File tree 6 files changed +50
-6
lines changed
compiler/src/dotty/tools/dotc
6 files changed +50
-6
lines changed Original file line number Diff line number Diff line change @@ -146,7 +146,9 @@ object NameOps {
146
146
147
147
/** Revert the expanded name. */
148
148
def unexpandedName : N = likeSpacedN {
149
- name.replace { case ExpandedName (_, unexp) => unexp }
149
+ name.replaceDeep {
150
+ case ExpandedName (_, unexp) => unexp
151
+ }
150
152
}
151
153
152
154
def errorName : N = likeSpacedN(name ++ nme.ERROR )
Original file line number Diff line number Diff line change @@ -69,11 +69,18 @@ object Names {
69
69
70
70
/** Apply rewrite rule given by `f` to some part of this name, skipping and rewrapping
71
71
* other decorators.
72
- * Stops at derived names whose kind has `definesNewName = true` .
72
+ * Stops at DerivedNames with infos of kind QualifiedInfo .
73
73
* If `f` does not apply to any part, return name unchanged.
74
74
*/
75
75
def replace (f : PartialFunction [Name , Name ]): ThisName
76
76
77
+ /** Same as replace, but does not stop at DerivedNames with infos of kind QualifiedInfo. */
78
+ def replaceDeep (f : PartialFunction [Name , Name ]): ThisName =
79
+ replace(f.orElse {
80
+ case DerivedName (underlying, info : QualifiedInfo ) =>
81
+ underlying.replaceDeep(f).derived(info)
82
+ })
83
+
77
84
/** If partial function `f` is defined for some part of this name, apply it
78
85
* in a Some, otherwise None.
79
86
* Stops at derived names whose kind has `definesNewName = true`.
Original file line number Diff line number Diff line change @@ -486,11 +486,10 @@ object SymDenotations {
486
486
def qualify (n : SimpleName ) =
487
487
val qn = kind(prefix.toTermName, if (filler.isEmpty) n else termName(filler + n))
488
488
if kind == FlatName && ! encl.is(JavaDefined ) then qn.compactified else qn
489
- val fn = name replace {
490
- case name : SimpleName => qualify(name)
491
- case name @ AnyQualifiedName (_, _) => qualify(name.toSimpleName)
489
+ val fn = name.replaceDeep {
490
+ case n : SimpleName => qualify(n)
492
491
}
493
- if ( name.isTypeName) fn.toTypeName else fn.toTermName
492
+ if name.isTypeName then fn.toTypeName else fn.toTermName
494
493
}
495
494
496
495
/** The encoded flat name of this denotation, where joined names are separated by `separator` characters. */
Original file line number Diff line number Diff line change @@ -23,7 +23,11 @@ object Mixin {
23
23
val description : String = " expand trait fields and trait initializers"
24
24
25
25
def traitSetterName (getter : TermSymbol )(using Context ): TermName =
26
+ extension (name : Name ) def qualifiedToSimple = name.replace {
27
+ case n @ AnyQualifiedName (_, _) => n.toSimpleName
28
+ }
26
29
getter.ensureNotPrivate.name
30
+ .qualifiedToSimple // TODO: Find out why TraitSetterNames can't be defined over QualifiedNames
27
31
.expandedName(getter.owner, TraitSetterName )
28
32
.asTermName.syntheticSetterName
29
33
}
Original file line number Diff line number Diff line change
1
+ 10
2
+ 20
3
+ 200
Original file line number Diff line number Diff line change
1
+ abstract class A :
2
+ val n : Int
3
+ def foo (): Int = n
4
+
5
+ trait B :
6
+ val m : Int
7
+ def foo (): Int = m
8
+
9
+ trait M extends A with B :
10
+ val a : Int
11
+ override def foo (): Int = a + super .foo()
12
+
13
+ trait N extends A with B :
14
+ val b : Int
15
+ override def foo (): Int = b * super .foo()
16
+
17
+ class Inner :
18
+ println(N .super [A ].foo())
19
+ println(N .super .foo())
20
+ println(foo())
21
+
22
+ object C extends A with M with N :
23
+ val a = 10
24
+ val b = 10
25
+ val m = 10
26
+ val n = 10
27
+ new Inner ()
28
+
29
+ @ main def Test = C
You can’t perform that action at this time.
0 commit comments