@@ -112,29 +112,34 @@ object JavaParsers {
112
112
def makePackaging (pkg : RefTree , stats : List [Tree ]): PackageDef =
113
113
atPos(pkg.pos) { PackageDef (pkg, stats) }
114
114
115
- def makeTemplate (parents : List [Tree ], stats : List [Tree ], tparams : List [TypeDef ]) = {
115
+ def makeTemplate (parents : List [Tree ], stats : List [Tree ], tparams : List [TypeDef ], needsDummyConstr : Boolean ) = {
116
116
def pullOutFirstConstr (stats : List [Tree ]): (Tree , List [Tree ]) = stats match {
117
117
case (meth : DefDef ) :: rest if meth.name.isConstructorName => (meth, rest)
118
118
case first :: rest =>
119
119
val (constr, tail) = pullOutFirstConstr(rest)
120
120
(constr, first :: tail)
121
121
case nil => (EmptyTree , nil)
122
122
}
123
- val (constr, stats1) = pullOutFirstConstr(stats)
124
- val constr1 = if (constr == EmptyTree ) makeConstructor(List (), tparams) else constr.asInstanceOf [DefDef ]
125
- Template (constr1, parents, EmptyValDef , stats1)
123
+ var (constr1, stats1) = pullOutFirstConstr(stats)
124
+ if (constr1 == EmptyTree ) constr1 = makeConstructor(List (), tparams)
125
+ // A dummy first constructor is needed for Java classes so that the real constructors see the
126
+ // import of the companion object. The constructor has parameter of type Unit so no Java code
127
+ // can call it.
128
+ if (needsDummyConstr) {
129
+ stats1 = constr1 :: stats1
130
+ constr1 = makeConstructor(List (scalaDot(tpnme.Unit )), tparams, Flags .JavaDefined | Flags .PrivateLocal )
131
+ }
132
+ Template (constr1.asInstanceOf [DefDef ], parents, EmptyValDef , stats1)
126
133
}
127
134
128
135
def makeSyntheticParam (count : Int , tpt : Tree ): ValDef =
129
136
makeParam(nme.syntheticParamName(count), tpt)
130
- def makeParam (name : String , tpt : Tree ): ValDef =
131
- makeParam(name.toTermName, tpt)
132
- def makeParam (name : TermName , tpt : Tree , flags : FlagSet = Flags .Param ): ValDef =
133
- ValDef (Modifiers (flags | Flags .JavaDefined ), name, tpt, EmptyTree )
137
+ def makeParam (name : TermName , tpt : Tree ): ValDef =
138
+ ValDef (Modifiers (Flags .JavaDefined | Flags .PrivateLocalParamAccessor ), name, tpt, EmptyTree )
134
139
135
- def makeConstructor (formals : List [Tree ], tparams : List [TypeDef ]) = {
140
+ def makeConstructor (formals : List [Tree ], tparams : List [TypeDef ], flags : FlagSet = Flags . JavaDefined ) = {
136
141
val vparams = mapWithIndex(formals)((p, i) => makeSyntheticParam(i + 1 , p))
137
- DefDef (Modifiers (Flags . JavaDefined ), nme.CONSTRUCTOR , tparams, List (vparams), TypeTree (), EmptyTree )
142
+ DefDef (Modifiers (flags ), nme.CONSTRUCTOR , tparams, List (vparams), TypeTree (), EmptyTree )
138
143
}
139
144
140
145
// ------------- general parsing ---------------------------
@@ -447,7 +452,7 @@ object JavaParsers {
447
452
PostfixOp (t, nme.raw.STAR )
448
453
}
449
454
}
450
- varDecl(Position (in.offset), Modifiers (Flags .JavaDefined | Flags .Param ), t, ident().toTermName, dontAddMutable = true )
455
+ varDecl(Position (in.offset), Modifiers (Flags .JavaDefined | Flags .Param ), t, ident().toTermName)
451
456
}
452
457
453
458
def optThrows (): Unit = {
@@ -571,12 +576,12 @@ object JavaParsers {
571
576
buf.toList
572
577
}
573
578
574
- def varDecl (pos : Position , mods : Modifiers , tpt : Tree , name : TermName , dontAddMutable : Boolean = false ): ValDef = {
579
+ def varDecl (pos : Position , mods : Modifiers , tpt : Tree , name : TermName ): ValDef = {
575
580
val tpt1 = optArrayBrackets(tpt)
576
581
if (in.token == EQUALS && ! (mods is Flags .Param )) skipTo(COMMA , SEMI )
577
- val mods1 = if (mods is Flags .Final ) mods &~ Flags . Final else if (dontAddMutable ) mods else mods | Flags .Mutable
582
+ val mods1 = if (mods is Flags .Final ) mods else mods | Flags .Mutable
578
583
atPos(pos) {
579
- ValDef (mods1, name, tpt1, EmptyTree )
584
+ ValDef (mods1, name, tpt1, if (mods is Flags . Param ) EmptyTree else unimplementedExpr )
580
585
}
581
586
}
582
587
@@ -590,7 +595,7 @@ object JavaParsers {
590
595
def makeCompanionObject (cdef : TypeDef , statics : List [Tree ]): Tree =
591
596
atPos(cdef.pos) {
592
597
ModuleDef ((cdef.mods & (Flags .AccessFlags | Flags .JavaDefined )).toTermFlags, cdef.name.toTermName,
593
- makeTemplate(List (), statics, List ()))
598
+ makeTemplate(List (), statics, List (), false ))
594
599
}
595
600
596
601
private val wild = Ident (nme.WILDCARD ) withPos Position (- 1 )
@@ -689,7 +694,7 @@ object JavaParsers {
689
694
val interfaces = interfacesOpt()
690
695
val (statics, body) = typeBody(CLASS , name, tparams)
691
696
addCompanionObject(statics, atPos(offset) {
692
- TypeDef (mods, name, makeTemplate(superclass :: interfaces, body, tparams))
697
+ TypeDef (mods, name, makeTemplate(superclass :: interfaces, body, tparams, true ))
693
698
})
694
699
}
695
700
@@ -709,7 +714,7 @@ object JavaParsers {
709
714
addCompanionObject(statics, atPos(offset) {
710
715
TypeDef (mods | Flags .Trait | Flags .Interface | Flags .Abstract ,
711
716
name, tparams,
712
- makeTemplate(parents, body, tparams))
717
+ makeTemplate(parents, body, tparams, false ))
713
718
})
714
719
}
715
720
@@ -763,12 +768,12 @@ object JavaParsers {
763
768
val name = identForType()
764
769
val (statics, body) = typeBody(AT , name, List ())
765
770
val constructorParams = body.collect {
766
- case dd : DefDef => makeParam(dd.name, dd.tpt, Flags . PrivateLocalParamAccessor )
771
+ case dd : DefDef => makeParam(dd.name, dd.tpt)
767
772
}
768
773
val constr = DefDef (Modifiers (Flags .JavaDefined ), nme.CONSTRUCTOR ,
769
774
List (), List (constructorParams), TypeTree (), EmptyTree )
770
775
val body1 = body.filterNot(_.isInstanceOf [DefDef ])
771
- val templ = makeTemplate(annotationParents, constr :: body1, List ())
776
+ val templ = makeTemplate(annotationParents, constr :: body1, List (), false )
772
777
addCompanionObject(statics, atPos(offset) {
773
778
TypeDef (mods | Flags .Abstract , name, templ)
774
779
})
@@ -808,7 +813,7 @@ object JavaParsers {
808
813
unimplementedExpr),
809
814
DefDef (
810
815
Modifiers (Flags .JavaDefined | Flags .JavaStatic | Flags .Method ), nme.valueOf, List (),
811
- List (List (makeParam(" x" , TypeTree (StringType )))),
816
+ List (List (makeParam(" x" .toTermName , TypeTree (StringType )))),
812
817
enumType,
813
818
unimplementedExpr))
814
819
accept(RBRACE )
@@ -821,7 +826,7 @@ object JavaParsers {
821
826
List (Literal (Constant (null )),Literal (Constant (0 ))))
822
827
addCompanionObject(consts ::: statics ::: predefs, atPos(offset) {
823
828
TypeDef (mods | Flags .Enum , name, List (),
824
- makeTemplate(superclazz :: interfaces, body, List ()))
829
+ makeTemplate(superclazz :: interfaces, body, List (), true ))
825
830
})
826
831
}
827
832
0 commit comments