Skip to content

Commit 6c38603

Browse files
committed
Fix #1396: Modify parser to allow wildcard types everywhere
1 parent a0ad3f1 commit 6c38603

File tree

2 files changed

+23
-27
lines changed

2 files changed

+23
-27
lines changed

docs/SyntaxSummary.txt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,17 +109,17 @@ grammar.
109109
| StableId
110110
| Path `.' `type' SingletonTypeTree(p)
111111
| `(' ArgTypes ')' Tuple(ts)
112+
| `_' TypeBounds
112113
| Refinement RefinedTypeTree(EmptyTree, refinement)
113114
| SimpleLiteral SingletonTypeTree(l)
114-
ArgType ::= Type
115-
| `_' TypeBounds
116-
ArgTypes ::= ArgType {`,' ArgType}
117-
FunArgType ::= ArgType
118-
| `=>' ArgType PrefixOp(=>, t)
115+
ArgTypes ::= Type {`,' Type}
116+
| NamedTypeArg {`,' NamedTypeArg }
117+
FunArgType ::= Type
118+
| `=>' Type PrefixOp(=>, t)
119119
ParamType ::= [`=>'] ParamValueType
120120
ParamValueType ::= Type [`*'] PostfixOp(t, "*")
121121
TypeArgs ::= `[' ArgTypes `]' ts
122-
NamedTypeArg ::= id `=' ArgType NamedArg(id, t)
122+
NamedTypeArg ::= id `=' Type NamedArg(id, t)
123123
NamedTypeArgs ::= `[' NamedTypeArg {`,' NamedTypeArg} `]' nts
124124
Refinement ::= `{' [Dcl] {semi [Dcl]} `}' ds
125125
TypeBounds ::= [`>:' Type] [`<: Type] | INT TypeBoundsTree(lo, hi)

src/dotty/tools/dotc/parsing/Parsers.scala

Lines changed: 17 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -737,6 +737,7 @@ object Parsers {
737737
* | StableId
738738
* | Path `.' type
739739
* | `(' ArgTypes `)'
740+
* | `_' TypeBounds
740741
* | Refinement
741742
* | Literal
742743
*/
@@ -746,6 +747,10 @@ object Parsers {
746747
else if (in.token == LBRACE)
747748
atPos(in.offset) { RefinedTypeTree(EmptyTree, refinement()) }
748749
else if (isSimpleLiteral) { SingletonTypeTree(literal()) }
750+
else if (in.token == USCORE) {
751+
val start = in.skipToken()
752+
typeBounds().withPos(Position(start, in.offset, start))
753+
}
749754
else path(thisOK = false, handleSingletonType) match {
750755
case r @ SingletonTypeTree(_) => r
751756
case r => convertToTypeId(r)
@@ -770,25 +775,16 @@ object Parsers {
770775
atPos(t.pos.start, id.pos.start) { SelectFromTypeTree(t, id.name) }
771776
}
772777

773-
/** ArgType ::= Type | `_' TypeBounds
774-
*/
775-
val argType = () =>
776-
if (in.token == USCORE) {
777-
val start = in.skipToken()
778-
typeBounds().withPos(Position(start, in.offset, start))
779-
}
780-
else typ()
781-
782-
/** NamedTypeArg ::= id `=' ArgType
778+
/** NamedTypeArg ::= id `=' Type
783779
*/
784780
val namedTypeArg = () => {
785781
val name = ident()
786782
accept(EQUALS)
787-
NamedArg(name.toTypeName, argType())
783+
NamedArg(name.toTypeName, typ())
788784
}
789785

790-
/** ArgTypes ::= ArgType {`,' ArgType}
791-
* NamedTypeArg {`,' NamedTypeArg}
786+
/** ArgTypes ::= Type {`,' Type}
787+
* | NamedTypeArg {`,' NamedTypeArg}
792788
*/
793789
def argTypes(namedOK: Boolean = false) = {
794790
def otherArgs(first: Tree, arg: () => Tree): List[Tree] = {
@@ -801,22 +797,22 @@ object Parsers {
801797
first :: rest
802798
}
803799
if (namedOK && in.token == IDENTIFIER)
804-
argType() match {
800+
typ() match {
805801
case Ident(name) if in.token == EQUALS =>
806802
in.nextToken()
807-
otherArgs(NamedArg(name, argType()), namedTypeArg)
803+
otherArgs(NamedArg(name, typ()), namedTypeArg)
808804
case firstArg =>
809805
if (in.token == EQUALS) println(s"??? $firstArg")
810-
otherArgs(firstArg, argType)
806+
otherArgs(firstArg, typ)
811807
}
812-
else commaSeparated(argType)
808+
else commaSeparated(typ)
813809
}
814810

815-
/** FunArgType ::= ArgType | `=>' ArgType
811+
/** FunArgType ::= Type | `=>' Type
816812
*/
817813
val funArgType = () =>
818-
if (in.token == ARROW) atPos(in.skipToken()) { ByNameTypeTree(argType()) }
819-
else argType()
814+
if (in.token == ARROW) atPos(in.skipToken()) { ByNameTypeTree(typ()) }
815+
else typ()
820816

821817
/** ParamType ::= [`=>'] ParamValueType
822818
*/
@@ -834,7 +830,7 @@ object Parsers {
834830
} else t
835831
}
836832

837-
/** TypeArgs ::= `[' ArgType {`,' ArgType} `]'
833+
/** TypeArgs ::= `[' Type {`,' Type} `]'
838834
* NamedTypeArgs ::= `[' NamedTypeArg {`,' NamedTypeArg} `]'
839835
*/
840836
def typeArgs(namedOK: Boolean = false): List[Tree] = inBrackets(argTypes(namedOK))

0 commit comments

Comments
 (0)