@@ -12,6 +12,7 @@ import Scanners.Offset
12
12
import Parsers .*
13
13
import core .*
14
14
import Contexts .*
15
+ import Symbols .defn
15
16
import Names .*
16
17
import Types .*
17
18
import ast .Trees .*
@@ -27,6 +28,9 @@ object JavaParsers {
27
28
28
29
import ast .untpd .*
29
30
31
+
32
+ val fakeFlags = Flags .JavaDefined | Flags .PrivateLocal | Flags .Invisible
33
+
30
34
class JavaParser (source : SourceFile )(using Context ) extends ParserCommon (source) {
31
35
32
36
val definitions : Definitions = ctx.definitions
@@ -89,16 +93,16 @@ object JavaParsers {
89
93
90
94
// --------- tree building -----------------------------
91
95
92
- def scalaAnnotationDot (name : Name ): Select = Select (scalaDot(nme.annotation), name)
93
-
94
96
def javaDot (name : Name ): Tree =
95
97
Select (rootDot(nme.java), name)
96
98
97
99
def javaLangDot (name : Name ): Tree =
98
100
Select (javaDot(nme.lang), name)
99
101
100
- /** Tree representing `java.lang.Object` */
101
- def javaLangObject (): Tree = javaLangDot(tpnme.Object )
102
+ /** Synthetic tree representing `java.lang.Object`.
103
+ * The typer will type all references to `java.lang.Object` as `FromJavaObject`.
104
+ */
105
+ def ObjectTpt (): Tree = TypeTree (defn.FromJavaObjectType ) // javaLangDot(tpnme.Object)
102
106
103
107
/** Tree representing `java.lang.Record` */
104
108
def javaLangRecord (): Tree = javaLangDot(tpnme.Record )
@@ -107,6 +111,8 @@ object JavaParsers {
107
111
AppliedTypeTree (scalaDot(tpnme.Array ), List (tpt))
108
112
109
113
def makeTemplate (parents : List [Tree ], stats : List [Tree ], tparams : List [TypeDef ], needsDummyConstr : Boolean ): Template = {
114
+ def UnitTpt (): Tree = TypeTree (defn.UnitType )
115
+
110
116
def pullOutFirstConstr (stats : List [Tree ]): (Tree , List [Tree ]) = stats match {
111
117
case (meth : DefDef ) :: rest if meth.name == nme.CONSTRUCTOR => (meth, rest)
112
118
case first :: rest =>
@@ -120,10 +126,9 @@ object JavaParsers {
120
126
// can call it.
121
127
// This also avoids clashes between the constructor parameter names and member names.
122
128
if (needsDummyConstr) {
123
- val fakeFlags = Flags .JavaDefined | Flags .PrivateLocal | Flags .Invisible
124
129
if (constr1 == EmptyTree ) constr1 = makeConstructor(List (), Nil , Parsers .unimplementedExpr)
125
130
stats1 = constr1 :: stats1
126
- constr1 = makeConstructor(List (scalaDot(tpnme. Unit )), tparams, EmptyTree , fakeFlags)
131
+ constr1 = makeConstructor(List (UnitTpt ( )), tparams, EmptyTree , fakeFlags)
127
132
}
128
133
else if (constr1 == EmptyTree ) {
129
134
constr1 = makeConstructor(List (), tparams, EmptyTree )
@@ -134,11 +139,11 @@ object JavaParsers {
134
139
def makeSyntheticParam (count : Int , tpt : Tree ): ValDef =
135
140
makeParam(nme.syntheticParamName(count), tpt)
136
141
def makeParam (name : TermName , tpt : Tree ): ValDef =
137
- ValDef (name, tpt, EmptyTree ).withMods( Modifiers ( Flags .JavaDefined | Flags .Param ) )
142
+ ValDef (name, tpt, EmptyTree ).withFlags( Flags .JavaDefined | Flags .Param )
138
143
139
144
def makeConstructor (formals : List [Tree ], tparams : List [TypeDef ], body : Tree , flags : FlagSet = Flags .JavaDefined ): DefDef = {
140
- val vparams = formals.zipWithIndex.map { case (p, i) => makeSyntheticParam(i + 1 , p).withMods( Modifiers ( flags) ) }
141
- DefDef (nme.CONSTRUCTOR , joinParams(tparams, List (vparams)), TypeTree (), body).withMods( Modifiers ( flags) )
145
+ val vparams = formals.zipWithIndex.map { case (p, i) => makeSyntheticParam(i + 1 , p).withAddedFlags( flags) }
146
+ DefDef (nme.CONSTRUCTOR , joinParams(tparams, List (vparams)), TypeTree (), body).withFlags( flags)
142
147
}
143
148
144
149
// ------------- general parsing ---------------------------
@@ -307,7 +312,7 @@ object JavaParsers {
307
312
if (in.token == QMARK ) {
308
313
val offset = in.offset
309
314
in.nextToken()
310
- val hi = if (in.token == EXTENDS ) { in.nextToken() ; typ() } else javaLangObject ()
315
+ val hi = if (in.token == EXTENDS ) { in.nextToken() ; typ() } else ObjectTpt ()
311
316
val lo = if (in.token == SUPER ) { in.nextToken() ; typ() } else EmptyTree
312
317
atSpan(offset) {
313
318
/*
@@ -508,7 +513,7 @@ object JavaParsers {
508
513
atSpan(in.offset) {
509
514
annotations()
510
515
val name = identForType()
511
- val hi = if (in.token == EXTENDS ) { in.nextToken() ; bound() } else javaLangObject ()
516
+ val hi = if (in.token == EXTENDS ) { in.nextToken() ; bound() } else ObjectTpt ()
512
517
TypeDef (name, TypeBoundsTree (EmptyTree , hi)).withMods(Modifiers (flags))
513
518
}
514
519
@@ -569,7 +574,7 @@ object JavaParsers {
569
574
if in.token == IDENTIFIER && in.name == jnme.RECORDid then
570
575
in.token = RECORD
571
576
572
- def termDecl (start : Offset , mods : Modifiers , parentToken : Int , parentTParams : List [ TypeDef ] ): List [Tree ] = {
577
+ def termDecl (start : Offset , mods : Modifiers , parentToken : Int ): List [Tree ] = {
573
578
val inInterface = definesInterface(parentToken)
574
579
val tparams = if (in.token == LT ) typeParams(Flags .JavaDefined | Flags .Param ) else List ()
575
580
val isVoid = in.token == VOID
@@ -741,11 +746,11 @@ object JavaParsers {
741
746
ValDef (name, tpt2, if (mods.is(Flags .Param )) EmptyTree else unimplementedExpr).withMods(mods1)
742
747
}
743
748
744
- def memberDecl (start : Offset , mods : Modifiers , parentToken : Int , parentTParams : List [ TypeDef ] ): List [Tree ] = in.token match
749
+ def memberDecl (start : Offset , mods : Modifiers , parentToken : Int ): List [Tree ] = in.token match
745
750
case CLASS | ENUM | RECORD | INTERFACE | AT =>
746
751
typeDecl(start, if definesInterface(parentToken) then mods | Flags .JavaStatic else mods)
747
752
case _ =>
748
- termDecl(start, mods, parentToken, parentTParams )
753
+ termDecl(start, mods, parentToken)
749
754
750
755
def makeCompanionObject (cdef : TypeDef , statics : List [Tree ]): Tree =
751
756
atSpan(cdef.span) {
@@ -818,9 +823,9 @@ object JavaParsers {
818
823
typ()
819
824
}
820
825
else
821
- javaLangObject ()
826
+ ObjectTpt ()
822
827
val interfaces = interfacesOpt()
823
- val (statics, body) = typeBody(CLASS , name, tparams )
828
+ val (statics, body) = typeBody(CLASS , name)
824
829
val cls = atSpan(start, nameOffset) {
825
830
TypeDef (name, makeTemplate(superclass :: interfaces, body, tparams, needsDummyConstr = true )).withMods(mods)
826
831
}
@@ -835,7 +840,7 @@ object JavaParsers {
835
840
val header = formalParams()
836
841
val superclass = javaLangRecord() // records always extend java.lang.Record
837
842
val interfaces = interfacesOpt() // records may implement interfaces
838
- val (statics, body) = typeBody(RECORD , name, tparams )
843
+ val (statics, body) = typeBody(RECORD , name)
839
844
840
845
// We need to generate accessors for every param, if no method with the same name is already defined
841
846
@@ -883,8 +888,8 @@ object JavaParsers {
883
888
repsep(() => typ(), COMMA )
884
889
}
885
890
else
886
- List (javaLangObject ())
887
- val (statics, body) = typeBody(INTERFACE , name, tparams )
891
+ List (ObjectTpt ())
892
+ val (statics, body) = typeBody(INTERFACE , name)
888
893
val iface = atSpan(start, nameOffset) {
889
894
TypeDef (
890
895
name,
@@ -893,14 +898,14 @@ object JavaParsers {
893
898
addCompanionObject(statics, iface)
894
899
}
895
900
896
- def typeBody (leadingToken : Int , parentName : Name , parentTParams : List [ TypeDef ] ): (List [Tree ], List [Tree ]) = {
901
+ def typeBody (leadingToken : Int , parentName : Name ): (List [Tree ], List [Tree ]) = {
897
902
accept(LBRACE )
898
- val defs = typeBodyDecls(leadingToken, parentName, parentTParams )
903
+ val defs = typeBodyDecls(leadingToken, parentName)
899
904
accept(RBRACE )
900
905
defs
901
906
}
902
907
903
- def typeBodyDecls (parentToken : Int , parentName : Name , parentTParams : List [ TypeDef ] ): (List [Tree ], List [Tree ]) = {
908
+ def typeBodyDecls (parentToken : Int , parentName : Name ): (List [Tree ], List [Tree ]) = {
904
909
val inInterface = definesInterface(parentToken)
905
910
val statics = new ListBuffer [Tree ]
906
911
val members = new ListBuffer [Tree ]
@@ -916,7 +921,7 @@ object JavaParsers {
916
921
else {
917
922
adaptRecordIdentifier()
918
923
if (in.token == ENUM || in.token == RECORD || definesInterface(in.token)) mods |= Flags .JavaStatic
919
- val decls = memberDecl(start, mods, parentToken, parentTParams )
924
+ val decls = memberDecl(start, mods, parentToken)
920
925
(if (mods.is(Flags .JavaStatic ) || inInterface && ! (decls exists (_.isInstanceOf [DefDef ])))
921
926
statics
922
927
else
@@ -926,15 +931,15 @@ object JavaParsers {
926
931
(statics.toList, members.toList)
927
932
}
928
933
def annotationParents : List [Tree ] = List (
929
- javaLangObject (),
934
+ ObjectTpt (),
930
935
Select (javaLangDot(nme.annotation), tpnme.Annotation )
931
936
)
932
937
def annotationDecl (start : Offset , mods : Modifiers ): List [Tree ] = {
933
938
accept(AT )
934
939
accept(INTERFACE )
935
940
val nameOffset = in.offset
936
941
val name = identForType()
937
- val (statics, body) = typeBody(AT , name, List () )
942
+ val (statics, body) = typeBody(AT , name)
938
943
val constructorParams = body.collect {
939
944
case dd : DefDef =>
940
945
makeParam(dd.name, dd.tpt)
@@ -969,7 +974,7 @@ object JavaParsers {
969
974
val (statics, body) =
970
975
if (in.token == SEMI ) {
971
976
in.nextToken()
972
- typeBodyDecls(ENUM , name, List () )
977
+ typeBodyDecls(ENUM , name)
973
978
}
974
979
else
975
980
(List (), List ())
@@ -1093,7 +1098,7 @@ object JavaParsers {
1093
1098
*/
1094
1099
class OutlineJavaParser (source : SourceFile )(using Context ) extends JavaParser (source) with OutlineParserCommon {
1095
1100
override def skipBracesHook (): Option [Tree ] = None
1096
- override def typeBody (leadingToken : Int , parentName : Name , parentTParams : List [ TypeDef ] ): (List [Tree ], List [Tree ]) = {
1101
+ override def typeBody (leadingToken : Int , parentName : Name ): (List [Tree ], List [Tree ]) = {
1097
1102
skipBraces()
1098
1103
(List (EmptyValDef ), List (EmptyTree ))
1099
1104
}
0 commit comments