in base/src/main/java/org/arend/naming/scope/LexicalScope.java [223:318]
private Object resolve(String name, ResolveType resolveType, Referable.RefKind refKind) {
if (name.isEmpty() || "_".equals(name)) {
return null;
}
for (Statement statement : myGroup.getStatements()) {
if (resolveType != ResolveType.REF || refKind == null || refKind == Referable.RefKind.EXPR) {
Group subgroup = statement.getGroup();
if (subgroup != null) {
Object result = resolveSubgroup(subgroup, name, resolveType);
if (result != null) {
return result;
}
}
}
if (refKind == null || refKind == Referable.RefKind.PLEVEL) {
Abstract.LevelParameters levelParams = statement.getPLevelsDefinition();
if (levelParams != null) {
for (Referable ref : levelParams.getReferables()) {
if (name.equals(ref.getRefName())) {
return ref;
}
}
}
}
if (refKind == null || refKind == Referable.RefKind.HLEVEL) {
Abstract.LevelParameters levelParams = statement.getHLevelsDefinition();
if (levelParams != null) {
for (Referable ref : levelParams.getReferables()) {
if (name.equals(ref.getRefName())) {
return ref;
}
}
}
}
}
if (resolveType != ResolveType.REF || refKind == null || refKind == Referable.RefKind.EXPR) {
if (myExtent == Extent.EVERYTHING) {
for (Group subgroup : myGroup.getDynamicSubgroups()) {
Object result = resolveSubgroup(subgroup, name, resolveType);
if (result != null) {
return result;
}
}
}
if (resolveType == ResolveType.REF && myExtent != Extent.ONLY_EXTERNAL) {
Object result = resolveInternal(myGroup, name, myKind == Kind.OPENED_INTERNAL);
if (result != null) {
return result;
}
}
}
if (!ignoreOpens()) {
Scope cachingScope = null;
for (Statement statement : myGroup.getStatements()) {
NamespaceCommand cmd = statement.getNamespaceCommand();
if (cmd == null || myKind == Kind.OPENED_WITH_IMPORTS && cmd.getKind() == NamespaceCommand.Kind.OPEN) {
continue;
}
Scope scope;
if (cmd.getKind() == NamespaceCommand.Kind.IMPORT) {
if (myModule != null && cmd.getPath().equals(myModule.toList())) {
continue;
}
scope = getImportedSubscope();
} else {
if (cachingScope == null) {
cachingScope = CachingScope.make(new LexicalScope(myParent, myGroup, null, Kind.OPENED_WITH_IMPORTS, myExtent));
}
scope = cachingScope;
}
scope = NamespaceCommandNamespace.resolveNamespace(scope, cmd);
Object result = resolveType == ResolveType.REF ? scope.resolveName(name, refKind) : scope.resolveNamespace(name, resolveType == ResolveType.INTERNAL_SCOPE);
if (result != null) {
return result;
}
}
}
if (myKind == Kind.INSIDE && resolveType == ResolveType.REF) {
List<? extends Referable> refs = myGroup.getExternalParameters();
for (int i = refs.size() - 1; i >= 0; i--) {
Referable ref = refs.get(i);
if (ref != null && ref.getRefName().equals(name)) {
return ref;
}
}
}
return resolveType == ResolveType.REF ? myParent.resolveName(name, refKind) : myParent.resolveNamespace(name, resolveType == ResolveType.INTERNAL_SCOPE);
}