diff options
Diffstat (limited to 'sources/scalac/symtab')
-rw-r--r-- | sources/scalac/symtab/Modifiers.java | 8 | ||||
-rw-r--r-- | sources/scalac/symtab/Symbol.java | 7 | ||||
-rw-r--r-- | sources/scalac/symtab/Type.java | 4 | ||||
-rw-r--r-- | sources/scalac/symtab/classfile/ClassfileParser.java | 4 |
4 files changed, 16 insertions, 7 deletions
diff --git a/sources/scalac/symtab/Modifiers.java b/sources/scalac/symtab/Modifiers.java index cc9111887a..292eb28bbc 100644 --- a/sources/scalac/symtab/Modifiers.java +++ b/sources/scalac/symtab/Modifiers.java @@ -19,7 +19,9 @@ public interface Modifiers { int SEALED = 0x00000010; int OVERRIDE = 0x00000020; int CASE = 0x00000040; - int ABSTRACTCLASS = 0x00000080; // abstract class + int ABSTRACT = 0x00000080; // abstract class, or used in conjunction + // with abstract override. + // Note difference to DEFERRED! int DEF = 0x00000100; // a def parameter int REPEATED = 0x00000200; // a repeated parameter @@ -69,7 +71,9 @@ public interface Modifiers { public static class Helper { public static boolean isAbstract(int flags) { - return (flags & (DEFERRED | ABSTRACTCLASS)) != 0; + // todo: ABSTRACT and DEFERRED should be separated. + return (flags & DEFERRED) != 0 || + (flags & (ABSTRACT | OVERRIDE)) == ABSTRACT; } public static boolean isFinal(int flags) { diff --git a/sources/scalac/symtab/Symbol.java b/sources/scalac/symtab/Symbol.java index 4b710248c6..3303edac5f 100644 --- a/sources/scalac/symtab/Symbol.java +++ b/sources/scalac/symtab/Symbol.java @@ -328,10 +328,15 @@ public abstract class Symbol implements Modifiers, Kinds { public final boolean isAbstractClass() { preInitialize(); - return (flags & ABSTRACTCLASS) != 0 && + return kind == CLASS && (flags & ABSTRACT) != 0 && this != Global.instance.definitions.ARRAY_CLASS; } + public final boolean isAbstractOverride() { + preInitialize(); + return (flags & (ABSTRACT | OVERRIDE)) == (ABSTRACT | OVERRIDE); + } + /* Does this symbol denote an anonymous class? */ public final boolean isAnonymousClass() { return isClass() && name.startsWith(Names.ANON_CLASS_NAME); diff --git a/sources/scalac/symtab/Type.java b/sources/scalac/symtab/Type.java index fac8f18f48..1532d9c0e6 100644 --- a/sources/scalac/symtab/Type.java +++ b/sources/scalac/symtab/Type.java @@ -157,7 +157,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { ExtCompoundType res = new ExtCompoundType(parts, members); res.tsym = new ClassSymbol( Position.FIRSTPOS, Names.COMPOUND_NAME.toTypeName(), Symbol.NONE, - SYNTHETIC | ABSTRACTCLASS); + SYNTHETIC | ABSTRACT); res.tsym.setInfo(res); res.tsym.primaryConstructor().setInfo( Type.MethodType(Symbol.EMPTY_ARRAY, Type.NoType)); @@ -590,7 +590,7 @@ public class Type implements Modifiers, Kinds, TypeTags, EntryTags { case TypeRef(_, Symbol sym, _): return sym.kind == CLASS && ((sym.flags & JAVA) != 0 || - (sym.flags & (TRAIT | ABSTRACTCLASS)) == 0); + (sym.flags & (TRAIT | ABSTRACT)) == 0); default: return false; } diff --git a/sources/scalac/symtab/classfile/ClassfileParser.java b/sources/scalac/symtab/classfile/ClassfileParser.java index 28f31c3647..9debd17b0f 100644 --- a/sources/scalac/symtab/classfile/ClassfileParser.java +++ b/sources/scalac/symtab/classfile/ClassfileParser.java @@ -86,7 +86,7 @@ public class ClassfileParser implements ClassfileConstants { // todo: correct flag transition c.flags = transFlags(flags); if ((c.flags & Modifiers.DEFERRED) != 0) - c.flags = c.flags & ~Modifiers.DEFERRED | Modifiers.ABSTRACTCLASS; + c.flags = c.flags & ~Modifiers.DEFERRED | Modifiers.ABSTRACT; Type supertpe = readClassType(in.nextChar()); Type[] basetpes = new Type[in.nextChar() + 1]; this.locals = new Scope(); @@ -145,7 +145,7 @@ public class ClassfileParser implements ClassfileConstants { if ((flags & 0x0010) != 0) res |= Modifiers.FINAL; if ((flags & 0x0200) != 0) - res |= Modifiers.INTERFACE | Modifiers.TRAIT | Modifiers.ABSTRACTCLASS; + res |= Modifiers.INTERFACE | Modifiers.TRAIT | Modifiers.ABSTRACT; return res | Modifiers.JAVA; } |