From d47109b92864b47226d823da75b00f5edb81a2dd Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Thu, 10 Oct 2013 21:54:35 +0400 Subject: [PATCH] Do not write 'jet.volatile' annotation to class files ProGuard fails when it sees a class named 'volatile' --- .../org/jetbrains/jet/codegen/AnnotationCodegen.java | 7 ++++++- .../codegen/bytecodeText/noVolatileAnnotation.kt | 3 +++ .../jet/codegen/BytecodeTextTestGenerated.java | 12 +++++++----- 3 files changed, 16 insertions(+), 6 deletions(-) create mode 100644 compiler/testData/codegen/bytecodeText/noVolatileAnnotation.kt diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java index 6a051f65848..889daf7ea91 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/AnnotationCodegen.java @@ -36,7 +36,6 @@ 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; @@ -85,11 +84,17 @@ public abstract class AnnotationCodegen { AnnotationDescriptor annotationDescriptor = bindingContext.get(BindingContext.ANNOTATION, annotationEntry); if (annotationDescriptor == null) continue; // Skipping annotations if they are not resolved. Needed for JetLightClass generation + if (isVolatile(annotationDescriptor)) continue; genAnnotation(annotationDescriptor); } } + private static boolean isVolatile(@NotNull AnnotationDescriptor annotationDescriptor) { + ClassifierDescriptor classDescriptor = annotationDescriptor.getType().getConstructor().getDeclarationDescriptor(); + return KotlinBuiltIns.getInstance().getVolatileAnnotationClass().equals(classDescriptor); + } + public void generateAnnotationDefaultValue(CompileTimeConstant value) { AnnotationVisitor visitor = visitAnnotation(null, false); // Parameters are unimportant genCompileTimeValue(null, value, visitor); diff --git a/compiler/testData/codegen/bytecodeText/noVolatileAnnotation.kt b/compiler/testData/codegen/bytecodeText/noVolatileAnnotation.kt new file mode 100644 index 00000000000..0d8b5a501e7 --- /dev/null +++ b/compiler/testData/codegen/bytecodeText/noVolatileAnnotation.kt @@ -0,0 +1,3 @@ +volatile val foo: Int = 1 + +// 0 jet/volatile \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java index 320b03b1ca6..e7856ab530a 100644 --- a/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/codegen/BytecodeTextTestGenerated.java @@ -16,17 +16,14 @@ package org.jetbrains.jet.codegen; -import junit.framework.Assert; import junit.framework.Test; import junit.framework.TestSuite; - -import java.io.File; -import java.util.regex.Pattern; import org.jetbrains.jet.JetTestUtils; import org.jetbrains.jet.test.InnerTestClasses; import org.jetbrains.jet.test.TestMetadata; -import org.jetbrains.jet.codegen.AbstractBytecodeTextTest; +import java.io.File; +import java.util.regex.Pattern; /** This class is generated by {@link org.jetbrains.jet.generators.tests.GenerateTests}. DO NOT MODIFY MANUALLY */ @SuppressWarnings("all") @@ -87,6 +84,11 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest { doTest("compiler/testData/codegen/bytecodeText/kt2887.kt"); } + @TestMetadata("noVolatileAnnotation.kt") + public void testNoVolatileAnnotation() throws Exception { + doTest("compiler/testData/codegen/bytecodeText/noVolatileAnnotation.kt"); + } + @TestMetadata("privateDefaultArgs.kt") public void testPrivateDefaultArgs() throws Exception { doTest("compiler/testData/codegen/bytecodeText/privateDefaultArgs.kt");