Skip to content

Commit 2b97efe

Browse files
authored
Add support for completions on export (#15795)
1 parent 775f9ce commit 2b97efe

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

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

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -60,22 +60,18 @@ object Completion {
6060
*/
6161
def completionMode(path: List[Tree], pos: SourcePosition): Mode =
6262
path match {
63-
case Ident(_) :: Import(_, _) :: _ =>
64-
Mode.Import
63+
case Ident(_) :: Import(_, _) :: _ => Mode.ImportOrExport
6564
case (ref: RefTree) :: _ =>
6665
if (ref.name.isTermName) Mode.Term
6766
else if (ref.name.isTypeName) Mode.Type
6867
else Mode.None
6968

7069
case (sel: untpd.ImportSelector) :: _ =>
71-
if sel.imported.span.contains(pos.span) then Mode.Import
70+
if sel.imported.span.contains(pos.span) then Mode.ImportOrExport
7271
else Mode.None // Can't help completing the renaming
7372

74-
case Import(_, _) :: _ =>
75-
Mode.Import
76-
77-
case _ =>
78-
Mode.None
73+
case (_: ImportOrExport) :: _ => Mode.ImportOrExport
74+
case _ => Mode.None
7975
}
8076

8177
/** When dealing with <errors> in varios palces we check to see if they are
@@ -103,8 +99,8 @@ object Completion {
10399
case (sel: untpd.ImportSelector) :: _ =>
104100
completionPrefix(sel.imported :: Nil, pos)
105101

106-
case Import(expr, selectors) :: _ =>
107-
selectors.find(_.span.contains(pos.span)).map { selector =>
102+
case (tree: untpd.ImportOrExport) :: _ =>
103+
tree.selectors.find(_.span.contains(pos.span)).map { selector =>
108104
completionPrefix(selector :: Nil, pos)
109105
}.getOrElse("")
110106

@@ -146,7 +142,7 @@ object Completion {
146142
case Select(qual @ This(_), _) :: _ if qual.span.isSynthetic => completer.scopeCompletions
147143
case Select(qual, _) :: _ if qual.tpe.hasSimpleKind => completer.selectionCompletions(qual)
148144
case Select(qual, _) :: _ => Map.empty
149-
case Import(expr, _) :: _ => completer.directMemberCompletions(expr)
145+
case (tree: ImportOrExport) :: _ => completer.directMemberCompletions(tree.expr)
150146
case (_: untpd.ImportSelector) :: Import(expr, _) :: _ => completer.directMemberCompletions(expr)
151147
case _ => completer.scopeCompletions
152148
}
@@ -566,7 +562,7 @@ object Completion {
566562
val Type: Mode = new Mode(2)
567563

568564
/** Both term and type symbols are allowed */
569-
val Import: Mode = new Mode(4) | Term | Type
565+
val ImportOrExport: Mode = new Mode(4) | Term | Type
570566
}
571567
}
572568

language-server/test/dotty/tools/languageserver/CompletionTest.scala

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1454,7 +1454,24 @@ class CompletionTest {
14541454
| testMet$m2
14551455
| Test(1, 2)
14561456
"""
1457-
.completion(m1, expected)
1458-
.completion(m2, expected)
1457+
.completion(m1, expected)
1458+
.completion(m2, expected)
1459+
}
1460+
1461+
@Test def exportCompletions: Unit = {
1462+
code"""object Foo:
1463+
| def xDef = 1
1464+
| val xVal = 1
1465+
| class xClass()
1466+
| object xObject {}
1467+
|object Test:
1468+
| export Foo.x${m1}
1469+
"""
1470+
.completion(m1, Set(
1471+
("xDef", Method, "=> Int"),
1472+
("xVal", Field, "Int"),
1473+
("xObject", Module, "Foo.xObject"),
1474+
("xClass", Module, "Foo.xClass"),
1475+
("xClass", Class, "Foo.xClass")))
14591476
}
14601477
}

0 commit comments

Comments
 (0)