@@ -3066,8 +3066,8 @@ object Parsers {
3066
3066
3067
3067
type ImportConstr = (Tree , List [ImportSelector ]) => Tree
3068
3068
3069
- /** Import ::= `import' [`given'] [ ImportExpr {`,' ImportExpr}
3070
- * Export ::= `export' [`given'] [ ImportExpr {`,' ImportExpr}
3069
+ /** Import ::= `import' ImportExpr {‘,’ ImportExpr}
3070
+ * Export ::= `export' ImportExpr {‘,’ ImportExpr}
3071
3071
*/
3072
3072
def importClause (leading : Token , mkTree : ImportConstr ): List [Tree ] = {
3073
3073
val offset = accept(leading)
@@ -3101,48 +3101,49 @@ object Parsers {
3101
3101
ctx.compilationUnit.sourceVersion = Some (SourceVersion .valueOf(imported.toString))
3102
3102
Import (tree, selectors)
3103
3103
3104
- /** ImportExpr ::= SimpleRef {‘.’ id} ‘.’ ImportSpec
3105
- * ImportSpec ::= id
3106
- * | ‘_’
3107
- * | ‘given’
3108
- * | ‘{’ ImportSelectors) ‘}’
3109
- */
3110
- def importExpr (mkTree : ImportConstr ): () => Tree = {
3111
-
3112
- /** '_' */
3113
- def wildcardSelectorId () = atSpan(in.skipToken()) { Ident (nme.WILDCARD ) }
3114
- def givenSelectorId (start : Offset ) = atSpan(start) { Ident (nme.EMPTY ) }
3104
+ /** ImportExpr ::= SimpleRef {‘.’ id} ‘.’ ImportSpec
3105
+ * | SimpleRef ‘as’ id
3106
+ * ImportSpec ::= NamedSelector
3107
+ * | WildcardSelector
3108
+ * | ‘{’ ImportSelectors) ‘}’
3109
+ * ImportSelectors ::= NamedSelector [‘,’ ImportSelectors]
3110
+ * | WildCardSelector {‘,’ WildCardSelector}
3111
+ * NamedSelector ::= id [‘as’ (id | ‘_’)]
3112
+ * WildCardSelector ::= ‘*' | ‘given’ [InfixType]
3113
+ */
3114
+ def importExpr (mkTree : ImportConstr ): () => Tree =
3115
+
3116
+ /** ‘*' | ‘_' */
3117
+ def wildcardSelector () =
3118
+ ImportSelector (atSpan(in.skipToken()) { Ident (nme.WILDCARD ) })
3119
+
3120
+ /** 'given [InfixType]' */
3121
+ def givenSelector () =
3122
+ ImportSelector (
3123
+ atSpan(in.skipToken()) { Ident (nme.EMPTY )},
3124
+ bound =
3125
+ if canStartTypeTokens.contains(in.token) then rejectWildcardType(infixType())
3126
+ else EmptyTree )
3127
+
3128
+ /** id [‘as’ (id | ‘_’) */
3129
+ def namedSelector (from : Ident ) =
3130
+ if in.token == ARROW || isIdent(nme.as) then
3131
+ atSpan(startOffset(from), in.skipToken()) {
3132
+ val to = if in.token == USCORE then wildcardIdent() else termIdent()
3133
+ ImportSelector (from, if to.name == nme.ERROR then EmptyTree else to)
3134
+ }
3135
+ else ImportSelector (from)
3115
3136
3116
- /** ImportSelectors ::= id [‘=>’ id | ‘=>’ ‘_’] [‘,’ ImportSelectors]
3117
- * | WildCardSelector {‘,’ WildCardSelector}
3118
- * WildCardSelector ::= ‘given’ [InfixType]
3119
- * | ‘_'
3120
- */
3121
3137
def importSelectors (idOK : Boolean ): List [ImportSelector ] =
3122
- val isWildcard = in.token == USCORE || in.token == GIVEN
3138
+ val isWildcard = in.token == USCORE || in.token == GIVEN || isIdent(nme.raw. STAR )
3123
3139
val selector = atSpan(in.offset) {
3124
3140
in.token match
3125
- case USCORE =>
3126
- ImportSelector (wildcardSelectorId())
3127
- case GIVEN =>
3128
- val start = in.skipToken()
3129
- if in.token == USCORE then
3130
- deprecationWarning(em " `given _` is deprecated in imports; replace with just `given` " , start)
3131
- in.nextToken()
3132
- ImportSelector (givenSelectorId(start)) // Let the selector span all of `given`; needed for -Ytest-pickler
3133
- else if canStartTypeTokens.contains(in.token) then
3134
- ImportSelector (givenSelectorId(start), bound = rejectWildcardType(infixType()))
3135
- else
3136
- ImportSelector (givenSelectorId(start))
3141
+ case USCORE => wildcardSelector()
3142
+ case GIVEN => givenSelector()
3137
3143
case _ =>
3138
- val from = termIdent()
3139
3144
if ! idOK then syntaxError(i " named imports cannot follow wildcard imports " )
3140
- if in.token == ARROW then
3141
- atSpan(startOffset(from), in.skipToken()) {
3142
- val to = if in.token == USCORE then wildcardIdent() else termIdent()
3143
- ImportSelector (from, if to.name == nme.ERROR then EmptyTree else to)
3144
- }
3145
- else ImportSelector (from)
3145
+ if isIdent(nme.raw.STAR ) then wildcardSelector()
3146
+ else namedSelector(termIdent())
3146
3147
}
3147
3148
val rest =
3148
3149
if in.token == COMMA then
@@ -3153,26 +3154,36 @@ object Parsers {
3153
3154
selector :: rest
3154
3155
3155
3156
def importSelection (qual : Tree ): Tree =
3156
- accept(DOT )
3157
- in.token match
3158
- case USCORE =>
3159
- mkTree(qual, ImportSelector (wildcardSelectorId()) :: Nil )
3160
- case GIVEN =>
3161
- mkTree(qual, ImportSelector (givenSelectorId(in.skipToken())) :: Nil )
3162
- case LBRACE =>
3163
- mkTree(qual, inBraces(importSelectors(idOK = true )))
3164
- case _ =>
3165
- val start = in.offset
3166
- val name = ident()
3167
- if in.token == DOT then
3168
- importSelection(atSpan(startOffset(qual), start) { Select (qual, name) })
3169
- else
3170
- atSpan(startOffset(qual)) {
3171
- mkTree(qual, ImportSelector (atSpan(start) { Ident (name) }) :: Nil )
3172
- }
3173
-
3174
- () => importSelection(simpleRef())
3175
- }
3157
+ if in.isIdent(nme.as) && qual.isInstanceOf [RefTree ] then
3158
+ qual match
3159
+ case Select (qual1, name) =>
3160
+ val from = Ident (name).withSpan(Span (qual.span.point, qual.span.end, 0 ))
3161
+ mkTree(qual1, namedSelector(from) :: Nil )
3162
+ case qual : Ident =>
3163
+ mkTree(EmptyTree , namedSelector(qual) :: Nil )
3164
+ else
3165
+ accept(DOT )
3166
+ in.token match
3167
+ case USCORE =>
3168
+ mkTree(qual, wildcardSelector() :: Nil )
3169
+ case GIVEN =>
3170
+ mkTree(qual, givenSelector() :: Nil )
3171
+ case LBRACE =>
3172
+ mkTree(qual, inBraces(importSelectors(idOK = true )))
3173
+ case _ =>
3174
+ if isIdent(nme.raw.STAR ) then
3175
+ mkTree(qual, wildcardSelector() :: Nil )
3176
+ else
3177
+ val start = in.offset
3178
+ val name = ident()
3179
+ if in.token == DOT then
3180
+ importSelection(atSpan(startOffset(qual), start) { Select (qual, name) })
3181
+ else
3182
+ mkTree(qual, namedSelector(atSpan(start) { Ident (name) }) :: Nil )
3183
+ end importSelection
3184
+
3185
+ () => atSpan(in.offset) { importSelection(simpleRef()) }
3186
+ end importExpr
3176
3187
3177
3188
/** Def ::= val PatDef
3178
3189
* | var VarDef
0 commit comments