Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit724e15a

Browse files
committed
Companions and nested classes are nestmates
1 parent52b2013 commit724e15a

File tree

10 files changed

+142
-15
lines changed

10 files changed

+142
-15
lines changed

‎src/compiler/scala/tools/nsc/Global.scala

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,6 +1180,7 @@ class Global(var currentSettings: Settings, reporter0: Reporter)
11801180
keepPhaseStack= settings.log.isSetByUser
11811181

11821182
valisScala3:Boolean= settings.isScala3:@nowarn
1183+
valisJDK11:Boolean= settings.targetValue.toInt>=11
11831184

11841185
objectsourceFeatures {
11851186
privatevals= settings

‎src/compiler/scala/tools/nsc/backend/jvm/BCodeBodyBuilder.scala

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -711,13 +711,14 @@ abstract class BCodeBodyBuilder extends BCodeSkelBuilder {
711711
generatedType= genPrimitiveOp(app, expectedType)
712712
}else {// normal method call
713713
defisTraitSuperAccessorBodyCall= app.hasAttachment[UseInvokeSpecial.type]
714+
defisPrivateSpecial= sym.isPrivate&& (claszSymbol.info<:< sym.owner.info)
714715
valinvokeStyle=
715716
if (sym.isStaticMember)
716717
InvokeStyle.Static
717-
elseif (sym.isPrivate|| sym.isClassConstructor)InvokeStyle.Special
718-
elseif (isTraitSuperAccessorBodyCall)
718+
elseif (isPrivateSpecial|| sym.isClassConstructor|| isTraitSuperAccessorBodyCall)
719719
InvokeStyle.Special
720-
elseInvokeStyle.Virtual
720+
else
721+
InvokeStyle.Virtual
721722

722723
if (invokeStyle.hasInstance) genLoadQualifier(fun)
723724
genLoadArguments(args, paramTKs(app))

‎src/compiler/scala/tools/nsc/backend/jvm/BCodeSkelBuilder.scala

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
5555
*
5656
* Given that CleanUp delivers trees that produce values on the stack,
5757
* the entry-point to all-things instruction-emit is `genLoad()`.
58-
* There, an operation taking N arguments results in recursively emitting instructions tolead each of them,
58+
* There, an operation taking N arguments results in recursively emitting instructions toload each of them,
5959
* followed by emitting instructions to process those arguments (to be found at run-time on the operand-stack).
6060
*
6161
* In a few cases the above recipe deserves more details, as provided in the documentation for:
@@ -124,7 +124,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
124124
thisBTypeDescriptor= thisBType.descriptor
125125
cnode=newClassNode1()
126126

127-
initJClass(cnode)
127+
initJClass()
128128
valcd=if (isCZStaticModule) {
129129
// Move statements from the primary constructor following the superclass constructor call to
130130
// a newly synthesised tree representing the "<clinit>", which also assigns the MODULE$ field.
@@ -182,7 +182,7 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
182182
/*
183183
* must-single-thread
184184
*/
185-
privatedefinitJClass(@unusedjclass: asm.ClassVisitor):Unit= {
185+
privatedefinitJClass():Unit= {
186186

187187
valbType= classBTypeFromSymbol(claszSymbol)
188188
valsuperClass= bType.info.get.superClass.getOrElse(ObjectRef).internalName
@@ -199,6 +199,16 @@ abstract class BCodeSkelBuilder extends BCodeHelpers {
199199
cnode.visitSource(cunit.source.toString,null/* SourceDebugExtension*/)
200200
}
201201

202+
if (currentRun.isJDK11)
203+
claszSymbol.attachments.get[NestHost]match {
204+
caseSome(NestHost(host))=> cnode.visitNestHost(internalName(host))
205+
caseNone=>
206+
claszSymbol.attachments.get[NestMembers]match {
207+
caseSome(NestMembers(members))=>for (m<- members) cnode.visitNestMember(internalName(m))
208+
caseNone=>
209+
}
210+
}
211+
202212
enclosingMethodAttribute(claszSymbol, internalName, methodBTypeFromSymbol(_).descriptor)match {
203213
caseSome(EnclosingMethodEntry(className, methodName, methodDescriptor))=>
204214
cnode.visitOuterClass(className, methodName, methodDescriptor)

‎src/compiler/scala/tools/nsc/backend/jvm/GenBCode.scala

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,8 @@ abstract class GenBCode extends SubComponent {
9797
generatedClassHandler=GeneratedClassHandler(global)
9898
statistics.stopTimer(statistics.bcodeInitTimer, initStart)
9999
}
100-
defwriteOtherFiles():Unit= {
101-
global.plugins foreach {
102-
plugin=>
103-
plugin.writeAdditionalOutputs(postProcessor.classfileWriter)
104-
}
105-
}
100+
101+
defwriteOtherFiles():Unit= global.plugins.foreach(_.writeAdditionalOutputs(postProcessor.classfileWriter))
106102

107103
privatedefclose():Unit=
108104
List[AutoCloseable](

‎src/compiler/scala/tools/nsc/transform/ExplicitOuter.scala

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,13 @@ abstract class ExplicitOuter extends InfoTransform
434434
else atPos(tree.pos)(outerPath(outerValue, currentClass.outerClass, sym))// (5)
435435

436436
caseSelect(qual, name)=>
437+
// c0 belongs to same "nest" as c1 if c0 is enclosed by c1,
438+
// or more generally their top enclosing classes are either identical or companions
439+
defisNestable(c0:Symbol,c1:Symbol):Boolean= currentRun.isJDK11&& {
440+
valtop0= c0.enclosingTopLevelClass
441+
valtop1= c1.enclosingTopLevelClass
442+
top0== top1|| top0.linkedClassOfClass== top1
443+
}
437444
// make not private symbol accessed from inner classes, as well as
438445
// symbols accessed from @inline methods
439446
//
@@ -442,7 +449,7 @@ abstract class ExplicitOuter extends InfoTransform
442449
defenclMethodIsInline= closestEnclMethod(currentOwner) hasAnnotationScalaInlineClass
443450
// scala/bug#8710 The extension method condition reflects our knowledge that a call to `new Meter(12).privateMethod`
444451
// with later be rewritten (in erasure) to `Meter.privateMethod$extension(12)`.
445-
if ((currentClass!= sym.owner|| enclMethodIsInline)&&!sym.isMethodWithExtension)
452+
if ((currentClass!= sym.owner|| enclMethodIsInline)&&!sym.isMethodWithExtension&&!isNestable(currentClass, sym.owner))
446453
sym.makeNotPrivate(sym.owner)
447454

448455
valqsym= qual.tpe.widen.typeSymbol

‎src/compiler/scala/tools/nsc/transform/Flatten.scala

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,21 @@ abstract class Flatten extends InfoTransform {
146146
if (tree.symbol.sourceModule.isStaticModule)
147147
removeSymbolInCurrentScope(tree.symbol.sourceModule)
148148
EmptyTree
149+
caseClassDef(_, _, _, _)if!tree.symbol.isModuleClass=>// !tree.symbol.isNestedClass
150+
valsym= tree.symbol
151+
valmodule= sym.companion.moduleClass
152+
if (module.exists) {
153+
module.attachments.get[NestHost]match {
154+
caseSome(NestHost(host))=> assert(host== sym,s"bad$module host$host !=$sym")
155+
caseNone=> module.updateAttachment(NestHost(sym))
156+
}
157+
valmembers= sym.attachments.get[NestMembers]match {
158+
caseSome(NestMembers(members))=> module:: members
159+
caseNone=> module::Nil
160+
}
161+
sym.updateAttachment(NestMembers(members))
162+
}
163+
tree.transform(this)
149164
case _=>
150165
tree.transform(this)
151166
}
@@ -173,6 +188,26 @@ abstract class Flatten extends InfoTransform {
173188
valstats1=super.transformStats(stats, exprOwner)
174189
if (currentOwner.isPackageClass) {
175190
vallifted= liftedDefs.remove(currentOwner).toList.flatten
191+
for (d<- lifted) {
192+
valsym= d.symbol
193+
valtop= {
194+
valtlc= sym.originalEnclosingTopLevelClassOrDummy
195+
if (tlc.isModuleClass) {
196+
valcmp= tlc.linkedClassOfClass
197+
if (cmp.exists) cmpelse tlc
198+
}
199+
else tlc
200+
}
201+
sym.attachments.get[NestHost]match {
202+
caseSome(NestHost(host))=> assert(host== top,s"bad$sym host$host !=$top")
203+
caseNone=> sym.updateAttachment(NestHost(top))
204+
}
205+
valmembers= top.attachments.get[NestMembers]match {
206+
caseSome(NestMembers(members))=> sym:: members
207+
caseNone=> sym::Nil
208+
}
209+
top.updateAttachment(NestMembers(members))
210+
}
176211
stats1::: lifted
177212
}
178213
else stats1

‎src/reflect/scala/reflect/internal/StdAttachments.scala

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,4 +186,10 @@ trait StdAttachments {
186186

187187
/** This Bind tree was derived immediately from the given tree, for unused accounting.*/
188188
caseclassVarAlias(tree:Tree/*Bind | ValDef*/)extendsPlainAttachment
189+
190+
/** A top-level class may be a "nest host" with given "nest members" (nested classes or companion).*/
191+
caseclassNestMembers(members:List[Symbol])extendsPlainAttachment
192+
193+
/** A nested class or a top-level companion module may have a "nest host" for which it is a "nest member".*/
194+
caseclassNestHost(host:Symbol)extendsPlainAttachment
189195
}

‎src/reflect/scala/reflect/internal/Symbols.scala

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2335,9 +2335,10 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
23352335
@tailrec
23362336
finaldeforiginalEnclosingTopLevelClassOrDummy:Symbol=
23372337
if (this eqNoSymbol)this
2338-
elseif (isTopLevel) {
2338+
elseif (originalOwner.isPackageClass) {
23392339
if (isClass)thiselse moduleClass.orElse(this)
2340-
}else originalOwner.originalEnclosingTopLevelClassOrDummy
2340+
}
2341+
else originalOwner.originalEnclosingTopLevelClassOrDummy
23412342

23422343
/** Is this symbol defined in the same scope and compilation unit as `that` symbol?*/
23432344
defisCoDefinedWith(that:Symbol)= {

‎src/reflect/scala/reflect/runtime/JavaUniverseForce.scala

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ trait JavaUniverseForce { self: runtime.JavaUniverse =>
9292
this.DiscardedExpr
9393
this.BooleanParameterType
9494
this.VarAlias
95+
this.NestMembers
96+
this.NestHost
9597
this.noPrint
9698
this.typeDebug
9799
// inaccessible: this.posAssigner

‎test/files/run/t6882.scala

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
//>usingoptions--target:11
2+
//>usingjvm11+
3+
4+
classCprivate (privatevali:Int,privatevalj:Int) {
5+
privatevalc= i+C.secret
6+
7+
@inlinedeff= j*2
8+
}
9+
objectC {
10+
defunwrap(c:C):Int= c.c
11+
12+
defapply(i:Int,j:Int):C=newC(i, j)
13+
14+
privatedefsecret=5
15+
}
16+
17+
classD(d0:String) {
18+
privatedefd= d0
19+
defe=newE
20+
classE {
21+
defe=D.this.d
22+
}
23+
}
24+
objectD {
25+
}
26+
27+
objectTop {
28+
privatedefi=42
29+
classNested {
30+
deff= i
31+
}
32+
defj=newNested().f
33+
}
34+
35+
classTopHeavy {
36+
privatedefi=TopHeavy.underlying
37+
}
38+
objectTopHeavy {
39+
privatedefunderlying=42
40+
classNested {
41+
deff=newTopHeavy().i
42+
}
43+
defj=newNested().f
44+
}
45+
46+
objectTest {
47+
importjava.lang.reflect.Modifier.{PRIVATE=>Private}
48+
defmain(args:Array[String]):Unit= {
49+
assert(C.unwrap(C(42,27))==47)
50+
for (m<-Class.forName("C$").getDeclaredMethods; n= m.getNameif n.contains("secret")) {
51+
assert(n=="secret")
52+
assert((m.getModifiers&Private)!=0)
53+
}
54+
55+
vald=newD("mystery")
56+
assert(d.e.e=="mystery")
57+
for (m<-Class.forName("D").getDeclaredMethods; n= m.getNameif n.contains("d")) {
58+
assert(n=="d")
59+
assert((m.getModifiers&Private)!=0)
60+
}
61+
62+
assert(Top.j==42)
63+
for (m<-Class.forName("Top$").getDeclaredMethods; n= m.getNameif n.contains("i")) {
64+
assert(n=="i")
65+
assert((m.getModifiers&Private)!=0)
66+
}
67+
}
68+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp