@@ -1636,6 +1636,7 @@ object Parsers {
16361636 * | TypTypeParamClause ‘=>>’ Type
16371637 * | FunParamClause ‘=>>’ Type
16381638 * | MatchType
1639+ * | QualifiedType2 -- under qualifiedTypes
16391640 * | InfixType
16401641 * FunType ::= (MonoFunType | PolyFunType)
16411642 * MonoFunType ::= FunTypeArgs (‘=>’ | ‘?=>’) Type
@@ -1646,6 +1647,11 @@ object Parsers {
16461647 * | `(' [ FunArgType {`,' FunArgType } ] `)'
16471648 * | '(' [ TypedFunParam {',' TypedFunParam } ')'
16481649 * MatchType ::= InfixType `match` <<< TypeCaseClauses >>>
1650+ * QualifiedType2 ::= InfixType `with` PostfixExprf
1651+ * IntoType ::= [‘into’] IntoTargetType
1652+ * | ‘( IntoType ‘)’
1653+ * IntoTargetType ::= Type
1654+ * | FunTypeArgs (‘=>’ | ‘?=>’) IntoType
16491655 */
16501656 def typ (inContextBound : Boolean = false ): Tree =
16511657 val start = in.offset
@@ -1705,6 +1711,8 @@ object Parsers {
17051711 functionRest(t :: Nil )
17061712 case MATCH =>
17071713 matchType(t)
1714+ case WITH if in.featureEnabled(Feature .qualifiedTypes) =>
1715+ qualifiedTypeShort(t)
17081716 case FORSOME =>
17091717 syntaxError(ExistentialTypesNoLongerSupported ())
17101718 t
@@ -1839,6 +1847,7 @@ object Parsers {
18391847 def funParamClauses (): List [List [ValDef ]] =
18401848 if in.token == LPAREN then funParamClause() :: funParamClauses() else Nil
18411849
1850+
18421851 /** InfixType ::= RefinedType {id [nl] RefinedType}
18431852 * | RefinedType `^` -- under captureChecking
18441853 */
@@ -1893,22 +1902,12 @@ object Parsers {
18931902 t
18941903 }
18951904
1896- /** With qualifiedTypes enabled:
1897- * WithType ::= AnnotType [`with' PostfixExpr]
1898- *
1899- * Otherwise:
1900- * WithType ::= AnnotType {`with' AnnotType} (deprecated)
1901- */
1905+ /** WithType ::= AnnotType {`with' AnnotType} (deprecated)
1906+ */
19021907 def withType (): Tree = withTypeRest(annotType())
19031908
19041909 def withTypeRest (t : Tree ): Tree =
1905- if in.featureEnabled(Feature .qualifiedTypes) && in.token == WITH then
1906- if inQualifiedType then t
1907- else
1908- in.nextToken()
1909- val qualifier = postfixExpr()
1910- QualifiedTypeTree (t, None , qualifier).withSpan(Span (t.span.start, qualifier.span.end))
1911- else if in.token == WITH then
1910+ if in.token == WITH && ! in.featureEnabled(Feature .qualifiedTypes) then
19121911 val withOffset = in.offset
19131912 in.nextToken()
19141913 if in.token == LBRACE || in.token == INDENT then
@@ -2247,6 +2246,17 @@ object Parsers {
22472246 accept(RBRACE )
22482247 QualifiedTypeTree (tp, Some (id), qualifier).withSpan(Span (startOffset, qualifier.span.end))
22492248
2249+ /** `with` PostfixExpr
2250+ */
2251+ def qualifiedTypeShort (t : Tree ): Tree =
2252+ if inQualifiedType then
2253+ t
2254+ else
2255+ accept(WITH )
2256+ val qualifier = postfixExpr()
2257+ QualifiedTypeTree (t, None , qualifier).withSpan(Span (t.span.start, qualifier.span.end))
2258+
2259+
22502260 /** TypeBounds ::= [`>:' TypeBound ] [`<:' TypeBound ]
22512261 * TypeBound ::= Type
22522262 * | CaptureSet -- under captureChecking
@@ -2323,7 +2333,12 @@ object Parsers {
23232333
23242334 def typeDependingOn (location : Location ): Tree =
23252335 if location.inParens then typ()
2326- else if location.inPattern then rejectWildcardType(refinedType())
2336+ else if location.inPattern then
2337+ val t = rejectWildcardType(refinedType())
2338+ if in.featureEnabled(Feature .qualifiedTypes) && in.token == WITH then
2339+ qualifiedTypeShort(t)
2340+ else
2341+ t
23272342 else infixType()
23282343
23292344/* ----------- EXPRESSIONS ------------------------------------------------ */
@@ -3165,10 +3180,11 @@ object Parsers {
31653180 if (isIdent(nme.raw.BAR )) { in.nextToken(); pattern1(location) :: patternAlts(location) }
31663181 else Nil
31673182
3168- /** Pattern1 ::= PatVar `:` RefinedType
3169- * | [‘-’] integerLiteral `:` RefinedType
3170- * | [‘-’] floatingPointLiteral `:` RefinedType
3171- * | Pattern2
3183+ /** Pattern1 ::= PatVar `:` QualifiedType3
3184+ * | [‘-’] integerLiteral `:` QualifiedType3
3185+ * | [‘-’] floatingPointLiteral `:` QualifiedType3
3186+ * | Pattern2
3187+ * QualifiedType3 ::= RefinedType [`with` PostfixExpr]
31723188 */
31733189 def pattern1 (location : Location = Location .InPattern ): Tree =
31743190 val p = pattern2(location)
0 commit comments