package scotch.compiler.syntax.definition;
import static java.util.stream.Collectors.toSet;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import scotch.symbol.Symbol;
import scotch.symbol.SymbolResolver;
import scotch.symbol.descriptor.TypeInstanceDescriptor;
import scotch.compiler.syntax.type.Type;
import scotch.compiler.text.SourceLocation;
public abstract class Import {
public static InclusionImport inclusionImport(SourceLocation sourceLocation, String moduleName, List<String> includes) {
return new InclusionImport(sourceLocation, moduleName, includes);
}
public static ModuleImport moduleImport(SourceLocation sourceLocation, String moduleName) {
return new ModuleImport(sourceLocation, moduleName);
}
protected static Set<Symbol> getContext_(String moduleName, Type type, SymbolResolver resolver) {
return resolver.getTypeInstancesByModule(moduleName).stream()
.filter(typeInstance -> typeInstance.getParameters().get(0).matches(type.toDescriptor()))
.map(TypeInstanceDescriptor::getTypeClass)
.collect(toSet());
}
Import() {
// intentionally empty
}
@Override
public abstract boolean equals(Object o);
public abstract Set<Symbol> getContext(Type type, SymbolResolver resolver);
@Override
public abstract int hashCode();
public abstract boolean isFrom(String moduleName);
public abstract Optional<Symbol> qualify(String name, SymbolResolver resolver);
@Override
public abstract String toString();
public abstract Import withSourceLocation(SourceLocation sourceLocation);
}