Skip to content

Commit 27acfd9

Browse files
committed
Add completions for given types
1 parent d9c6efb commit 27acfd9

File tree

2 files changed

+44
-42
lines changed

2 files changed

+44
-42
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ object Completion:
9292
path match
9393
case GenericImportSelector(sel) =>
9494
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
9596
else Mode.None // import scala.{util => u@@}
9697
case GenericImportOrExport(_) => Mode.ImportOrExport | Mode.Scope // import TrieMa@@
9798
case untpd.Literal(Constants.Constant(_: String)) :: _ => Mode.Term | Mode.Scope // literal completions
@@ -133,8 +134,9 @@ object Completion:
133134
i + 1
134135

135136
path match
136-
case GenericImportSelector(sel) if !sel.isGiven =>
137-
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
138140
else completionPrefix(sel.imported :: Nil, pos)
139141

140142
// Foo.`se<TAB> will result in Select(Ident(Foo), <error>)

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

Lines changed: 40 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,10 @@ class CompletionTest {
9696

9797
@Test def importCompleteFromPackage: Unit = {
9898
withSources(
99-
code"""package a
100-
abstract class MyClass""",
101-
code"""package b
102-
import a.My${m1}"""
99+
code"""|package a
100+
|abstract class MyClass""",
101+
code"""|package b
102+
|import a.My${m1}"""
103103
).completion(("MyClass", Class, "a.MyClass"))
104104
}
105105

@@ -111,11 +111,11 @@ class CompletionTest {
111111
}
112112

113113
@Test def importCompleteIncludesSynthetic: Unit = {
114-
code"""case class MyCaseClass(foobar: Int)
115-
object O {
116-
val x = MyCaseClass(0)
117-
import x.c${m1}
118-
}"""
114+
code"""|case class MyCaseClass(foobar: Int)
115+
|object O {
116+
| val x = MyCaseClass(0)
117+
| import x.c${m1}
118+
|}"""
119119
.completion(
120120
("copy", Method, "(foobar: Int): MyCaseClass"),
121121
("canEqual", Method, "(that: Any): Boolean"),
@@ -131,11 +131,11 @@ class CompletionTest {
131131

132132
@Test def importCompleteWithClassAndCompanion: Unit = {
133133
withSources(
134-
code"""package pkg0
135-
class Foo
136-
object Foo""",
137-
code"""package pgk1
138-
import pkg0.F${m1}"""
134+
code"""|package pkg0
135+
|class Foo
136+
|object Foo""",
137+
code"""|package pgk1
138+
|import pkg0.F${m1}"""
139139
).completion(
140140
("Foo", Class, "pkg0.Foo"),
141141
("Foo", Module, "pkg0.Foo"),
@@ -144,22 +144,22 @@ class CompletionTest {
144144

145145
@Test def importCompleteIncludePackage: Unit = {
146146
withSources(
147-
code"""package foo.bar
148-
abstract classFizz""",
147+
code"""|package foo.bar
148+
|abstract classFizz""",
149149
code"""import foo.b${m1}"""
150150
).completion(("bar", Module, "foo.bar"))
151151
}
152152

153153
@Test def importCompleteIncludeMembers: Unit = {
154154
withSources(
155-
code"""object MyObject {
156-
val myVal = 0
157-
def myDef = 0
158-
var myVar = 0
159-
object myObject
160-
abstract class myClass
161-
trait myTrait
162-
}""",
155+
code"""|object MyObject {
156+
| val myVal = 0
157+
| def myDef = 0
158+
| var myVar = 0
159+
| object myObject
160+
| abstract class myClass
161+
| trait myTrait
162+
|}""",
163163
code"""import MyObject.my${m1}"""
164164
).completion(
165165
("myVal", Field, "Int"),
@@ -201,9 +201,9 @@ class CompletionTest {
201201
}
202202

203203
@Test def completeJavaModuleClass: Unit = {
204-
code"""object O {
205-
val out = java.io.FileDesc${m1}
206-
}"""
204+
code"""|object O {
205+
| val out = java.io.FileDesc${m1}
206+
|}"""
207207
.completion(("FileDescriptor", Module, "java.io.FileDescriptor"))
208208
}
209209

@@ -221,18 +221,18 @@ class CompletionTest {
221221
}
222222

223223
@Test def importGivenByType: Unit = {
224-
code"""trait Foo
225-
object Bar
226-
import Bar.{given Fo$m1}"""
224+
code"""|trait Foo
225+
|object Bar
226+
|import Bar.{given Fo$m1}"""
227227
.completion(("Foo", Class, "Foo"))
228228
}
229229

230230
@Test def markDeprecatedSymbols: Unit = {
231-
code"""object Foo {
232-
@deprecated
233-
val bar = 0
234-
}
235-
import Foo.ba${m1}"""
231+
code"""|object Foo {
232+
| @deprecated
233+
| val bar = 0
234+
|}
235+
|import Foo.ba${m1}"""
236236
.completion(results => {
237237
assertEquals(1, results.size)
238238
val result = results.head
@@ -294,11 +294,11 @@ class CompletionTest {
294294
}
295295

296296
@Test def completionOnRenamedImport2: Unit = {
297-
code"""import java.util.{HashMap => MyImportedSymbol}
298-
trait Foo {
299-
import java.io.{FileDescriptor => MyImportedSymbol}
300-
val x: MyImp${m1}
301-
}"""
297+
code"""|import java.util.{HashMap => MyImportedSymbol}
298+
|trait Foo {
299+
| import java.io.{FileDescriptor => MyImportedSymbol}
300+
| val x: MyImp${m1}
301+
|}"""
302302
.completion(
303303
("MyImportedSymbol", Class, "java.io.FileDescriptor"),
304304
("MyImportedSymbol", Module, "java.io.FileDescriptor"),

0 commit comments

Comments
 (0)