From 6be9c7c05dd7f7cc6a8390f1e3ef576086799e82 Mon Sep 17 00:00:00 2001 From: noti0na1 Date: Sat, 22 Jun 2019 22:27:13 -0400 Subject: [PATCH] Add support of parsing runtime invisible annotations --- .../src/dotty/tools/dotc/core/StdNames.scala | 36 +++++++++---------- .../dotc/core/classfile/ClassfileParser.scala | 7 ++-- 2 files changed, 22 insertions(+), 21 deletions(-) diff --git a/compiler/src/dotty/tools/dotc/core/StdNames.scala b/compiler/src/dotty/tools/dotc/core/StdNames.scala index 420e9190ad15..74c2136b0640 100644 --- a/compiler/src/dotty/tools/dotc/core/StdNames.scala +++ b/compiler/src/dotty/tools/dotc/core/StdNames.scala @@ -221,24 +221,24 @@ object StdNames { final val bridgeAnnot: N = "bridge" // Classfile Attributes - final val AnnotationDefaultATTR: N = "AnnotationDefault" - final val BridgeATTR: N = "Bridge" - final val ClassfileAnnotationATTR: N = "RuntimeInvisibleAnnotations" // RetentionPolicy.CLASS. Currently not used (Apr 2009). - final val CodeATTR: N = "Code" - final val ConstantValueATTR: N = "ConstantValue" - final val DeprecatedATTR: N = "Deprecated" - final val ExceptionsATTR: N = "Exceptions" - final val InnerClassesATTR: N = "InnerClasses" - final val LineNumberTableATTR: N = "LineNumberTable" - final val LocalVariableTableATTR: N = "LocalVariableTable" - final val RuntimeAnnotationATTR: N = "RuntimeVisibleAnnotations" // RetentionPolicy.RUNTIME - final val RuntimeParamAnnotationATTR: N = "RuntimeVisibleParameterAnnotations" // RetentionPolicy.RUNTIME (annotations on parameters) - final val ScalaATTR: N = "Scala" - final val ScalaSignatureATTR: N = "ScalaSig" - final val TASTYATTR: N = "TASTY" - final val SignatureATTR: N = "Signature" - final val SourceFileATTR: N = "SourceFile" - final val SyntheticATTR: N = "Synthetic" + final val AnnotationDefaultATTR: N = "AnnotationDefault" + final val BridgeATTR: N = "Bridge" + final val CodeATTR: N = "Code" + final val ConstantValueATTR: N = "ConstantValue" + final val DeprecatedATTR: N = "Deprecated" + final val ExceptionsATTR: N = "Exceptions" + final val InnerClassesATTR: N = "InnerClasses" + final val LineNumberTableATTR: N = "LineNumberTable" + final val LocalVariableTableATTR: N = "LocalVariableTable" + final val RuntimeVisibleAnnotationATTR: N = "RuntimeVisibleAnnotations" // RetentionPolicy.RUNTIME + final val RuntimeInvisibleAnnotationATTR: N = "RuntimeInvisibleAnnotations" // RetentionPolicy.CLASS + final val RuntimeParamAnnotationATTR: N = "RuntimeVisibleParameterAnnotations" // RetentionPolicy.RUNTIME (annotations on parameters) + final val ScalaATTR: N = "Scala" + final val ScalaSignatureATTR: N = "ScalaSig" + final val TASTYATTR: N = "TASTY" + final val SignatureATTR: N = "Signature" + final val SourceFileATTR: N = "SourceFile" + final val SyntheticATTR: N = "Synthetic" // ----- Term names ----------------------------------------- diff --git a/compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala b/compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala index 5e7b3a4eb76c..c2a907cb21e9 100644 --- a/compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala +++ b/compiler/src/dotty/tools/dotc/core/classfile/ClassfileParser.scala @@ -570,13 +570,14 @@ class ClassfileParser( case tpnme.AnnotationDefaultATTR => sym.addAnnotation(Annotation(defn.AnnotationDefaultAnnot, Nil)) // Java annotations on classes / methods / fields with RetentionPolicy.RUNTIME - case tpnme.RuntimeAnnotationATTR => + case tpnme.RuntimeVisibleAnnotationATTR + | tpnme.RuntimeInvisibleAnnotationATTR => parseAnnotations(attrLen) // TODO 1: parse runtime visible annotations on parameters // case tpnme.RuntimeParamAnnotationATTR - // TODO 2: also parse RuntimeInvisibleAnnotation / RuntimeInvisibleParamAnnotation, + // TODO 2: also parse RuntimeInvisibleParamAnnotation // i.e. java annotations with RetentionPolicy.CLASS? case tpnme.ExceptionsATTR => @@ -852,7 +853,7 @@ class ClassfileParser( return Some(NoEmbedded) } - if (scan(tpnme.RuntimeAnnotationATTR)) { + if (scan(tpnme.RuntimeVisibleAnnotationATTR) || scan(tpnme.RuntimeInvisibleAnnotationATTR)) { val attrLen = in.nextInt val nAnnots = in.nextChar var i = 0