diff options
author | Paul Phillips <paulp@improving.org> | 2012-09-29 18:07:09 -0700 |
---|---|---|
committer | Paul Phillips <paulp@improving.org> | 2012-09-29 18:36:30 -0700 |
commit | 32e70a01da1fda7bdc91d7301ee3b8707fd2bcd4 (patch) | |
tree | 68b610a5cedca13014acdfb1bde79085349f18a9 /src/reflect | |
parent | 75a075b507b1c3f4463ab0eb42fecde66978e903 (diff) | |
download | scala-32e70a01da1fda7bdc91d7301ee3b8707fd2bcd4.tar.gz scala-32e70a01da1fda7bdc91d7301ee3b8707fd2bcd4.tar.bz2 scala-32e70a01da1fda7bdc91d7301ee3b8707fd2bcd4.zip |
Fix for SI-4729, overriding java varargs in scala.
This was a bad interaction between anonymous subclasses
and bridge methods.
new Foo { override def bar = 5 }
Scala figures it can mark "bar" private since hey, what's
the difference. The problem is that if it was overriding a
java-defined varargs method in scala, the bridge method
logic says "Oh, it's private? Then you don't need a varargs
bridge." Hey scalac, you're the one that made me private!
You made me like this! You!
Diffstat (limited to 'src/reflect')
-rw-r--r-- | src/reflect/scala/reflect/internal/Types.scala | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/src/reflect/scala/reflect/internal/Types.scala b/src/reflect/scala/reflect/internal/Types.scala index 97ad02c8a9..b3b302121d 100644 --- a/src/reflect/scala/reflect/internal/Types.scala +++ b/src/reflect/scala/reflect/internal/Types.scala @@ -6989,6 +6989,14 @@ trait Types extends api.Types { self: SymbolTable => } } + def isJavaVarargsAncestor(clazz: Symbol) = ( + clazz.isClass + && clazz.isJavaDefined + && (clazz.info.nonPrivateDecls exists isJavaVarArgsMethod) + ) + def inheritsJavaVarArgsMethod(clazz: Symbol) = + clazz.thisType.baseClasses exists isJavaVarargsAncestor + /** All types in list must be polytypes with type parameter lists of * same length as tparams. * Returns list of list of bounds infos, where corresponding type @@ -7101,6 +7109,12 @@ trait Types extends api.Types { self: SymbolTable => else (ps :+ SerializableClass.tpe).toList ) + /** Members of the given class, other than those inherited + * from Any or AnyRef. + */ + def nonTrivialMembers(clazz: Symbol): Iterable[Symbol] = + clazz.info.members filterNot (sym => sym.owner == ObjectClass || sym.owner == AnyClass) + def objToAny(tp: Type): Type = if (!phase.erasedTypes && tp.typeSymbol == ObjectClass) AnyClass.tpe else tp |