[FE 1.0] Report recursive type checker problem as a warning till 1.9

^KT-48546
This commit is contained in:
Victor Petukhov
2022-03-18 09:54:53 +04:00
committed by teamcity
parent 2307122089
commit 57a134c543
20 changed files with 118 additions and 17 deletions
@@ -796,7 +796,8 @@ public interface Errors {
DiagnosticFactory1<PsiElement, String> NAME_SHADOWING = DiagnosticFactory1.create(WARNING, PositioningStrategies.FOR_REDECLARATION);
DiagnosticFactory0<PsiElement> ACCESSOR_PARAMETER_NAME_SHADOWING = DiagnosticFactory0.create(WARNING);
DiagnosticFactoryForDeprecation0<KtExpression> TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM = DiagnosticFactoryForDeprecation0.create(LanguageFeature.ForbidRecursiveDelegateExpressions);
DiagnosticFactoryForDeprecation0<KtExpression> TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM =
DiagnosticFactoryForDeprecation0.create(LanguageFeature.ForbidRecursiveDelegateExpressions);
// Checking call arguments
@@ -75,7 +75,11 @@ class DiagnosticReporterByTrackingStrategy(
trace,
(diagnostic as NoValueForParameter).parameterDescriptor
)
TypeCheckerHasRanIntoRecursion::class.java -> tracingStrategy.recursiveType(trace)
TypeCheckerHasRanIntoRecursion::class.java -> {
val shouldReportErrorsOnRecursiveTypeInsidePlusAssignment =
context.languageVersionSettings.supportsFeature(LanguageFeature.ReportErrorsOnRecursiveTypeInsidePlusAssignment)
tracingStrategy.recursiveType(trace, shouldReportErrorsOnRecursiveTypeInsidePlusAssignment)
}
InstantiationOfAbstractClass::class.java -> tracingStrategy.instantiationOfAbstractClass(trace)
AbstractSuperCall::class.java -> {
val superExpression = (diagnostic as AbstractSuperCall).receiver.psiExpression as? KtSuperExpression
@@ -22,6 +22,7 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.diagnostics.DiagnosticFactory0;
import org.jetbrains.kotlin.diagnostics.DiagnosticUtilsKt;
import org.jetbrains.kotlin.lexer.KtToken;
import org.jetbrains.kotlin.lexer.KtTokens;
@@ -138,10 +139,16 @@ public abstract class AbstractTracingStrategy implements TracingStrategy {
}
@Override
public void recursiveType(@NotNull BindingTrace trace) {
public void recursiveType(@NotNull BindingTrace trace, boolean shouldReportErrorsOnRecursiveTypeInsidePlusAssignment) {
KtExpression expression = call.getCalleeExpression();
if (expression == null) return;
trace.report(TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM.getErrorFactory().on(expression));
DiagnosticFactory0<KtExpression> factory;
if (shouldReportErrorsOnRecursiveTypeInsidePlusAssignment) {
factory = TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM.getErrorFactory();
} else {
factory = TYPECHECKER_HAS_RUN_INTO_RECURSIVE_PROBLEM.getWarningFactory();
}
trace.report(factory.on(expression));
}
@Override
@@ -17,6 +17,7 @@
package org.jetbrains.kotlin.resolve.calls.tasks;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.config.LanguageVersionSettings;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.psi.Call;
import org.jetbrains.kotlin.resolve.BindingTrace;
@@ -82,7 +83,7 @@ public interface TracingStrategy {
) {}
@Override
public void recursiveType(@NotNull BindingTrace trace) {}
public void recursiveType(@NotNull BindingTrace trace, boolean shouldReportErrorsOnRecursiveTypeInsidePlusAssignment) {}
@Override
public void instantiationOfAbstractClass(@NotNull BindingTrace trace) {}
@@ -147,7 +148,7 @@ public interface TracingStrategy {
@NotNull Collection<? extends ResolvedCall<D>> descriptors
);
void recursiveType(@NotNull BindingTrace trace);
void recursiveType(@NotNull BindingTrace trace, boolean shouldReportErrorsOnRecursiveTypeInsidePlusAssignment);
void instantiationOfAbstractClass(@NotNull BindingTrace trace);
@@ -585,7 +585,7 @@ public class ControlStructureTypingUtils {
}
@Override
public void recursiveType(@NotNull BindingTrace trace) {
public void recursiveType(@NotNull BindingTrace trace, boolean shouldReportErrorsOnRecursiveTypeInsidePlusAssignment) {
logError();
}