package scotch.compiler.syntax.reference;
import java.util.List;
import scotch.symbol.Symbol;
import scotch.symbol.descriptor.TypeInstanceDescriptor;
import scotch.symbol.descriptor.TypeParameterDescriptor;
public abstract class DefinitionReference {
private static final RootReference rootRef = new RootReference();
public static ClassReference classRef(Symbol symbol) {
return new ClassReference(symbol);
}
public static DataReference dataRef(Symbol symbol) {
return new DataReference(symbol);
}
public static InstanceReference instanceRef(ClassReference classReference, ModuleReference moduleReference, List<TypeParameterDescriptor> parameters) {
return new InstanceReference(classReference, moduleReference, parameters);
}
public static InstanceReference instanceRef(TypeInstanceDescriptor descriptor) {
return instanceRef(classRef(descriptor.getTypeClass()), moduleRef(descriptor.getModuleName()), descriptor.getParameters());
}
public static ModuleReference moduleRef(String name) {
return new ModuleReference(name);
}
public static OperatorReference operatorRef(Symbol symbol) {
return new OperatorReference(symbol);
}
public static RootReference rootRef() {
return rootRef;
}
public static ScopeReference scopeRef(Symbol symbol) {
return new ScopeReference(symbol);
}
public static SignatureReference signatureRef(Symbol symbol) {
return new SignatureReference(symbol);
}
public static ValueReference valueRef(Symbol symbol) {
return new ValueReference(symbol);
}
DefinitionReference() {
// intentionally empty
}
@Override
public abstract boolean equals(Object o);
@Override
public abstract int hashCode();
@Override
public abstract String toString();
}