diff --git a/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java b/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java index 1322f06ce71..72676399735 100644 --- a/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java +++ b/compiler/cli/src/org/jetbrains/jet/cli/common/messages/AnalyzerWithCompilerReport.java @@ -20,17 +20,21 @@ import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiErrorElement; +import com.intellij.psi.PsiModifierListOwner; +import com.intellij.psi.util.PsiFormatUtil; import jet.Function0; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.analyzer.AnalyzeExhaust; import org.jetbrains.jet.lang.descriptors.ClassDescriptor; +import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor; import org.jetbrains.jet.lang.diagnostics.*; import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.jet.lang.psi.JetFile; import org.jetbrains.jet.lang.psi.JetIdeTemplate; import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.BindingContextUtils; import org.jetbrains.jet.lang.resolve.DescriptorUtils; import java.util.Collection; @@ -111,6 +115,23 @@ public final class AnalyzerWithCompilerReport { } } + private void reportAlternativeSignatureErrors() { + assert analyzeExhaust != null; + BindingContext bc = analyzeExhaust.getBindingContext(); + Collection descriptorsWithErrors = bc.getKeys(BindingContext.ALTERNATIVE_SIGNATURE_DATA_ERROR); + if (!descriptorsWithErrors.isEmpty()) { + StringBuilder message = new StringBuilder("The following Java entities have annotations wrong Kotlin signatures:\n"); + for (DeclarationDescriptor descriptor : descriptorsWithErrors) { + PsiElement declaration = BindingContextUtils.descriptorToDeclaration(bc, descriptor); + assert declaration instanceof PsiModifierListOwner; + String externalName = PsiFormatUtil.getExternalName((PsiModifierListOwner) declaration); + message.append(externalName).append(": "); + message.append(bc.get(BindingContext.ALTERNATIVE_SIGNATURE_DATA_ERROR, descriptor)).append("\n"); + } + messageCollectorWrapper.report(CompilerMessageSeverity.ERROR, message.toString(), CompilerMessageLocation.NO_LOCATION); + } + } + public static boolean reportDiagnostics(@NotNull BindingContext bindingContext, @NotNull MessageCollector messageCollector) { boolean hasErrors = false; for (Diagnostic diagnostic : sortedDiagnostics(bindingContext.getDiagnostics())) { @@ -191,6 +212,7 @@ public final class AnalyzerWithCompilerReport { analyzeExhaust = analyzer.invoke(); reportDiagnostics(analyzeExhaust.getBindingContext(), messageCollectorWrapper); reportIncompleteHierarchies(); + reportAlternativeSignatureErrors(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java index a1e01e64c91..c5ce0e39f5c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/BindingContext.java @@ -252,7 +252,8 @@ public interface BindingContext { WritableSlice INCOMPLETE_HIERARCHY = Slices.createCollectiveSetSlice(); - WritableSlice ALTERNATIVE_SIGNATURE_DATA_ERROR = Slices.createSimpleSlice(); + WritableSlice ALTERNATIVE_SIGNATURE_DATA_ERROR = + new BasicWritableSlice(Slices.ONLY_REWRITE_TO_EQUAL, true); WritableSlice IS_DECLARED_IN_JAVA = Slices.createSimpleSlice(); diff --git a/compiler/testData/cli/wrongKotlinSignature.kt b/compiler/testData/cli/wrongKotlinSignature.kt new file mode 100644 index 00000000000..b9f31118352 --- /dev/null +++ b/compiler/testData/cli/wrongKotlinSignature.kt @@ -0,0 +1,3 @@ +package test; + +val x = ClassWithWrongKotlinSignature.foo() \ No newline at end of file diff --git a/compiler/testData/cli/wrongKotlinSignature.out b/compiler/testData/cli/wrongKotlinSignature.out new file mode 100644 index 00000000000..56fdd0f30e3 --- /dev/null +++ b/compiler/testData/cli/wrongKotlinSignature.out @@ -0,0 +1,4 @@ +ERROR: The following Java entities have annotations wrong Kotlin signatures: +ClassWithWrongKotlinSignature java.lang.String foo(): Function names mismatch, original: foo, alternative: bar + +COMPILATION_ERROR diff --git a/compiler/testData/cli/wrongKotlinSignatureLib/ClassWithWrongKotlinSignature.java b/compiler/testData/cli/wrongKotlinSignatureLib/ClassWithWrongKotlinSignature.java new file mode 100644 index 00000000000..ca8adfaa9e2 --- /dev/null +++ b/compiler/testData/cli/wrongKotlinSignatureLib/ClassWithWrongKotlinSignature.java @@ -0,0 +1,8 @@ +import jet.runtime.typeinfo.KotlinSignature; + +public class ClassWithWrongKotlinSignature { + @KotlinSignature("fun bar() : String") + public static String foo() { + throw new UnsupportedOperationException(); + } +} diff --git a/compiler/tests/org/jetbrains/jet/cli/jvm/CliTest.java b/compiler/tests/org/jetbrains/jet/cli/jvm/CliTest.java index 9525ba8d139..8133f351d05 100644 --- a/compiler/tests/org/jetbrains/jet/cli/jvm/CliTest.java +++ b/compiler/tests/org/jetbrains/jet/cli/jvm/CliTest.java @@ -124,6 +124,15 @@ public class CliTest { executeCompilerCompareOutput(args); } + @Test + public void wrongKotlinSignature() throws Exception { + String[] args = { + "-src", "compiler/testData/cli/wrongKotlinSignature.kt", + "-classpath", "compiler/testData/cli/wrongKotlinSignatureLib", + "-output", tmpdir.getTmpDir().getPath()}; + executeCompilerCompareOutput(args); + } + @Test public void help() throws Exception { executeCompilerCompareOutput(new String[] {"-help"});