@@ -3066,8 +3066,8 @@ object Parsers {
30663066
30673067 type ImportConstr = (Tree , List [ImportSelector ]) => Tree
30683068
3069- /** Import ::= `import' [`given'] [ ImportExpr {`,' ImportExpr}
3070- * Export ::= `export' [`given'] [ ImportExpr {`,' ImportExpr}
3069+ /** Import ::= `import' ImportExpr {‘,’ ImportExpr}
3070+ * Export ::= `export' ImportExpr {‘,’ ImportExpr}
30713071 */
30723072 def importClause (leading : Token , mkTree : ImportConstr ): List [Tree ] = {
30733073 val offset = accept(leading)
@@ -3097,48 +3097,49 @@ object Parsers {
30973097 ctx.compilationUnit.sourceVersion = Some (SourceVersion .valueOf(imported.toString))
30983098 Import (tree, selectors)
30993099
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)
31113132
3112- /** ImportSelectors ::= id [‘=>’ id | ‘=>’ ‘_’] [‘,’ ImportSelectors]
3113- * | WildCardSelector {‘,’ WildCardSelector}
3114- * WildCardSelector ::= ‘given’ [InfixType]
3115- * | ‘_'
3116- */
31173133 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 )
31193135 val selector = atSpan(in.offset) {
31203136 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()
31333139 case _ =>
3134- val from = termIdent()
31353140 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())
31423143 }
31433144 val rest =
31443145 if in.token == COMMA then
@@ -3149,26 +3150,36 @@ object Parsers {
31493150 selector :: rest
31503151
31513152 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
31723183
31733184 /** Def ::= val PatDef
31743185 * | var VarDef
0 commit comments