package me.tomassetti.turin.definitions;
import me.tomassetti.jvm.JvmConstructorDefinition;
import me.tomassetti.turin.symbols.FormalParameter;
import me.tomassetti.turin.typesystem.TypeUsage;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class InternalConstructorDefinition extends InternalInvokableDefinition {
private JvmConstructorDefinition jvmConstructorDefinition;
private TypeUsage returnType;
public JvmConstructorDefinition getJvmConstructorDefinition() {
return jvmConstructorDefinition;
}
public InternalConstructorDefinition(TypeUsage returnType, List<? extends FormalParameter> formalParameters, JvmConstructorDefinition jvmConstructorDefinition) {
super(formalParameters);
this.jvmConstructorDefinition = jvmConstructorDefinition;
this.returnType = returnType;
}
@Override
public InternalConstructorDefinition asConstructor() {
return this;
}
@Override
public InternalMethodDefinition asMethod() {
throw new UnsupportedOperationException();
}
@Override
public boolean isConstructor() {
return true;
}
@Override
public boolean isMethod() {
return false;
}
@Override
public TypeUsage getReturnType() {
return returnType;
}
@Override
public InternalConstructorDefinition apply(Map<String, TypeUsage> typeParams) {
List<FormalParameter> formalParametersReplaced = new ArrayList<>();
for (FormalParameter fp : getFormalParameters()) {
formalParametersReplaced.add(fp.apply(typeParams));
}
return new InternalConstructorDefinition(returnType.replaceTypeVariables(typeParams),
formalParametersReplaced, jvmConstructorDefinition);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof InternalConstructorDefinition)) return false;
InternalConstructorDefinition that = (InternalConstructorDefinition) o;
if (!jvmConstructorDefinition.equals(that.jvmConstructorDefinition)) return false;
if (!returnType.equals(that.returnType)) return false;
if (!getFormalParameters().equals(that.getFormalParameters())) return false;
return true;
}
@Override
public int hashCode() {
int result = jvmConstructorDefinition.hashCode();
result = 31 * result + returnType.hashCode();
return result;
}
@Override
public String toString() {
return "InternalConstructorDefinition{" +
"jvmConstructorDefinition=" + jvmConstructorDefinition +
", returnType=" + returnType +
'}';
}
}