diff options
author | mihaylov <mihaylov@epfl.ch> | 2006-05-17 08:43:54 +0000 |
---|---|---|
committer | mihaylov <mihaylov@epfl.ch> | 2006-05-17 08:43:54 +0000 |
commit | c98f8ec7425435ab10af3b3ff6031924ba51b171 (patch) | |
tree | ac46cc769093b64c226470680591e1867fff6700 /src/compiler/scala/tools/nsc/symtab/classfile/ClassfileParser.scala | |
parent | 98e286c19736adf7b70ae4c89c0d545e09a28dc2 (diff) | |
download | scala-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.scala | 33 |
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; |