[FIR] Add checker for MISSING_DEPENDENCY_CLASS
#KT-59371 Fixed
This commit is contained in:
+7
@@ -415,6 +415,13 @@ internal val KT_DIAGNOSTIC_CONVERTER = KtDiagnosticConverterBuilder.buildConvert
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirErrors.MISSING_DEPENDENCY_CLASS) { firDiagnostic ->
|
||||
MissingDependencyClassImpl(
|
||||
firSymbolBuilder.typeBuilder.buildKtType(firDiagnostic.a),
|
||||
firDiagnostic as KtPsiDiagnostic,
|
||||
token,
|
||||
)
|
||||
}
|
||||
add(FirErrors.CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS) { firDiagnostic ->
|
||||
CreatingAnInstanceOfAbstractClassImpl(
|
||||
firDiagnostic as KtPsiDiagnostic,
|
||||
|
||||
+5
@@ -336,6 +336,11 @@ sealed interface KtFirDiagnostic<PSI : PsiElement> : KtDiagnosticWithPsi<PSI> {
|
||||
override val diagnosticClass get() = DuplicateParameterNameInFunctionType::class
|
||||
}
|
||||
|
||||
interface MissingDependencyClass : KtFirDiagnostic<PsiElement> {
|
||||
override val diagnosticClass get() = MissingDependencyClass::class
|
||||
val type: KtType
|
||||
}
|
||||
|
||||
interface CreatingAnInstanceOfAbstractClass : KtFirDiagnostic<KtExpression> {
|
||||
override val diagnosticClass get() = CreatingAnInstanceOfAbstractClass::class
|
||||
}
|
||||
|
||||
+6
@@ -387,6 +387,12 @@ internal class DuplicateParameterNameInFunctionTypeImpl(
|
||||
token: KtLifetimeToken,
|
||||
) : KtAbstractFirDiagnostic<KtTypeReference>(firDiagnostic, token), KtFirDiagnostic.DuplicateParameterNameInFunctionType
|
||||
|
||||
internal class MissingDependencyClassImpl(
|
||||
override val type: KtType,
|
||||
firDiagnostic: KtPsiDiagnostic,
|
||||
token: KtLifetimeToken,
|
||||
) : KtAbstractFirDiagnostic<PsiElement>(firDiagnostic, token), KtFirDiagnostic.MissingDependencyClass
|
||||
|
||||
internal class CreatingAnInstanceOfAbstractClassImpl(
|
||||
firDiagnostic: KtPsiDiagnostic,
|
||||
token: KtLifetimeToken,
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
// FILE: J.java
|
||||
public class J {
|
||||
public static fun f(Byte x) {}
|
||||
public static fun f(Integer x) {}
|
||||
public static fun f(Long x) {}
|
||||
public static void f(Byte x) {}
|
||||
public static void f(Integer x) {}
|
||||
public static void f(Long x) {}
|
||||
}
|
||||
|
||||
// FILE: x.kt
|
||||
|
||||
+4
@@ -176,6 +176,10 @@ object DIAGNOSTICS_LIST : DiagnosticList("FirErrors") {
|
||||
}
|
||||
|
||||
val DUPLICATE_PARAMETER_NAME_IN_FUNCTION_TYPE by error<KtTypeReference>()
|
||||
|
||||
val MISSING_DEPENDENCY_CLASS by error<PsiElement>(PositioningStrategy.REFERENCED_NAME_BY_QUALIFIED) {
|
||||
parameter<ConeKotlinType>("type")
|
||||
}
|
||||
}
|
||||
|
||||
val CALL_RESOLUTION by object : DiagnosticGroup("Call resolution") {
|
||||
|
||||
@@ -175,6 +175,7 @@ object FirErrors {
|
||||
val UNRESOLVED_REFERENCE_WRONG_RECEIVER by error1<PsiElement, Collection<FirBasedSymbol<*>>>()
|
||||
val UNRESOLVED_IMPORT by error1<PsiElement, String>(SourceElementPositioningStrategies.IMPORT_LAST_NAME)
|
||||
val DUPLICATE_PARAMETER_NAME_IN_FUNCTION_TYPE by error0<KtTypeReference>()
|
||||
val MISSING_DEPENDENCY_CLASS by error1<PsiElement, ConeKotlinType>(SourceElementPositioningStrategies.REFERENCED_NAME_BY_QUALIFIED)
|
||||
|
||||
// Call resolution
|
||||
val CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS by error0<KtExpression>()
|
||||
|
||||
+1
@@ -53,6 +53,7 @@ val FIR_NON_SUPPRESSIBLE_ERROR_NAMES: Set<String> = setOf(
|
||||
"UNRESOLVED_REFERENCE_WRONG_RECEIVER",
|
||||
"UNRESOLVED_IMPORT",
|
||||
"DUPLICATE_PARAMETER_NAME_IN_FUNCTION_TYPE",
|
||||
"MISSING_DEPENDENCY_CLASS",
|
||||
"CREATING_AN_INSTANCE_OF_ABSTRACT_CLASS",
|
||||
"NO_CONSTRUCTOR",
|
||||
"FUNCTION_CALL_EXPECTED",
|
||||
|
||||
+1
@@ -68,6 +68,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
|
||||
FirSpreadOfNullableChecker,
|
||||
FirAssignmentOperatorCallChecker,
|
||||
FirNamedVarargChecker,
|
||||
FirMissingDependencyClassChecker,
|
||||
FirUnderscoredTypeArgumentSyntaxChecker,
|
||||
FirContractNotFirstStatementChecker,
|
||||
FirProtectedConstructorNotInSuperCallChecker,
|
||||
|
||||
+68
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright 2010-2023 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
||||
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
|
||||
*/
|
||||
|
||||
package org.jetbrains.kotlin.fir.analysis.checkers.expression
|
||||
|
||||
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.FirFunctionCall
|
||||
import org.jetbrains.kotlin.fir.expressions.impl.FirNoReceiverExpression
|
||||
import org.jetbrains.kotlin.fir.references.isError
|
||||
import org.jetbrains.kotlin.fir.resolve.diagnostics.ConeInapplicableCandidateError
|
||||
import org.jetbrains.kotlin.fir.resolve.toSymbol
|
||||
import org.jetbrains.kotlin.fir.types.*
|
||||
import org.jetbrains.kotlin.resolve.calls.tower.CandidateApplicability
|
||||
|
||||
/**
|
||||
* @see org.jetbrains.kotlin.resolve.checkers.MissingDependencyClassChecker
|
||||
*/
|
||||
object FirMissingDependencyClassChecker : FirFunctionCallChecker() {
|
||||
override fun check(expression: FirFunctionCall, context: CheckerContext, reporter: DiagnosticReporter) {
|
||||
val calleeReference = expression.calleeReference
|
||||
if (calleeReference.isError()) {
|
||||
// To replicate K1 behavior, MISSING_DEPENDENCY_CLASS errors should still be reported on unsafe calls.
|
||||
// All other callee errors should skip reporting of MISSING_DEPENDENCY_CLASS.
|
||||
val diagnostic = calleeReference.diagnostic
|
||||
if (diagnostic !is ConeInapplicableCandidateError || diagnostic.applicability != CandidateApplicability.UNSAFE_CALL) {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
fun consider(type: ConeKotlinType) {
|
||||
var hasError = false
|
||||
var hasMissingClass = false
|
||||
type.forEachClassLikeType {
|
||||
when (it) {
|
||||
is ConeErrorType -> hasError = true
|
||||
else -> hasMissingClass = hasMissingClass || it.lookupTag.toSymbol(context.session) == null
|
||||
}
|
||||
}
|
||||
|
||||
if (hasMissingClass && !hasError) {
|
||||
reporter.reportOn(expression.source, FirErrors.MISSING_DEPENDENCY_CLASS, type, context)
|
||||
}
|
||||
}
|
||||
|
||||
expression.coneTypeOrNull?.let(::consider)
|
||||
expression.extensionReceiver.takeIf { it !is FirNoReceiverExpression }?.coneTypeOrNull?.let(::consider)
|
||||
expression.argumentList.arguments.forEach { it.coneTypeOrNull?.let(::consider) }
|
||||
}
|
||||
|
||||
private fun ConeKotlinType.forEachClassLikeType(action: (ConeClassLikeType) -> Unit) {
|
||||
when (this) {
|
||||
is ConeFlexibleType -> {
|
||||
lowerBound.forEachClassLikeType(action)
|
||||
upperBound.forEachClassLikeType(action)
|
||||
}
|
||||
|
||||
is ConeDefinitelyNotNullType -> original.forEachClassLikeType(action)
|
||||
is ConeIntersectionType -> intersectedTypes.forEach { it.forEachClassLikeType(action) }
|
||||
is ConeClassLikeType -> action(this)
|
||||
else -> {} // Ignore all type parameters.
|
||||
}
|
||||
}
|
||||
}
|
||||
+8
@@ -360,6 +360,7 @@ import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MANY_LAMBDA_EXPRE
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.METHOD_OF_ANY_IMPLEMENTED_IN_INTERFACE
|
||||
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_STDLIB_CLASS
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MISSING_VAL_ON_ANNOTATION_PARAMETER
|
||||
import org.jetbrains.kotlin.fir.analysis.diagnostics.FirErrors.MIXING_FUNCTIONAL_KINDS_IN_SUPERTYPES
|
||||
@@ -743,6 +744,13 @@ object FirErrorsDefaultMessages : BaseDiagnosticRendererFactory() {
|
||||
TO_STRING,
|
||||
TO_STRING,
|
||||
)
|
||||
|
||||
map.put(
|
||||
MISSING_DEPENDENCY_CLASS,
|
||||
"Cannot access class ''{0}''. Check your module classpath for missing or conflicting dependencies.",
|
||||
RENDER_TYPE,
|
||||
)
|
||||
|
||||
map.put(ASSIGNMENT_IN_EXPRESSION_CONTEXT, "Only expressions are allowed in this context.")
|
||||
map.put(EXPRESSION_EXPECTED, "Only expressions are allowed here.")
|
||||
|
||||
|
||||
+1
-1
@@ -24,4 +24,4 @@ package c
|
||||
import a.*
|
||||
import b.*
|
||||
|
||||
fun test(): <!OVERLOAD_RESOLUTION_AMBIGUITY!>x<!> = d().x()
|
||||
fun test(): <!OVERLOAD_RESOLUTION_AMBIGUITY!>x<!> = d().<!MISSING_DEPENDENCY_CLASS!>x<!>()
|
||||
|
||||
-38
@@ -1,38 +0,0 @@
|
||||
// SKIP_JAVAC
|
||||
// FILE: a/B.java
|
||||
package a;
|
||||
|
||||
public class B {}
|
||||
|
||||
// FILE: a/D.java
|
||||
package a;
|
||||
|
||||
public class D {
|
||||
public static class B {}
|
||||
}
|
||||
|
||||
// FILE: b/A1.java
|
||||
package b;
|
||||
|
||||
import a.B;
|
||||
import a.D.B;
|
||||
|
||||
public class A1 {
|
||||
public B getB() { return null; }
|
||||
}
|
||||
|
||||
// FILE: b/A2.java
|
||||
package b;
|
||||
|
||||
import a.*;
|
||||
import a.D.*;
|
||||
|
||||
public class A2 {
|
||||
public B getB() { return null; }
|
||||
}
|
||||
|
||||
// FILE: a.kt
|
||||
package b
|
||||
|
||||
fun test() = A1().getB()
|
||||
fun test2() = A2().getB()
|
||||
+2
-1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// SKIP_JAVAC
|
||||
// FILE: a/B.java
|
||||
package a;
|
||||
@@ -35,4 +36,4 @@ public class A2 {
|
||||
package b
|
||||
|
||||
fun test() = A1().getB()
|
||||
fun test2() = A2().<!MISSING_DEPENDENCY_CLASS!>getB<!>()
|
||||
fun test2() = A2().<!MISSING_DEPENDENCY_CLASS!>getB<!>()
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
// SKIP_JAVAC
|
||||
// FILE: a/A.java
|
||||
package a;
|
||||
|
||||
public class A {
|
||||
public static class B {}
|
||||
}
|
||||
|
||||
// FILE: a/D.java
|
||||
package a;
|
||||
|
||||
public class D {
|
||||
public static class B {}
|
||||
}
|
||||
|
||||
// FILE: b/A1.java
|
||||
package b;
|
||||
|
||||
import a.A.B;
|
||||
import a.D.B;
|
||||
|
||||
public class A1 {
|
||||
public B getB() { return null; }
|
||||
}
|
||||
|
||||
// FILE: b/A2.java
|
||||
package b;
|
||||
|
||||
import a.A.*;
|
||||
import a.D.*;
|
||||
|
||||
public class A2 {
|
||||
public B getB() { return null; }
|
||||
}
|
||||
|
||||
// FILE: a.kt
|
||||
package b
|
||||
|
||||
fun test() = A1().getB()
|
||||
fun test2() = A2().getB()
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// SKIP_JAVAC
|
||||
// FILE: a/A.java
|
||||
package a;
|
||||
|
||||
-27
@@ -1,27 +0,0 @@
|
||||
// FILE: a/x.java
|
||||
package a;
|
||||
|
||||
public class x {
|
||||
public class Z {}
|
||||
}
|
||||
|
||||
// FILE: a/i.java
|
||||
package a;
|
||||
|
||||
public interface i {
|
||||
public class Z {}
|
||||
}
|
||||
|
||||
// FILE: a/y.java
|
||||
package a;
|
||||
|
||||
public class y extends x implements i {
|
||||
|
||||
public Z getZ() { return null; }
|
||||
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
package a
|
||||
|
||||
fun test() = y().getZ()
|
||||
+2
-1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// FILE: a/x.java
|
||||
package a;
|
||||
|
||||
@@ -24,4 +25,4 @@ public class y extends x implements i {
|
||||
// FILE: test.kt
|
||||
package a
|
||||
|
||||
fun test() = y().<!MISSING_DEPENDENCY_CLASS!>getZ<!>()
|
||||
fun test() = y().<!MISSING_DEPENDENCY_CLASS!>getZ<!>()
|
||||
|
||||
-30
@@ -1,30 +0,0 @@
|
||||
// FILE: a/x.java
|
||||
package a;
|
||||
|
||||
public class x {
|
||||
public class Z {}
|
||||
}
|
||||
|
||||
// FILE: a/i.java
|
||||
package a;
|
||||
|
||||
public interface i {
|
||||
public class Z {}
|
||||
}
|
||||
|
||||
// FILE: a/i2.java
|
||||
package a;
|
||||
|
||||
public interface i2 extends i {}
|
||||
|
||||
// FILE: a/y.java
|
||||
package a;
|
||||
|
||||
public class y extends x implements i2 {
|
||||
public Z getZ() { return null; }
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
package a
|
||||
|
||||
fun test() = y().getZ()
|
||||
+2
-1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// FILE: a/x.java
|
||||
package a;
|
||||
|
||||
@@ -27,4 +28,4 @@ public class y extends x implements i2 {
|
||||
// FILE: test.kt
|
||||
package a
|
||||
|
||||
fun test() = y().<!MISSING_DEPENDENCY_CLASS!>getZ<!>()
|
||||
fun test() = y().<!MISSING_DEPENDENCY_CLASS!>getZ<!>()
|
||||
|
||||
-25
@@ -1,25 +0,0 @@
|
||||
// FILE: a/i.java
|
||||
package a;
|
||||
|
||||
public interface i {
|
||||
public class Z {}
|
||||
}
|
||||
|
||||
// FILE: a/i2.java
|
||||
package a;
|
||||
|
||||
public interface i2 {
|
||||
public class Z {}
|
||||
}
|
||||
|
||||
// FILE: a/x.java
|
||||
package a;
|
||||
|
||||
public class x implements i, i2 {
|
||||
public Z getZ() { return null; }
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
package a
|
||||
|
||||
fun test() = x().getZ()
|
||||
+2
-1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// FILE: a/i.java
|
||||
package a;
|
||||
|
||||
@@ -22,4 +23,4 @@ public class x implements i, i2 {
|
||||
// FILE: test.kt
|
||||
package a
|
||||
|
||||
fun test() = x().<!MISSING_DEPENDENCY_CLASS!>getZ<!>()
|
||||
fun test() = x().<!MISSING_DEPENDENCY_CLASS!>getZ<!>()
|
||||
|
||||
-47
@@ -1,47 +0,0 @@
|
||||
// FILE: a/x.java
|
||||
package a;
|
||||
|
||||
public class x {
|
||||
class O {}
|
||||
}
|
||||
|
||||
// FILE: a/x1.java
|
||||
package a;
|
||||
|
||||
public class x1 extends x {}
|
||||
|
||||
// FILE: a/x2.java
|
||||
package a;
|
||||
|
||||
public class x2 extends x1 {}
|
||||
|
||||
// FILE: a/i.java
|
||||
package a;
|
||||
|
||||
public interface i {
|
||||
public class O {}
|
||||
}
|
||||
|
||||
// FILE: a/i2.java
|
||||
package a;
|
||||
|
||||
public interface i2 extends i {
|
||||
public class O {}
|
||||
}
|
||||
|
||||
// FILE: a/i3.java
|
||||
package a;
|
||||
|
||||
public interface i3 extends i2 {}
|
||||
|
||||
// FILE: a/test.java
|
||||
package a;
|
||||
|
||||
public class test extends x2 implements i3 {
|
||||
public O getO() { return null; }
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
package a
|
||||
|
||||
fun test1() = test().getO()
|
||||
+1
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// FILE: a/x.java
|
||||
package a;
|
||||
|
||||
|
||||
@@ -1,33 +0,0 @@
|
||||
// FILE: a/x.java
|
||||
package a;
|
||||
|
||||
public class x {
|
||||
public class O {}
|
||||
}
|
||||
|
||||
// FILE: a/i.java
|
||||
package a;
|
||||
|
||||
public interface i {
|
||||
public class O {}
|
||||
}
|
||||
|
||||
// FILE: a/i2.java
|
||||
package a;
|
||||
|
||||
public interface i2 extends i {
|
||||
public O getO();
|
||||
}
|
||||
|
||||
// FILE: a/Test.java
|
||||
package a;
|
||||
|
||||
public class Test extends x implements i2 {
|
||||
@Override
|
||||
public O getO() { return null; }
|
||||
}
|
||||
|
||||
// FILE: test.kt
|
||||
package a
|
||||
|
||||
fun test() = Test().getO()
|
||||
@@ -1,3 +1,4 @@
|
||||
// FIR_IDENTICAL
|
||||
// FILE: a/x.java
|
||||
package a;
|
||||
|
||||
@@ -30,4 +31,4 @@ public class Test extends x implements i2 {
|
||||
// FILE: test.kt
|
||||
package a
|
||||
|
||||
fun test() = Test().<!MISSING_DEPENDENCY_CLASS!>getO<!>()
|
||||
fun test() = Test().<!MISSING_DEPENDENCY_CLASS!>getO<!>()
|
||||
|
||||
Vendored
+5
-5
@@ -247,7 +247,7 @@ fun case_4(value_1: Any?) {
|
||||
case_4_2(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>)
|
||||
value_1.toByte()
|
||||
case_4_3(value_1)
|
||||
value_1.inv()
|
||||
value_1.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 5
|
||||
@@ -340,28 +340,28 @@ fun case_8(value_1: Any?) {
|
||||
value_1<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>toByte<!>()
|
||||
if (case_8_2(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>)) {
|
||||
value_1.toByte()
|
||||
if (case_8_3(value_1)) value_1.inv()
|
||||
if (case_8_3(value_1)) value_1.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
if (!case_8_4(value_1)) {
|
||||
value_1<!UNNECESSARY_SAFE_CALL!>?.<!><!UNRESOLVED_REFERENCE!>toByte<!>()
|
||||
if (!case_8_5(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>)) {
|
||||
value_1.toByte()
|
||||
if (!case_8_6(value_1)) value_1.inv()
|
||||
if (!case_8_6(value_1)) value_1.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
if (case_8_7(value_1) == null) {
|
||||
value_1?.<!UNRESOLVED_REFERENCE!>toByte<!>()
|
||||
if (case_8_8(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>) != null) {
|
||||
value_1<!UNSAFE_CALL!>.<!>toByte()
|
||||
if (case_8_9(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>) != null) value_1<!UNSAFE_CALL!>.<!>inv()
|
||||
if (case_8_9(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>) != null) value_1<!UNSAFE_CALL!>.<!><!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
if (case_8_10(value_1) != null) {
|
||||
value_1?.<!UNRESOLVED_REFERENCE!>toByte<!>()
|
||||
if (case_8_11(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>) == null) {
|
||||
value_1<!UNSAFE_CALL!>.<!>toByte()
|
||||
if (case_8_12(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>) == null) value_1<!UNSAFE_CALL!>.<!>inv()
|
||||
if (case_8_12(<!ARGUMENT_TYPE_MISMATCH!>value_1<!>) == null) value_1<!UNSAFE_CALL!>.<!><!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,7 +19,7 @@ fun case_1(x: ClassWithCustomEquals) {
|
||||
val y = null
|
||||
if (<!SENSELESS_COMPARISON!>x == y<!>) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,7 +27,7 @@ fun case_1(x: ClassWithCustomEquals) {
|
||||
fun case_2(x: ClassWithCustomEquals) {
|
||||
if (<!SENSELESS_COMPARISON!>x == null<!>) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ fun case_2(x: ClassWithCustomEquals) {
|
||||
fun case_3(x: ClassWithCustomEquals, y: Nothing?) {
|
||||
if (<!SENSELESS_COMPARISON!>x == y<!>) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ fun case_4(x: ClassWithCustomEquals) {
|
||||
val y = null
|
||||
if (<!SENSELESS_COMPARISON!>y == x<!>) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,7 +64,7 @@ fun case_4(x: ClassWithCustomEquals) {
|
||||
fun case_5(x: ClassWithCustomEquals, y: Nothing?) {
|
||||
if (<!SENSELESS_COMPARISON!>y == x<!>) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,7 +77,7 @@ fun case_6(x: ClassWithCustomEquals) {
|
||||
val y = null
|
||||
if (<!SENSELESS_COMPARISON!>x == y<!> == true) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ fun case_6(x: ClassWithCustomEquals) {
|
||||
fun case_7(x: ClassWithCustomEquals) {
|
||||
if ((<!SENSELESS_COMPARISON!>x != null<!>) == false) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -97,7 +97,7 @@ fun case_7(x: ClassWithCustomEquals) {
|
||||
fun case_8(x: ClassWithCustomEquals, y: Nothing?) {
|
||||
if (!(<!SENSELESS_COMPARISON!>y == x<!>) == false) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("ClassWithCustomEquals & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
fun case_1(x: Any?) {
|
||||
if (x is Nothing) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ fun case_1(x: Any?) {
|
||||
fun case_2(x: Any) {
|
||||
if (x is Nothing) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ fun case_2(x: Any) {
|
||||
fun case_3(x: Any?) {
|
||||
if (x !is Nothing) else {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ fun case_3(x: Any?) {
|
||||
fun case_4(x: Any) {
|
||||
if (x !is Nothing) else {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -53,7 +53,7 @@ fun case_5(x: Any?) {
|
||||
fun case_6(x: Any?) {
|
||||
if (!(x !is Nothing)) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ fun case_6(x: Any?) {
|
||||
fun case_7(x: Any) {
|
||||
if (!(x is Nothing)) else {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -85,7 +85,7 @@ fun case_9(x: Any?) {
|
||||
fun case_10(x: Any?) {
|
||||
if (!!(x !is Nothing)) else {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
fun case_1(x: Nothing?) {
|
||||
if (x is Int) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing? & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing? & kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing? & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ fun case_1(x: Nothing?) {
|
||||
fun case_2(x: Nothing) {
|
||||
if (<!USELESS_IS_CHECK!>x is Unit<!>) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>x<!>.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -71,7 +71,7 @@ fun case_7(x: Nothing) {
|
||||
fun case_8(x: Nothing?) {
|
||||
if (!(<!USELESS_IS_CHECK!>x is Int?<!>)) else {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing?")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing?")!>x<!>?.inv()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Nothing?")!>x<!>?.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -25,7 +25,7 @@ fun case_1(x: Any?) {
|
||||
fun case_2(x: Any?) {
|
||||
(x as Nothing?)!!
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!><!UNSAFE_CALL{LT}!>.<!><!UNRESOLVED_REFERENCE{LT}!>inv<!>()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 3
|
||||
@@ -40,7 +40,7 @@ fun case_3(x: Any?) {
|
||||
fun case_4(x: Any?) {
|
||||
if (x as Class? is Class) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class")!>x<!><!UNSAFE_CALL{LT}!>.<!>prop_1
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & Class")!>x<!>.prop_1
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ fun case_4(x: Any?) {
|
||||
fun case_5(x: Any?) {
|
||||
if (x as Nothing? is Nothing) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!><!UNSAFE_CALL{LT}!>.<!><!UNRESOLVED_REFERENCE{LT}!>inv<!>()
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.Nothing")!>x<!>.<!MISSING_DEPENDENCY_CLASS!>inv<!>()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -56,14 +56,14 @@ fun case_5(x: Any?) {
|
||||
fun case_6(x: Any?) {
|
||||
(x as String?)!!
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String")!>x<!><!UNSAFE_CALL{LT}!>.<!>length
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String")!>x<!>.length
|
||||
}
|
||||
|
||||
// TESTCASE NUMBER: 7
|
||||
fun case_7(x: Any?) {
|
||||
if (x as String? != null) {
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String")!>x<!>
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String")!>x<!><!UNSAFE_CALL{LT}!>.<!>length
|
||||
<!DEBUG_INFO_EXPRESSION_TYPE("kotlin.Any? & kotlin.String")!>x<!>.length
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user