package me.tomassetti.turin.parser.ast.expressions; import com.google.common.collect.ImmutableList; import me.tomassetti.turin.compiler.errorhandling.ErrorCollector; import me.tomassetti.jvm.JvmConstructorDefinition; import me.tomassetti.turin.definitions.TypeDefinition; import me.tomassetti.turin.resolvers.SymbolResolver; import me.tomassetti.turin.parser.ast.Node; import me.tomassetti.turin.parser.ast.typeusage.ReferenceTypeUsageNode; import me.tomassetti.turin.parser.ast.typeusage.TypeUsageNode; import me.tomassetti.turin.symbols.FormalParameter; import java.util.*; public class Creation extends InvokableExpr { private TypeUsageNode type; public TypeUsageNode getType() { return type; } @Override public String toString() { return "Creation{" + "type='" + type + '\'' + ", actualParams=" + actualParams + '}'; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Creation creation = (Creation) o; if (!actualParams.equals(creation.actualParams)) return false; if (!type.equals(creation.type)) return false; return true; } @Override public int hashCode() { int result = type.hashCode(); result = 31 * result + actualParams.hashCode(); return result; } @Override public boolean isOnOverloaded(SymbolResolver resolver) { return getTypeDefinition(resolver).hasManyConstructors(); } private TypeDefinition getTypeDefinition(SymbolResolver resolver) { return type.asReferenceTypeUsage().getTypeDefinition(); } @Override protected List<? extends FormalParameter> formalParameters(SymbolResolver resolver) { return getTypeDefinition(resolver).getConstructorParams(actualParams); } public Creation(TypeUsageNode type, List<ActualParam> actualParams) { super(actualParams); this.type = type; this.type.setParent(this); } public Creation(String typeName, List<ActualParam> actualParams) { this(new ReferenceTypeUsageNode(typeName), actualParams); } @Override protected boolean specificValidate(SymbolResolver resolver, ErrorCollector errorCollector) { return super.specificValidate(resolver, errorCollector); } @Override public Iterable<Node> getChildren() { return ImmutableList.copyOf(actualParams); } @Override public TypeUsageNode calcType() { return type; } public JvmConstructorDefinition jvmDefinition(SymbolResolver resolver) { return getTypeDefinition(resolver).resolveConstructorCall(originalParams); } }