Failing with compilation error when Java library has wrong @KotlinSignatureAnnotation.
This commit is contained in:
+22
@@ -20,17 +20,21 @@ import com.intellij.openapi.util.text.StringUtil;
|
|||||||
import com.intellij.openapi.vfs.VirtualFile;
|
import com.intellij.openapi.vfs.VirtualFile;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
import com.intellij.psi.PsiErrorElement;
|
import com.intellij.psi.PsiErrorElement;
|
||||||
|
import com.intellij.psi.PsiModifierListOwner;
|
||||||
|
import com.intellij.psi.util.PsiFormatUtil;
|
||||||
import jet.Function0;
|
import jet.Function0;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
|
import org.jetbrains.jet.analyzer.AnalyzeExhaust;
|
||||||
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
|
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.*;
|
||||||
import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages;
|
import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages;
|
||||||
import org.jetbrains.jet.lang.psi.JetFile;
|
import org.jetbrains.jet.lang.psi.JetFile;
|
||||||
import org.jetbrains.jet.lang.psi.JetIdeTemplate;
|
import org.jetbrains.jet.lang.psi.JetIdeTemplate;
|
||||||
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
|
import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.BindingContext;
|
import org.jetbrains.jet.lang.resolve.BindingContext;
|
||||||
|
import org.jetbrains.jet.lang.resolve.BindingContextUtils;
|
||||||
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
import org.jetbrains.jet.lang.resolve.DescriptorUtils;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@@ -111,6 +115,23 @@ public final class AnalyzerWithCompilerReport {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void reportAlternativeSignatureErrors() {
|
||||||
|
assert analyzeExhaust != null;
|
||||||
|
BindingContext bc = analyzeExhaust.getBindingContext();
|
||||||
|
Collection<DeclarationDescriptor> 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) {
|
public static boolean reportDiagnostics(@NotNull BindingContext bindingContext, @NotNull MessageCollector messageCollector) {
|
||||||
boolean hasErrors = false;
|
boolean hasErrors = false;
|
||||||
for (Diagnostic diagnostic : sortedDiagnostics(bindingContext.getDiagnostics())) {
|
for (Diagnostic diagnostic : sortedDiagnostics(bindingContext.getDiagnostics())) {
|
||||||
@@ -191,6 +212,7 @@ public final class AnalyzerWithCompilerReport {
|
|||||||
analyzeExhaust = analyzer.invoke();
|
analyzeExhaust = analyzer.invoke();
|
||||||
reportDiagnostics(analyzeExhaust.getBindingContext(), messageCollectorWrapper);
|
reportDiagnostics(analyzeExhaust.getBindingContext(), messageCollectorWrapper);
|
||||||
reportIncompleteHierarchies();
|
reportIncompleteHierarchies();
|
||||||
|
reportAlternativeSignatureErrors();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -252,7 +252,8 @@ public interface BindingContext {
|
|||||||
|
|
||||||
WritableSlice<ClassDescriptor, Boolean> INCOMPLETE_HIERARCHY = Slices.createCollectiveSetSlice();
|
WritableSlice<ClassDescriptor, Boolean> INCOMPLETE_HIERARCHY = Slices.createCollectiveSetSlice();
|
||||||
|
|
||||||
WritableSlice<DeclarationDescriptor, String> ALTERNATIVE_SIGNATURE_DATA_ERROR = Slices.createSimpleSlice();
|
WritableSlice<DeclarationDescriptor, String> ALTERNATIVE_SIGNATURE_DATA_ERROR =
|
||||||
|
new BasicWritableSlice<DeclarationDescriptor, String>(Slices.ONLY_REWRITE_TO_EQUAL, true);
|
||||||
|
|
||||||
WritableSlice<CallableDescriptor, Boolean> IS_DECLARED_IN_JAVA = Slices.createSimpleSlice();
|
WritableSlice<CallableDescriptor, Boolean> IS_DECLARED_IN_JAVA = Slices.createSimpleSlice();
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
val x = ClassWithWrongKotlinSignature.foo()
|
||||||
@@ -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
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
import jet.runtime.typeinfo.KotlinSignature;
|
||||||
|
|
||||||
|
public class ClassWithWrongKotlinSignature {
|
||||||
|
@KotlinSignature("fun bar() : String")
|
||||||
|
public static String foo() {
|
||||||
|
throw new UnsupportedOperationException();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -124,6 +124,15 @@ public class CliTest {
|
|||||||
executeCompilerCompareOutput(args);
|
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
|
@Test
|
||||||
public void help() throws Exception {
|
public void help() throws Exception {
|
||||||
executeCompilerCompareOutput(new String[] {"-help"});
|
executeCompilerCompareOutput(new String[] {"-help"});
|
||||||
|
|||||||
Reference in New Issue
Block a user