Provide additional information about missing supertypes

Add -X flag to report extra compiler diagnostics which migth break compatibility.
Use the flag to unconditionally check constructors without fear of
prematurely evaluating lazy supertypes.

KT-19234
KT-42404
KT-44583
This commit is contained in:
Pavel Kirpichenkov
2021-02-04 20:46:49 +03:00
parent 4a381d4b83
commit 2a46da906c
17 changed files with 109 additions and 1 deletions
@@ -357,6 +357,13 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
) )
var suppressVersionWarnings: Boolean by FreezableVar(false) var suppressVersionWarnings: Boolean by FreezableVar(false)
@Argument(
value = "-Xextended-compiler-checks",
description = "Enable additional compiler checks that might provide verbose diagnostic information for certain errors.\n" +
"Warning: this mode is not backward-compatible and might cause compilation errors in previously compiled code."
)
var extendedCompilerChecks: Boolean by FreezableVar(false)
open fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> { open fun configureAnalysisFlags(collector: MessageCollector): MutableMap<AnalysisFlag<*>, Any> {
return HashMap<AnalysisFlag<*>, Any>().apply { return HashMap<AnalysisFlag<*>, Any>().apply {
put(AnalysisFlags.skipMetadataVersionCheck, skipMetadataVersionCheck) put(AnalysisFlags.skipMetadataVersionCheck, skipMetadataVersionCheck)
@@ -424,6 +431,10 @@ abstract class CommonCompilerArguments : CommonToolArguments() {
put(LanguageFeature.InferenceCompatibility, LanguageFeature.State.ENABLED) put(LanguageFeature.InferenceCompatibility, LanguageFeature.State.ENABLED)
} }
if (extendedCompilerChecks) {
put(LanguageFeature.ExtendedCompilerChecks, LanguageFeature.State.ENABLED)
}
if (progressiveMode) { if (progressiveMode) {
LanguageFeature.values().filter { it.kind.enabledInProgressiveMode }.forEach { LanguageFeature.values().filter { it.kind.enabledInProgressiveMode }.forEach {
// Don't overwrite other settings: users may want to turn off some particular // Don't overwrite other settings: users may want to turn off some particular
@@ -26,6 +26,7 @@ import org.jetbrains.kotlin.cli.common.CLIConfigurationKeys
import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.* import org.jetbrains.kotlin.cli.common.messages.CompilerMessageSeverity.*
import org.jetbrains.kotlin.codegen.state.IncompatibleClassTrackerImpl import org.jetbrains.kotlin.codegen.state.IncompatibleClassTrackerImpl
import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.config.CompilerConfiguration
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.config.LanguageVersionSettings import org.jetbrains.kotlin.config.LanguageVersionSettings
import org.jetbrains.kotlin.config.languageVersionSettings import org.jetbrains.kotlin.config.languageVersionSettings
import org.jetbrains.kotlin.diagnostics.* import org.jetbrains.kotlin.diagnostics.*
@@ -72,6 +73,9 @@ class AnalyzerWithCompilerReport(
.append(", unresolved supertypes: ").append(unresolved!!.joinToString()) .append(", unresolved supertypes: ").append(unresolved!!.joinToString())
.append("\n") .append("\n")
} }
if (!languageVersionSettings.supportsFeature(LanguageFeature.ExtendedCompilerChecks)) {
message.append("Adding -Xextended-compiler-checks argument might provide additional information.\n")
}
messageCollector.report(ERROR, message.toString()) messageCollector.report(ERROR, message.toString())
} }
} }
@@ -6,6 +6,7 @@
package org.jetbrains.kotlin.resolve.checkers package org.jetbrains.kotlin.resolve.checkers
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.config.LanguageFeature
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtDeclaration
@@ -48,7 +49,11 @@ object MissingDependencySupertypeChecker {
descriptor.dispatchReceiverParameter?.declaration, reportOn, descriptor.dispatchReceiverParameter?.declaration, reportOn,
context.trace, context.missingSupertypesResolver context.trace, context.missingSupertypesResolver
) )
if (descriptor !is ConstructorDescriptor && descriptor !is FakeCallableDescriptorForObject && !errorReported) {
val eagerChecksAllowed = context.languageVersionSettings.supportsFeature(LanguageFeature.ExtendedCompilerChecks)
val unresolvedLazySupertypesByDefault = descriptor is ConstructorDescriptor || descriptor is FakeCallableDescriptorForObject
if (eagerChecksAllowed || !unresolvedLazySupertypesByDefault && !errorReported) {
// The constructed class' own supertypes are not resolved after constructor call, // The constructed class' own supertypes are not resolved after constructor call,
// so its containing declaration should not be checked. // so its containing declaration should not be checked.
// Dispatch receiver is checked before for case of inner class constructor call. // Dispatch receiver is checked before for case of inner class constructor call.
+2
View File
@@ -44,6 +44,8 @@ where advanced options include:
-Xexplicit-api={strict|warning|disable} -Xexplicit-api={strict|warning|disable}
Force compiler to report errors on all public API declarations without explicit visibility or return type. Force compiler to report errors on all public API declarations without explicit visibility or return type.
Use 'warning' level to issue warnings instead of errors. Use 'warning' level to issue warnings instead of errors.
-Xextended-compiler-checks Enable additional compiler checks that might provide verbose diagnostic information for certain errors.
Warning: this mode is not backward-compatible and might cause compilation errors in previously compiled code.
-Xinference-compatibility Enable compatibility changes for generic type inference algorithm -Xinference-compatibility Enable compatibility changes for generic type inference algorithm
-Xinline-classes Enable experimental inline classes -Xinline-classes Enable experimental inline classes
-Xintellij-plugin-root=<path> Path to the kotlin-compiler.jar or directory where IntelliJ configuration files can be found -Xintellij-plugin-root=<path> Path to the kotlin-compiler.jar or directory where IntelliJ configuration files can be found
+2
View File
@@ -152,6 +152,8 @@ where advanced options include:
-Xexplicit-api={strict|warning|disable} -Xexplicit-api={strict|warning|disable}
Force compiler to report errors on all public API declarations without explicit visibility or return type. Force compiler to report errors on all public API declarations without explicit visibility or return type.
Use 'warning' level to issue warnings instead of errors. Use 'warning' level to issue warnings instead of errors.
-Xextended-compiler-checks Enable additional compiler checks that might provide verbose diagnostic information for certain errors.
Warning: this mode is not backward-compatible and might cause compilation errors in previously compiled code.
-Xinference-compatibility Enable compatibility changes for generic type inference algorithm -Xinference-compatibility Enable compatibility changes for generic type inference algorithm
-Xinline-classes Enable experimental inline classes -Xinline-classes Enable experimental inline classes
-Xintellij-plugin-root=<path> Path to the kotlin-compiler.jar or directory where IntelliJ configuration files can be found -Xintellij-plugin-root=<path> Path to the kotlin-compiler.jar or directory where IntelliJ configuration files can be found
@@ -1,5 +1,6 @@
error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath: error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
class test.Sub, unresolved supertypes: test.Super class test.Sub, unresolved supertypes: test.Super
Adding -Xextended-compiler-checks argument might provide additional information.
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyErrorPositions/source.kt:3:1: error: cannot access 'test.Super' which is a supertype of 'SubSub'. Check your module classpath for missing or conflicting dependencies compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyErrorPositions/source.kt:3:1: error: cannot access 'test.Super' which is a supertype of 'SubSub'. Check your module classpath for missing or conflicting dependencies
class SubSub : Sub() class SubSub : Sub()
@@ -1,5 +1,6 @@
error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath: error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
class test.Sub, unresolved supertypes: test.Super class test.Sub, unresolved supertypes: test.Super
Adding -Xextended-compiler-checks argument might provide additional information.
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyInJava/source.kt:3:1: error: cannot access 'test.Super' which is a supertype of 'SubSub'. Check your module classpath for missing or conflicting dependencies compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyInJava/source.kt:3:1: error: cannot access 'test.Super' which is a supertype of 'SubSub'. Check your module classpath for missing or conflicting dependencies
class SubSub : Sub() class SubSub : Sub()
@@ -1,5 +1,6 @@
error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath: error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
class test.Sub, unresolved supertypes: test.Super class test.Sub, unresolved supertypes: test.Super
Adding -Xextended-compiler-checks argument might provide additional information.
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyInKotlin/source.kt:3:1: error: cannot access 'test.Super' which is a supertype of 'SubSub'. Check your module classpath for missing or conflicting dependencies compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyInKotlin/source.kt:3:1: error: cannot access 'test.Super' which is a supertype of 'SubSub'. Check your module classpath for missing or conflicting dependencies
class SubSub : Sub() class SubSub : Sub()
@@ -1,5 +1,6 @@
error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath: error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
class test.B, unresolved supertypes: test.A class test.B, unresolved supertypes: test.A
Adding -Xextended-compiler-checks argument might provide additional information.
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyMissingInterface/source.kt:5:15: error: cannot access 'test.A' which is a supertype of 'test.B'. Check your module classpath for missing or conflicting dependencies compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyMissingInterface/source.kt:5:15: error: cannot access 'test.A' which is a supertype of 'test.B'. Check your module classpath for missing or conflicting dependencies
D.m(B.n()) D.m(B.n())
@@ -1,6 +1,7 @@
error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath: error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
class test.SubClass, unresolved supertypes: test.Super class test.SubClass, unresolved supertypes: test.Super
class test.SubObject, unresolved supertypes: test.Super class test.SubObject, unresolved supertypes: test.Super
Adding -Xextended-compiler-checks argument might provide additional information.
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyOfEnclosingClass/source.kt:6:16: error: cannot access 'test.Super' which is a supertype of 'test.SubClass'. Check your module classpath for missing or conflicting dependencies compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyOfEnclosingClass/source.kt:6:16: error: cannot access 'test.Super' which is a supertype of 'test.SubClass'. Check your module classpath for missing or conflicting dependencies
SubClass().Inner() // Error - dispatch receiver misses supertype SubClass().Inner() // Error - dispatch receiver misses supertype
@@ -0,0 +1,5 @@
package test;
public class Sub extends Super {
}
@@ -0,0 +1,11 @@
package test
class SubKt : Super() {
companion object {
fun companionMethod() = "OK"
}
object InnerObject {
fun objectMethod() = "OK"
}
}
@@ -0,0 +1,7 @@
package test;
public class Super {
String foo() {
return "Super";
}
}
@@ -0,0 +1,20 @@
error: supertypes of the following classes cannot be resolved. Please make sure you have the required dependencies in the classpath:
class test.Sub, unresolved supertypes: test.Super
class test.SubKt, unresolved supertypes: test.Super
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyWithExtendedCompilerChecks/source.kt:12:32: error: cannot access 'test.Super' which is a supertype of 'Sub'. Check your module classpath for missing or conflicting dependencies
fun simpleFun(arg: Sub): Sub = Sub()
^
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyWithExtendedCompilerChecks/source.kt:19:18: error: cannot access 'test.Super' which is a supertype of 'Sub'. Check your module classpath for missing or conflicting dependencies
val x: Sub = Sub()
^
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyWithExtendedCompilerChecks/source.kt:21:18: error: cannot access 'test.Super' which is a supertype of 'Sub'. Check your module classpath for missing or conflicting dependencies
useCallRef(::Sub)
^
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyWithExtendedCompilerChecks/source.kt:22:15: error: cannot access 'test.Super' which is a supertype of 'Sub'. Check your module classpath for missing or conflicting dependencies
simpleFun(Sub())
^
compiler/testData/compileKotlinAgainstCustomBinaries/incompleteHierarchyWithExtendedCompilerChecks/source.kt:23:20: error: cannot access 'test.Super' which is a supertype of 'Sub'. Check your module classpath for missing or conflicting dependencies
inlineFun<Sub>(Sub())
^
COMPILATION_ERROR
@@ -0,0 +1,26 @@
import test.Sub as MySub
import test.SubKt
typealias Sub = MySub
class Test<T>
@Suppress("UNUSED_PARAMETER")
fun useCallRef(ref: Any?) {}
@Suppress("UNUSED_PARAMETER")
fun simpleFun(arg: Sub): Sub = Sub()
inline fun <reified T> inlineFun(t: T) = t
// In conservative mode without -Xextended-compiler-checks flag these usages don't cause compilation error
fun test() {
@Suppress("UNUSED_VARIABLE")
val x: Sub = Sub()
Test<Sub>()
useCallRef(::Sub)
simpleFun(Sub())
inlineFun<Sub>(Sub())
SubKt.companionMethod()
SubKt.InnerObject.objectMethod()
}
@@ -229,6 +229,14 @@ class CompileKotlinAgainstCustomBinariesTest : AbstractKotlinCompilerIntegration
doTestBrokenLibrary("library", "test/Super.class") doTestBrokenLibrary("library", "test/Super.class")
} }
fun testIncompleteHierarchyWithExtendedCompilerChecks() {
doTestBrokenLibrary(
"library",
"test/Super.class",
additionalOptions = listOf("-Xextended-compiler-checks"),
)
}
fun testIncompleteHierarchyErrorPositions() { fun testIncompleteHierarchyErrorPositions() {
doTestBrokenLibrary("library", "test/Super.class") doTestBrokenLibrary("library", "test/Super.class")
} }
@@ -168,6 +168,8 @@ enum class LanguageFeature(
// Looks like we can't enable it until KT-26245 is fixed because otherwise some use cases become broken because of overrides // Looks like we can't enable it until KT-26245 is fixed because otherwise some use cases become broken because of overrides
ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated(sinceVersion = null, kind = BUG_FIX), ProhibitUsingNullableTypeParameterAgainstNotNullAnnotated(sinceVersion = null, kind = BUG_FIX),
ExtendedCompilerChecks(sinceVersion = null),
// Experimental features // Experimental features
Coroutines( Coroutines(