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:
+11
@@ -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
|
||||||
|
|||||||
+4
@@ -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
-1
@@ -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
@@ -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
@@ -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
|
||||||
|
|||||||
Vendored
+1
@@ -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
@@ -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()
|
||||||
|
|||||||
Vendored
+1
@@ -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()
|
||||||
|
|||||||
Vendored
+1
@@ -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())
|
||||||
|
|||||||
Vendored
+1
@@ -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
|
||||||
|
|||||||
+5
@@ -0,0 +1,5 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
public class Sub extends Super {
|
||||||
|
|
||||||
|
}
|
||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
package test
|
||||||
|
|
||||||
|
class SubKt : Super() {
|
||||||
|
companion object {
|
||||||
|
fun companionMethod() = "OK"
|
||||||
|
}
|
||||||
|
|
||||||
|
object InnerObject {
|
||||||
|
fun objectMethod() = "OK"
|
||||||
|
}
|
||||||
|
}
|
||||||
+7
@@ -0,0 +1,7 @@
|
|||||||
|
package test;
|
||||||
|
|
||||||
|
public class Super {
|
||||||
|
String foo() {
|
||||||
|
return "Super";
|
||||||
|
}
|
||||||
|
}
|
||||||
+20
@@ -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
|
||||||
+26
@@ -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()
|
||||||
|
}
|
||||||
+8
@@ -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(
|
||||||
|
|||||||
Reference in New Issue
Block a user