Skip to content

Commit

Permalink
Merge pull request #10417 from SethTisue/revert-pr-10148
Browse files Browse the repository at this point in the history
  • Loading branch information
SethTisue committed May 31, 2023
2 parents fd209dc + 3fdd091 commit f113b1a
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 14 deletions.
30 changes: 24 additions & 6 deletions src/interactive/scala/tools/nsc/interactive/Global.scala
Original file line number Diff line number Diff line change
Expand Up @@ -992,7 +992,7 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")

private[interactive] def getScopeCompletion(pos: Position, response: Response[List[Member]]): Unit = {
informIDE("getScopeCompletion" + pos)
respond(response) { scopeMembers(pos) }
respond(response) { scopeMemberFlatten(scopeMembers(pos)) }
}

@nowarn("msg=inheritance from class LinkedHashMap")
Expand Down Expand Up @@ -1045,7 +1045,14 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
// imported val and var are always marked as inaccessible, but they could be accessed through their getters. scala/bug#7995
val member = if (s.hasGetter)
ScopeMember(s, st, context.isAccessible(s.getter, pre, superAccess = false), viaImport)
else ScopeMember(s, st, context.isAccessible(s, pre, superAccess = false), viaImport)
else {
if (s.isAliasType) {
val aliasInfo = ScopeMember(s, st, context.isAccessible(s, pre, superAccess = false), viaImport)
ScopeMember(s.info.typeSymbol, s.info.typeSymbol.tpe,
context.isAccessible(s.info.typeSymbol, pre, superAccess = false), viaImport,
aliasInfo = Some(aliasInfo))
} else ScopeMember(s, st, context.isAccessible(s, pre, superAccess = false), viaImport)
}
member.prefix = pre
member
}
Expand Down Expand Up @@ -1190,7 +1197,13 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
symbol.name.isTermName == name.isTermName || // Keep names of the same type
name.isTypeName && isStable // Completing a type: keep stable terms (paths)
}
!isJunk && member.accessible && !symbol.isConstructor && (name.isEmpty || matcher(member.sym.name)) && nameTypeOk
// scala/bug#11846 aliasInfo should be match
def aliasTypeOk: Boolean = {
matcher(member.aliasInfo.map(_.sym.name).getOrElse(NoSymbol.name)) && !forImport && symbol.name.isTermName == name.isTermName
}

!isJunk && member.accessible && !symbol.isConstructor && (name.isEmpty || (matcher(member.sym.name) || aliasTypeOk)
&& nameTypeOk)

}
}
Expand All @@ -1211,6 +1224,11 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
}
}

private def scopeMemberFlatten(members: List[ScopeMember]): List[ScopeMember] = {
val (infoWithoutAlias, infoWithAlias) = members.partition(_.aliasInfo.isEmpty)
infoWithoutAlias ++ infoWithAlias ++ infoWithAlias.flatten(_.aliasInfo)
}

final def completionsAt(pos: Position): CompletionResult = {
val focus1: Tree = typedTreeAt(pos)
def typeCompletions(tree: Tree, qual: Tree, nameStart: Int, name: Name): CompletionResult = {
Expand Down Expand Up @@ -1238,13 +1256,13 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
val allMembers = scopeMembers(pos)
val positionDelta: Int = pos.start - focus1.pos.start
val subName = name.subName(0, positionDelta)
CompletionResult.ScopeMembers(positionDelta, allMembers, subName, forImport = false)
CompletionResult.ScopeMembers(positionDelta, scopeMemberFlatten(allMembers), subName, forImport = false)
case imp@Import(i @ Ident(name), head :: Nil) if head.name == nme.ERROR =>
val allMembers = scopeMembers(pos)
val nameStart = i.pos.start
val positionDelta: Int = pos.start - nameStart
val subName = name.subName(0, pos.start - i.pos.start)
CompletionResult.ScopeMembers(positionDelta, allMembers, subName, forImport = true)
CompletionResult.ScopeMembers(positionDelta, scopeMemberFlatten(allMembers), subName, forImport = true)
case imp@Import(qual, selectors) =>
selectors.reverseIterator.find(_.namePos <= pos.start) match {
case None => CompletionResult.NoResults
Expand All @@ -1267,7 +1285,7 @@ class Global(settings: Settings, _reporter: Reporter, projectName: String = "")
val allMembers = scopeMembers(pos)
val positionDelta: Int = pos.start - focus1.pos.start
val subName = name.subName(0, positionDelta)
CompletionResult.ScopeMembers(positionDelta, allMembers, subName, forImport = false)
CompletionResult.ScopeMembers(positionDelta, scopeMemberFlatten(allMembers), subName, forImport = false)
case _ =>
CompletionResult.NoResults
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -350,7 +350,7 @@ class Completion(delegate: shell.Completion) extends shell.Completion with Compl
}

val parsedLineWord = parsedLine.word()
result.candidates.filter(_.name == parsedLineWord) match {
result.candidates.filter(c => c.name == parsedLineWord || c.alias.fold(false)(a => a == parsedLineWord)) match {
case Nil =>
case exacts =>
val declStrings = exacts.map(_.declString()).filterNot(_ == "")
Expand Down
1 change: 1 addition & 0 deletions src/repl/scala/tools/nsc/interpreter/Interface.scala
Original file line number Diff line number Diff line change
Expand Up @@ -336,6 +336,7 @@ case class CompletionCandidate(
isDeprecated: Boolean = false,
isUniversal: Boolean = false,
declString: () => String = () => "",
alias: Option[String] = None
)
object CompletionCandidate {
sealed trait Arity
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -216,12 +216,7 @@ trait PresentationCompilation { self: IMain =>
val ccs = for {
member <- matching
if seen.add(member.sym)
candidate <- if (member.sym.isAliasType) {
val dealiased = member.sym.info.dealias.typeSymbol
seen.add(dealiased)
List(member.sym, dealiased)
} else List(member.sym)
sym <- if (candidate.isClass && isNew) candidate.info.decl(nme.CONSTRUCTOR).alternatives else candidate.alternatives
sym <- if (member.sym.isClass && isNew) member.sym.info.decl(nme.CONSTRUCTOR).alternatives else member.sym.alternatives
sugared = sym.sugaredSymbolOrSelf
} yield {
CompletionCandidate(
Expand All @@ -237,7 +232,9 @@ trait PresentationCompilation { self: IMain =>
val methodOtherDesc = if (!desc.exists(_ != "")) "" else " " + desc.filter(_ != "").mkString(" ")
sugared.defStringSeenAs(tp) + methodOtherDesc
}
})
},
alias = member.aliasInfo.fold[Option[String]](None)(s => Some(s.sym.nameString))
)
}
ccs
}
Expand Down

0 comments on commit f113b1a

Please sign in to comment.