@@ -12,6 +12,7 @@ import Scanners.Offset
1212import Parsers .*
1313import core .*
1414import Contexts .*
15+ import Symbols .defn
1516import Names .*
1617import Types .*
1718import ast .Trees .*
@@ -27,6 +28,9 @@ object JavaParsers {
2728
2829 import ast .untpd .*
2930
31+
32+ val fakeFlags = Flags .JavaDefined | Flags .PrivateLocal | Flags .Invisible
33+
3034 class JavaParser (source : SourceFile )(using Context ) extends ParserCommon (source) {
3135
3236 val definitions : Definitions = ctx.definitions
@@ -89,16 +93,16 @@ object JavaParsers {
8993
9094 // --------- tree building -----------------------------
9195
92- def scalaAnnotationDot (name : Name ): Select = Select (scalaDot(nme.annotation), name)
93-
9496 def javaDot (name : Name ): Tree =
9597 Select (rootDot(nme.java), name)
9698
9799 def javaLangDot (name : Name ): Tree =
98100 Select (javaDot(nme.lang), name)
99101
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)
102106
103107 /** Tree representing `java.lang.Record` */
104108 def javaLangRecord (): Tree = javaLangDot(tpnme.Record )
@@ -107,6 +111,8 @@ object JavaParsers {
107111 AppliedTypeTree (scalaDot(tpnme.Array ), List (tpt))
108112
109113 def makeTemplate (parents : List [Tree ], stats : List [Tree ], tparams : List [TypeDef ], needsDummyConstr : Boolean ): Template = {
114+ def UnitTpt (): Tree = TypeTree (defn.UnitType )
115+
110116 def pullOutFirstConstr (stats : List [Tree ]): (Tree , List [Tree ]) = stats match {
111117 case (meth : DefDef ) :: rest if meth.name == nme.CONSTRUCTOR => (meth, rest)
112118 case first :: rest =>
@@ -120,10 +126,9 @@ object JavaParsers {
120126 // can call it.
121127 // This also avoids clashes between the constructor parameter names and member names.
122128 if (needsDummyConstr) {
123- val fakeFlags = Flags .JavaDefined | Flags .PrivateLocal | Flags .Invisible
124129 if (constr1 == EmptyTree ) constr1 = makeConstructor(List (), Nil , Parsers .unimplementedExpr)
125130 stats1 = constr1 :: stats1
126- constr1 = makeConstructor(List (scalaDot(tpnme. Unit )), tparams, EmptyTree , fakeFlags)
131+ constr1 = makeConstructor(List (UnitTpt ( )), tparams, EmptyTree , fakeFlags)
127132 }
128133 else if (constr1 == EmptyTree ) {
129134 constr1 = makeConstructor(List (), tparams, EmptyTree )
@@ -134,11 +139,11 @@ object JavaParsers {
134139 def makeSyntheticParam (count : Int , tpt : Tree ): ValDef =
135140 makeParam(nme.syntheticParamName(count), tpt)
136141 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 )
138143
139144 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)
142147 }
143148
144149 // ------------- general parsing ---------------------------
@@ -307,7 +312,7 @@ object JavaParsers {
307312 if (in.token == QMARK ) {
308313 val offset = in.offset
309314 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 ()
311316 val lo = if (in.token == SUPER ) { in.nextToken() ; typ() } else EmptyTree
312317 atSpan(offset) {
313318 /*
@@ -508,7 +513,7 @@ object JavaParsers {
508513 atSpan(in.offset) {
509514 annotations()
510515 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 ()
512517 TypeDef (name, TypeBoundsTree (EmptyTree , hi)).withMods(Modifiers (flags))
513518 }
514519
@@ -569,7 +574,7 @@ object JavaParsers {
569574 if in.token == IDENTIFIER && in.name == jnme.RECORDid then
570575 in.token = RECORD
571576
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 ] = {
573578 val inInterface = definesInterface(parentToken)
574579 val tparams = if (in.token == LT ) typeParams(Flags .JavaDefined | Flags .Param ) else List ()
575580 val isVoid = in.token == VOID
@@ -741,11 +746,11 @@ object JavaParsers {
741746 ValDef (name, tpt2, if (mods.is(Flags .Param )) EmptyTree else unimplementedExpr).withMods(mods1)
742747 }
743748
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
745750 case CLASS | ENUM | RECORD | INTERFACE | AT =>
746751 typeDecl(start, if definesInterface(parentToken) then mods | Flags .JavaStatic else mods)
747752 case _ =>
748- termDecl(start, mods, parentToken, parentTParams )
753+ termDecl(start, mods, parentToken)
749754
750755 def makeCompanionObject (cdef : TypeDef , statics : List [Tree ]): Tree =
751756 atSpan(cdef.span) {
@@ -818,9 +823,9 @@ object JavaParsers {
818823 typ()
819824 }
820825 else
821- javaLangObject ()
826+ ObjectTpt ()
822827 val interfaces = interfacesOpt()
823- val (statics, body) = typeBody(CLASS , name, tparams )
828+ val (statics, body) = typeBody(CLASS , name)
824829 val cls = atSpan(start, nameOffset) {
825830 TypeDef (name, makeTemplate(superclass :: interfaces, body, tparams, needsDummyConstr = true )).withMods(mods)
826831 }
@@ -835,7 +840,7 @@ object JavaParsers {
835840 val header = formalParams()
836841 val superclass = javaLangRecord() // records always extend java.lang.Record
837842 val interfaces = interfacesOpt() // records may implement interfaces
838- val (statics, body) = typeBody(RECORD , name, tparams )
843+ val (statics, body) = typeBody(RECORD , name)
839844
840845 // We need to generate accessors for every param, if no method with the same name is already defined
841846
@@ -883,8 +888,8 @@ object JavaParsers {
883888 repsep(() => typ(), COMMA )
884889 }
885890 else
886- List (javaLangObject ())
887- val (statics, body) = typeBody(INTERFACE , name, tparams )
891+ List (ObjectTpt ())
892+ val (statics, body) = typeBody(INTERFACE , name)
888893 val iface = atSpan(start, nameOffset) {
889894 TypeDef (
890895 name,
@@ -893,14 +898,14 @@ object JavaParsers {
893898 addCompanionObject(statics, iface)
894899 }
895900
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 ]) = {
897902 accept(LBRACE )
898- val defs = typeBodyDecls(leadingToken, parentName, parentTParams )
903+ val defs = typeBodyDecls(leadingToken, parentName)
899904 accept(RBRACE )
900905 defs
901906 }
902907
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 ]) = {
904909 val inInterface = definesInterface(parentToken)
905910 val statics = new ListBuffer [Tree ]
906911 val members = new ListBuffer [Tree ]
@@ -916,7 +921,7 @@ object JavaParsers {
916921 else {
917922 adaptRecordIdentifier()
918923 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)
920925 (if (mods.is(Flags .JavaStatic ) || inInterface && ! (decls exists (_.isInstanceOf [DefDef ])))
921926 statics
922927 else
@@ -926,15 +931,15 @@ object JavaParsers {
926931 (statics.toList, members.toList)
927932 }
928933 def annotationParents : List [Tree ] = List (
929- javaLangObject (),
934+ ObjectTpt (),
930935 Select (javaLangDot(nme.annotation), tpnme.Annotation )
931936 )
932937 def annotationDecl (start : Offset , mods : Modifiers ): List [Tree ] = {
933938 accept(AT )
934939 accept(INTERFACE )
935940 val nameOffset = in.offset
936941 val name = identForType()
937- val (statics, body) = typeBody(AT , name, List () )
942+ val (statics, body) = typeBody(AT , name)
938943 val constructorParams = body.collect {
939944 case dd : DefDef =>
940945 makeParam(dd.name, dd.tpt)
@@ -969,7 +974,7 @@ object JavaParsers {
969974 val (statics, body) =
970975 if (in.token == SEMI ) {
971976 in.nextToken()
972- typeBodyDecls(ENUM , name, List () )
977+ typeBodyDecls(ENUM , name)
973978 }
974979 else
975980 (List (), List ())
@@ -1093,7 +1098,7 @@ object JavaParsers {
10931098 */
10941099 class OutlineJavaParser (source : SourceFile )(using Context ) extends JavaParser (source) with OutlineParserCommon {
10951100 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 ]) = {
10971102 skipBraces()
10981103 (List (EmptyValDef ), List (EmptyTree ))
10991104 }
0 commit comments