@@ -423,6 +423,19 @@ object Parsers {
423
423
case _ => false
424
424
}
425
425
426
+ def isWildcardType (t : Tree ): Boolean = t match {
427
+ case t : TypeBoundsTree => true
428
+ case Parens (t1) => isWildcardType(t1)
429
+ case _ => false
430
+ }
431
+
432
+ def rejectWildcardType (t : Tree , fallbackTree : Tree = scalaAny): Tree =
433
+ if (isWildcardType(t)) {
434
+ syntaxError(UnboundWildcardType (), t.span)
435
+ fallbackTree
436
+ }
437
+ else t
438
+
426
439
/* -------------- XML ---------------------------------------------------- */
427
440
428
441
/** the markup parser */
@@ -768,7 +781,7 @@ object Parsers {
768
781
/** Same as [[typ ]], but if this results in a wildcard it emits a syntax error and
769
782
* returns a tree for type `Any` instead.
770
783
*/
771
- def toplevelTyp (): Tree = checkWildcard (typ())
784
+ def toplevelTyp (): Tree = rejectWildcardType (typ())
772
785
773
786
/** Type ::= FunTypeMods FunArgTypes `=>' Type
774
787
* | HkTypeParamClause `->' Type
@@ -885,7 +898,7 @@ object Parsers {
885
898
886
899
def refinedTypeRest (t : Tree ): Tree = {
887
900
newLineOptWhenFollowedBy(LBRACE )
888
- if (in.token == LBRACE ) refinedTypeRest(atSpan(startOffset(t)) { RefinedTypeTree (checkWildcard (t), refinement()) })
901
+ if (in.token == LBRACE ) refinedTypeRest(atSpan(startOffset(t)) { RefinedTypeTree (rejectWildcardType (t), refinement()) })
889
902
else t
890
903
}
891
904
@@ -907,7 +920,10 @@ object Parsers {
907
920
def annotType (): Tree = annotTypeRest(simpleType())
908
921
909
922
def annotTypeRest (t : Tree ): Tree =
910
- if (in.token == AT ) annotTypeRest(atSpan(startOffset(t)) { Annotated (t, annot()) })
923
+ if (in.token == AT )
924
+ annotTypeRest(atSpan(startOffset(t)) {
925
+ Annotated (rejectWildcardType(t), annot())
926
+ })
911
927
else t
912
928
913
929
/** SimpleType ::= SimpleType TypeArgs
@@ -949,7 +965,7 @@ object Parsers {
949
965
private def simpleTypeRest (t : Tree ): Tree = in.token match {
950
966
case HASH => simpleTypeRest(typeProjection(t))
951
967
case LBRACKET => simpleTypeRest(atSpan(startOffset(t)) {
952
- AppliedTypeTree (checkWildcard (t), typeArgs(namedOK = false , wildOK = true )) })
968
+ AppliedTypeTree (rejectWildcardType (t), typeArgs(namedOK = false , wildOK = true )) })
953
969
case _ => t
954
970
}
955
971
@@ -959,18 +975,23 @@ object Parsers {
959
975
atSpan(startOffset(t), startOffset(id)) { Select (t, id.name) }
960
976
}
961
977
962
- /** NamedTypeArg ::= id `=' Type
963
- */
964
- val namedTypeArg : () => NamedArg = () => {
965
- val name = ident()
966
- accept(EQUALS )
967
- NamedArg (name.toTypeName, typ())
968
- }
969
-
970
978
/** ArgTypes ::= Type {`,' Type}
971
979
* | NamedTypeArg {`,' NamedTypeArg}
980
+ * NamedTypeArg ::= id `=' Type
972
981
*/
973
982
def argTypes (namedOK : Boolean , wildOK : Boolean ): List [Tree ] = {
983
+
984
+ def argType () = {
985
+ val t = typ()
986
+ if (wildOK) t else rejectWildcardType(t)
987
+ }
988
+
989
+ def namedTypeArg () = {
990
+ val name = ident()
991
+ accept(EQUALS )
992
+ NamedArg (name.toTypeName, argType())
993
+ }
994
+
974
995
def otherArgs (first : Tree , arg : () => Tree ): List [Tree ] = {
975
996
val rest =
976
997
if (in.token == COMMA ) {
@@ -980,16 +1001,15 @@ object Parsers {
980
1001
else Nil
981
1002
first :: rest
982
1003
}
983
- def typParser () = checkWildcard(typ(), wildOK)
984
1004
if (namedOK && in.token == IDENTIFIER )
985
- typParser () match {
1005
+ argType () match {
986
1006
case Ident (name) if in.token == EQUALS =>
987
1007
in.nextToken()
988
- otherArgs(NamedArg (name, typ ()), namedTypeArg)
1008
+ otherArgs(NamedArg (name, argType ()), () => namedTypeArg() )
989
1009
case firstArg =>
990
- otherArgs(firstArg, () => typ ())
1010
+ otherArgs(firstArg, () => argType ())
991
1011
}
992
- else commaSeparated(() => typParser ())
1012
+ else commaSeparated(() => argType ())
993
1013
}
994
1014
995
1015
/** FunArgType ::= Type | `=>' Type
@@ -1064,33 +1084,6 @@ object Parsers {
1064
1084
else if (location == Location .InPattern ) refinedType()
1065
1085
else infixType()
1066
1086
1067
- /** Checks whether `t` represents a non-value type (wildcard types, or ByNameTypeTree).
1068
- * If it is, returns the [[Tree ]] which immediately represents the non-value type.
1069
- */
1070
- @ tailrec
1071
- private final def findNonValueTypeTree (t : Tree , alsoNonValue : Boolean ): Option [Tree ] = t match {
1072
- case TypeBoundsTree (_, _) => Some (t)
1073
- case ByNameTypeTree (_) if alsoNonValue => Some (t)
1074
- case Parens (t1) => findNonValueTypeTree(t1, alsoNonValue)
1075
- case Annotated (t1, _) => findNonValueTypeTree(t1, alsoNonValue)
1076
- case _ => None
1077
- }
1078
-
1079
- def rejectWildcard (t : Tree , fallbackTree : Tree ): Tree =
1080
- findNonValueTypeTree(t, false ) match {
1081
- case Some (wildcardTree) =>
1082
- syntaxError(UnboundWildcardType (), wildcardTree.span)
1083
- fallbackTree
1084
- case None => t
1085
- }
1086
-
1087
-
1088
- def checkWildcard (t : Tree , wildOK : Boolean = false , fallbackTree : Tree = scalaAny): Tree =
1089
- if (wildOK)
1090
- t
1091
- else
1092
- rejectWildcard(t, fallbackTree)
1093
-
1094
1087
/* ----------- EXPRESSIONS ------------------------------------------------ */
1095
1088
1096
1089
/** EqualsExpr ::= `=' Expr
@@ -2567,7 +2560,7 @@ object Parsers {
2567
2560
*/
2568
2561
val constrApp : () => Tree = () => {
2569
2562
// Using Ident(nme.ERROR) to avoid causing cascade errors on non-user-written code
2570
- val t = checkWildcard (annotType(), fallbackTree = Ident (nme.ERROR ))
2563
+ val t = rejectWildcardType (annotType(), fallbackTree = Ident (nme.ERROR ))
2571
2564
if (in.token == LPAREN ) parArgumentExprss(wrapNew(t))
2572
2565
else t
2573
2566
}
0 commit comments