[FIR] Add checker for MISSING_DEPENDENCY_CLASS

#KT-59371 Fixed
This commit is contained in:
Brian Norman
2023-08-21 06:59:13 -05:00
committed by Space Team
parent ecb6b5dc58
commit 833072e1fb
30 changed files with 145 additions and 277 deletions
@@ -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,
@@ -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
}
@@ -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
@@ -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>()
@@ -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",
@@ -68,6 +68,7 @@ object CommonExpressionCheckers : ExpressionCheckers() {
FirSpreadOfNullableChecker,
FirAssignmentOperatorCallChecker,
FirNamedVarargChecker,
FirMissingDependencyClassChecker,
FirUnderscoredTypeArgumentSyntaxChecker,
FirContractNotFirstStatementChecker,
FirProtectedConstructorNotInSuperCallChecker,
@@ -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.
}
}
}
@@ -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.")
@@ -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<!>()
@@ -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()
@@ -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;
@@ -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()
@@ -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<!>()
@@ -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()
@@ -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<!>()
@@ -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()
@@ -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<!>()
@@ -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,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<!>()
@@ -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
}
}