summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sources/scalac/backend/jvm/GenJVM.java9
-rw-r--r--sources/scalac/symtab/Symbol.java11
-rw-r--r--sources/scalac/transformer/AddInterfacesPhase.java6
3 files changed, 12 insertions, 14 deletions
diff --git a/sources/scalac/backend/jvm/GenJVM.java b/sources/scalac/backend/jvm/GenJVM.java
index 9c18e219fc..aa5998caa8 100644
--- a/sources/scalac/backend/jvm/GenJVM.java
+++ b/sources/scalac/backend/jvm/GenJVM.java
@@ -613,7 +613,7 @@ class GenJVM {
}
protected byte genLoadModule(Symbol sym) {
- String javaSymName = javaName(sym);
+ String javaSymName = javaName(sym.moduleClass());
if (javaSymName.equals(currClassName))
currIL.append(ic.THIS);
else {
@@ -1416,19 +1416,18 @@ class GenJVM {
}
protected String javaName(Symbol sym) {
+ assert sym.isClass() : Debug.show(sym);
if (sym == defs.ANY_CLASS || sym == defs.ANYREF_CLASS)
return JAVA_LANG_OBJECT;
else {
StringBuffer buf = new StringBuffer(sym.name.toString());
if ((sym.isModule() || sym.isModuleClass()) && !sym.isJava())
buf.append('$');
- for (sym = sym.owner();
- !(sym.isAnonymousClass() || sym.isPackage());
- sym = sym.owner()) {
+ for (sym = sym.owner(); !sym.isPackage(); sym = sym.owner()) {
buf.insert(0, '$');
buf.insert(0, sym.name);
}
- if (!sym.isAnonymousClass()) {
+ if (!sym.isRoot()) {
buf.insert(0, '.');
buf.insert(0, sym.fullName());
}
diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java
index 43c2867796..adc38fe975 100644
--- a/sources/scalac/symtab/Symbol.java
+++ b/sources/scalac/symtab/Symbol.java
@@ -222,9 +222,7 @@ public abstract class Symbol implements Modifiers, Kinds {
/* Does this symbol denote an anonymous class? */
public final boolean isAnonymousClass() {
- return kind == CLASS &&
- (name == Names.EMPTY.toTypeName() ||
- name == Names.ANON_CLASS_NAME.toTypeName());
+ return isClass() && name.startsWith(Names.ANON_CLASS_NAME);
}
/** Does this symbol denote the root class or root module?
@@ -262,7 +260,7 @@ public abstract class Symbol implements Modifiers, Kinds {
/** Does this symbol denote a class? */
public final boolean isClass() {
- return kind == CLASS;
+ return kind == CLASS && (flags & PACKAGE) == 0;
}
/** Does this symbol denote a case class?
@@ -342,9 +340,8 @@ public abstract class Symbol implements Modifiers, Kinds {
* - it is defined within a local class
*/
public final boolean isLocalClass() {
- return kind == CLASS &&
- !isPackage() &&
- (name == Names.EMPTY.toTypeName() ||
+ return isClass() &&
+ (isAnonymousClass() ||
owner.isValue() ||
owner.isLocalClass());
}
diff --git a/sources/scalac/transformer/AddInterfacesPhase.java b/sources/scalac/transformer/AddInterfacesPhase.java
index 5d85bf317e..3c51efae91 100644
--- a/sources/scalac/transformer/AddInterfacesPhase.java
+++ b/sources/scalac/transformer/AddInterfacesPhase.java
@@ -40,8 +40,9 @@ public class AddInterfacesPhase extends PhaseDescriptor {
}
public Type transformInfo(Symbol sym, Type tp) {
- if (sym.isConstructor()
- && needInterface(sym.primaryConstructorClass())) {
+ if (sym.isConstructor()) {
+ Symbol clazz =sym.primaryConstructorClass();
+ if (clazz.isPackage() || !needInterface(clazz)) return tp;
// The symbol is a constructor of a class which needs
// an interface. All its value arguments have to be
// removed.
@@ -183,6 +184,7 @@ public class AddInterfacesPhase extends PhaseDescriptor {
: Debug.toString(classSym) + " is not a class (kind " + classSym.kind + ")";
return !(classSym.isJava()
|| classSym.isModuleClass()
+ || classSym.isAnonymousClass()
|| hasInterfaceSymbol(classSym)
|| classSym == Global.instance.definitions.ANY_CLASS
|| classSym == Global.instance.definitions.ANYREF_CLASS