summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPaul Phillips <paulp@improving.org>2013-03-27 10:35:01 -0700
committerPaul Phillips <paulp@improving.org>2013-03-27 10:35:01 -0700
commit9e1483d4d32a644cf17ebe7bcf41b27e9a3c3160 (patch)
treebda59d947bb2e6ef44d3b2ee98c3b73a81289167 /src
parentf0b866e78fc07fe2dd5f38be74d8cba7816867a3 (diff)
parent4e10b2c833fa846c68b81e94a08d867e7de656aa (diff)
downloadscala-9e1483d4d32a644cf17ebe7bcf41b27e9a3c3160.tar.gz
scala-9e1483d4d32a644cf17ebe7bcf41b27e9a3c3160.tar.bz2
scala-9e1483d4d32a644cf17ebe7bcf41b27e9a3c3160.zip
Merge pull request #2288 from paulp/pr/2273-with-edits
SI-6387 Clones accessor before name expansion
Diffstat (limited to 'src')
-rw-r--r--src/reflect/scala/reflect/internal/Symbols.scala35
1 files changed, 24 insertions, 11 deletions
diff --git a/src/reflect/scala/reflect/internal/Symbols.scala b/src/reflect/scala/reflect/internal/Symbols.scala
index 45c16b7302..7274eeafe0 100644
--- a/src/reflect/scala/reflect/internal/Symbols.scala
+++ b/src/reflect/scala/reflect/internal/Symbols.scala
@@ -2538,20 +2538,32 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
}
/** change name by appending $$<fully-qualified-name-of-class `base`>
- * Do the same for any accessed symbols or setters/getters
+ * Do the same for any accessed symbols or setters/getters.
+ * If the accessor to be renamed is overriding a base symbol, enter
+ * a cloned symbol with the original name but without ACCESSOR flag.
*/
override def expandName(base: Symbol) {
- if (!hasFlag(EXPANDEDNAME)) {
- setFlag(EXPANDEDNAME)
- if (hasAccessorFlag && !isDeferred) {
- accessed.expandName(base)
- }
- else if (hasGetter) {
- getter(owner).expandName(base)
- setter(owner).expandName(base)
- }
- name = nme.expandedName(name.toTermName, base)
+ def expand(sym: Symbol) {
+ if ((sym eq NoSymbol) || (sym hasFlag EXPANDEDNAME)) () // skip
+ else sym setFlag EXPANDEDNAME setName nme.expandedName(sym.name.toTermName, base)
+ }
+ def cloneAndExpand(accessor: Symbol) {
+ val clone = accessor.cloneSymbol(accessor.owner, (accessor.flags | ARTIFACT) & ~ACCESSOR)
+ expand(accessor)
+ log(s"Expanded overriding accessor to $accessor, but cloned $clone to preserve override")
+ accessor.owner.info.decls enter clone
+ }
+ def expandAccessor(accessor: Symbol) {
+ if (accessor.isOverridingSymbol) cloneAndExpand(accessor) else expand(accessor)
+ }
+ if (hasAccessorFlag && !isDeferred) {
+ expand(accessed)
+ }
+ else if (hasGetter) {
+ expandAccessor(getter(owner))
+ expandAccessor(setter(owner))
}
+ expand(this)
}
protected def doCookJavaRawInfo() {
@@ -3223,6 +3235,7 @@ trait Symbols extends api.Symbols { self: SymbolTable =>
override def companionModule = NoSymbol
override def companionSymbol = NoSymbol
override def isSubClass(that: Symbol) = false
+ override def isOverridingSymbol = false
override def filter(cond: Symbol => Boolean) = this
override def defString: String = toString
override def locationString: String = ""