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