From 25dc5b5991da1c32bf7f9b62f18010d60d635e4c Mon Sep 17 00:00:00 2001 From: Evgeny Gerashchenko Date: Fri, 1 Feb 2013 14:29:25 +0400 Subject: [PATCH] Checking redundant projections in jdk annotations. --- .../kotlinSignature/TypeTransformingVisitor.java | 15 +++++++++++++-- .../jvm/compiler/JdkAnnotationsValidityTest.java | 15 ++++++++++++++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java index bdbaf195bb0..3bb68d12be9 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/kotlinSignature/TypeTransformingVisitor.java @@ -18,6 +18,7 @@ package org.jetbrains.jet.lang.resolve.java.kotlinSignature; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.annotations.TestOnly; import org.jetbrains.asm4.Type; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; import org.jetbrains.jet.lang.descriptors.ClassifierDescriptor; @@ -39,7 +40,9 @@ import java.util.*; import static org.jetbrains.jet.lang.resolve.java.TypeUsage.TYPE_ARGUMENT; import static org.jetbrains.jet.lang.types.Variance.INVARIANT; -class TypeTransformingVisitor extends JetVisitor { +public class TypeTransformingVisitor extends JetVisitor { + private static boolean strictMode = false; + private final JetType originalType; private final Map originalToAltTypeParameters; @@ -179,7 +182,10 @@ class TypeTransformingVisitor extends JetVisitor { } if (altProjectionKind != INVARIANT && parameter.getVariance() != INVARIANT) { if (altProjectionKind == parameter.getVariance()) { - // TODO report redundant if in strict mode + if (strictMode) { + throw new AlternativeSignatureMismatchException("Projection kind '%s' is redundant", + altProjectionKind, DescriptorUtils.getFQName(typeConstructor.getDeclarationDescriptor())); + } } else { throw new AlternativeSignatureMismatchException("Projection kind '%s' is conflicting with variance of %s", @@ -232,4 +238,9 @@ class TypeTransformingVisitor extends JetVisitor { private static boolean isSameName(String qualifiedName, String fullyQualifiedName) { return fullyQualifiedName.equals(qualifiedName) || fullyQualifiedName.endsWith("." + qualifiedName); } + + @TestOnly + public static void setStrictMode(boolean strictMode) { + TypeTransformingVisitor.strictMode = strictMode; + } } diff --git a/compiler/tests/org/jetbrains/jet/jvm/compiler/JdkAnnotationsValidityTest.java b/compiler/tests/org/jetbrains/jet/jvm/compiler/JdkAnnotationsValidityTest.java index e2eab280f6e..a5b1711a09f 100644 --- a/compiler/tests/org/jetbrains/jet/jvm/compiler/JdkAnnotationsValidityTest.java +++ b/compiler/tests/org/jetbrains/jet/jvm/compiler/JdkAnnotationsValidityTest.java @@ -42,6 +42,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.java.JavaDescriptorResolver; import org.jetbrains.jet.lang.resolve.java.JavaToKotlinClassMap; +import org.jetbrains.jet.lang.resolve.java.kotlinSignature.TypeTransformingVisitor; import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.scopes.JetScope; import org.jetbrains.jet.renderer.DescriptorRenderer; @@ -65,10 +66,22 @@ public class JdkAnnotationsValidityTest extends UsefulTestCase { return new JetCoreEnvironment(parentDisposable, configuration); } + @Override + protected void setUp() throws Exception { + super.setUp(); + TypeTransformingVisitor.setStrictMode(true); + } + + @Override + protected void tearDown() throws Exception { + TypeTransformingVisitor.setStrictMode(false); + super.tearDown(); + } + public void testNoErrorsInAlternativeSignatures() { List affectedClasses = getAffectedClasses("file://jdk-annotations"); - final Map> errors = Maps.newHashMap(); + final Map> errors = Maps.newLinkedHashMap(); for (int chunkIndex = 0; chunkIndex < affectedClasses.size() / CLASSES_IN_CHUNK + 1; chunkIndex++) { Disposable parentDisposable = CompileEnvironmentUtil.createMockDisposable();