@@ -90,29 +90,22 @@ object Completion:
90
90
91
91
val completionSymbolKind : Mode =
92
92
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
96
99
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
100
101
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
104
105
105
- case (_ : untpd.ImportOrExport ) :: _ => Mode .ImportOrExport
106
106
case _ => Mode .None
107
107
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
116
109
117
110
/** When dealing with <errors> in varios palces we check to see if they are
118
111
* due to incomplete backticks. If so, we ensure we get the full prefix
@@ -141,18 +134,11 @@ object Completion:
141
134
i + 1
142
135
143
136
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
149
140
else completionPrefix(sel.imported :: Nil , pos)
150
141
151
- case (tree : untpd.ImportOrExport ) :: _ =>
152
- tree.selectors.find(_.span.contains(pos.span)).map: selector =>
153
- completionPrefix(selector :: Nil , pos)
154
- .getOrElse(" " )
155
-
156
142
// Foo.`se<TAB> will result in Select(Ident(Foo), <error>)
157
143
case (select : untpd.Select ) :: _ if select.name == nme.ERROR =>
158
144
checkBacktickPrefix(select.source.content(), select.nameSpan.start, select.span.end)
@@ -169,6 +155,20 @@ object Completion:
169
155
170
156
end completionPrefix
171
157
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
+
172
172
/** Inspect `path` to determine the offset where the completion result should be inserted. */
173
173
def completionOffset (untpdPath : List [untpd.Tree ]): Int =
174
174
untpdPath match
@@ -211,7 +211,6 @@ object Completion:
211
211
case tpd.Select (qual, _) :: _ if qual.typeOpt.hasSimpleKind => completer.selectionCompletions(qual)
212
212
case tpd.Select (qual, _) :: _ => Map .empty
213
213
case (tree : tpd.ImportOrExport ) :: _ => completer.directMemberCompletions(tree.expr)
214
- case (_ : untpd.ImportSelector ) :: tpd.Import (expr, _) :: _ => completer.directMemberCompletions(expr)
215
214
case _ => completer.scopeCompletions
216
215
217
216
interactiv.println(i """ completion info with pos = $pos,
0 commit comments