private Object resolve()

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);
  }