summaryrefslogtreecommitdiff
path: root/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
diff options
context:
space:
mode:
authormihaylov <mihaylov@epfl.ch>2006-05-17 08:43:54 +0000
committermihaylov <mihaylov@epfl.ch>2006-05-17 08:43:54 +0000
commitc98f8ec7425435ab10af3b3ff6031924ba51b171 (patch)
treeac46cc769093b64c226470680591e1867fff6700 /src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
parent98e286c19736adf7b70ae4c89c0d545e09a28dc2 (diff)
downloadscala-c98f8ec7425435ab10af3b3ff6031924ba51b171.tar.gz
scala-c98f8ec7425435ab10af3b3ff6031924ba51b171.tar.bz2
scala-c98f8ec7425435ab10af3b3ff6031924ba51b171.zip
Added support for emitting Java annotations int...
Added support for emitting Java annotations into classfiles
Diffstat (limited to 'src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala')
-rw-r--r--src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala33
1 files changed, 24 insertions, 9 deletions
diff --git a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
index 489502910c..0bd20198a4 100644
--- a/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
+++ b/src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala
@@ -242,12 +242,14 @@ abstract class ClassfileParser {
def parseClass(): unit = {
val jflags = in.nextChar;
+ val isAttribute = (jflags & JAVA_ACC_ANNOTATION) != 0;
var sflags = transFlags(jflags);
if ((sflags & DEFERRED) != 0) sflags = sflags & ~DEFERRED | ABSTRACT;
val c = pool.getClassSymbol(in.nextChar);
if (c != clazz)
throw new IOException("class file '" + in.file + "' contains wrong " + clazz);
- val superType = pool.getSuperClass(in.nextChar).tpe;
+ val superType = if (isAttribute) { in.nextChar; definitions.AttributeClass.tpe }
+ else pool.getSuperClass(in.nextChar).tpe;
val ifaceCount = in.nextChar;
val parents = (superType ::
(for (val i <- List.range(0, ifaceCount))
@@ -276,12 +278,24 @@ abstract class ClassfileParser {
for (val i <- Iterator.range(0, fieldCount)) parseField();
val methodCount = in.nextChar;
for (val i <- Iterator.range(0, methodCount)) parseMethod();
- if (instanceDefs.lookup(nme.CONSTRUCTOR) == NoSymbol && (sflags & INTERFACE) == 0) {
- //System.out.println("adding constructor to " + clazz);//DEBUG
- instanceDefs.enter(
- clazz.newConstructor(Position.NOPOS)
- .setFlag(clazz.flags & ConstrFlags).setInfo(MethodType(List(), clazz.tpe)));
- }
+ if ((instanceDefs.lookup(nme.CONSTRUCTOR) == NoSymbol
+ && (sflags & INTERFACE) == 0) ||
+ isAttribute)
+ {
+ //System.out.println("adding constructor to " + clazz);//DEBUG
+ val constrParamTypes =
+ if (isAttribute) {
+ val value = instanceDefs.lookup(nme.value)
+ if (value == NoSymbol) List ()
+ else List(value.tpe.resultType)
+ //System.out.println("" + value + " : " + value.tpe)
+ }
+ else List()
+ instanceDefs.enter(
+ clazz.newConstructor(Position.NOPOS)
+ .setFlag(clazz.flags & ConstrFlags)
+ .setInfo(MethodType(constrParamTypes, clazz.tpe)));
+ }
}
}
@@ -600,11 +614,12 @@ abstract class ClassfileParser {
res = res | PRIVATE
else if ((flags & JAVA_ACC_PROTECTED) != 0)
res = res | PROTECTED
- if ((flags & JAVA_ACC_ABSTRACT) != 0)
+ if ((flags & JAVA_ACC_ABSTRACT) != 0 && (flags & JAVA_ACC_ANNOTATION) == 0)
res = res | DEFERRED;
if ((flags & JAVA_ACC_FINAL) != 0)
res = res | FINAL;
- if ((flags & JAVA_ACC_INTERFACE) != 0)
+ if (((flags & JAVA_ACC_INTERFACE) != 0) &&
+ ((flags & JAVA_ACC_ANNOTATION) == 0))
res = res | TRAIT | INTERFACE | ABSTRACT;
if ((flags & JAVA_ACC_SYNTHETIC) != 0)
res = res | SYNTHETIC;