Frontend tests: serialize dynamic call descriptors and check them in diagnostic tests.

This commit is contained in:
Zalim Bashorov
2014-12-15 22:37:41 +03:00
parent d071c44126
commit 2484954e2f
26 changed files with 324 additions and 26 deletions
@@ -17,7 +17,9 @@
package org.jetbrains.jet.checkers;
import com.google.common.base.Predicate;
import com.google.common.collect.*;
import com.google.common.collect.Collections2;
import com.google.common.collect.LinkedListMultimap;
import com.google.common.collect.Lists;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiElement;
@@ -30,12 +32,12 @@ import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.Stack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.diagnostics.Diagnostic;
import org.jetbrains.jet.lang.diagnostics.DiagnosticFactory;
import org.jetbrains.jet.lang.diagnostics.Severity;
import org.jetbrains.jet.lang.diagnostics.rendering.AbstractDiagnosticWithParametersRenderer;
import org.jetbrains.jet.lang.diagnostics.rendering.DefaultErrorMessages;
import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticFactoryToRendererMap;
import org.jetbrains.jet.lang.diagnostics.rendering.DiagnosticRenderer;
import org.jetbrains.jet.lang.psi.JetElement;
import org.jetbrains.jet.lang.psi.JetExpression;
@@ -87,7 +89,8 @@ public class CheckerTestUtil {
public static List<Diagnostic> getDiagnosticsIncludingSyntaxErrors(
@NotNull BindingContext bindingContext,
@NotNull final PsiElement root,
boolean markDynamicCalls
boolean markDynamicCalls,
@Nullable List<DeclarationDescriptor> dynamicCallDescriptors
) {
List<Diagnostic> diagnostics = new ArrayList<Diagnostic>();
diagnostics.addAll(Collections2.filter(bindingContext.getDiagnostics().all(),
@@ -100,16 +103,17 @@ public class CheckerTestUtil {
for (PsiErrorElement errorElement : AnalyzingUtils.getSyntaxErrorRanges(root)) {
diagnostics.add(new SyntaxErrorDiagnostic(errorElement));
}
List<Diagnostic> debugAnnotations = getDebugInfoDiagnostics(root, bindingContext, markDynamicCalls);
List<Diagnostic> debugAnnotations = getDebugInfoDiagnostics(root, bindingContext, markDynamicCalls, dynamicCallDescriptors);
diagnostics.addAll(debugAnnotations);
return diagnostics;
}
@NotNull
public static List<Diagnostic> getDebugInfoDiagnostics(
private static List<Diagnostic> getDebugInfoDiagnostics(
@NotNull PsiElement root,
@NotNull BindingContext bindingContext,
final boolean markDynamicCalls
final boolean markDynamicCalls,
@Nullable final List<DeclarationDescriptor> dynamicCallDescriptors
) {
final List<Diagnostic> debugAnnotations = Lists.newArrayList();
DebugInfoUtil.markDebugAnnotations(root, bindingContext, new DebugInfoUtil.DebugInfoReporter() {
@@ -129,7 +133,11 @@ public class CheckerTestUtil {
}
@Override
public void reportDynamicCall(@NotNull JetElement element) {
public void reportDynamicCall(@NotNull JetElement element, DeclarationDescriptor declarationDescriptor) {
if (dynamicCallDescriptors != null) {
dynamicCallDescriptors.add(declarationDescriptor);
}
if (markDynamicCalls) {
newDiagnostic(element, DebugInfoDiagnosticFactory.DYNAMIC);
}
@@ -64,7 +64,7 @@ public class DebugInfoUtil {
public abstract void reportUnresolvedWithTarget(@NotNull JetReferenceExpression expression, @NotNull String target);
public void reportDynamicCall(@NotNull JetElement element) { }
public void reportDynamicCall(@NotNull JetElement element, DeclarationDescriptor declarationDescriptor) { }
}
public static void markDebugAnnotations(
@@ -99,11 +99,9 @@ public class DebugInfoUtil {
@Override
public void visitForExpression(@NotNull JetForExpression expression) {
JetExpression range = expression.getLoopRange();
if (reportIfDynamicCall(range, range, LOOP_RANGE_ITERATOR_RESOLVED_CALL) ||
reportIfDynamicCall(range, range, LOOP_RANGE_HAS_NEXT_RESOLVED_CALL) ||
reportIfDynamicCall(range, range, LOOP_RANGE_NEXT_RESOLVED_CALL)) {
// for side-effect of the condition only
}
reportIfDynamicCall(range, range, LOOP_RANGE_ITERATOR_RESOLVED_CALL);
reportIfDynamicCall(range, range, LOOP_RANGE_HAS_NEXT_RESOLVED_CALL);
reportIfDynamicCall(range, range, LOOP_RANGE_NEXT_RESOLVED_CALL);
super.visitForExpression(expression);
}
@@ -120,11 +118,9 @@ public class DebugInfoUtil {
VariableDescriptor descriptor = bindingContext.get(VARIABLE, property);
if (descriptor instanceof PropertyDescriptor && property.getDelegate() != null) {
PropertyDescriptor propertyDescriptor = (PropertyDescriptor) descriptor;
if (reportIfDynamicCall(property.getDelegate(), propertyDescriptor.getGetter(), DELEGATED_PROPERTY_RESOLVED_CALL)
|| reportIfDynamicCall(property.getDelegate(), propertyDescriptor.getSetter(), DELEGATED_PROPERTY_RESOLVED_CALL)
|| reportIfDynamicCall(property.getDelegate(), propertyDescriptor, DELEGATED_PROPERTY_PD_RESOLVED_CALL)) {
// for side-effect of the condition only
}
reportIfDynamicCall(property.getDelegate(), propertyDescriptor.getGetter(), DELEGATED_PROPERTY_RESOLVED_CALL);
reportIfDynamicCall(property.getDelegate(), propertyDescriptor.getSetter(), DELEGATED_PROPERTY_RESOLVED_CALL);
reportIfDynamicCall(property.getDelegate(), propertyDescriptor, DELEGATED_PROPERTY_PD_RESOLVED_CALL);
}
super.visitProperty(property);
}
@@ -230,7 +226,7 @@ public class DebugInfoUtil {
private static boolean reportIfDynamic(JetElement element, DeclarationDescriptor declarationDescriptor, DebugInfoReporter debugInfoReporter) {
if (declarationDescriptor != null && TasksPackage.isDynamic(declarationDescriptor)) {
debugInfoReporter.reportDynamicCall(element);
debugInfoReporter.reportDynamicCall(element, declarationDescriptor);
return true;
}
return false;
@@ -0,0 +1 @@
public final fun sam(/*0*/ p0: dynamic): dynamic
@@ -0,0 +1,5 @@
public final fun foo(): dynamic
public final var bar: dynamic
public final fun <get-bar>(): dynamic
public final fun <set-bar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final fun baz(/*0*/ p0: dynamic): dynamic
@@ -0,0 +1,72 @@
public final fun plus(): dynamic
public final fun minus(): dynamic
public final fun not(): dynamic
public final fun plus(/*0*/ p0: dynamic): dynamic
public final fun plus(/*0*/ p0: dynamic): dynamic
public final fun minus(/*0*/ p0: dynamic): dynamic
public final fun times(/*0*/ p0: dynamic): dynamic
public final fun div(/*0*/ p0: dynamic): dynamic
public final fun mod(/*0*/ p0: dynamic): dynamic
public final fun rangeTo(/*0*/ p0: dynamic): dynamic
public final fun and(/*0*/ p0: dynamic): dynamic
public final fun contains(/*0*/ p0: dynamic): dynamic
public final fun contains(/*0*/ p0: dynamic): dynamic
public final fun contains(/*0*/ p0: dynamic): dynamic
public final fun contains(/*0*/ p0: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public final fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public final fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ p2: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun inc(): dynamic
public final fun inc(): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun dec(): dynamic
public final fun dec(): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun invoke(): dynamic
public final fun invoke(/*0*/ p0: dynamic): dynamic
public final fun invoke(/*0*/ name: dynamic): dynamic
public final fun invoke(/*0*/ p0: () -> dynamic): dynamic
public final fun invoke(/*0*/ p0: dynamic): dynamic
public final fun compareTo(/*0*/ p0: dynamic): dynamic
public final fun compareTo(/*0*/ p0: dynamic): dynamic
public final fun compareTo(/*0*/ p0: dynamic): dynamic
public final fun compareTo(/*0*/ p0: dynamic): dynamic
public final fun foo(): dynamic
public final fun component1(): dynamic
public final fun component2(): dynamic
public final fun component3(): dynamic
public final fun foo(): dynamic
public final fun foo(): dynamic
public final fun foo(): dynamic
public final fun inc(): dynamic
public final fun inc(): dynamic
public final fun dec(): dynamic
public final fun dec(): dynamic
public final fun plusAssign(/*0*/ p0: dynamic): dynamic
public final fun minusAssign(/*0*/ p0: dynamic): dynamic
public final fun timesAssign(/*0*/ p0: dynamic): dynamic
public final fun divAssign(/*0*/ p0: dynamic): dynamic
public final fun modAssign(/*0*/ p0: dynamic): dynamic
public final fun plusAssign(/*0*/ p0: dynamic): dynamic
public final fun minusAssign(/*0*/ p0: dynamic): dynamic
public final fun timesAssign(/*0*/ p0: dynamic): dynamic
public final fun divAssign(/*0*/ p0: dynamic): dynamic
public final fun modAssign(/*0*/ p0: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun plusAssign(/*0*/ p0: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun minusAssign(/*0*/ p0: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun timesAssign(/*0*/ p0: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun divAssign(/*0*/ p0: dynamic): dynamic
public final fun get(/*0*/ p0: dynamic): dynamic
public final fun modAssign(/*0*/ p0: dynamic): dynamic
public fun get(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public fun propertyDelegated(/*0*/ p0: dynamic): dynamic
public fun get(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public fun set(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ p2: dynamic): dynamic
public fun propertyDelegated(/*0*/ p0: dynamic): dynamic
@@ -60,7 +60,7 @@ fun test(d: dynamic) {
d <!DEBUG_INFO_DYNAMIC!>>=<!> d
d <!DEBUG_INFO_DYNAMIC!>><!> d
for (i in <!DEBUG_INFO_DYNAMIC!>d<!>) {
for (i in d) {
i.<!DEBUG_INFO_DYNAMIC!>foo<!>()
}
@@ -96,5 +96,5 @@ fun test(d: dynamic) {
}
val dyn: dynamic = null
val foo : Int <!DEBUG_INFO_DYNAMIC!>by dyn<!>
var bar : Int <!DEBUG_INFO_DYNAMIC!>by dyn<!>
val foo : Int <!DEBUG_INFO_DYNAMIC, DEBUG_INFO_DYNAMIC!>by dyn<!>
var bar : Int <!DEBUG_INFO_DYNAMIC, DEBUG_INFO_DYNAMIC, DEBUG_INFO_DYNAMIC!>by dyn<!>
@@ -0,0 +1,15 @@
public final fun foo(): dynamic
public final fun isDynamic(): dynamic
public final fun foo(/*0*/ p0: dynamic): dynamic
public final fun isDynamic(): dynamic
public final fun foo(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public final fun isDynamic(): dynamic
public final fun </*0*/ T0> foo(): dynamic
public final fun isDynamic(): dynamic
public final var foo: dynamic
public final fun <get-foo>(): dynamic
public final fun <set-foo>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final fun isDynamic(): dynamic
public final var foo: dynamic
public final fun <get-foo>(): dynamic
public final fun <set-foo>(/*0*/ <set-?>: dynamic): kotlin.Unit
@@ -0,0 +1,17 @@
public final fun foo(/*0*/ p0: () -> dynamic): dynamic
public final fun foo(/*0*/ p0: () -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: dynamic.(dynamic, dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: () -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic, dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic
public final fun foo(/*0*/ p0: (dynamic) -> dynamic): dynamic
@@ -0,0 +1,4 @@
public final fun foo(): dynamic
public final fun isDynamic(): dynamic
public final fun foo(/*0*/ p0: dynamic): dynamic
public final fun isDynamic(): dynamic
@@ -0,0 +1,36 @@
public final var onAnyVal: dynamic
public final fun <get-onAnyVal>(): dynamic
public final fun <set-onAnyVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVal: dynamic
public final fun <get-onAnyVal>(): dynamic
public final fun <set-onAnyVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVal: dynamic
public final fun <get-onAnyVal>(): dynamic
public final fun <set-onAnyVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVal: dynamic
public final fun <get-onAnyVal>(): dynamic
public final fun <set-onAnyVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVal: dynamic
public final fun <get-onAnyVal>(): dynamic
public final fun <set-onAnyVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVal: dynamic
public final fun <get-onAnyVal>(): dynamic
public final fun <set-onAnyVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onNullableAnyVal: dynamic
public final fun <get-onNullableAnyVal>(): dynamic
public final fun <set-onNullableAnyVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onStringVal: dynamic
public final fun <get-onStringVal>(): dynamic
public final fun <set-onStringVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var memberVal: dynamic
public final fun <get-memberVal>(): dynamic
public final fun <set-memberVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var memberVal: dynamic
public final fun <get-memberVal>(): dynamic
public final fun <set-memberVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var memberExtensionVal: dynamic
public final fun <get-memberExtensionVal>(): dynamic
public final fun <set-memberExtensionVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var memberExtensionVal: dynamic
public final fun <get-memberExtensionVal>(): dynamic
public final fun <set-memberExtensionVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
@@ -0,0 +1,36 @@
public final var onAnyVar: dynamic
public final fun <get-onAnyVar>(): dynamic
public final fun <set-onAnyVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVar: dynamic
public final fun <get-onAnyVar>(): dynamic
public final fun <set-onAnyVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVar: dynamic
public final fun <get-onAnyVar>(): dynamic
public final fun <set-onAnyVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVar: dynamic
public final fun <get-onAnyVar>(): dynamic
public final fun <set-onAnyVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVar: dynamic
public final fun <get-onAnyVar>(): dynamic
public final fun <set-onAnyVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onAnyVar: dynamic
public final fun <get-onAnyVar>(): dynamic
public final fun <set-onAnyVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onNullableAnyVar: dynamic
public final fun <get-onNullableAnyVar>(): dynamic
public final fun <set-onNullableAnyVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var onStringVar: dynamic
public final fun <get-onStringVar>(): dynamic
public final fun <set-onStringVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var memberVar: dynamic
public final fun <get-memberVar>(): dynamic
public final fun <set-memberVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var memberExtensionVar: dynamic
public final fun <get-memberExtensionVar>(): dynamic
public final fun <set-memberExtensionVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var memberVar: dynamic
public final fun <get-memberVar>(): dynamic
public final fun <set-memberVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final var memberExtensionVar: dynamic
public final fun <get-memberExtensionVar>(): dynamic
public final fun <set-memberExtensionVar>(/*0*/ <set-?>: dynamic): kotlin.Unit
@@ -0,0 +1,8 @@
public final fun onAny(): dynamic
public final fun onAny(): dynamic
public final fun onAny(): dynamic
public final fun onAny(/*0*/ p0: dynamic): dynamic
public final fun onNullableAny(): dynamic
public final fun onString(): dynamic
public final fun member(): dynamic
public final fun memberExtension(): dynamic
@@ -0,0 +1,15 @@
public final fun foo(): dynamic
public final fun isDynamic(): dynamic
public final fun foo(/*0*/ p0: dynamic): dynamic
public final fun isDynamic(): dynamic
public final fun foo(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
public final fun isDynamic(): dynamic
public final fun </*0*/ T0> foo(): dynamic
public final fun isDynamic(): dynamic
public final var foo: dynamic
public final fun <get-foo>(): dynamic
public final fun <set-foo>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final fun isDynamic(): dynamic
public final var foo: dynamic
public final fun <get-foo>(): dynamic
public final fun <set-foo>(/*0*/ <set-?>: dynamic): kotlin.Unit
@@ -0,0 +1,4 @@
public final fun foo(): dynamic
public final fun foo(): dynamic
public final fun doo(): dynamic
public final fun doo(): dynamic
@@ -0,0 +1,3 @@
public final fun foo(/*0*/ name: dynamic): dynamic
public final fun foo(/*0*/ p0: dynamic, /*1*/ name: dynamic): dynamic
public final fun foo(/*0*/ p0: dynamic, /*1*/ duplicate: dynamic, /*2*/ duplicate: dynamic): dynamic
@@ -0,0 +1,9 @@
public final fun foo(): dynamic
public final fun isDynamic(): dynamic
public final fun foo(): dynamic
public final fun isDynamic(): dynamic
public final fun foo(): dynamic
public final fun isDynamic(): dynamic
public final fun foo(): dynamic
public final fun foo(): dynamic
public final fun foo(): dynamic
@@ -0,0 +1 @@
public final fun foo(/*0*/ p0: dynamic, /*1*/ p1: dynamic): dynamic
@@ -0,0 +1 @@
public final fun baz(): dynamic
@@ -0,0 +1,10 @@
public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array<out dynamic>*/): dynamic
public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array<out dynamic>*/): dynamic
public final fun foo(/*0*/ p0: dynamic, /*1*/ p1: dynamic, /*2*/ vararg p2: dynamic /*kotlin.Array<out dynamic>*/): dynamic
public final fun foo(/*0*/ p0: dynamic, /*1*/ vararg p1: dynamic /*kotlin.Array<out dynamic>*/, /*2*/ p2: () -> dynamic): dynamic
public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array<out dynamic>*/, /*1*/ p1: () -> dynamic): dynamic
public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array<out dynamic>*/): dynamic
public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array<out dynamic>*/, /*1*/ p1: () -> dynamic): dynamic
public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array<out dynamic>*/): dynamic
public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array<out dynamic>*/): dynamic
public final fun foo(/*0*/ vararg p0: dynamic /*kotlin.Array<out dynamic>*/): dynamic
@@ -0,0 +1,16 @@
public final fun foo(): dynamic
public final fun ext(): dynamic
public final fun bar(): dynamic
public final var baz: dynamic
public final fun <get-baz>(): dynamic
public final fun <set-baz>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final fun ext(): dynamic
public final fun extValFun(): dynamic
public final var extVal: dynamic
public final fun <get-extVal>(): dynamic
public final fun <set-extVal>(/*0*/ <set-?>: dynamic): kotlin.Unit
public final fun extExtVal(): dynamic
public final fun invoke(): dynamic
public final fun plus(/*0*/ p0: dynamic): dynamic
public final fun invoke(): dynamic
public final fun foo(): dynamic
@@ -0,0 +1 @@
public final fun bar(): dynamic
@@ -0,0 +1 @@
public final fun foo(): dynamic
@@ -61,6 +61,7 @@ import java.util.*;
import static org.jetbrains.jet.lang.diagnostics.Errors.*;
import static org.jetbrains.jet.test.util.RecursiveDescriptorComparator.RECURSIVE;
import static org.jetbrains.jet.test.util.RecursiveDescriptorComparator.RECURSIVE_ALL;
public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest {
@@ -146,6 +147,15 @@ public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest {
ok &= testFile.getActualText(moduleBindings.get(testFile.getModule()), actualText, shouldSkipJvmSignatureDiagnostics(groupedByModule));
}
Throwable exceptionFromDynamicCallDescriptorsValidation = null;
try {
File expectedFile = new File(FileUtil.getNameWithoutExtension(testDataFile.getAbsolutePath()) + ".dynamic.txt");
checkDynamicCallDescriptors(expectedFile, testFiles);
}
catch (Throwable e) {
exceptionFromDynamicCallDescriptorsValidation = e;
}
JetTestUtils.assertEqualsToFile(testDataFile, actualText.toString());
assertTrue("Diagnostics mismatch. See the output above", ok);
@@ -157,6 +167,28 @@ public abstract class AbstractJetDiagnosticsTest extends BaseDiagnosticsTest {
if (exceptionFromLazyResolveLogValidation != null) {
throw UtilsPackage.rethrow(exceptionFromLazyResolveLogValidation);
}
if (exceptionFromDynamicCallDescriptorsValidation != null) {
throw UtilsPackage.rethrow(exceptionFromDynamicCallDescriptorsValidation);
}
}
private void checkDynamicCallDescriptors(File expectedFile, List<TestFile> testFiles) {
RecursiveDescriptorComparator serializer = new RecursiveDescriptorComparator(RECURSIVE_ALL);
StringBuilder actualText = new StringBuilder();
for (TestFile testFile : testFiles) {
List<DeclarationDescriptor> dynamicCallDescriptors = testFile.getDynamicCallDescriptors();
for (DeclarationDescriptor descriptor : dynamicCallDescriptors) {
String actualSerialized = serializer.serializeRecursively(descriptor);
actualText.append(actualSerialized);
}
}
if (actualText.length() != 0 || expectedFile.exists()) {
JetTestUtils.assertEqualsToFile(expectedFile, actualText.toString());
}
}
public boolean shouldSkipJvmSignatureDiagnostics(Map<TestModule, List<TestFile>> groupedByModule) {
@@ -33,6 +33,7 @@ import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.asJava.AsJavaPackage;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.diagnostics.*;
import org.jetbrains.jet.lang.psi.JetDeclaration;
import org.jetbrains.jet.lang.psi.JetFile;
@@ -243,6 +244,7 @@ public abstract class BaseDiagnosticsTest extends
private final boolean declareFlexibleType;
public final boolean checkLazyLog;
private final boolean markDynamicCalls;
private final List<DeclarationDescriptor> dynamicCallDescriptors = new ArrayList<DeclarationDescriptor>();
public TestFile(
@Nullable TestModule module,
@@ -325,6 +327,11 @@ public abstract class BaseDiagnosticsTest extends
return jetFile;
}
@NotNull
public List<DeclarationDescriptor> getDynamicCallDescriptors() {
return dynamicCallDescriptors;
}
public boolean getActualText(BindingContext bindingContext, StringBuilder actualText, boolean skipJvmSignatureDiagnostics) {
if (this.jetFile == null) {
// TODO: check java files too
@@ -338,7 +345,7 @@ public abstract class BaseDiagnosticsTest extends
final boolean[] ok = { true };
List<Diagnostic> diagnostics = ContainerUtil.filter(
KotlinPackage.plus(CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, jetFile, markDynamicCalls),
KotlinPackage.plus(CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, jetFile, markDynamicCalls, dynamicCallDescriptors),
jvmSignatureDiagnostics),
whatDiagnosticsToConsider
);
@@ -147,7 +147,7 @@ public class CheckerTestUtilTest extends JetLiteFixture {
(JetFile) psiFile)
.getBindingContext();
String expectedText = CheckerTestUtil.addDiagnosticMarkersToText(psiFile, CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false)).toString();
String expectedText = CheckerTestUtil.addDiagnosticMarkersToText(psiFile, CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false, null)).toString();
List<DiagnosedRange> diagnosedRanges = Lists.newArrayList();
CheckerTestUtil.parseDiagnosedRanges(expectedText, diagnosedRanges);
@@ -155,7 +155,7 @@ public class CheckerTestUtilTest extends JetLiteFixture {
diagnosedRange.setFile(psiFile);
}
List<Diagnostic> diagnostics = CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false);
List<Diagnostic> diagnostics = CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false, null);
Collections.sort(diagnostics, CheckerTestUtil.DIAGNOSTIC_COMPARATOR);
makeTestData(diagnostics, diagnosedRanges);
@@ -42,7 +42,7 @@ public class CopyAsDiagnosticTestAction extends AnAction {
BindingContext bindingContext = ResolvePackage.analyzeFully((JetFile) psiFile);
List<Diagnostic> diagnostics = CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false);
List<Diagnostic> diagnostics = CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(bindingContext, psiFile, false, null);
String result = CheckerTestUtil.addDiagnosticMarkersToText(psiFile, diagnostics).toString();
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();