package me.tomassetti.turin.parser.ast.invokables;
import com.google.common.collect.ImmutableList;
import me.tomassetti.turin.resolvers.SymbolResolver;
import me.tomassetti.turin.parser.ast.FormalParameterNode;
import me.tomassetti.turin.parser.ast.Node;
import me.tomassetti.turin.parser.ast.statements.Statement;
import me.tomassetti.turin.parser.ast.typeusage.TypeUsageNode;
import me.tomassetti.turin.symbols.FormalParameter;
import me.tomassetti.turin.symbols.InvokableDefinition;
import me.tomassetti.turin.symbols.Symbol;
import java.util.List;
import java.util.Optional;
/**
* Either a function or a method.
*/
public abstract class InvokableDefinitionNode extends Node implements InvokableDefinition {
protected String name;
protected TypeUsageNode returnType;
protected List<FormalParameterNode> parameters;
protected Statement body;
public InvokableDefinitionNode(List<FormalParameterNode> parameters, Statement body, String name, TypeUsageNode returnType) {
this.parameters = parameters;
this.parameters.forEach((p) -> p.setParent(InvokableDefinitionNode.this) );
this.body = body;
this.body.setParent(this);
this.name = name;
this.returnType = returnType;
this.returnType.setParent(this);
}
@Override
public TypeUsageNode getReturnType() {
return returnType;
}
@Override
public List<? extends FormalParameter> getParameters() {
return parameters;
}
public Statement getBody() {
return body;
}
@Override
public Optional<Symbol> findSymbol(String name, SymbolResolver resolver) {
for (FormalParameterNode param : parameters) {
if (param.getName().equals(name)) {
return Optional.of(param);
}
}
return super.findSymbol(name, resolver);
}
@Override
public String getName() {
return name;
}
@Override
public Iterable<Node> getChildren() {
return ImmutableList.<Node>builder().add(returnType).addAll(parameters).add(body).build();
}
}