Improve test framework for diagnostic tests with NI
Mark with `NI;` or `OI;` only diagnostics that are specific for concrete inference
This commit is contained in:
@@ -17,7 +17,6 @@
|
|||||||
package org.jetbrains.kotlin.checkers;
|
package org.jetbrains.kotlin.checkers;
|
||||||
|
|
||||||
import com.google.common.collect.LinkedListMultimap;
|
import com.google.common.collect.LinkedListMultimap;
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.intellij.openapi.util.TextRange;
|
import com.intellij.openapi.util.TextRange;
|
||||||
import com.intellij.openapi.util.text.StringUtil;
|
import com.intellij.openapi.util.text.StringUtil;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
@@ -30,6 +29,7 @@ import com.intellij.util.containers.ContainerUtil;
|
|||||||
import com.intellij.util.containers.Stack;
|
import com.intellij.util.containers.Stack;
|
||||||
import kotlin.Pair;
|
import kotlin.Pair;
|
||||||
import kotlin.TuplesKt;
|
import kotlin.TuplesKt;
|
||||||
|
import kotlin.collections.ArraysKt;
|
||||||
import kotlin.collections.CollectionsKt;
|
import kotlin.collections.CollectionsKt;
|
||||||
import kotlin.text.StringsKt;
|
import kotlin.text.StringsKt;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -88,6 +88,7 @@ public class CheckerTestUtil {
|
|||||||
private static final Pattern INDIVIDUAL_PARAMETER_PATTERN = Pattern.compile(DIAGNOSTIC_PARAMETER);
|
private static final Pattern INDIVIDUAL_PARAMETER_PATTERN = Pattern.compile(DIAGNOSTIC_PARAMETER);
|
||||||
|
|
||||||
private static final String NEW_INFERENCE_PREFIX = "NI";
|
private static final String NEW_INFERENCE_PREFIX = "NI";
|
||||||
|
private static final String OLD_INFERENCE_PREFIX = "OI";
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static List<ActualDiagnostic> getDiagnosticsIncludingSyntaxErrors(
|
public static List<ActualDiagnostic> getDiagnosticsIncludingSyntaxErrors(
|
||||||
@@ -213,39 +214,25 @@ public class CheckerTestUtil {
|
|||||||
void wrongParametersDiagnostic(TextDiagnostic expectedDiagnostic, TextDiagnostic actualDiagnostic, int start, int end);
|
void wrongParametersDiagnostic(TextDiagnostic expectedDiagnostic, TextDiagnostic actualDiagnostic, int start, int end);
|
||||||
|
|
||||||
void unexpectedDiagnostic(TextDiagnostic diagnostic, int actualStart, int actualEnd);
|
void unexpectedDiagnostic(TextDiagnostic diagnostic, int actualStart, int actualEnd);
|
||||||
|
|
||||||
void uncheckedDiagnostic(TextDiagnostic diagnostic, int expectedStart, int expectedEnd);
|
|
||||||
|
|
||||||
boolean shouldUseDiagnosticsForNI();
|
|
||||||
|
|
||||||
boolean isWithNewInferenceDirective();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Map<ActualDiagnostic, TextDiagnostic> diagnosticsDiff(
|
public static Map<AbstractTestDiagnostic, TextDiagnostic> diagnosticsDiff(
|
||||||
List<DiagnosedRange> expected,
|
List<DiagnosedRange> expected,
|
||||||
Collection<ActualDiagnostic> actual,
|
Collection<ActualDiagnostic> actual,
|
||||||
DiagnosticDiffCallbacks callbacks
|
DiagnosticDiffCallbacks callbacks
|
||||||
) {
|
) {
|
||||||
Map<ActualDiagnostic, TextDiagnostic> diagnosticToExpectedDiagnostic = new HashMap<>();
|
Map<AbstractTestDiagnostic, TextDiagnostic> diagnosticToExpectedDiagnostic = new HashMap<>();
|
||||||
|
|
||||||
assertSameFile(actual);
|
assertSameFile(actual);
|
||||||
|
|
||||||
Iterator<DiagnosedRange> expectedDiagnostics = expected.iterator();
|
Iterator<DiagnosedRange> expectedDiagnostics = expected.iterator();
|
||||||
List<ActualDiagnosticDescriptor> sortedDiagnosticDescriptors =
|
List<ActualDiagnosticDescriptor> sortedDiagnosticDescriptors = getActualSortedDiagnosticDescriptors(actual);
|
||||||
getActualSortedDiagnosticDescriptors(actual, !callbacks.isWithNewInferenceDirective());
|
|
||||||
Iterator<ActualDiagnosticDescriptor> actualDiagnostics = sortedDiagnosticDescriptors.iterator();
|
Iterator<ActualDiagnosticDescriptor> actualDiagnostics = sortedDiagnosticDescriptors.iterator();
|
||||||
|
|
||||||
DiagnosedRange currentExpected = safeAdvance(expectedDiagnostics);
|
DiagnosedRange currentExpected = safeAdvance(expectedDiagnostics);
|
||||||
ActualDiagnosticDescriptor currentActual = safeAdvance(actualDiagnostics);
|
ActualDiagnosticDescriptor currentActual = safeAdvance(actualDiagnostics);
|
||||||
while (currentExpected != null || currentActual != null) {
|
while (currentExpected != null || currentActual != null) {
|
||||||
if (currentExpected != null) {
|
if (currentExpected != null) {
|
||||||
boolean currentDiagnosticsForNI = CollectionsKt.any(currentExpected.diagnostics, diagnostic -> diagnostic.withNewInference);
|
|
||||||
if (callbacks.shouldUseDiagnosticsForNI() != currentDiagnosticsForNI) {
|
|
||||||
uncheckedDiagnostics(callbacks, currentExpected);
|
|
||||||
currentExpected = safeAdvance(expectedDiagnostics);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (currentActual == null) {
|
if (currentActual == null) {
|
||||||
missingDiagnostics(callbacks, currentExpected);
|
missingDiagnostics(callbacks, currentExpected);
|
||||||
currentExpected = safeAdvance(expectedDiagnostics);
|
currentExpected = safeAdvance(expectedDiagnostics);
|
||||||
@@ -296,7 +283,7 @@ public class CheckerTestUtil {
|
|||||||
@NotNull DiagnosticDiffCallbacks callbacks,
|
@NotNull DiagnosticDiffCallbacks callbacks,
|
||||||
@NotNull DiagnosedRange currentExpected,
|
@NotNull DiagnosedRange currentExpected,
|
||||||
@NotNull ActualDiagnosticDescriptor currentActual,
|
@NotNull ActualDiagnosticDescriptor currentActual,
|
||||||
@NotNull Map<ActualDiagnostic, TextDiagnostic> diagnosticToInput
|
@NotNull Map<AbstractTestDiagnostic, TextDiagnostic> diagnosticToInput
|
||||||
) {
|
) {
|
||||||
int expectedStart = currentExpected.getStart();
|
int expectedStart = currentExpected.getStart();
|
||||||
int expectedEnd = currentExpected.getEnd();
|
int expectedEnd = currentExpected.getEnd();
|
||||||
@@ -305,16 +292,20 @@ public class CheckerTestUtil {
|
|||||||
int actualEnd = currentActual.getEnd();
|
int actualEnd = currentActual.getEnd();
|
||||||
assert expectedStart == actualStart && expectedEnd == actualEnd;
|
assert expectedStart == actualStart && expectedEnd == actualEnd;
|
||||||
|
|
||||||
Map<ActualDiagnostic, TextDiagnostic> actualDiagnostics = currentActual.getTextDiagnosticsMap();
|
Map<AbstractTestDiagnostic, TextDiagnostic> actualDiagnostics = currentActual.getTextDiagnosticsMap();
|
||||||
List<TextDiagnostic> expectedDiagnostics = currentExpected.getDiagnostics();
|
List<TextDiagnostic> expectedDiagnostics = currentExpected.getDiagnostics();
|
||||||
|
|
||||||
for (TextDiagnostic expectedDiagnostic : expectedDiagnostics) {
|
for (TextDiagnostic expectedDiagnostic : expectedDiagnostics) {
|
||||||
Map.Entry<ActualDiagnostic, TextDiagnostic> actualDiagnosticEntry = CollectionsKt.firstOrNull(
|
Map.Entry<AbstractTestDiagnostic, TextDiagnostic> actualDiagnosticEntry = CollectionsKt.firstOrNull(
|
||||||
actualDiagnostics.entrySet(), entry -> expectedDiagnostic.getDescription().equals(entry.getValue().getDescription())
|
actualDiagnostics.entrySet(), entry -> {
|
||||||
|
TextDiagnostic actualDiagnostic = entry.getValue();
|
||||||
|
return expectedDiagnostic.getDescription().equals(actualDiagnostic.getDescription()) &&
|
||||||
|
expectedDiagnostic.inferenceCompatibility.isCompatible(actualDiagnostic.inferenceCompatibility);
|
||||||
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
if (actualDiagnosticEntry != null) {
|
if (actualDiagnosticEntry != null) {
|
||||||
ActualDiagnostic actualDiagnostic = actualDiagnosticEntry.getKey();
|
AbstractTestDiagnostic actualDiagnostic = actualDiagnosticEntry.getKey();
|
||||||
TextDiagnostic actualTextDiagnostic = actualDiagnosticEntry.getValue();
|
TextDiagnostic actualTextDiagnostic = actualDiagnosticEntry.getValue();
|
||||||
|
|
||||||
if (!compareTextDiagnostic(expectedDiagnostic, actualTextDiagnostic)) {
|
if (!compareTextDiagnostic(expectedDiagnostic, actualTextDiagnostic)) {
|
||||||
@@ -322,6 +313,8 @@ public class CheckerTestUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
actualDiagnostics.remove(actualDiagnostic);
|
actualDiagnostics.remove(actualDiagnostic);
|
||||||
|
actualDiagnostic.enhanceInferenceCompatibility(expectedDiagnostic.inferenceCompatibility);
|
||||||
|
|
||||||
diagnosticToInput.put(actualDiagnostic, expectedDiagnostic);
|
diagnosticToInput.put(actualDiagnostic, expectedDiagnostic);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -360,7 +353,7 @@ public class CheckerTestUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void unexpectedDiagnostics(ActualDiagnosticDescriptor descriptor, DiagnosticDiffCallbacks callbacks) {
|
private static void unexpectedDiagnostics(ActualDiagnosticDescriptor descriptor, DiagnosticDiffCallbacks callbacks) {
|
||||||
for (ActualDiagnostic diagnostic : descriptor.diagnostics) {
|
for (AbstractTestDiagnostic diagnostic : descriptor.diagnostics) {
|
||||||
callbacks.unexpectedDiagnostic(TextDiagnostic.asTextDiagnostic(diagnostic), descriptor.getStart(), descriptor.getEnd());
|
callbacks.unexpectedDiagnostic(TextDiagnostic.asTextDiagnostic(diagnostic), descriptor.getStart(), descriptor.getEnd());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -371,12 +364,6 @@ public class CheckerTestUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void uncheckedDiagnostics(DiagnosticDiffCallbacks callbacks, DiagnosedRange currentExpected) {
|
|
||||||
for (TextDiagnostic diagnostic : currentExpected.getDiagnostics()) {
|
|
||||||
callbacks.uncheckedDiagnostic(diagnostic, currentExpected.getStart(), currentExpected.getEnd());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static <T> T safeAdvance(Iterator<T> iterator) {
|
private static <T> T safeAdvance(Iterator<T> iterator) {
|
||||||
return iterator.hasNext() ? iterator.next() : null;
|
return iterator.hasNext() ? iterator.next() : null;
|
||||||
}
|
}
|
||||||
@@ -419,7 +406,7 @@ public class CheckerTestUtil {
|
|||||||
public static StringBuffer addDiagnosticMarkersToText(
|
public static StringBuffer addDiagnosticMarkersToText(
|
||||||
@NotNull PsiFile psiFile,
|
@NotNull PsiFile psiFile,
|
||||||
@NotNull Collection<ActualDiagnostic> diagnostics,
|
@NotNull Collection<ActualDiagnostic> diagnostics,
|
||||||
@NotNull Map<ActualDiagnostic, TextDiagnostic> diagnosticToExpectedDiagnostic,
|
@NotNull Map<AbstractTestDiagnostic, TextDiagnostic> diagnosticToExpectedDiagnostic,
|
||||||
@NotNull Function<PsiFile, String> getFileText,
|
@NotNull Function<PsiFile, String> getFileText,
|
||||||
@NotNull Collection<PositionalTextDiagnostic> uncheckedDiagnostics,
|
@NotNull Collection<PositionalTextDiagnostic> uncheckedDiagnostics,
|
||||||
boolean withNewInferenceDirective
|
boolean withNewInferenceDirective
|
||||||
@@ -432,7 +419,7 @@ public class CheckerTestUtil {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<AbstractDiagnosticDescriptor> diagnosticDescriptors = getSortedDiagnosticDescriptors(diagnostics, uncheckedDiagnostics, !withNewInferenceDirective);
|
List<AbstractDiagnosticDescriptor> diagnosticDescriptors = getSortedDiagnosticDescriptors(diagnostics, uncheckedDiagnostics);
|
||||||
|
|
||||||
Stack<AbstractDiagnosticDescriptor> opened = new Stack<>();
|
Stack<AbstractDiagnosticDescriptor> opened = new Stack<>();
|
||||||
ListIterator<AbstractDiagnosticDescriptor> iterator = diagnosticDescriptors.listIterator();
|
ListIterator<AbstractDiagnosticDescriptor> iterator = diagnosticDescriptors.listIterator();
|
||||||
@@ -445,7 +432,7 @@ public class CheckerTestUtil {
|
|||||||
opened.pop();
|
opened.pop();
|
||||||
}
|
}
|
||||||
while (currentDescriptor != null && i == currentDescriptor.start) {
|
while (currentDescriptor != null && i == currentDescriptor.start) {
|
||||||
openDiagnosticsString(result, currentDescriptor, diagnosticToExpectedDiagnostic);
|
openDiagnosticsString(result, currentDescriptor, diagnosticToExpectedDiagnostic, withNewInferenceDirective);
|
||||||
if (currentDescriptor.getEnd() == i) {
|
if (currentDescriptor.getEnd() == i) {
|
||||||
closeDiagnosticString(result);
|
closeDiagnosticString(result);
|
||||||
}
|
}
|
||||||
@@ -465,7 +452,7 @@ public class CheckerTestUtil {
|
|||||||
if (currentDescriptor != null) {
|
if (currentDescriptor != null) {
|
||||||
assert currentDescriptor.start == text.length();
|
assert currentDescriptor.start == text.length();
|
||||||
assert currentDescriptor.end == text.length();
|
assert currentDescriptor.end == text.length();
|
||||||
openDiagnosticsString(result, currentDescriptor, diagnosticToExpectedDiagnostic);
|
openDiagnosticsString(result, currentDescriptor, diagnosticToExpectedDiagnostic, withNewInferenceDirective);
|
||||||
opened.push(currentDescriptor);
|
opened.push(currentDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,7 +469,8 @@ public class CheckerTestUtil {
|
|||||||
private static void openDiagnosticsString(
|
private static void openDiagnosticsString(
|
||||||
StringBuffer result,
|
StringBuffer result,
|
||||||
AbstractDiagnosticDescriptor currentDescriptor,
|
AbstractDiagnosticDescriptor currentDescriptor,
|
||||||
Map<ActualDiagnostic, TextDiagnostic> diagnosticToExpectedDiagnostic
|
Map<AbstractTestDiagnostic, TextDiagnostic> diagnosticToExpectedDiagnostic,
|
||||||
|
boolean withNewInferenceDirective
|
||||||
) {
|
) {
|
||||||
result.append("<!");
|
result.append("<!");
|
||||||
if (currentDescriptor instanceof TextDiagnosticDescriptor) {
|
if (currentDescriptor instanceof TextDiagnosticDescriptor) {
|
||||||
@@ -490,9 +478,9 @@ public class CheckerTestUtil {
|
|||||||
result.append(diagnostic.asString());
|
result.append(diagnostic.asString());
|
||||||
}
|
}
|
||||||
else if (currentDescriptor instanceof ActualDiagnosticDescriptor) {
|
else if (currentDescriptor instanceof ActualDiagnosticDescriptor) {
|
||||||
List<ActualDiagnostic> diagnostics = ((ActualDiagnosticDescriptor) currentDescriptor).getDiagnostics();
|
List<AbstractTestDiagnostic> diagnostics = ((ActualDiagnosticDescriptor) currentDescriptor).getDiagnostics();
|
||||||
for (Iterator<ActualDiagnostic> iterator = diagnostics.iterator(); iterator.hasNext(); ) {
|
for (Iterator<AbstractTestDiagnostic> iterator = diagnostics.iterator(); iterator.hasNext(); ) {
|
||||||
ActualDiagnostic diagnostic = iterator.next();
|
AbstractTestDiagnostic diagnostic = iterator.next();
|
||||||
TextDiagnostic expectedDiagnostic = diagnosticToExpectedDiagnostic.get(diagnostic);
|
TextDiagnostic expectedDiagnostic = diagnosticToExpectedDiagnostic.get(diagnostic);
|
||||||
if (expectedDiagnostic != null) {
|
if (expectedDiagnostic != null) {
|
||||||
TextDiagnostic actualTextDiagnostic = TextDiagnostic.asTextDiagnostic(diagnostic);
|
TextDiagnostic actualTextDiagnostic = TextDiagnostic.asTextDiagnostic(diagnostic);
|
||||||
@@ -504,12 +492,12 @@ public class CheckerTestUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (diagnostic.withNewInference) {
|
if (withNewInferenceDirective && diagnostic.getInferenceCompatibility().abbreviation != null) {
|
||||||
result.append(NEW_INFERENCE_PREFIX);
|
result.append(diagnostic.getInferenceCompatibility().abbreviation);
|
||||||
result.append(";");
|
result.append(";");
|
||||||
}
|
}
|
||||||
if (diagnostic.platform != null) {
|
if (diagnostic.getPlatform() != null) {
|
||||||
result.append(diagnostic.platform);
|
result.append(diagnostic.getPlatform());
|
||||||
result.append(":");
|
result.append(":");
|
||||||
}
|
}
|
||||||
result.append(diagnostic.getName());
|
result.append(diagnostic.getName());
|
||||||
@@ -630,11 +618,10 @@ public class CheckerTestUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static List<ActualDiagnosticDescriptor> getActualSortedDiagnosticDescriptors(
|
private static List<ActualDiagnosticDescriptor> getActualSortedDiagnosticDescriptors(
|
||||||
@NotNull Collection<ActualDiagnostic> diagnostics,
|
@NotNull Collection<ActualDiagnostic> diagnostics
|
||||||
boolean groupDiagnosticsByRange
|
|
||||||
) {
|
) {
|
||||||
return CollectionsKt.filterIsInstance(
|
return CollectionsKt.filterIsInstance(
|
||||||
getSortedDiagnosticDescriptors(diagnostics, Collections.emptyList(), groupDiagnosticsByRange),
|
getSortedDiagnosticDescriptors(diagnostics, Collections.emptyList()),
|
||||||
ActualDiagnosticDescriptor.class
|
ActualDiagnosticDescriptor.class
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -642,45 +629,20 @@ public class CheckerTestUtil {
|
|||||||
@NotNull
|
@NotNull
|
||||||
private static List<AbstractDiagnosticDescriptor> getSortedDiagnosticDescriptors(
|
private static List<AbstractDiagnosticDescriptor> getSortedDiagnosticDescriptors(
|
||||||
@NotNull Collection<ActualDiagnostic> diagnostics,
|
@NotNull Collection<ActualDiagnostic> diagnostics,
|
||||||
@NotNull Collection<PositionalTextDiagnostic> uncheckedDiagnostics,
|
@NotNull Collection<PositionalTextDiagnostic> uncheckedDiagnostics
|
||||||
boolean groupDiagnosticsByRange
|
|
||||||
) {
|
) {
|
||||||
List<ActualDiagnostic> validDiagnostics = CollectionsKt.filter(diagnostics, actualDiagnostic -> actualDiagnostic.diagnostic.isValid());
|
List<ActualDiagnostic> validDiagnostics = CollectionsKt.filter(diagnostics, actualDiagnostic -> actualDiagnostic.diagnostic.isValid());
|
||||||
List<AbstractDiagnosticDescriptor> diagnosticDescriptors = groupDiagnosticsByRange ?
|
List<AbstractDiagnosticDescriptor> diagnosticDescriptors = groupDiagnosticsByTextRange(validDiagnostics, uncheckedDiagnostics);
|
||||||
groupDiagnosticsByTextRange(validDiagnostics) :
|
diagnosticDescriptors.sort((d1, d2) -> (d1.start != d2.start) ? d1.start - d2.start : d2.end - d1.end);
|
||||||
asPlainDiagnosticDescriptors(validDiagnostics);
|
|
||||||
for (PositionalTextDiagnostic diagnostic : uncheckedDiagnostics) {
|
|
||||||
diagnosticDescriptors.add(new TextDiagnosticDescriptor(diagnostic));
|
|
||||||
}
|
|
||||||
diagnosticDescriptors.sort((d1, d2) -> {
|
|
||||||
if (d1.start != d2.start) return d1.start - d2.start;
|
|
||||||
if (d1.end != d2.end) return d2.end - d1.end;
|
|
||||||
if (d1.isWithNewInference() && !d2.isWithNewInference()) return -1;
|
|
||||||
if (!d1.isWithNewInference() && d2.isWithNewInference()) return 1;
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
return diagnosticDescriptors;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<AbstractDiagnosticDescriptor> asPlainDiagnosticDescriptors(@NotNull Collection<ActualDiagnostic> diagnostics) {
|
|
||||||
List<AbstractDiagnosticDescriptor> diagnosticDescriptors = Lists.newArrayList();
|
|
||||||
for (ActualDiagnostic actualDiagnostic : diagnostics) {
|
|
||||||
for (TextRange range : actualDiagnostic.diagnostic.getTextRanges()) {
|
|
||||||
diagnosticDescriptors.add(
|
|
||||||
new ActualDiagnosticDescriptor(
|
|
||||||
range.getStartOffset(),
|
|
||||||
range.getEndOffset(),
|
|
||||||
Collections.singletonList(actualDiagnostic))
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return diagnosticDescriptors;
|
return diagnosticDescriptors;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static List<AbstractDiagnosticDescriptor> groupDiagnosticsByTextRange(@NotNull Collection<ActualDiagnostic> diagnostics) {
|
private static List<AbstractDiagnosticDescriptor> groupDiagnosticsByTextRange(
|
||||||
LinkedListMultimap<TextRange, ActualDiagnostic> diagnosticsGroupedByRanges = LinkedListMultimap.create();
|
@NotNull Collection<ActualDiagnostic> diagnostics,
|
||||||
|
@NotNull Collection<PositionalTextDiagnostic> uncheckedDiagnostics
|
||||||
|
) {
|
||||||
|
LinkedListMultimap<TextRange, AbstractTestDiagnostic> diagnosticsGroupedByRanges = LinkedListMultimap.create();
|
||||||
for (ActualDiagnostic actualDiagnostic : diagnostics) {
|
for (ActualDiagnostic actualDiagnostic : diagnostics) {
|
||||||
Diagnostic diagnostic = actualDiagnostic.diagnostic;
|
Diagnostic diagnostic = actualDiagnostic.diagnostic;
|
||||||
for (TextRange textRange : diagnostic.getTextRanges()) {
|
for (TextRange textRange : diagnostic.getTextRanges()) {
|
||||||
@@ -688,12 +650,27 @@ public class CheckerTestUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return CollectionsKt.map(diagnosticsGroupedByRanges.keySet(), range ->
|
for (PositionalTextDiagnostic uncheckedDiagnostic : uncheckedDiagnostics) {
|
||||||
new ActualDiagnosticDescriptor(
|
TextRange range = new TextRange(uncheckedDiagnostic.getStart(), uncheckedDiagnostic.getEnd());
|
||||||
range.getStartOffset(),
|
diagnosticsGroupedByRanges.put(range, uncheckedDiagnostic.getDiagnostic());
|
||||||
range.getEndOffset(),
|
}
|
||||||
diagnosticsGroupedByRanges.get(range))
|
|
||||||
);
|
return CollectionsKt.map(diagnosticsGroupedByRanges.keySet(), range -> {
|
||||||
|
List<AbstractTestDiagnostic> abstractDiagnostics = diagnosticsGroupedByRanges.get(range);
|
||||||
|
|
||||||
|
Comparator<AbstractTestDiagnostic> comparator = Comparator.comparing(AbstractTestDiagnostic::getInferenceCompatibility);
|
||||||
|
boolean needSortingByName = CollectionsKt.any(
|
||||||
|
abstractDiagnostics,
|
||||||
|
diagnostic -> diagnostic.getInferenceCompatibility() != TextDiagnostic.InferenceCompatibility.ALL
|
||||||
|
);
|
||||||
|
if (needSortingByName) {
|
||||||
|
comparator = comparator.thenComparing(Comparator.comparing(AbstractTestDiagnostic::getName));
|
||||||
|
}
|
||||||
|
|
||||||
|
abstractDiagnostics.sort(comparator);
|
||||||
|
|
||||||
|
return new ActualDiagnosticDescriptor(range.getStartOffset(), range.getEndOffset(), abstractDiagnostics);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
private static abstract class AbstractDiagnosticDescriptor {
|
private static abstract class AbstractDiagnosticDescriptor {
|
||||||
@@ -716,34 +693,27 @@ public class CheckerTestUtil {
|
|||||||
public TextRange getTextRange() {
|
public TextRange getTextRange() {
|
||||||
return new TextRange(start, end);
|
return new TextRange(start, end);
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract boolean isWithNewInference();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ActualDiagnosticDescriptor extends AbstractDiagnosticDescriptor {
|
private static class ActualDiagnosticDescriptor extends AbstractDiagnosticDescriptor {
|
||||||
private final List<ActualDiagnostic> diagnostics;
|
private final List<AbstractTestDiagnostic> diagnostics;
|
||||||
|
|
||||||
ActualDiagnosticDescriptor(int start, int end, List<ActualDiagnostic> diagnostics) {
|
ActualDiagnosticDescriptor(int start, int end, List<AbstractTestDiagnostic> diagnostics) {
|
||||||
super(start, end);
|
super(start, end);
|
||||||
this.diagnostics = diagnostics;
|
this.diagnostics = diagnostics;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<ActualDiagnostic> getDiagnostics() {
|
public List<AbstractTestDiagnostic> getDiagnostics() {
|
||||||
return diagnostics;
|
return diagnostics;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<ActualDiagnostic, TextDiagnostic> getTextDiagnosticsMap() {
|
public Map<AbstractTestDiagnostic, TextDiagnostic> getTextDiagnosticsMap() {
|
||||||
Map<ActualDiagnostic, TextDiagnostic> diagnosticMap = new HashMap<>();
|
Map<AbstractTestDiagnostic, TextDiagnostic> diagnosticMap = new HashMap<>();
|
||||||
for (ActualDiagnostic diagnostic : diagnostics) {
|
for (AbstractTestDiagnostic diagnostic : diagnostics) {
|
||||||
diagnosticMap.put(diagnostic, TextDiagnostic.asTextDiagnostic(diagnostic));
|
diagnosticMap.put(diagnostic, TextDiagnostic.asTextDiagnostic(diagnostic));
|
||||||
}
|
}
|
||||||
return diagnosticMap;
|
return diagnosticMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isWithNewInference() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class TextDiagnosticDescriptor extends AbstractDiagnosticDescriptor {
|
private static class TextDiagnosticDescriptor extends AbstractDiagnosticDescriptor {
|
||||||
@@ -757,34 +727,57 @@ public class CheckerTestUtil {
|
|||||||
public TextDiagnostic getTextDiagnostic() {
|
public TextDiagnostic getTextDiagnostic() {
|
||||||
return positionalTextDiagnostic.getDiagnostic();
|
return positionalTextDiagnostic.getDiagnostic();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isWithNewInference() {
|
|
||||||
return positionalTextDiagnostic.getDiagnostic().withNewInference;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class ActualDiagnostic {
|
public interface AbstractTestDiagnostic {
|
||||||
|
String getName();
|
||||||
|
|
||||||
|
String getPlatform();
|
||||||
|
|
||||||
|
TextDiagnostic.InferenceCompatibility getInferenceCompatibility();
|
||||||
|
|
||||||
|
void enhanceInferenceCompatibility(TextDiagnostic.InferenceCompatibility inferenceCompatibility);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class ActualDiagnostic implements AbstractTestDiagnostic {
|
||||||
public final Diagnostic diagnostic;
|
public final Diagnostic diagnostic;
|
||||||
public final String platform;
|
public final String platform;
|
||||||
public final boolean withNewInference;
|
public TextDiagnostic.InferenceCompatibility inferenceCompatibility;
|
||||||
|
|
||||||
ActualDiagnostic(@NotNull Diagnostic diagnostic, @Nullable String platform, boolean withNewInference) {
|
ActualDiagnostic(@NotNull Diagnostic diagnostic, @Nullable String platform, boolean withNewInference) {
|
||||||
this.diagnostic = diagnostic;
|
this.diagnostic = diagnostic;
|
||||||
this.platform = platform;
|
this.platform = platform;
|
||||||
this.withNewInference = withNewInference;
|
this.inferenceCompatibility = withNewInference ?
|
||||||
|
TextDiagnostic.InferenceCompatibility.NEW :
|
||||||
|
TextDiagnostic.InferenceCompatibility.OLD;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
@NotNull
|
@NotNull
|
||||||
public String getName() {
|
public String getName() {
|
||||||
return diagnostic.getFactory().getName();
|
return diagnostic.getFactory().getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getPlatform() {
|
||||||
|
return platform;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public PsiFile getFile() {
|
public PsiFile getFile() {
|
||||||
return diagnostic.getPsiFile();
|
return diagnostic.getPsiFile();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TextDiagnostic.InferenceCompatibility getInferenceCompatibility() {
|
||||||
|
return inferenceCompatibility;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enhanceInferenceCompatibility(TextDiagnostic.InferenceCompatibility inferenceCompatibility) {
|
||||||
|
this.inferenceCompatibility = inferenceCompatibility;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object obj) {
|
public boolean equals(Object obj) {
|
||||||
if (!(obj instanceof ActualDiagnostic)) return false;
|
if (!(obj instanceof ActualDiagnostic)) return false;
|
||||||
@@ -793,44 +786,66 @@ public class CheckerTestUtil {
|
|||||||
// '==' on diagnostics is intentional here
|
// '==' on diagnostics is intentional here
|
||||||
return other.diagnostic == diagnostic &&
|
return other.diagnostic == diagnostic &&
|
||||||
(other.platform == null ? platform == null : other.platform.equals(platform)) &&
|
(other.platform == null ? platform == null : other.platform.equals(platform)) &&
|
||||||
(other.withNewInference == withNewInference);
|
(other.inferenceCompatibility == inferenceCompatibility);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int result = System.identityHashCode(diagnostic);
|
int result = System.identityHashCode(diagnostic);
|
||||||
result = 31 * result + (platform != null ? platform.hashCode() : 0);
|
result = 31 * result + (platform != null ? platform.hashCode() : 0);
|
||||||
result = 31 * result + (withNewInference ? 0 : 1);
|
result = 31 * result + inferenceCompatibility.hashCode();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return (withNewInference ? NEW_INFERENCE_PREFIX + ";" : "") + (platform != null ? platform + ":" : "") + diagnostic.toString();
|
String inferenceAbbreviation = inferenceCompatibility.abbreviation;
|
||||||
|
return (inferenceAbbreviation != null ? inferenceAbbreviation + ";" : "") +
|
||||||
|
(platform != null ? platform + ":" : "") +
|
||||||
|
diagnostic.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class TextDiagnostic {
|
public static class TextDiagnostic implements AbstractTestDiagnostic {
|
||||||
|
public enum InferenceCompatibility {
|
||||||
|
NEW(NEW_INFERENCE_PREFIX), OLD(OLD_INFERENCE_PREFIX), ALL(null);
|
||||||
|
|
||||||
|
@Nullable String abbreviation;
|
||||||
|
|
||||||
|
InferenceCompatibility(@Nullable String abbreviation) {
|
||||||
|
this.abbreviation = abbreviation;
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isCompatible(InferenceCompatibility other) {
|
||||||
|
return this == other || this == ALL || other == ALL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
private static TextDiagnostic parseDiagnostic(String text) {
|
private static TextDiagnostic parseDiagnostic(String text) {
|
||||||
Matcher matcher = INDIVIDUAL_DIAGNOSTIC_PATTERN.matcher(text);
|
Matcher matcher = INDIVIDUAL_DIAGNOSTIC_PATTERN.matcher(text);
|
||||||
if (!matcher.find())
|
if (!matcher.find())
|
||||||
throw new IllegalArgumentException("Could not parse diagnostic: " + text);
|
throw new IllegalArgumentException("Could not parse diagnostic: " + text);
|
||||||
|
|
||||||
boolean withNewInference = NEW_INFERENCE_PREFIX.equals(extractDataBefore(matcher.group(1), ";"));
|
InferenceCompatibility inference = computeInferenceCompatibility(extractDataBefore(matcher.group(1), ";"));
|
||||||
String platform = extractDataBefore(matcher.group(2), ":");
|
String platform = extractDataBefore(matcher.group(2), ":");
|
||||||
|
|
||||||
String name = matcher.group(3);
|
String name = matcher.group(3);
|
||||||
String parameters = matcher.group(4);
|
String parameters = matcher.group(4);
|
||||||
if (parameters == null) {
|
if (parameters == null) {
|
||||||
return new TextDiagnostic(name, platform, null, withNewInference);
|
return new TextDiagnostic(name, platform, null, inference);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<String> parsedParameters = new SmartList<>();
|
List<String> parsedParameters = new SmartList<>();
|
||||||
Matcher parametersMatcher = INDIVIDUAL_PARAMETER_PATTERN.matcher(parameters);
|
Matcher parametersMatcher = INDIVIDUAL_PARAMETER_PATTERN.matcher(parameters);
|
||||||
while (parametersMatcher.find())
|
while (parametersMatcher.find())
|
||||||
parsedParameters.add(unescape(parametersMatcher.group().trim()));
|
parsedParameters.add(unescape(parametersMatcher.group().trim()));
|
||||||
return new TextDiagnostic(name, platform, parsedParameters, withNewInference);
|
return new TextDiagnostic(name, platform, parsedParameters, inference);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static InferenceCompatibility computeInferenceCompatibility(@Nullable String abbreviation) {
|
||||||
|
if (abbreviation == null) return InferenceCompatibility.ALL;
|
||||||
|
return ArraysKt.single(InferenceCompatibility.values(), inference -> abbreviation.equals(inference.abbreviation));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String extractDataBefore(@Nullable String prefix, @NotNull String anchor) {
|
private static String extractDataBefore(@Nullable String prefix, @NotNull String anchor) {
|
||||||
@@ -846,6 +861,14 @@ public class CheckerTestUtil {
|
|||||||
return s.replaceAll("\\\\([" + SHOULD_BE_ESCAPED + "])", "$1");
|
return s.replaceAll("\\\\([" + SHOULD_BE_ESCAPED + "])", "$1");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static TextDiagnostic asTextDiagnostic(@NotNull AbstractTestDiagnostic abstractTestDiagnostic) {
|
||||||
|
if (abstractTestDiagnostic instanceof ActualDiagnostic) {
|
||||||
|
return asTextDiagnostic((ActualDiagnostic) abstractTestDiagnostic);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (TextDiagnostic) abstractTestDiagnostic;
|
||||||
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public static TextDiagnostic asTextDiagnostic(@NotNull ActualDiagnostic actualDiagnostic) {
|
public static TextDiagnostic asTextDiagnostic(@NotNull ActualDiagnostic actualDiagnostic) {
|
||||||
Diagnostic diagnostic = actualDiagnostic.diagnostic;
|
Diagnostic diagnostic = actualDiagnostic.diagnostic;
|
||||||
@@ -856,9 +879,9 @@ public class CheckerTestUtil {
|
|||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
Object[] renderParameters = ((AbstractDiagnosticWithParametersRenderer) renderer).renderParameters(diagnostic);
|
Object[] renderParameters = ((AbstractDiagnosticWithParametersRenderer) renderer).renderParameters(diagnostic);
|
||||||
List<String> parameters = ContainerUtil.map(renderParameters, Object::toString);
|
List<String> parameters = ContainerUtil.map(renderParameters, Object::toString);
|
||||||
return new TextDiagnostic(diagnosticName, actualDiagnostic.platform, parameters, actualDiagnostic.withNewInference);
|
return new TextDiagnostic(diagnosticName, actualDiagnostic.platform, parameters, actualDiagnostic.inferenceCompatibility);
|
||||||
}
|
}
|
||||||
return new TextDiagnostic(diagnosticName, actualDiagnostic.platform, null, actualDiagnostic.withNewInference);
|
return new TextDiagnostic(diagnosticName, actualDiagnostic.platform, null, actualDiagnostic.inferenceCompatibility);
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -867,15 +890,28 @@ public class CheckerTestUtil {
|
|||||||
private final String platform;
|
private final String platform;
|
||||||
@Nullable
|
@Nullable
|
||||||
private final List<String> parameters;
|
private final List<String> parameters;
|
||||||
private final boolean withNewInference;
|
@NotNull
|
||||||
|
private InferenceCompatibility inferenceCompatibility;
|
||||||
|
|
||||||
public TextDiagnostic(@NotNull String name, @Nullable String platform, @Nullable List<String> parameters, boolean withNewInference) {
|
public TextDiagnostic(
|
||||||
|
@NotNull String name,
|
||||||
|
@Nullable String platform,
|
||||||
|
@Nullable List<String> parameters,
|
||||||
|
@Nullable InferenceCompatibility inference
|
||||||
|
) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.platform = platform;
|
this.platform = platform;
|
||||||
this.parameters = parameters;
|
this.parameters = parameters;
|
||||||
this.withNewInference = withNewInference;
|
this.inferenceCompatibility = inference != null ? inference : InferenceCompatibility.ALL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
@Nullable
|
@Nullable
|
||||||
public String getPlatform() {
|
public String getPlatform() {
|
||||||
return platform;
|
return platform;
|
||||||
@@ -891,6 +927,17 @@ public class CheckerTestUtil {
|
|||||||
return parameters;
|
return parameters;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public InferenceCompatibility getInferenceCompatibility() {
|
||||||
|
return inferenceCompatibility;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enhanceInferenceCompatibility(InferenceCompatibility inferenceCompatibility) {
|
||||||
|
this.inferenceCompatibility = inferenceCompatibility;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean equals(Object o) {
|
public boolean equals(Object o) {
|
||||||
if (this == o) return true;
|
if (this == o) return true;
|
||||||
@@ -901,7 +948,7 @@ public class CheckerTestUtil {
|
|||||||
if (!name.equals(that.name)) return false;
|
if (!name.equals(that.name)) return false;
|
||||||
if (platform != null ? !platform.equals(that.platform) : that.platform != null) return false;
|
if (platform != null ? !platform.equals(that.platform) : that.platform != null) return false;
|
||||||
if (parameters != null ? !parameters.equals(that.parameters) : that.parameters != null) return false;
|
if (parameters != null ? !parameters.equals(that.parameters) : that.parameters != null) return false;
|
||||||
if (withNewInference != that.withNewInference) return false;
|
if (inferenceCompatibility != that.inferenceCompatibility) return false;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -911,15 +958,15 @@ public class CheckerTestUtil {
|
|||||||
int result = name.hashCode();
|
int result = name.hashCode();
|
||||||
result = 31 * result + (platform != null ? platform.hashCode() : 0);
|
result = 31 * result + (platform != null ? platform.hashCode() : 0);
|
||||||
result = 31 * result + (parameters != null ? parameters.hashCode() : 0);
|
result = 31 * result + (parameters != null ? parameters.hashCode() : 0);
|
||||||
result = 31 * result + (withNewInference ? 0 : 1);
|
result = 31 * result + inferenceCompatibility.hashCode();
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
public String asString() {
|
public String asString() {
|
||||||
StringBuilder result = new StringBuilder();
|
StringBuilder result = new StringBuilder();
|
||||||
if (withNewInference) {
|
if (inferenceCompatibility.abbreviation != null) {
|
||||||
result.append(NEW_INFERENCE_PREFIX);
|
result.append(inferenceCompatibility.abbreviation);
|
||||||
result.append(";");
|
result.append(";");
|
||||||
}
|
}
|
||||||
if (platform != null) {
|
if (platform != null) {
|
||||||
|
|||||||
@@ -225,15 +225,22 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, Tes
|
|||||||
val withNewInference = newInferenceEnabled && withNewInferenceDirective && !USE_OLD_INFERENCE_DIAGNOSTICS_FOR_NI
|
val withNewInference = newInferenceEnabled && withNewInferenceDirective && !USE_OLD_INFERENCE_DIAGNOSTICS_FOR_NI
|
||||||
val diagnostics = ContainerUtil.filter(
|
val diagnostics = ContainerUtil.filter(
|
||||||
CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(
|
CheckerTestUtil.getDiagnosticsIncludingSyntaxErrors(
|
||||||
bindingContext, implementingModulesBindings, ktFile, markDynamicCalls, dynamicCallDescriptors, withNewInference
|
bindingContext, implementingModulesBindings, ktFile, markDynamicCalls, dynamicCallDescriptors, newInferenceEnabled
|
||||||
) + jvmSignatureDiagnostics,
|
) + jvmSignatureDiagnostics,
|
||||||
{ whatDiagnosticsToConsider.value(it.diagnostic) }
|
{ whatDiagnosticsToConsider.value(it.diagnostic) }
|
||||||
)
|
)
|
||||||
|
|
||||||
val uncheckedDiagnostics = mutableListOf<PositionalTextDiagnostic>()
|
val uncheckedDiagnostics = mutableListOf<PositionalTextDiagnostic>()
|
||||||
|
val inferenceCompatibilityOfTest = asInferenceCompatibility(withNewInference)
|
||||||
|
val invertedInferenceCompatibilityOfTest = asInferenceCompatibility(!withNewInference)
|
||||||
|
|
||||||
val diagnosticToExpectedDiagnostic = CheckerTestUtil.diagnosticsDiff(diagnosedRanges, diagnostics, object : CheckerTestUtil.DiagnosticDiffCallbacks {
|
val diagnosticToExpectedDiagnostic = CheckerTestUtil.diagnosticsDiff(diagnosedRanges, diagnostics, object : CheckerTestUtil.DiagnosticDiffCallbacks {
|
||||||
override fun missingDiagnostic(diagnostic: CheckerTestUtil.TextDiagnostic, expectedStart: Int, expectedEnd: Int) {
|
override fun missingDiagnostic(diagnostic: CheckerTestUtil.TextDiagnostic, expectedStart: Int, expectedEnd: Int) {
|
||||||
|
if (withNewInferenceDirective && diagnostic.inferenceCompatibility != inferenceCompatibilityOfTest) {
|
||||||
|
updateUncheckedDiagnostics(diagnostic, expectedStart, expectedEnd)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
val message = "Missing " + diagnostic.description + DiagnosticUtils.atLocation(ktFile, TextRange(expectedStart, expectedEnd))
|
val message = "Missing " + diagnostic.description + DiagnosticUtils.atLocation(ktFile, TextRange(expectedStart, expectedEnd))
|
||||||
System.err.println(message)
|
System.err.println(message)
|
||||||
ok[0] = false
|
ok[0] = false
|
||||||
@@ -253,18 +260,20 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, Tes
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun unexpectedDiagnostic(diagnostic: CheckerTestUtil.TextDiagnostic, actualStart: Int, actualEnd: Int) {
|
override fun unexpectedDiagnostic(diagnostic: CheckerTestUtil.TextDiagnostic, actualStart: Int, actualEnd: Int) {
|
||||||
|
if (withNewInferenceDirective && diagnostic.inferenceCompatibility != inferenceCompatibilityOfTest) {
|
||||||
|
updateUncheckedDiagnostics(diagnostic, actualStart, actualEnd)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
val message = "Unexpected ${diagnostic.description}${DiagnosticUtils.atLocation(ktFile, TextRange(actualStart, actualEnd))}"
|
val message = "Unexpected ${diagnostic.description}${DiagnosticUtils.atLocation(ktFile, TextRange(actualStart, actualEnd))}"
|
||||||
System.err.println(message)
|
System.err.println(message)
|
||||||
ok[0] = false
|
ok[0] = false
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun uncheckedDiagnostic(diagnostic: CheckerTestUtil.TextDiagnostic, expectedStart: Int, expectedEnd: Int) {
|
fun updateUncheckedDiagnostics(diagnostic: CheckerTestUtil.TextDiagnostic, start: Int, end: Int) {
|
||||||
uncheckedDiagnostics.add(PositionalTextDiagnostic(diagnostic, expectedStart, expectedEnd))
|
diagnostic.enhanceInferenceCompatibility(invertedInferenceCompatibilityOfTest)
|
||||||
|
uncheckedDiagnostics.add(PositionalTextDiagnostic(diagnostic, start, end))
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun shouldUseDiagnosticsForNI(): Boolean = withNewInference
|
|
||||||
|
|
||||||
override fun isWithNewInferenceDirective(): Boolean = withNewInferenceDirective
|
|
||||||
})
|
})
|
||||||
|
|
||||||
actualText.append(CheckerTestUtil.addDiagnosticMarkersToText(
|
actualText.append(CheckerTestUtil.addDiagnosticMarkersToText(
|
||||||
@@ -276,6 +285,13 @@ abstract class BaseDiagnosticsTest : KotlinMultiFileTestWithJava<TestModule, Tes
|
|||||||
return ok[0]
|
return ok[0]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun asInferenceCompatibility(isNewInference: Boolean): CheckerTestUtil.TextDiagnostic.InferenceCompatibility {
|
||||||
|
return if (isNewInference)
|
||||||
|
CheckerTestUtil.TextDiagnostic.InferenceCompatibility.NEW
|
||||||
|
else
|
||||||
|
CheckerTestUtil.TextDiagnostic.InferenceCompatibility.OLD
|
||||||
|
}
|
||||||
|
|
||||||
private fun computeJvmSignatureDiagnostics(bindingContext: BindingContext): Set<ActualDiagnostic> {
|
private fun computeJvmSignatureDiagnostics(bindingContext: BindingContext): Set<ActualDiagnostic> {
|
||||||
val jvmSignatureDiagnostics = HashSet<ActualDiagnostic>()
|
val jvmSignatureDiagnostics = HashSet<ActualDiagnostic>()
|
||||||
val declarations = PsiTreeUtil.findChildrenOfType(ktFile, KtDeclaration::class.java)
|
val declarations = PsiTreeUtil.findChildrenOfType(ktFile, KtDeclaration::class.java)
|
||||||
|
|||||||
@@ -105,7 +105,7 @@ public class CheckerTestUtilTest extends KotlinTestWithEnvironment {
|
|||||||
DiagnosticData unused = diagnostics.get(2);
|
DiagnosticData unused = diagnostics.get(2);
|
||||||
String unusedDiagnostic = asTextDiagnostic(unused, "i");
|
String unusedDiagnostic = asTextDiagnostic(unused, "i");
|
||||||
DiagnosedRange range = asDiagnosticRange(unused, unusedDiagnostic);
|
DiagnosedRange range = asDiagnosticRange(unused, unusedDiagnostic);
|
||||||
doTest(new TheTest(wrongParameters(unusedDiagnostic, "UNUSED_VARIABLE(a)", unused.startOffset, unused.endOffset)) {
|
doTest(new TheTest(wrongParameters(unusedDiagnostic, "OI;UNUSED_VARIABLE(a)", unused.startOffset, unused.endOffset)) {
|
||||||
@Override
|
@Override
|
||||||
protected void makeTestData(List<ActualDiagnostic> diagnostics, List<DiagnosedRange> diagnosedRanges) {
|
protected void makeTestData(List<ActualDiagnostic> diagnostics, List<DiagnosedRange> diagnosedRanges) {
|
||||||
diagnosedRanges.set(unused.rangeIndex, range);
|
diagnosedRanges.set(unused.rangeIndex, range);
|
||||||
@@ -118,7 +118,7 @@ public class CheckerTestUtilTest extends KotlinTestWithEnvironment {
|
|||||||
String unusedDiagnostic = asTextDiagnostic(unresolvedReference, "i");
|
String unusedDiagnostic = asTextDiagnostic(unresolvedReference, "i");
|
||||||
String toManyArguments = asTextDiagnostic(diagnostics.get(7));
|
String toManyArguments = asTextDiagnostic(diagnostics.get(7));
|
||||||
DiagnosedRange range = asDiagnosticRange(unresolvedReference, unusedDiagnostic, toManyArguments);
|
DiagnosedRange range = asDiagnosticRange(unresolvedReference, unusedDiagnostic, toManyArguments);
|
||||||
doTest(new TheTest(wrongParameters(unusedDiagnostic, "UNRESOLVED_REFERENCE(xx)", unresolvedReference.startOffset, unresolvedReference.endOffset)) {
|
doTest(new TheTest(wrongParameters(unusedDiagnostic, "OI;UNRESOLVED_REFERENCE(xx)", unresolvedReference.startOffset, unresolvedReference.endOffset)) {
|
||||||
@Override
|
@Override
|
||||||
protected void makeTestData(List<ActualDiagnostic> diagnostics, List<DiagnosedRange> diagnosedRanges) {
|
protected void makeTestData(List<ActualDiagnostic> diagnostics, List<DiagnosedRange> diagnosedRanges) {
|
||||||
diagnosedRanges.set(unresolvedReference.rangeIndex, range);
|
diagnosedRanges.set(unresolvedReference.rangeIndex, range);
|
||||||
@@ -181,20 +181,6 @@ public class CheckerTestUtilTest extends KotlinTestWithEnvironment {
|
|||||||
public void unexpectedDiagnostic(CheckerTestUtil.TextDiagnostic diagnostic, int actualStart, int actualEnd) {
|
public void unexpectedDiagnostic(CheckerTestUtil.TextDiagnostic diagnostic, int actualStart, int actualEnd) {
|
||||||
actualMessages.add(unexpected(diagnostic.getDescription(), actualStart, actualEnd));
|
actualMessages.add(unexpected(diagnostic.getDescription(), actualStart, actualEnd));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void uncheckedDiagnostic(CheckerTestUtil.TextDiagnostic diagnostic, int expectedStart, int expectedEnd) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean shouldUseDiagnosticsForNI() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isWithNewInferenceDirective() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
assertEquals(listToString(expectedMessages), listToString(actualMessages));
|
assertEquals(listToString(expectedMessages), listToString(actualMessages));
|
||||||
|
|||||||
Reference in New Issue
Block a user