Skip to content

Commit 4739268

Browse files
committed
Simplify Scala 2 trait support
Drop vestigial code related to Scala 2.11 support. In particular, we created a fake impl class in AugmentScala2Trait only to add its members to the trait in LinkScala2Impls. We now directly add the members to the trait in LinkScala2Impls. We could potentially simplify things even further by getting rid of LinkScala2Impls since the static `foo$` methods in Scala 2 traits always forward to instance methods `foo`, but that could have performance implication as detailed in #5928, so we keep things as-is for now, but eventually we should either switch Dotty trait encoding to also use static forwarders, or not use them at all.
1 parent 757e2d1 commit 4739268

28 files changed

+95
-194
lines changed

compiler/src/dotty/tools/backend/jvm/BTypesFromSymbols.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ class BTypesFromSymbols[I <: BackendInterface](val int: I) extends BTypes {
6161
}
6262

6363
private def setClassInfo(classSym: Symbol, classBType: ClassBType): ClassBType = {
64-
val superClassSym = if (classSym.isImplClass) ObjectClass else classSym.superClass
64+
val superClassSym = classSym.superClass
6565
assert(
6666
if (classSym == ObjectClass)
6767
superClassSym == NoSymbol

compiler/src/dotty/tools/backend/jvm/BackendInterface.scala

-1
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,6 @@ abstract class BackendInterface extends BackendInterfaceDefinitions {
484484
def isStrictFP: Boolean
485485
def isLabel: Boolean
486486
def hasPackageFlag: Boolean
487-
def isImplClass: Boolean
488487
def isInterface: Boolean
489488
def isGetter: Boolean
490489
def isSetter: Boolean

compiler/src/dotty/tools/backend/jvm/DottyBackendInterface.scala

+2-3
Original file line numberDiff line numberDiff line change
@@ -666,7 +666,6 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
666666
def isStrictFP: Boolean = false // todo: implement
667667
def isLabel: Boolean = sym is Flags.Label
668668
def hasPackageFlag: Boolean = sym is Flags.Package
669-
def isImplClass: Boolean = sym is Flags.ImplClass
670669
def isInterface: Boolean = (sym is Flags.PureInterface) || (sym is Flags.Trait)
671670
def isGetter: Boolean = toDenot(sym).isGetter
672671
def isSetter: Boolean = toDenot(sym).isSetter
@@ -683,7 +682,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
683682

684683
def isFinal: Boolean = sym is Flags.Final
685684
def isStaticMember: Boolean = (sym ne NoSymbol) &&
686-
((sym is Flags.JavaStatic) || (owner is Flags.ImplClass) || toDenot(sym).hasAnnotation(ctx.definitions.ScalaStaticAnnot))
685+
((sym is Flags.JavaStatic) || toDenot(sym).hasAnnotation(ctx.definitions.ScalaStaticAnnot))
687686
// guard against no sumbol cause this code is executed to select which call type(static\dynamic) to use to call array.clone
688687

689688
def isBottomClass: Boolean = (sym ne defn.NullClass) && (sym ne defn.NothingClass)
@@ -701,7 +700,7 @@ class DottyBackendInterface(outputDirectory: AbstractFile, val superCallsMap: Ma
701700
def isNonBottomSubClass(other: Symbol): Boolean = sym.derivesFrom(other)
702701
def hasAnnotation(ann: Symbol): Boolean = toDenot(sym).hasAnnotation(ann)
703702
def shouldEmitForwarders: Boolean =
704-
(sym is Flags.Module) && !(sym is Flags.ImplClass) && sym.isStatic
703+
(sym is Flags.Module) && sym.isStatic
705704
def isJavaEntryPoint: Boolean = CollectEntryPoints.isJavaEntryPoint(sym)
706705

707706
def isClassConstructor: Boolean = toDenot(sym).isClassConstructor

compiler/src/dotty/tools/backend/sjs/JSCodeGen.scala

-8
Original file line numberDiff line numberDiff line change
@@ -1575,8 +1575,6 @@ class JSCodeGen()(implicit ctx: Context) {
15751575
genApplyJSMethodGeneric(tree, sym, genExpr(receiver), genActualJSArgs(sym, args), isStat)
15761576
/*else
15771577
genApplyJSClassMethod(genExpr(receiver), sym, genActualArgs(sym, args))*/
1578-
} else if (foreignIsImplClass(sym.owner)) {
1579-
genTraitImplApply(sym, args.map(genExpr))
15801578
} else if (sym.isClassConstructor) {
15811579
// Calls to constructors are always statically linked
15821580
genApplyMethodStatically(genExpr(receiver), sym, genActualArgs(sym, args))
@@ -2022,12 +2020,6 @@ class JSCodeGen()(implicit ctx: Context) {
20222020
toIRType(patchedResultType(method)))
20232021
}
20242022

2025-
/** Gen a call to a Scala2 impl class method. */
2026-
private def genTraitImplApply(method: Symbol, arguments: List[js.Tree])(
2027-
implicit pos: Position): js.Tree = {
2028-
genApplyStatic(method, arguments)
2029-
}
2030-
20312023
/** Gen a call to a non-exposed method of a non-native JS class. */
20322024
private def genApplyJSClassMethod(receiver: js.Tree, method: Symbol,
20332025
arguments: List[js.Tree])(implicit pos: Position): js.Tree = {

compiler/src/dotty/tools/backend/sjs/JSEncoding.scala

-3
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,6 @@ object JSEncoding {
185185
js.Ident(localNames.localSymbolName(sym), Some(sym.unexpandedName.decoded))
186186
}
187187

188-
def foreignIsImplClass(sym: Symbol)(implicit ctx: Context): Boolean =
189-
sym.name.endsWith(nme.IMPL_CLASS_SUFFIX.toString)
190-
191188
def encodeClassType(sym: Symbol)(implicit ctx: Context): jstpe.Type = {
192189
if (sym == defn.ObjectClass) jstpe.AnyType
193190
else if (isJSType(sym)) jstpe.AnyType

compiler/src/dotty/tools/dotc/Compiler.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class Compiler {
8181
new ElimByName, // Expand by-name parameter references
8282
new CollectNullableFields, // Collect fields that can be nulled out after use in lazy initialization
8383
new ElimOuterSelect, // Expand outer selections
84-
new AugmentScala2Traits, // Expand traits defined in Scala 2.x to simulate old-style rewritings
84+
new AugmentScala2Traits, // Augments Scala2 traits with additional members needed for mixin composition.
8585
new ResolveSuper, // Implement super accessors and add forwarders to trait methods
8686
new FunctionXXLForwarders, // Add forwarders for FunctionXXL apply method
8787
new ArrayConstructors) :: // Intercept creation of (non-generic) arrays and intrinsify.

compiler/src/dotty/tools/dotc/core/Flags.scala

+9-15
Original file line numberDiff line numberDiff line change
@@ -340,6 +340,8 @@ object Flags {
340340
/** An unpickled Scala 2.x class */
341341
final val Scala2x: FlagSet = typeFlag(26, "<scala-2.x>")
342342

343+
final val Scala2xTrait: FlagSet = Scala2x | Trait
344+
343345
final val SuperAccessorOrScala2x: FlagSet = Scala2x.toCommonFlags
344346

345347
/** A method that has default params */
@@ -413,11 +415,6 @@ object Flags {
413415
/** Symbol is a self name */
414416
final val SelfName: FlagSet = termFlag(54, "<selfname>")
415417

416-
/** Symbol is an implementation class of a Scala2 trait */
417-
final val ImplClass: FlagSet = typeFlag(54, "<implclass>")
418-
419-
final val SelfNameOrImplClass: FlagSet = SelfName.toCommonFlags
420-
421418
/** An existentially bound symbol (Scala 2.x only) */
422419
final val Scala2ExistentialCommon: FlagSet = commonFlag(55, "<existential>")
423420
final val Scala2Existential: FlagSet = Scala2ExistentialCommon.toTypeFlags
@@ -428,14 +425,11 @@ object Flags {
428425
/** A module variable (Scala 2.x only) */
429426
final val Scala2ModuleVar: FlagSet = termFlag(57, "<modulevar>")
430427

431-
/** A Scala 2.12 trait that has been augmented with static members */
432-
final val Scala_2_12_Augmented: FlagSet = typeFlag(57, "<scala_2_12_augmented>")
433-
434-
/** A definition that's initialized before the super call (Scala 2.x only) */
435-
final val Scala2PreSuper: FlagSet = termFlag(58, "<presuper>")
436-
437-
/** A Scala 2.12 or higher trait */
438-
final val Scala_2_12_Trait: FlagSet = typeFlag(58, "<scala_2_12_trait>")
428+
/** A Scala 2.x trait that has been partially augmented.
429+
* This is set in `AugmentScala2Trait` and reset in `LinkScala2Impls`
430+
* when the trait is fully augmented.
431+
*/
432+
final val Scala2xPartiallyAugmented: FlagSet = typeFlag(57, "<scala-2.x-partially-augmented>")
439433

440434
/** A macro */
441435
final val Macro: FlagSet = commonFlag(59, "<macro>")
@@ -497,7 +491,7 @@ object Flags {
497491
* is completed)
498492
*/
499493
final val AfterLoadFlags: FlagSet =
500-
FromStartFlags | AccessFlags | Final | AccessorOrSealed | LazyOrTrait | SelfNameOrImplClass
494+
FromStartFlags | AccessFlags | Final | AccessorOrSealed | LazyOrTrait | SelfName.toCommonFlags
501495

502496
assert(FromStartFlags.isTermFlags && FromStartFlags.isTypeFlags)
503497
// TODO: Should check that FromStartFlags do not change in completion
@@ -549,7 +543,7 @@ object Flags {
549543

550544
/** Flags that can apply to a module class */
551545
final val RetainedModuleClassFlags: FlagSet = RetainedModuleValAndClassFlags |
552-
ImplClass | Enum | Opaque
546+
Enum | Opaque
553547

554548
/** Flags that are copied from a synthetic companion to a user-defined one
555549
* when the two are merged. See: Namer.mergeCompanionDefs

compiler/src/dotty/tools/dotc/core/Mode.scala

-3
Original file line numberDiff line numberDiff line change
@@ -69,9 +69,6 @@ object Mode {
6969
/** We are currently unpickling Scala2 info */
7070
val Scala2Unpickling: Mode = newMode(13, "Scala2Unpickling")
7171

72-
/** We are currently unpickling from Java 8 or higher */
73-
val Java8Unpickling: Mode = newMode(14, "Java8Unpickling")
74-
7572
/** Use Scala2 scheme for overloading and implicit resolution */
7673
val OldOverloadingResolution: Mode = newMode(15, "OldOverloadingResolution")
7774

compiler/src/dotty/tools/dotc/core/NameOps.scala

-8
Original file line numberDiff line numberDiff line change
@@ -141,14 +141,6 @@ object NameOps {
141141
name.replace { case VariantName(invariant, _) => invariant }
142142
}
143143

144-
def implClassName: N = likeSpacedN(name ++ tpnme.IMPL_CLASS_SUFFIX)
145-
146-
def traitOfImplClassName: N = {
147-
val suffix = tpnme.IMPL_CLASS_SUFFIX.toString
148-
assert(name.endsWith(suffix), name)
149-
likeSpacedN(name.mapLast(_.dropRight(suffix.length)))
150-
}
151-
152144
def errorName: N = likeSpacedN(name ++ nme.ERROR)
153145

154146
/** Map variance value -1, +1 to 0, 1 */

compiler/src/dotty/tools/dotc/core/StdNames.scala

-1
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ object StdNames {
128128
val EMPTY_PACKAGE: N = "<empty>"
129129
val EXCEPTION_RESULT_PREFIX: N = "exceptionResult"
130130
val EXPAND_SEPARATOR: N = str.EXPAND_SEPARATOR
131-
val IMPL_CLASS_SUFFIX: N = "$class"
132131
val IMPORT: N = "<import>"
133132
val MODULE_SUFFIX: N = str.MODULE_SUFFIX
134133
val OPS_PACKAGE: N = "<special-ops>"

compiler/src/dotty/tools/dotc/core/SymDenotations.scala

+1-6
Original file line numberDiff line numberDiff line change
@@ -650,9 +650,6 @@ object SymDenotations {
650650
/** is this the constructor of a class? */
651651
final def isClassConstructor: Boolean = name == nme.CONSTRUCTOR
652652

653-
/** Is this the constructor of a trait? */
654-
final def isImplClassConstructor: Boolean = name == nme.TRAIT_CONSTRUCTOR
655-
656653
/** Is this the constructor of a trait or a class */
657654
final def isConstructor: Boolean = name.isConstructorName
658655

@@ -757,7 +754,6 @@ object SymDenotations {
757754
|| boundary.isRoot
758755
|| (accessWithin(boundary) || accessWithinLinked(boundary)) &&
759756
( !(this is Local)
760-
|| (owner is ImplClass) // allow private local accesses to impl class members
761757
|| isCorrectThisType(pre)
762758
)
763759
|| (this is Protected) &&
@@ -1901,8 +1897,7 @@ object SymDenotations {
19011897
override def primaryConstructor(implicit ctx: Context): Symbol = {
19021898
def constrNamed(cname: TermName) = info.decls.denotsNamed(cname).last.symbol
19031899
// denotsNamed returns Symbols in reverse order of occurrence
1904-
if (this.is(ImplClass)) constrNamed(nme.TRAIT_CONSTRUCTOR) // ignore normal constructor
1905-
else if (this.is(Package)) NoSymbol
1900+
if (this.is(Package)) NoSymbol
19061901
else constrNamed(nme.CONSTRUCTOR).orElse(constrNamed(nme.TRAIT_CONSTRUCTOR))
19071902
}
19081903

compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala

-2
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,6 @@ class ClassfileParser(
9999
throw new IOException(s"class file '${in.file}' has wrong magic number 0x${toHexString(magic)}, should be 0x${toHexString(JAVA_MAGIC)}")
100100
val minorVersion = in.nextChar.toInt
101101
val majorVersion = in.nextChar.toInt
102-
if (majorVersion >= JAVA8_MAJOR_VERSION)
103-
Scala2UnpicklingMode |= Mode.Java8Unpickling
104102
if ((majorVersion < JAVA_MAJOR_VERSION) ||
105103
((majorVersion == JAVA_MAJOR_VERSION) &&
106104
(minorVersion < JAVA_MINOR_VERSION)))

compiler/src/dotty/tools/dotc/core/unpickleScala2/PickleBuffer.scala

-1
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,6 @@ object PickleBuffer {
230230
LAZY -> Lazy,
231231
MIXEDIN -> (MixedIn, Scala2Existential),
232232
EXPANDEDNAME -> Scala2ExpandedName,
233-
IMPLCLASS -> (Scala2PreSuper, ImplClass),
234233
SPECIALIZED -> Specialized,
235234
VBRIDGE -> EmptyFlags,
236235
VARARGS -> JavaVarargs,

compiler/src/dotty/tools/dotc/core/unpickleScala2/Scala2Flags.scala

-1
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ object Scala2Flags {
8080
final val MIXEDIN = 1L << 35 // term member has been mixed in
8181
final val EXISTENTIAL = 1L << 35 // type is an existential parameter or skolem
8282
final val EXPANDEDNAME = 1L << 36 // name has been expanded with class suffix
83-
final val IMPLCLASS = 1L << 37 // symbol is an implementation class
8483
final val TRANS_FLAG = 1L << 38 // transient flag guaranteed to be reset after each phase.
8584

8685
final val LOCKED = 1L << 39 // temporary flag to catch cyclic dependencies

compiler/src/dotty/tools/dotc/core/unpickleScala2/Scala2Unpickler.scala

-2
Original file line numberDiff line numberDiff line change
@@ -474,8 +474,6 @@ class Scala2Unpickler(bytes: Array[Byte], classRoot: ClassDenotation, moduleClas
474474
def finishSym(sym: Symbol): Symbol = {
475475
if (sym.isClass) {
476476
sym.setFlag(Scala2x)
477-
if (flags.is(Trait) && ctx.mode.is(Mode.Java8Unpickling))
478-
sym.setFlag(Scala_2_12_Trait)
479477
}
480478
if (!(isRefinementClass(sym) || isUnpickleRoot(sym) || (sym is Scala2Existential))) {
481479
val owner = sym.owner

compiler/src/dotty/tools/dotc/printing/PlainPrinter.scala

-1
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,6 @@ class PlainPrinter(_ctx: Context) extends Printer {
368368
else if (sym.isAnonymousClass) "anonymous class"
369369
else if (flags is ModuleClass) "module class"
370370
else if (flags is ModuleVal) "module"
371-
else if (flags is ImplClass) "implementation class"
372371
else if (flags is Trait) "trait"
373372
else if (sym.isClass) "class"
374373
else if (sym.isType) "type"

compiler/src/dotty/tools/dotc/printing/RefinedPrinter.scala

-1
Original file line numberDiff line numberDiff line change
@@ -833,7 +833,6 @@ class RefinedPrinter(_ctx: Context) extends PlainPrinter(_ctx) {
833833
if (flags is Package) "package"
834834
else if (sym.isPackageObject) "package object"
835835
else if (flags is Module) "object"
836-
else if (flags is ImplClass) "class"
837836
else if (sym.isClassConstructor) "constructor"
838837
else super.kindString(sym)
839838
}

compiler/src/dotty/tools/dotc/tastyreflect/KernelImpl.scala

-1
Original file line numberDiff line numberDiff line change
@@ -1601,7 +1601,6 @@ class KernelImpl(val rootContext: core.Contexts.Context, val rootPosition: util.
16011601
def Flags_ModuleClass: Flags = core.Flags.ModuleClass
16021602
def Flags_PrivateLocal: Flags = core.Flags.PrivateLocal
16031603
def Flags_Package: Flags = core.Flags.Package
1604-
def Flags_ImplClass: Flags = core.Flags.ImplClass
16051604

16061605
//
16071606
// QUOTED SEAL/UNSEAL

compiler/src/dotty/tools/dotc/transform/AugmentScala2Traits.scala

+33-67
Original file line numberDiff line numberDiff line change
@@ -14,93 +14,59 @@ import Annotations._
1414
import StdNames._
1515
import NameOps._
1616
import NameKinds.{ExpandedName, TraitSetterName}
17+
import ast.Trees._
1718

1819
object AugmentScala2Traits {
1920
val name: String = "augmentScala2Traits"
2021
}
2122

22-
/** This phase augments Scala2 traits with implementation classes and with additional members
23-
* needed for mixin composition.
24-
* These symbols would have been added between Unpickling and Mixin in the Scala2 pipeline.
25-
* Specifically, it adds
23+
/** This phase augments Scala2 traits with additional members needed for mixin composition.
2624
*
27-
* - an implementation class which defines a trait constructor and trait method implementations
28-
* - trait setters for vals defined in traits
25+
* These symbols would have been added between Unpickling and Mixin in the Scala2 pipeline.
2926
*
30-
* Furthermore, it expands the names of all private getters and setters as well as super accessors in the trait and makes
31-
* them not-private.
27+
* Specifically, we:
28+
* - Mark all lazy val fields as @volatile to get the proper Scala 2 semantics.
29+
* - Add trait setters for vals defined in traits.
30+
* - Expand the names of all private getters and setters as well as super accessors in the trait and make
31+
* not-private.
3232
*/
33-
class AugmentScala2Traits extends MiniPhase with IdentityDenotTransformer with FullParameterization { thisPhase =>
33+
class AugmentScala2Traits extends MiniPhase with IdentityDenotTransformer { thisPhase =>
3434
import ast.tpd._
3535

3636
override def changesMembers: Boolean = true
3737

3838
override def phaseName: String = AugmentScala2Traits.name
3939

40-
override def rewiredTarget(referenced: Symbol, derived: Symbol)(implicit ctx: Context): Symbol = NoSymbol
41-
4240
override def transformTemplate(impl: Template)(implicit ctx: Context): Template = {
4341
val cls = impl.symbol.owner.asClass
44-
for (mixin <- cls.mixins)
45-
if (mixin.is(Scala2x))
46-
augmentScala2Trait(mixin, cls)
42+
for (mixin <- cls.mixins if mixin.is(Scala2x) && !mixin.is(Scala2xPartiallyAugmented))
43+
augmentScala2Trait(mixin)
4744
impl
4845
}
4946

50-
private def augmentScala2Trait(mixin: ClassSymbol, cls: ClassSymbol)(implicit ctx: Context): Unit = {
51-
if (mixin.implClass.is(Scala2x)) () // nothing to do, mixin was already augmented
52-
else {
53-
//println(i"creating new implclass for $mixin ${mixin.implClass}")
54-
val ops = new MixinOps(cls, thisPhase)
55-
import ops._
56-
57-
val implClass = ctx.newCompleteClassSymbol(
58-
owner = mixin.owner,
59-
name = mixin.name.implClassName,
60-
flags = Abstract | Scala2x | ImplClass,
61-
parents = defn.ObjectType :: Nil,
62-
assocFile = mixin.assocFile).enteredAfter(thisPhase)
63-
64-
def implMethod(meth: TermSymbol): Symbol = {
65-
val mold =
66-
if (meth.isConstructor)
67-
meth.copySymDenotation(
68-
name = nme.TRAIT_CONSTRUCTOR,
69-
info = MethodType(Nil, defn.UnitType))
70-
else meth.ensureNotPrivate
71-
meth.copy(
72-
owner = implClass,
73-
name = mold.name.asTermName,
74-
flags = Method | JavaStatic,
75-
info = fullyParameterizedType(mold.info, mixin))
76-
}
77-
78-
def traitSetter(getter: TermSymbol) =
79-
getter.copy(
80-
name = getter.ensureNotPrivate.name
81-
.expandedName(getter.owner, TraitSetterName)
82-
.asTermName.setterName,
83-
flags = Method | Accessor,
84-
info = MethodType(getter.info.resultType :: Nil, defn.UnitType))
47+
private def augmentScala2Trait(mixin: ClassSymbol)(implicit ctx: Context): Unit = {
48+
def traitSetter(getter: TermSymbol) =
49+
getter.copy(
50+
name = getter.ensureNotPrivate.name
51+
.expandedName(getter.owner, TraitSetterName)
52+
.asTermName.setterName,
53+
flags = Method | Accessor,
54+
info = MethodType(getter.info.resultType :: Nil, defn.UnitType))
8555

86-
for (sym <- mixin.info.decls) {
87-
if (needsForwarder(sym) || sym.isConstructor || sym.isGetter && sym.is(Lazy) || sym.is(Method, butNot = Deferred))
88-
implClass.enter(implMethod(sym.asTerm))
89-
if (sym.isGetter)
90-
if (sym.is(Lazy)) {
91-
if (!sym.hasAnnotation(defn.VolatileAnnot))
92-
sym.addAnnotation(Annotation(defn.VolatileAnnot, Nil))
93-
}
94-
else if (!sym.is(Deferred) && !sym.setter.exists &&
95-
!sym.info.resultType.isInstanceOf[ConstantType])
96-
traitSetter(sym.asTerm).enteredAfter(thisPhase)
97-
if ((sym.is(PrivateAccessor) && !sym.name.is(ExpandedName) &&
98-
(sym.isGetter || sym.isSetter)) // strangely, Scala 2 fields are also methods that have Accessor set.
99-
|| sym.isSuperAccessor) // scala2 superaccessors are pickled as private, but are compiled as public expanded
100-
sym.ensureNotPrivate.installAfter(thisPhase)
101-
}
102-
ctx.log(i"Scala2x trait decls of $mixin = ${mixin.info.decls.toList.map(_.showDcl)}%\n %")
103-
ctx.log(i"Scala2x impl decls of $mixin = ${implClass.info.decls.toList.map(_.showDcl)}%\n %")
56+
for (sym <- mixin.info.decls) {
57+
if (sym.isGetter)
58+
if (sym.is(Lazy)) {
59+
if (!sym.hasAnnotation(defn.VolatileAnnot))
60+
sym.addAnnotation(Annotation(defn.VolatileAnnot, Nil))
61+
}
62+
else if (!sym.is(Deferred) && !sym.setter.exists &&
63+
!sym.info.resultType.isInstanceOf[ConstantType])
64+
traitSetter(sym.asTerm).enteredAfter(thisPhase)
65+
if ((sym.is(PrivateAccessor) && !sym.name.is(ExpandedName) &&
66+
(sym.isGetter || sym.isSetter)) // strangely, Scala 2 fields are also methods that have Accessor set.
67+
|| sym.isSuperAccessor) // scala2 superaccessors are pickled as private, but are compiled as public expanded
68+
sym.ensureNotPrivate.installAfter(thisPhase)
10469
}
70+
mixin.setFlag(Scala2xPartiallyAugmented)
10571
}
10672
}

0 commit comments

Comments
 (0)