@@ -737,6 +737,7 @@ object Parsers {
737
737
* | StableId
738
738
* | Path `.' type
739
739
* | `(' ArgTypes `)'
740
+ * | `_' TypeBounds
740
741
* | Refinement
741
742
* | Literal
742
743
*/
@@ -746,6 +747,10 @@ object Parsers {
746
747
else if (in.token == LBRACE )
747
748
atPos(in.offset) { RefinedTypeTree (EmptyTree , refinement()) }
748
749
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
+ }
749
754
else path(thisOK = false , handleSingletonType) match {
750
755
case r @ SingletonTypeTree (_) => r
751
756
case r => convertToTypeId(r)
@@ -770,25 +775,16 @@ object Parsers {
770
775
atPos(t.pos.start, id.pos.start) { SelectFromTypeTree (t, id.name) }
771
776
}
772
777
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
783
779
*/
784
780
val namedTypeArg = () => {
785
781
val name = ident()
786
782
accept(EQUALS )
787
- NamedArg (name.toTypeName, argType ())
783
+ NamedArg (name.toTypeName, typ ())
788
784
}
789
785
790
- /** ArgTypes ::= ArgType {`,' ArgType }
791
- * NamedTypeArg {`,' NamedTypeArg}
786
+ /** ArgTypes ::= Type {`,' Type }
787
+ * | NamedTypeArg {`,' NamedTypeArg}
792
788
*/
793
789
def argTypes (namedOK : Boolean = false ) = {
794
790
def otherArgs (first : Tree , arg : () => Tree ): List [Tree ] = {
@@ -801,22 +797,22 @@ object Parsers {
801
797
first :: rest
802
798
}
803
799
if (namedOK && in.token == IDENTIFIER )
804
- argType () match {
800
+ typ () match {
805
801
case Ident (name) if in.token == EQUALS =>
806
802
in.nextToken()
807
- otherArgs(NamedArg (name, argType ()), namedTypeArg)
803
+ otherArgs(NamedArg (name, typ ()), namedTypeArg)
808
804
case firstArg =>
809
805
if (in.token == EQUALS ) println(s " ??? $firstArg" )
810
- otherArgs(firstArg, argType )
806
+ otherArgs(firstArg, typ )
811
807
}
812
- else commaSeparated(argType )
808
+ else commaSeparated(typ )
813
809
}
814
810
815
- /** FunArgType ::= ArgType | `=>' ArgType
811
+ /** FunArgType ::= Type | `=>' Type
816
812
*/
817
813
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 ()
820
816
821
817
/** ParamType ::= [`=>'] ParamValueType
822
818
*/
@@ -834,7 +830,7 @@ object Parsers {
834
830
} else t
835
831
}
836
832
837
- /** TypeArgs ::= `[' ArgType {`,' ArgType } `]'
833
+ /** TypeArgs ::= `[' Type {`,' Type } `]'
838
834
* NamedTypeArgs ::= `[' NamedTypeArg {`,' NamedTypeArg} `]'
839
835
*/
840
836
def typeArgs (namedOK : Boolean = false ): List [Tree ] = inBrackets(argTypes(namedOK))
0 commit comments