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