package me.tomassetti.turin.parser.ast;
import com.google.common.collect.ImmutableList;
import me.tomassetti.turin.resolvers.SymbolResolver;
import me.tomassetti.turin.parser.ast.statements.Statement;
import me.tomassetti.turin.symbols.FormalParameterSymbol;
import me.tomassetti.turin.symbols.Symbol;
import me.tomassetti.turin.typesystem.ArrayTypeUsage;
import me.tomassetti.turin.typesystem.ReferenceTypeUsage;
import java.util.Optional;
public class Program extends Node implements Named, Symbol {
private String name;
private Statement statement;
private FormalParameterSymbol formalParameter;
private String paramName;
public FormalParameterSymbol getFormalParameter() {
if (formalParameter == null) {
formalParameter = new FormalParameterSymbol(new ArrayTypeUsage(ReferenceTypeUsage.STRING(symbolResolver())), paramName);
}
return formalParameter;
}
public String getParamName() {
return paramName;
}
public Program(String name, Statement statement, String paramName) {
this.name = name;
this.statement = statement;
this.statement.setParent(this);
this.formalParameter = null;
this.paramName = paramName;
}
public String getName() {
return name;
}
public Statement getStatement() {
return statement;
}
@Override
public Iterable<Node> getChildren() {
return ImmutableList.of(statement);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Program program = (Program) o;
if (!name.equals(program.name)) return false;
if (!statement.equals(program.statement)) return false;
return true;
}
@Override
public String toString() {
return "Program{" +
"name='" + name + '\'' +
", statement=" + statement +
", formalParameter=" + formalParameter +
'}';
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + statement.hashCode();
result = 31 * result + formalParameter.hashCode();
return result;
}
@Override
public Optional<Symbol> findSymbol(String name, SymbolResolver resolver) {
if (name.equals(paramName)) {
return Optional.of(getFormalParameter());
}
return super.findSymbol(name, resolver);
}
public String getQualifiedName() {
return contextName() + "." + name;
}
}