private def resolveSym()

in rsc/src/main/scala/rsc/outline/Outliner.scala [213:372]


  private def resolveSym(env: Env, path: Path): SymbolResolution = {
    path.id.sym match {
      case NoSymbol =>
        path match {
          case id: AmbigId =>
            val resolution = env.resolve(id.value)
            resolution match {
              case resolution: AmbiguousResolution =>
                if (env.isSynthetic) reporter.append(AmbiguousMember(env, id, resolution))
                else reporter.append(AmbiguousId(id, resolution))
                resolution
              case _: BlockedResolution =>
                resolution
              case _: FailedResolution =>
                if (env.isSynthetic) reporter.append(UnboundMember(env, id))
                else reporter.append(UnboundId(id))
                resolution
              case ResolvedSymbol(sym) =>
                id.sym = sym
                resolution
            }
          case AmbigSelect(qual, id) =>
            val resolution = resolveScope(env, qual)
            resolution match {
              case resolution: BlockedResolution =>
                resolution
              case resolution: FailedResolution =>
                resolution
              case ResolvedScope(qualScope) =>
                val env1 = Env(env.root, List(qualScope))
                resolveSym(env1, id)
            }
          case id: NamedId =>
            val resolution = env.resolve(id.name)
            resolution match {
              case resolution: AmbiguousResolution =>
                if (env.isSynthetic) reporter.append(AmbiguousMember(env, id, resolution))
                else reporter.append(AmbiguousId(id, resolution))
                resolution
              case _: BlockedResolution =>
                resolution
              case _: FailedResolution =>
                if (env.isSynthetic) reporter.append(UnboundMember(env, id))
                else reporter.append(UnboundId(id))
                resolution
              case ResolvedSymbol(sym) =>
                id.sym = sym
                resolution
            }
          case TermSelect(qual: Path, id) =>
            val resolution = resolveScope(env, qual)
            resolution match {
              case resolution: BlockedResolution =>
                resolution
              case resolution: FailedResolution =>
                resolution
              case ResolvedScope(qualScope) =>
                val env1 = Env(env.root, List(qualScope))
                resolveSym(env1, id)
            }
          case TermSelect(qual, id) =>
            reporter.append(IllegalOutline(path))
            ErrorResolution
          case TermSuper(qual, mix) =>
            // FIXME: https://github.com/twitter/rsc/issues/96
            reporter.append(IllegalOutline(path))
            ErrorResolution
          case TermThis(qual) =>
            val resolution = {
              qual match {
                case AmbigId(value) => env.resolveThis(value)
                case AnonId() => env.resolveThis()
              }
            }
            resolution match {
              case resolution: AmbiguousResolution =>
                reporter.append(AmbiguousId(qual, resolution))
                resolution
              case _: BlockedResolution =>
                resolution
              case _: FailedResolution =>
                reporter.append(UnboundId(qual))
                resolution
              case ResolvedSymbol(qualSym) =>
                qual.sym = qualSym
                resolution
            }
          case TptProject(qual: Path, id) =>
            val resolution = resolveScope(env, qual)
            resolution match {
              case resolution: BlockedResolution =>
                resolution
              case resolution: FailedResolution =>
                resolution
              case ResolvedScope(qualScope) =>
                // FIXME: https://github.com/twitter/rsc/issues/91
                val env1 = Env(env.root, List(qualScope))
                resolveSym(env1, id)
            }
          case TptProject(qual, id) =>
            // FIXME: https://github.com/twitter/rsc/issues/91
            reporter.append(IllegalOutline(path))
            ErrorResolution
          case TptSelect(qual, id) =>
            val resolution = resolveScope(env, qual)
            resolution match {
              case resolution: BlockedResolution =>
                resolution
              case resolution: FailedResolution =>
                resolution
              case ResolvedScope(qualScope) =>
                val env1 = Env(env.root, List(qualScope))
                val resolution1 = env1.resolve(id.name)
                resolution1 match {
                  case resolution1: AmbiguousResolution =>
                    reporter.append(AmbiguousMember(env1, id, resolution1))
                    resolution1
                  case _: BlockedResolution =>
                    resolution1
                  case _: FailedResolution =>
                    env.lang match {
                      case ScalaLanguage | UnknownLanguage =>
                        reporter.append(UnboundMember(env1, id))
                        resolution1
                      case JavaLanguage =>
                        val resolution2 = {
                          val qualSym2 = qualScope.sym.companionSymbol
                          if (symtab.scopes.contains(qualSym2)) {
                            val scope2 = symtab.scopes(qualSym2)
                            val env2 = Env(env.root, List(scope2))
                            env2.resolve(id.name)
                          } else {
                            resolution1
                          }
                        }
                        resolution2 match {
                          case _: AmbiguousResolution =>
                            resolution1
                          case _: BlockedResolution =>
                            resolution2
                          case _: FailedResolution =>
                            resolution1
                          case ResolvedSymbol(sym) =>
                            qual.id.sym = sym
                            id.sym = sym
                            resolution2
                        }
                    }
                  case ResolvedSymbol(sym) =>
                    id.sym = sym
                    resolution1
                }
            }
          case TptSingleton(qual) =>
            resolveSym(env, qual)
        }
      case sym =>
        ResolvedSymbol(sym)
    }
  }