Skip to content

Commit a4e3a85

Browse files
Backport "Unify completion pos usage, fix presentation compiler crash in interpolation" to LTS (#20964)
Backports #19614 to the LTS branch. PR submitted by the release tooling. [skip ci]
2 parents 8e55fb6 + 507f14a commit a4e3a85

File tree

16 files changed

+320
-493
lines changed

16 files changed

+320
-493
lines changed

compiler/src/dotty/tools/dotc/interactive/Completion.scala

+28-29
Original file line numberDiff line numberDiff line change
@@ -90,29 +90,22 @@ object Completion:
9090

9191
val completionSymbolKind: Mode =
9292
path match
93-
case untpd.Ident(_) :: untpd.Import(_, _) :: _ => Mode.ImportOrExport
94-
case untpd.Ident(_) :: (_: untpd.ImportSelector) :: _ => Mode.ImportOrExport
95-
case untpd.Literal(Constants.Constant(_: String)) :: _ => Mode.Term // literal completions
93+
case GenericImportSelector(sel) =>
94+
if sel.imported.span.contains(pos.span) then Mode.ImportOrExport // import scala.@@
95+
else if sel.isGiven && sel.bound.span.contains(pos.span) then Mode.ImportOrExport
96+
else Mode.None // import scala.{util => u@@}
97+
case GenericImportOrExport(_) => Mode.ImportOrExport | Mode.Scope // import TrieMa@@
98+
case untpd.Literal(Constants.Constant(_: String)) :: _ => Mode.Term | Mode.Scope // literal completions
9699
case (ref: untpd.RefTree) :: _ =>
97-
if (ref.name.isTermName) Mode.Term
98-
else if (ref.name.isTypeName) Mode.Type
99-
else Mode.None
100+
val maybeSelectMembers = if ref.isInstanceOf[untpd.Select] then Mode.Member else Mode.Scope
100101

101-
case (sel: untpd.ImportSelector) :: _ =>
102-
if sel.imported.span.contains(pos.span) then Mode.ImportOrExport
103-
else Mode.None // Can't help completing the renaming
102+
if (ref.name.isTermName) Mode.Term | maybeSelectMembers
103+
else if (ref.name.isTypeName) Mode.Type | maybeSelectMembers
104+
else Mode.None
104105

105-
case (_: untpd.ImportOrExport) :: _ => Mode.ImportOrExport
106106
case _ => Mode.None
107107

108-
val completionKind: Mode =
109-
path match
110-
case Nil | (_: untpd.PackageDef) :: _ => Mode.None
111-
case untpd.Ident(_) :: (_: untpd.ImportSelector) :: _ => Mode.Member
112-
case (_: untpd.Select) :: _ => Mode.Member
113-
case _ => Mode.Scope
114-
115-
completionSymbolKind | completionKind
108+
completionSymbolKind
116109

117110
/** When dealing with <errors> in varios palces we check to see if they are
118111
* due to incomplete backticks. If so, we ensure we get the full prefix
@@ -141,18 +134,11 @@ object Completion:
141134
i + 1
142135

143136
path match
144-
case (sel: untpd.ImportSelector) :: _ =>
145-
completionPrefix(sel.imported :: Nil, pos)
146-
147-
case untpd.Ident(_) :: (sel: untpd.ImportSelector) :: _ if !sel.isGiven =>
148-
if sel.isWildcard then pos.source.content()(pos.point - 1).toString
137+
case GenericImportSelector(sel) =>
138+
if sel.isGiven then completionPrefix(sel.bound :: Nil, pos)
139+
else if sel.isWildcard then pos.source.content()(pos.point - 1).toString
149140
else completionPrefix(sel.imported :: Nil, pos)
150141

151-
case (tree: untpd.ImportOrExport) :: _ =>
152-
tree.selectors.find(_.span.contains(pos.span)).map: selector =>
153-
completionPrefix(selector :: Nil, pos)
154-
.getOrElse("")
155-
156142
// Foo.`se<TAB> will result in Select(Ident(Foo), <error>)
157143
case (select: untpd.Select) :: _ if select.name == nme.ERROR =>
158144
checkBacktickPrefix(select.source.content(), select.nameSpan.start, select.span.end)
@@ -169,6 +155,20 @@ object Completion:
169155

170156
end completionPrefix
171157

158+
private object GenericImportSelector:
159+
def unapply(path: List[untpd.Tree]): Option[untpd.ImportSelector] =
160+
path match
161+
case untpd.Ident(_) :: (sel: untpd.ImportSelector) :: _ => Some(sel)
162+
case (sel: untpd.ImportSelector) :: _ => Some(sel)
163+
case _ => None
164+
165+
private object GenericImportOrExport:
166+
def unapply(path: List[untpd.Tree]): Option[untpd.ImportOrExport] =
167+
path match
168+
case untpd.Ident(_) :: (importOrExport: untpd.ImportOrExport) :: _ => Some(importOrExport)
169+
case (importOrExport: untpd.ImportOrExport) :: _ => Some(importOrExport)
170+
case _ => None
171+
172172
/** Inspect `path` to determine the offset where the completion result should be inserted. */
173173
def completionOffset(untpdPath: List[untpd.Tree]): Int =
174174
untpdPath match
@@ -211,7 +211,6 @@ object Completion:
211211
case tpd.Select(qual, _) :: _ if qual.typeOpt.hasSimpleKind => completer.selectionCompletions(qual)
212212
case tpd.Select(qual, _) :: _ => Map.empty
213213
case (tree: tpd.ImportOrExport) :: _ => completer.directMemberCompletions(tree.expr)
214-
case (_: untpd.ImportSelector) :: tpd.Import(expr, _) :: _ => completer.directMemberCompletions(expr)
215214
case _ => completer.scopeCompletions
216215

217216
interactiv.println(i"""completion info with pos = $pos,

compiler/test/dotty/tools/dotc/interactive/CustomCompletion.scala

-130
This file was deleted.

compiler/test/dotty/tools/dotc/interactive/CustomCompletionTests.scala

-171
This file was deleted.

0 commit comments

Comments
 (0)