package scotch.compiler.syntax.definition;
import static scotch.symbol.Symbol.qualified;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import com.google.common.collect.ImmutableList;
import lombok.ToString;
import scotch.compiler.text.SourceLocation;
import scotch.symbol.Symbol;
import scotch.symbol.SymbolResolver;
import scotch.compiler.syntax.type.Type;
@ToString(exclude = "sourceLocation")
public final class InclusionImport extends Import {
private final SourceLocation sourceLocation;
private final String moduleName;
private final List<String> includes;
InclusionImport(SourceLocation sourceLocation, String moduleName, List<String> includes) {
this.sourceLocation = sourceLocation;
this.moduleName = moduleName;
this.includes = ImmutableList.copyOf(includes);
}
@Override
public boolean equals(Object o) {
if (o == this) {
return true;
} else if (o instanceof InclusionImport) {
InclusionImport other = (InclusionImport) o;
return Objects.equals(moduleName, other.moduleName)
&& Objects.equals(includes, other.includes);
} else {
return false;
}
}
@Override
public Set<Symbol> getContext(Type type, SymbolResolver resolver) {
return getContext_(moduleName, type, resolver);
}
@Override
public int hashCode() {
return Objects.hash(moduleName, includes);
}
@Override
public boolean isFrom(String moduleName) {
return Objects.equals(this.moduleName, moduleName);
}
@Override
public Optional<Symbol> qualify(String name, SymbolResolver resolver) {
if (includes.contains(name) && resolver.isDefined(qualified(moduleName, name))) {
return Optional.of(qualified(moduleName, name));
} else {
return Optional.empty();
}
}
@Override
public InclusionImport withSourceLocation(SourceLocation sourceLocation) {
return new InclusionImport(sourceLocation, moduleName, includes);
}
}