Check Retention annotation writing annotations in bytecode

This commit is contained in:
Natalia.Ukhorskaya
2013-07-25 15:34:40 +04:00
parent 1066fc7f2a
commit 09b163069f
5 changed files with 53 additions and 9 deletions
@@ -36,6 +36,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.resolve.calls.model.ResolvedCall;
import org.jetbrains.jet.lang.resolve.constants.*;
import org.jetbrains.jet.lang.resolve.constants.StringValue;
import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import java.lang.annotation.RetentionPolicy;
@@ -224,19 +225,20 @@ public abstract class AnnotationCodegen {
}
private static RetentionPolicy getRetentionPolicy(ClassifierDescriptor descriptor, JetTypeMapper typeMapper) {
RetentionPolicy rp = RetentionPolicy.RUNTIME;
/*
@todo : when JavaDescriptoResolver provides ennough info
for (AnnotationDescriptor annotationDescriptor : descriptor.getAnnotations()) {
String internalName = typeMapper.mapType(annotationDescriptor.getType()).getInternalName();
if("java/lang/annotation/RetentionPolicy".equals(internalName)) {
CompileTimeConstant<?> compileTimeConstant = annotationDescriptor.getValueArguments().get(0);
System.out.println(compileTimeConstant);
break;
if("java/lang/annotation/Retention".equals(internalName)) {
CompileTimeConstant<?> compileTimeConstant = annotationDescriptor.getAllValueArguments().values().iterator().next();
assert compileTimeConstant instanceof EnumValue : "Retention argument should be Enum value " + compileTimeConstant;
PropertyDescriptor propertyDescriptor = ((EnumValue) compileTimeConstant).getValue();
assert "java/lang/annotation/RetentionPolicy".equals(typeMapper.mapType(propertyDescriptor.getType()).getInternalName()) :
"Retention argument should be of type RetentionPolicy";
String propertyDescriptorName = propertyDescriptor.getName().asString();
return RetentionPolicy.valueOf(propertyDescriptorName);
}
}
*/
return rp; //To change body of created methods use File | Settings | File Templates.
return RetentionPolicy.CLASS;
}
abstract AnnotationVisitor visitAnnotation(String descr, boolean visible);
@@ -0,0 +1,9 @@
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
Ann class MyClass
Retention(RetentionPolicy.CLASS)
annotation class Ann
// 1 @LAnn;()
@@ -0,0 +1,9 @@
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
Ann class MyClass
Retention(RetentionPolicy.RUNTIME)
annotation class Ann
// 1 @LAnn;()
@@ -0,0 +1,9 @@
import java.lang.annotation.Retention
import java.lang.annotation.RetentionPolicy
Ann class MyClass
Retention(RetentionPolicy.SOURCE)
annotation class Ann
// 0 @LAnn;()
@@ -37,6 +37,21 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), "org.jetbrains.jet.generators.tests.GenerateTests", new File("compiler/testData/codegen/bytecodeText"), Pattern.compile("^(.+)\\.kt$"), true);
}
@TestMetadata("annotationRetentionPolicyClass.kt")
public void testAnnotationRetentionPolicyClass() throws Exception {
doTest("compiler/testData/codegen/bytecodeText/annotationRetentionPolicyClass.kt");
}
@TestMetadata("annotationRetentionPolicyRuntime.kt")
public void testAnnotationRetentionPolicyRuntime() throws Exception {
doTest("compiler/testData/codegen/bytecodeText/annotationRetentionPolicyRuntime.kt");
}
@TestMetadata("annotationRetentionPolicySource.kt")
public void testAnnotationRetentionPolicySource() throws Exception {
doTest("compiler/testData/codegen/bytecodeText/annotationRetentionPolicySource.kt");
}
@TestMetadata("componentEvaluatesOnlyOnce.kt")
public void testComponentEvaluatesOnlyOnce() throws Exception {
doTest("compiler/testData/codegen/bytecodeText/componentEvaluatesOnlyOnce.kt");