Skip to content

Commit 61d59a1

Browse files
committed
fix extension definitions with Select, add tests, simplify if
1 parent 3bb813e commit 61d59a1

File tree

4 files changed

+59
-14
lines changed

4 files changed

+59
-14
lines changed

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

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,6 @@ object Completion:
139139
.pathTo(pos.span, List(ctx.compilationUnit.untpdTree), true).collect:
140140
case untpdTree: untpd.Tree => untpdTree
141141

142-
143142
tpdPath match
144143
case (_: Bind) :: _ => tpdPath
145144
case (_: untpd.TypTree) :: _ => tpdPath
@@ -155,15 +154,20 @@ object Completion:
155154

156155
val completer = new Completer(mode, prefix, pos)
157156

158-
val completions = tpdPath match
159-
// Ignore synthetic select from `This` because in code it was `Ident`
160-
// See example in dotty.tools.languageserver.CompletionTest.syntheticThis
161-
case Select(qual @ This(_), _) :: _ if qual.span.isSynthetic => completer.scopeCompletions
162-
case Select(qual, _) :: _ if qual.tpe.hasSimpleKind => completer.selectionCompletions(qual)
163-
case Select(qual, _) :: _ => Map.empty
164-
case (tree: ImportOrExport) :: _ => completer.directMemberCompletions(tree.expr)
165-
case (_: untpd.ImportSelector) :: Import(expr, _) :: _ => completer.directMemberCompletions(expr)
166-
case _ => completer.scopeCompletions
157+
val completions = path0 match
158+
case untpd.Select(qual, _) :: _ :: untpd.ExtMethods(_, _) :: _ =>
159+
val tpdQual = ctx.typer.typedExpr(qual)
160+
completer.selectionCompletions(tpdQual)
161+
case _ => tpdPath match
162+
163+
// Ignore synthetic select from `This` because in code it was `Ident`
164+
// See example in dotty.tools.languageserver.CompletionTest.syntheticThis
165+
case Select(qual @ This(_), _) :: _ if qual.span.isSynthetic => completer.scopeCompletions
166+
case Select(qual, _) :: _ if qual.tpe.hasSimpleKind => completer.selectionCompletions(qual)
167+
case Select(qual, _) :: _ => Map.empty
168+
case (tree: ImportOrExport) :: _ => completer.directMemberCompletions(tree.expr)
169+
case (_: untpd.ImportSelector) :: Import(expr, _) :: _ => completer.directMemberCompletions(expr)
170+
case _ => completer.scopeCompletions
167171

168172
val describedCompletions = describeCompletions(completions)
169173
val backtickedCompletions =

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

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1533,6 +1533,16 @@ class CompletionTest {
15331533
|"""
15341534
.completion(m1, Set(("Foo",Class,"Foo")))
15351535

1536+
@Test def extensionDefinitionCompletionsSelect: Unit =
1537+
code"""|object Test:
1538+
| class TestSelect()
1539+
|object T:
1540+
| extension (x: Test.TestSel$m1)
1541+
|"""
1542+
.completion(m1, Set(
1543+
("TestSelect", Module, "Test.TestSelect"), ("TestSelect", Class, "Test.TestSelect")
1544+
))
1545+
15361546
@Test def selectDynamic: Unit =
15371547
code"""|import scala.language.dynamics
15381548
|class Foo extends Dynamic {

presentation-compiler/src/main/dotty/tools/pc/completions/Completions.scala

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -106,10 +106,8 @@ class Completions(
106106
else false
107107

108108
if generalExclude then false
109-
else if completionMode.is(Mode.ImportOrExport) then true
110-
else if completionMode.is(Mode.Term) && isWildcardParam(sym) then false
111-
else if completionMode.is(Mode.Term) && (sym.isTerm || sym.is(Package)) then true
112-
else !completionMode.is(Mode.Term)
109+
else if completionMode.is(Mode.Type) then true
110+
else !isWildcardParam(sym) && (sym.isTerm || sym.is(Package))
113111
end if
114112
end includeSymbol
115113

presentation-compiler/test/dotty/tools/pc/tests/completion/CompletionSuite.scala

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1442,6 +1442,39 @@ class CompletionSuite extends BaseCompletionSuite:
14421442
|""".stripMargin
14431443
)
14441444

1445+
@Test def `extension-definition-select` =
1446+
check(
1447+
"""|object Test:
1448+
| class TestSelect()
1449+
|object T:
1450+
| extension (x: Test.TestSel@@)
1451+
|""".stripMargin,
1452+
"""|TestSelect test.Test
1453+
|""".stripMargin
1454+
)
1455+
1456+
@Test def `extension-definition-select-mix-1` =
1457+
check(
1458+
"""|object Test:
1459+
| class TestSelect()
1460+
|object T:
1461+
| extension (using Int)(x: Test.TestSel@@)
1462+
|""".stripMargin,
1463+
"""|TestSelect test.Test
1464+
|""".stripMargin
1465+
)
1466+
1467+
@Test def `extension-definition-select-mix-2` =
1468+
check(
1469+
"""|object Test:
1470+
| class TestSelect[T]()
1471+
|object T:
1472+
| extension [T](x: Test.TestSel@@)
1473+
|""".stripMargin,
1474+
"""|TestSelect[T] test.Test
1475+
|TestSelect test.Test
1476+
|""".stripMargin
1477+
)
14451478

14461479
@Test def `no-square-brackets` =
14471480
checkEdit(

0 commit comments

Comments
 (0)