Skip to content

Commit 07847f8

Browse files
authored
Merge pull request #6040 from dotty-staging/scala2-augment-after-erasure-2
Simplify Scala 2 trait support
2 parents 6efb61b + d3de543 commit 07847f8

28 files changed

+102
-198
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
@@ -367,7 +367,6 @@ class PlainPrinter(_ctx: Context) extends Printer {
367367
else if (sym.isAnonymousClass) "anonymous class"
368368
else if (flags is ModuleClass) "module class"
369369
else if (flags is ModuleVal) "module"
370-
else if (flags is ImplClass) "implementation class"
371370
else if (flags is Trait) "trait"
372371
else if (sym.isClass) "class"
373372
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
@@ -1611,7 +1611,6 @@ class KernelImpl(val rootContext: core.Contexts.Context, val rootPosition: util.
16111611
def Flags_ModuleClass: Flags = core.Flags.ModuleClass
16121612
def Flags_PrivateLocal: Flags = core.Flags.PrivateLocal
16131613
def Flags_Package: Flags = core.Flags.Package
1614-
def Flags_ImplClass: Flags = core.Flags.ImplClass
16151614

16161615
//
16171616
// 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)