From c322644860b5692217bc384f5b272cac00dc068b Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Tue, 19 Dec 2023 14:51:55 +0100 Subject: [PATCH] K2: report only warning on lambda parameters with missing dependencies During the fix of KT-62525, we've forbidden to use lambda parameters with inaccessible types at all. After it, some impact was noticed, so we decided to forbid them only in case it's necessary (the case when associated types have type arguments, see KT-62525 description), and to deprecate them in other cases. #KT-64266 Fixed --- .../diagnostics/KtFirDataClassConverters.kt | 7 +++++ .../api/fir/diagnostics/KtFirDiagnostics.kt | 5 ++++ .../fir/diagnostics/KtFirDiagnosticsImpl.kt | 6 ++++ ...CompilerTestFE10TestdataTestGenerated.java | 6 ++++ ...sticCompilerFE10TestDataTestGenerated.java | 6 ++++ ...eeOldFrontendDiagnosticsTestGenerated.java | 6 ++++ ...siOldFrontendDiagnosticsTestGenerated.java | 6 ++++ .../diagnostics/FirDiagnosticsList.kt | 3 ++ .../fir/analysis/diagnostics/FirErrors.kt | 1 + ...ssingDependencyClassForParameterChecker.kt | 6 +++- .../FirMissingDependencyClassChecker.kt | 19 ++++++++++-- .../diagnostics/FirErrorsDefaultMessages.kt | 6 ++++ .../fir/symbols/impl/FirFunctionSymbol.kt | 1 + .../tests/javac/LambdaNonGeneric.diag.txt | 6 ++-- .../tests/javac/LambdaNonGeneric.fir.diag.txt | 24 +++++++-------- .../tests/javac/LambdaNonGeneric.fir.kt | 17 ++++++----- .../tests/javac/LambdaNonGeneric.kt | 1 + .../javac/LambdaNonGenericForbidden.fir.kt | 30 +++++++++++++++++++ .../tests/javac/LambdaNonGenericForbidden.kt | 30 +++++++++++++++++++ .../test/runners/DiagnosticTestGenerated.java | 6 ++++ .../DiagnosticUsingJavacTestGenerated.java | 6 ++++ .../kotlin/config/LanguageVersionSettings.kt | 1 + 22 files changed, 172 insertions(+), 27 deletions(-) create mode 100644 compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.fir.kt create mode 100644 compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt index 843af89a56d..07fba012258 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDataClassConverters.kt @@ -431,6 +431,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert token, ) } + add(FirErrors.MISSING_DEPENDENCY_CLASS_IN_LAMBDA_PARAMETER) { firDiagnostic -> + MissingDependencyClassInLambdaParameterImpl( + firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a), + firDiagnostic as KtPsiDiagnostic, + token, + ) + } add(FirErrors.CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS) { firDiagnostic -> CreatingAnInstanceOfAbstractClassImpl( firDiagnostic as KtPsiDiagnostic, diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt index 64ae2eb3539..af1fe844078 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnostics.kt @@ -348,6 +348,11 @@ sealed interface KtFirDiagnostic : KtDiagnosticWithPsi { val declarationType: KtType } + interface MissingDependencyClassInLambdaParameter : KtFirDiagnostic { + override val diagnosticClass get() = MissingDependencyClassInLambdaParameter::class + val type: KtType + } + interface CreatingAnInstanceOfAbstractClass : KtFirDiagnostic { override val diagnosticClass get() = CreatingAnInstanceOfAbstractClass::class } diff --git a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt index 3105cdc809e..07c9d4f1deb 100644 --- a/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt +++ b/analysis/analysis-api-fir/src/org/jetbrains/kotlin/analysis/api/fir/diagnostics/KtFirDiagnosticsImpl.kt @@ -401,6 +401,12 @@ internal class MissingDependencySuperclassImpl( token: KtLifetimeToken, ) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MissingDependencySuperclass +internal class MissingDependencyClassInLambdaParameterImpl( + override val type: KtType, + firDiagnostic: KtPsiDiagnostic, + token: KtLifetimeToken, +) : KtAbstractFirDiagnostic(firDiagnostic, token), KtFirDiagnostic.MissingDependencyClassInLambdaParameter + internal class CreatingAnInstanceOfAbstractClassImpl( firDiagnostic: KtPsiDiagnostic, token: KtLifetimeToken, diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java index 8e98aa52b99..60ae37c8137 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosticCompilerTestFE10TestdataTestGenerated.java @@ -22892,6 +22892,12 @@ public class DiagnosticCompilerTestFE10TestdataTestGenerated extends AbstractDia runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt"); } + @Test + @TestMetadata("LambdaNonGenericForbidden.kt") + public void testLambdaNonGenericForbidden() throws Exception { + runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt"); + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/javac/fieldsResolution") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java index 9a2b33f32f3..c160693a1d7 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated.java @@ -22892,6 +22892,12 @@ public class LLFirPreresolvedReversedDiagnosticCompilerFE10TestDataTestGenerated runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt"); } + @Test + @TestMetadata("LambdaNonGenericForbidden.kt") + public void testLambdaNonGenericForbidden() throws Exception { + runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt"); + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/javac/fieldsResolution") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java index d0c52b554ac..302360c1f1f 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirLightTreeOldFrontendDiagnosticsTestGenerated.java @@ -22886,6 +22886,12 @@ public class FirLightTreeOldFrontendDiagnosticsTestGenerated extends AbstractFir runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt"); } + @Test + @TestMetadata("LambdaNonGenericForbidden.kt") + public void testLambdaNonGenericForbidden() throws Exception { + runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt"); + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/javac/fieldsResolution") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java index 67e53962fa1..e119ee7667e 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirPsiOldFrontendDiagnosticsTestGenerated.java @@ -22892,6 +22892,12 @@ public class FirPsiOldFrontendDiagnosticsTestGenerated extends AbstractFirPsiDia runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt"); } + @Test + @TestMetadata("LambdaNonGenericForbidden.kt") + public void testLambdaNonGenericForbidden() throws Exception { + runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt"); + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/javac/fieldsResolution") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt index 92e6670f093..2919063b168 100644 --- a/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt +++ b/compiler/fir/checkers/checkers-component-generator/src/org/jetbrains/kotlin/fir/checkers/generator/diagnostics/FirDiagnosticsList.kt @@ -183,6 +183,9 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") { parameter("missingType") parameter("declarationType") } + val MISSING_DEPENDENCY_CLASS_IN_LAMBDA_PARAMETER by warning(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) { + parameter("type") + } } val CALL_RESOLUTION by object : DiagnosticGroup("Call resolution") { diff --git a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt index 48aa1ba70fa..850a96aa65c 100644 --- a/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt +++ b/compiler/fir/checkers/gen/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrors.kt @@ -186,6 +186,7 @@ object FirErrors { val DUPLICATE_PARAMETER_NAME_IN_FUNCTION_TYPE: KtDiagnosticFactory0 by error0() val MISSING_DEPENDENCY_CLASS: KtDiagnosticFactory1 by error1(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) val MISSING_DEPENDENCY_SUPERCLASS: KtDiagnosticFactory2 by error2(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) + val MISSING_DEPENDENCY_CLASS_IN_LAMBDA_PARAMETER: KtDiagnosticFactory1 by warning1(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED) // Call resolution val CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS: KtDiagnosticFactory0 by error0() diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMissingDependencyClassForParameterChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMissingDependencyClassForParameterChecker.kt index 444da195804..a336b25ddb7 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMissingDependencyClassForParameterChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/declaration/FirMissingDependencyClassForParameterChecker.kt @@ -9,6 +9,7 @@ import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.checkers.expression.FirMissingDependencyClassProxy import org.jetbrains.kotlin.fir.declarations.FirValueParameter +import org.jetbrains.kotlin.fir.symbols.impl.FirAnonymousFunctionSymbol import org.jetbrains.kotlin.fir.types.ConeKotlinType import org.jetbrains.kotlin.fir.types.coneType @@ -18,8 +19,11 @@ object FirMissingDependencyClassForParameterChecker : FirValueParameterChecker() context: CheckerContext, reporter: DiagnosticReporter, ) { + val containingFunctionSymbol = declaration.containingFunctionSymbol + if (containingFunctionSymbol !is FirAnonymousFunctionSymbol || !containingFunctionSymbol.isLambda) return + val missingTypes = mutableSetOf() considerType(declaration.returnTypeRef.coneType, missingTypes, context) - reportMissingTypes(declaration.source, missingTypes, context, reporter) + reportMissingTypes(declaration.source, missingTypes, context, reporter, isTypeOfLambdaParameter = true) } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirMissingDependencyClassChecker.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirMissingDependencyClassChecker.kt index 3f7f6746c26..11be42d7039 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirMissingDependencyClassChecker.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/checkers/expression/FirMissingDependencyClassChecker.kt @@ -6,11 +6,13 @@ package org.jetbrains.kotlin.fir.analysis.checkers.expression import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.config.LanguageFeature import org.jetbrains.kotlin.diagnostics.DiagnosticReporter import org.jetbrains.kotlin.diagnostics.reportOn import org.jetbrains.kotlin.fir.analysis.checkers.context.CheckerContext import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors import org.jetbrains.kotlin.fir.expressions.FirQualifiedAccessExpression +import org.jetbrains.kotlin.fir.languageVersionSettings import org.jetbrains.kotlin.fir.references.isError import org.jetbrains.kotlin.fir.references.toResolvedCallableSymbol import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeDiagnosticWithSingleCandidate @@ -39,7 +41,7 @@ object FirMissingDependencyClassChecker : FirQualifiedAccessExpressionChecker(), (symbol as? FirFunctionSymbol<*>)?.valueParameterSymbols?.forEach { considerType(it.resolvedReturnTypeRef.coneType, missingTypes, context) } - reportMissingTypes(expression.source, missingTypes, context, reporter) + reportMissingTypes(expression.source, missingTypes, context, reporter, isTypeOfLambdaParameter = false) } } @@ -76,7 +78,7 @@ internal interface FirMissingDependencyClassProxy { } if (hasMissingClass && !hasError) { - val reportedType = type.withNullability(ConeNullability.NOT_NULL, context.session.typeContext).withArguments(emptyArray()) + val reportedType = type.withNullability(ConeNullability.NOT_NULL, context.session.typeContext) missingTypes.add(reportedType) } } @@ -86,9 +88,20 @@ internal interface FirMissingDependencyClassProxy { missingTypes: MutableSet, context: CheckerContext, reporter: DiagnosticReporter, + isTypeOfLambdaParameter: Boolean, ) { + val reported = mutableSetOf() for (missingType in missingTypes) { - reporter.reportOn(source, FirErrors.MISSING_DEPENDENCY_CLASS, missingType, context) + val withoutArguments = missingType.withArguments(emptyArray()) + if (withoutArguments in reported) continue + if (isTypeOfLambdaParameter && missingType.typeArguments.isEmpty() && + !context.session.languageVersionSettings.supportsFeature(LanguageFeature.ForbidLambdaParameterWithMissingDependencyType) + ) { + reporter.reportOn(source, FirErrors.MISSING_DEPENDENCY_CLASS_IN_LAMBDA_PARAMETER, withoutArguments, context) + } else { + reporter.reportOn(source, FirErrors.MISSING_DEPENDENCY_CLASS, withoutArguments, context) + reported += withoutArguments + } } } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt index 98a54ad0087..1b066841827 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/diagnostics/FirErrorsDefaultMessages.kt @@ -381,6 +381,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.METHOD_OF_ANY_IMP import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISPLACED_TYPE_PARAMETER_CONSTRAINTS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_CONSTRUCTOR_KEYWORD import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_DEPENDENCY_CLASS +import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_DEPENDENCY_CLASS_IN_LAMBDA_PARAMETER import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_DEPENDENCY_SUPERCLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_STDLIB_CLASS import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_VAL_ON_ANNOTATION_PARAMETER @@ -788,6 +789,11 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() { RENDER_TYPE, RENDER_TYPE, ) + map.put( + MISSING_DEPENDENCY_CLASS_IN_LAMBDA_PARAMETER, + "Class ''{0}'' of the lambda parameter is inaccessible. While it may work, this case is dangerous and may be forbidden soon. Consider adding a necessary dependency to your module classpath.", + RENDER_TYPE, + ) map.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, "Only expressions are allowed in this context.") map.put(EXPRESSION_EXPECTED, "Only expressions are allowed here.") diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt index 89ee5d5fa0f..ed3a92b0fc2 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/symbols/impl/FirFunctionSymbol.kt @@ -102,6 +102,7 @@ sealed class FirFunctionWithoutNameSymbol(stubName: Name) : Fir class FirAnonymousFunctionSymbol : FirFunctionWithoutNameSymbol(Name.identifier("anonymous")) { val label: FirLabel? get() = fir.label + val isLambda: Boolean get() = fir.isLambda } open class FirPropertyAccessorSymbol : FirFunctionWithoutNameSymbol(Name.identifier("accessor")) { diff --git a/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.diag.txt b/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.diag.txt index 776870f4039..357808ba569 100644 --- a/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.diag.txt +++ b/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.diag.txt @@ -1,15 +1,15 @@ // -- Module: -- // -- Module: -- -/m2.kt:13:9: warning: parameter 'f' is never used +/m2.kt:14:9: warning: parameter 'f' is never used fun foo(f: (Some, String) -> Unit) {} ^ -/m2.kt:14:9: warning: parameter 'f' is never used +/m2.kt:15:9: warning: parameter 'f' is never used fun bar(f: (Some) -> Unit) {} ^ // -- Module: -- -/m3.kt:23:17: error: unresolved reference: Some +/m3.kt:24:17: error: unresolved reference: Some foo { some: Some, _ -> } ^ diff --git a/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.fir.diag.txt b/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.fir.diag.txt index 0c0571acf49..341ae46c4e7 100644 --- a/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.fir.diag.txt +++ b/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.fir.diag.txt @@ -1,23 +1,23 @@ -/m3.kt:(72,73): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(73,74): warning: Class 'Some' of the lambda parameter is inaccessible. While it may work, this case is dangerous and may be forbidden soon. Consider adding a necessary dependency to your module classpath. -/m3.kt:(92,96): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(93,97): warning: Class 'Some' of the lambda parameter is inaccessible. While it may work, this case is dangerous and may be forbidden soon. Consider adding a necessary dependency to your module classpath. -/m3.kt:(117,121): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(118,122): warning: Class 'Some' of the lambda parameter is inaccessible. While it may work, this case is dangerous and may be forbidden soon. Consider adding a necessary dependency to your module classpath. -/m3.kt:(128,132): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(129,133): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. -/m3.kt:(162,166): error: Unresolved reference 'Some'. +/m3.kt:(163,167): error: Unresolved reference 'Some'. -/m3.kt:(184,187): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(185,188): warning: Class 'Some' of the lambda parameter is inaccessible. While it may work, this case is dangerous and may be forbidden soon. Consider adding a necessary dependency to your module classpath. -/m3.kt:(198,199): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(199,200): warning: Class 'Some' of the lambda parameter is inaccessible. While it may work, this case is dangerous and may be forbidden soon. Consider adding a necessary dependency to your module classpath. -/m3.kt:(215,217): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(216,218): warning: Class 'Some' of the lambda parameter is inaccessible. While it may work, this case is dangerous and may be forbidden soon. Consider adding a necessary dependency to your module classpath. -/m3.kt:(231,248): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(232,249): warning: Class 'Some' of the lambda parameter is inaccessible. While it may work, this case is dangerous and may be forbidden soon. Consider adding a necessary dependency to your module classpath. -/m3.kt:(233,235): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(234,236): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. -/m3.kt:(259,263): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(260,264): warning: Class 'Some' of the lambda parameter is inaccessible. While it may work, this case is dangerous and may be forbidden soon. Consider adding a necessary dependency to your module classpath. -/m3.kt:(267,271): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. +/m3.kt:(268,272): error: Cannot access class 'Some'. Check your module classpath for missing or conflicting dependencies. diff --git a/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.fir.kt b/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.fir.kt index 5d6e8f636aa..9d8d2c15c70 100644 --- a/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.fir.kt +++ b/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.fir.kt @@ -1,5 +1,6 @@ // RENDER_DIAGNOSTICS_FULL_TEXT // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_ANONYMOUS_PARAMETER +// LANGUAGE: -ForbidLambdaParameterWithMissingDependencyType // ISSUE: KT-64266 // MODULE: m1 @@ -17,14 +18,14 @@ fun bar(f: (Some) -> Unit) {} // FILE: m3.kt fun test() { - foo { _, _ -> } - foo { some, str -> } - foo { some, _ -> some.toString() } + foo { _, _ -> } + foo { some, str -> } + foo { some, _ -> some.toString() } foo { some: Some, _ -> } - bar { } - bar { _ -> } - bar { it -> } - bar { it.toString() } - bar { some -> some.toString() } + bar { } + bar { _ -> } + bar { it -> } + bar { it.toString() } + bar { some -> some.toString() } } diff --git a/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt b/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt index be9db64269d..aa79674539d 100644 --- a/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt +++ b/compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt @@ -1,5 +1,6 @@ // RENDER_DIAGNOSTICS_FULL_TEXT // !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_ANONYMOUS_PARAMETER +// LANGUAGE: -ForbidLambdaParameterWithMissingDependencyType // ISSUE: KT-64266 // MODULE: m1 diff --git a/compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.fir.kt b/compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.fir.kt new file mode 100644 index 00000000000..9618d93786c --- /dev/null +++ b/compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.fir.kt @@ -0,0 +1,30 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_ANONYMOUS_PARAMETER +// LANGUAGE: +ForbidLambdaParameterWithMissingDependencyType +// ISSUE: KT-64266 + +// MODULE: m1 +// FILE: m1.kt + +class Some + +// MODULE: m2(m1) +// FILE: m2.kt + +fun foo(f: (Some, String) -> Unit) {} +fun bar(f: (Some) -> Unit) {} + +// MODULE: m3(m2) +// FILE: m3.kt + +fun test() { + foo { _, _ -> } + foo { some, str -> } + foo { some, _ -> some.toString() } + foo { some: Some, _ -> } + + bar { } + bar { _ -> } + bar { it -> } + bar { it.toString() } + bar { some -> some.toString() } +} diff --git a/compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt b/compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt new file mode 100644 index 00000000000..7d2521a3208 --- /dev/null +++ b/compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt @@ -0,0 +1,30 @@ +// !DIAGNOSTICS: -UNUSED_PARAMETER -UNUSED_ANONYMOUS_PARAMETER +// LANGUAGE: +ForbidLambdaParameterWithMissingDependencyType +// ISSUE: KT-64266 + +// MODULE: m1 +// FILE: m1.kt + +class Some + +// MODULE: m2(m1) +// FILE: m2.kt + +fun foo(f: (Some, String) -> Unit) {} +fun bar(f: (Some) -> Unit) {} + +// MODULE: m3(m2) +// FILE: m3.kt + +fun test() { + foo { _, _ -> } + foo { some, str -> } + foo { some, _ -> some.toString() } + foo { some: Some, _ -> } + + bar { } + bar { _ -> } + bar { it -> } + bar { it.toString() } + bar { some -> some.toString() } +} diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 16b1da9cbe1..f5d176f427d 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -22892,6 +22892,12 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt"); } + @Test + @TestMetadata("LambdaNonGenericForbidden.kt") + public void testLambdaNonGenericForbidden() throws Exception { + runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt"); + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/javac/fieldsResolution") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticUsingJavacTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticUsingJavacTestGenerated.java index b43274b1b85..d5631217616 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticUsingJavacTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticUsingJavacTestGenerated.java @@ -42,6 +42,12 @@ public class DiagnosticUsingJavacTestGenerated extends AbstractDiagnosticUsingJa runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGeneric.kt"); } + @Test + @TestMetadata("LambdaNonGenericForbidden.kt") + public void testLambdaNonGenericForbidden() throws Exception { + runTest("compiler/testData/diagnostics/tests/javac/LambdaNonGenericForbidden.kt"); + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/javac/fieldsResolution") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt index 0e13781b902..50a5d045be5 100644 --- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt +++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt @@ -316,6 +316,7 @@ enum class LanguageFeature( PrioritizedEnumEntries(KOTLIN_2_1, kind = UNSTABLE_FEATURE), // KT-58920 ProhibitInlineModifierOnPrimaryConstructorParameters(KOTLIN_2_1, kind = BUG_FIX), // KT-59664 ProhibitSingleNamedFunctionAsExpression(KOTLIN_2_1, kind = BUG_FIX), // KT-62573 + ForbidLambdaParameterWithMissingDependencyType(KOTLIN_2_1, kind = BUG_FIX), // KT-64266 // End of 2.* language features --------------------------------------------------