From 9b39a8abc2f7c0561d4a06d10b71b8b2607b84e3 Mon Sep 17 00:00:00 2001 From: Jinseong Jeon Date: Tue, 20 Apr 2021 22:57:36 -0700 Subject: [PATCH] FIR: avoid wrapping an erroneous type as FirResolvedTypeRef Instead, use FirErrorTypeRef, a subtype of FirResolvedTypeRef --- .../testData/resolve/asImports.fir.txt | 2 +- .../testData/resolve/cast.fir.txt | 2 +- .../instanceAccessBeforeSuperCall.fir.txt | 6 ++-- .../superIsNotAnExpression.fir.txt | 2 +- .../typeArgumentsNotAllowed.fir.txt | 8 ++--- .../diagnostics/upperBoundViolated.fir.txt | 6 ++-- .../positive/exhaustiveness_enumJava.fir.txt | 6 ++-- .../exhaustiveness_sealedSubClass.fir.txt | 6 ++-- .../CallBasedInExpressionGenerator.fir.txt | 6 ++-- .../resolve/expresssions/access.fir.txt | 2 +- .../expresssions/baseQualifier.fir.txt | 6 ++-- .../resolve/expresssions/companion.fir.txt | 2 +- .../resolve/expresssions/errCallable.fir.txt | 4 +-- .../resolve/expresssions/localObjects.fir.txt | 4 +-- .../expresssions/nestedObjects.fir.txt | 4 +-- .../expresssions/privateObjectLiteral.fir.txt | 4 +-- .../resolve/innerClasses/inner.fir.txt | 2 +- .../resolve/nestedClassContructor.fir.txt | 2 +- .../problems/inaccessibleJavaGetter.fir.txt | 4 +-- .../multipleJavaClassesInOneFile.fir.txt | 2 +- .../properties/javaAccessorConversion.fir.txt | 8 ++--- .../references/leakedImplicitType.fir.txt | 2 +- .../references/referenceToExtension.fir.txt | 4 +-- .../callableReferences/beyoundCalls.fir.txt | 2 +- .../moreSpecificAmbiguousExtensions.fir.txt | 2 +- .../diagnostics/forLoopChecker.fir.txt | 8 ++--- .../ErrorNodeDiagnosticCollectorComponent.kt | 5 +++- .../src/org/jetbrains/kotlin/fir/CopyUtils.kt | 16 ++++++---- .../FirDeclarationsResolveTransformer.kt | 12 +++++--- .../jetbrains/kotlin/fir/types/TypeUtils.kt | 30 +++++++++++-------- .../tests/SafeCallOnFakePackage.fir.kt | 2 +- .../WithGenericParameters.fir.kt | 2 +- .../tests/regressions/kt10843.fir.kt | 2 +- .../resolve/javaStaticMembers.fir.kt | 2 +- 34 files changed, 98 insertions(+), 79 deletions(-) diff --git a/compiler/fir/analysis-tests/testData/resolve/asImports.fir.txt b/compiler/fir/analysis-tests/testData/resolve/asImports.fir.txt index 5bbe15cf1ef..e4b0a5fa27d 100644 --- a/compiler/fir/analysis-tests/testData/resolve/asImports.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/asImports.fir.txt @@ -10,7 +10,7 @@ FILE: A.kt } FILE: main.kt public final fun test_1(): R|kotlin/Unit| { - lval a: R|ERROR CLASS: Unresolved name: A| = #() + lval a: = #() lval b: R|foo/A| = R|foo/A.A|() lval c: R|foo/A| = #() } diff --git a/compiler/fir/analysis-tests/testData/resolve/cast.fir.txt b/compiler/fir/analysis-tests/testData/resolve/cast.fir.txt index 44396b82148..bfab229080b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/cast.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/cast.fir.txt @@ -18,7 +18,7 @@ FILE: cast.kt } public get(): R|(kotlin/String) -> kotlin/Boolean| - public final val hError: R|(ERROR CLASS: No type for parameter) -> kotlin/Boolean| = fun (_: R|ERROR CLASS: No type for parameter|): R|kotlin/Boolean| { + public final val hError: R|(ERROR CLASS: No type for parameter) -> kotlin/Boolean| = fun (_: ): R|kotlin/Boolean| { ^ Boolean(true) } diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/instanceAccessBeforeSuperCall.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/instanceAccessBeforeSuperCall.fir.txt index e2b537fd74f..10056871e2f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/instanceAccessBeforeSuperCall.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/instanceAccessBeforeSuperCall.fir.txt @@ -25,7 +25,7 @@ FILE: instanceAccessBeforeSuperCall.kt } public constructor(x: R|kotlin/Int|): R|C| { - this(fun (): R|ERROR CLASS: Cannot access '''' before superclass constructor has been called| { + this(fun (): '' before superclass constructor has been called> { lval a: R|kotlin/Int| = Int(10) ^ this@R|/C| } @@ -63,8 +63,8 @@ FILE: instanceAccessBeforeSuperCall.kt } public final fun test(f: R|F|): R|kotlin/Unit| { } - public final val a: R|ERROR CLASS: 'this' is not defined in this context| = this# - public get(): R|ERROR CLASS: 'this' is not defined in this context| + public final val a: = this# + public get(): public final class F : R|kotlin/Any| { public constructor(a: R|kotlin/Int|, b: R|kotlin/Int|, closure: R|() -> kotlin/Unit|, instance: R|F?|): R|F| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/superIsNotAnExpression.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/superIsNotAnExpression.fir.txt index 3af57a5c5a0..44ce6f49b1a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/superIsNotAnExpression.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/superIsNotAnExpression.fir.txt @@ -13,7 +13,7 @@ FILE: superIsNotAnExpression.kt public final fun act(): R|kotlin/Unit| { #() #() - #( = @fun (): R|ERROR CLASS: Unresolved name: println| { + #( = @fun (): { ^ #(ERROR_EXPR(Incorrect character: 'weird')) } ) diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.fir.txt index aedd7069035..5cb34d28b71 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/typeArgumentsNotAllowed.fir.txt @@ -22,10 +22,10 @@ FILE: typeArgumentsNotAllowed.kt } } - public final val a: R|ERROR CLASS: Unresolved name: MyClass| = Q|rest|.# - public get(): R|ERROR CLASS: Unresolved name: MyClass| - public final val b: R|ERROR CLASS: Unresolved name: MyClass| = Q|rest/Best|.# - public get(): R|ERROR CLASS: Unresolved name: MyClass| + public final val a: = Q|rest|.# + public get(): + public final val b: = Q|rest/Best|.# + public get(): public final class B : R|kotlin/Any| { public constructor(): R|rest/B| { super() diff --git a/compiler/fir/analysis-tests/testData/resolve/diagnostics/upperBoundViolated.fir.txt b/compiler/fir/analysis-tests/testData/resolve/diagnostics/upperBoundViolated.fir.txt index 34f05662a1a..65924bdae96 100644 --- a/compiler/fir/analysis-tests/testData/resolve/diagnostics/upperBoundViolated.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/diagnostics/upperBoundViolated.fir.txt @@ -22,7 +22,7 @@ FILE: upperBoundViolated.kt lval b1: R|B| = R|/B.B|() lval b2: R|B| = R|/B.B|() lval b3: R|B| = R|/B.B|() - lval b4: R|ERROR CLASS: Unresolved name: NumberPhile| = R|/B.B|<>().#(ERROR_EXPR(No right operand)).#(#()).#(ERROR_EXPR(No right operand)) + lval b4: = R|/B.B|<>().#(ERROR_EXPR(No right operand)).#(#()).#(ERROR_EXPR(No right operand)) lval b5: R|B>| = R|/B.B||>() R|/fest|() R|/fest|() @@ -58,8 +58,8 @@ FILE: upperBoundViolated.kt } public final typealias NL = R|NumColl>| - public final val test7: R|ERROR CLASS: Unresolved name: NumberPhile| = R|/NumColl.NumColl|().#(ERROR_EXPR(No right operand)) - public get(): R|ERROR CLASS: Unresolved name: NumberPhile| + public final val test7: = R|/NumColl.NumColl|().#(ERROR_EXPR(No right operand)) + public get(): public final val test8: R|NumColl>| = R|/NumColl.NumColl|() public get(): R|NumColl>| public final class NumberPhile : R|kotlin/Any| { diff --git a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_enumJava.fir.txt b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_enumJava.fir.txt index e178354ee1b..f3b8d19e300 100644 --- a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_enumJava.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_enumJava.fir.txt @@ -1,6 +1,6 @@ FILE: main.kt public final fun test_1(e: R|JavaEnum|): R|kotlin/Unit| { - lval a: R|ERROR CLASS: Unresolved name: plus| = when (R|/e|) { + lval a: = when (R|/e|) { ==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> { Int(1) } @@ -9,7 +9,7 @@ FILE: main.kt } } .#(Int(0)) - lval b: R|ERROR CLASS: Unresolved name: plus| = when (R|/e|) { + lval b: = when (R|/e|) { ==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> { Int(1) } @@ -44,7 +44,7 @@ FILE: main.kt .R|kotlin/Int.plus|(Int(0)) } public final fun test_2(e: R|JavaEnum?|): R|kotlin/Unit| { - lval a: R|ERROR CLASS: Unresolved name: plus| = when (R|/e|) { + lval a: = when (R|/e|) { ==($subj$, Q|JavaEnum|.R|/JavaEnum.A|) -> { Int(1) } diff --git a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedSubClass.fir.txt b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedSubClass.fir.txt index 0eebe0a863e..3d03bb9d7c7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedSubClass.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/exhaustiveness/positive/exhaustiveness_sealedSubClass.fir.txt @@ -77,7 +77,7 @@ FILE: exhaustiveness_sealedSubClass.kt .R|kotlin/Int.plus|(Int(0)) } public final fun test_2(e: R|A|): R|kotlin/Unit| { - lval a: R|ERROR CLASS: Unresolved name: plus| = when (R|/e|) { + lval a: = when (R|/e|) { ($subj$ is R|D|) -> { Int(1) } @@ -86,7 +86,7 @@ FILE: exhaustiveness_sealedSubClass.kt } } .#(Int(0)) - lval b: R|ERROR CLASS: Unresolved name: plus| = when (R|/e|) { + lval b: = when (R|/e|) { ($subj$ is R|B|) -> { Int(1) } @@ -98,7 +98,7 @@ FILE: exhaustiveness_sealedSubClass.kt } } .#(Int(0)) - lval c: R|ERROR CLASS: Unresolved name: plus| = when (R|/e|) { + lval c: = when (R|/e|) { ($subj$ is R|B|) -> { Int(1) } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt index 7ede4a51353..55139a3c5a5 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/CallBasedInExpressionGenerator.fir.txt @@ -29,8 +29,8 @@ FILE: CallBasedInExpressionGenerator.kt public final val codegen: R|org/jetbrains/kotlin/codegen/range/inExpression/ExpressionCodegen| = R|/codegen| public get(): R|org/jetbrains/kotlin/codegen/range/inExpression/ExpressionCodegen| - private final val resolvedCall: R|ERROR CLASS: Unresolved name: getResolvedCallWithAssert| = R|/operatorReference|.#(this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.codegen|.#) - private get(): R|ERROR CLASS: Unresolved name: getResolvedCallWithAssert| + private final val resolvedCall: = R|/operatorReference|.#(this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.codegen|.#) + private get(): private final val isInverted: R|kotlin/Boolean| = ==(R|/operatorReference|.#(), #.#) private get(): R|kotlin/Boolean| @@ -75,7 +75,7 @@ FILE: CallBasedInExpressionGenerator.kt } private final fun invokeFunction(v: R|org/jetbrains/kotlin/codegen/range/inExpression/InstructionAdapter|): R|kotlin/Unit| { - lval result: R|ERROR CLASS: Unresolved name: invokeFunction| = this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.codegen|.#(this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.resolvedCall|.#, this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.resolvedCall|, #()) + lval result: = this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.codegen|.#(this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.resolvedCall|.#, this@R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator|.R|org/jetbrains/kotlin/codegen/range/inExpression/CallBasedInExpressionGenerator.resolvedCall|, #()) R|/result|.#(R|/result|.#, R|/result|.#, R|/v|) } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/access.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/access.fir.txt index 5b203daae18..fa2f219769f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/access.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/access.fir.txt @@ -57,7 +57,7 @@ FILE: access.kt lval a: R|kotlin/Int| = Int(10) lval b: R|kotlin/Int| = R|/a| lval d: R|kotlin/String| = String() - lval c: R|ERROR CLASS: Unresolved name: c| = # + lval c: = # #() local final fun bcd(): R|kotlin/Unit| { } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/baseQualifier.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/baseQualifier.fir.txt index 5331a3118a3..e39cdbce985 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/baseQualifier.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/baseQualifier.fir.txt @@ -29,7 +29,7 @@ FILE: Test.kt lval bbd: R|BB.D| = Q|BB.D| lval aac: R|AA.C| = Q|AA.C| Q|JavaClass|.R|/JavaClass.bar|() - lval errC: R|ERROR CLASS: Unresolved name: C| = Q|BB|.# - lval errBarViaBB: R|ERROR CLASS: Unresolved name: bar| = Q|BB|.#() - lval errBarViaAA: R|ERROR CLASS: Unresolved name: bar| = Q|AA|.#() + lval errC: = Q|BB|.# + lval errBarViaBB: = Q|BB|.#() + lval errBarViaAA: = Q|AA|.#() } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/companion.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/companion.fir.txt index cfae09ebedd..27b77514e9a 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/companion.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/companion.fir.txt @@ -47,5 +47,5 @@ FILE: companion.kt Q|B|.R|/B.Companion.baz|() lval x: R|kotlin/String| = Q|A|.R|/A.Companion.D| lval y: R|kotlin/String| = Q|B|.R|/B.Companion.C| - lval z: R|ERROR CLASS: Unresolved name: D| = Q|B|.# + lval z: = Q|B|.# } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/errCallable.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/errCallable.fir.txt index 6cd7f7ee287..4c5122e0a5b 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/errCallable.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/errCallable.fir.txt @@ -18,10 +18,10 @@ FILE: errCallable.kt } public final fun foo(): R|kotlin/Unit| { - lval x: R|ERROR CLASS: Unresolved reference: Nested| = ::# + lval x: = ::# } } public final fun R|Your|.foo(): R|kotlin/Unit| { - lval x: R|ERROR CLASS: Unresolved reference: Nested| = ::# + lval x: = ::# } diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.fir.txt index 06684582e0d..da21a3d6171 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/localObjects.fir.txt @@ -40,5 +40,5 @@ FILE: localObjects.kt Q|B|.R|/B.foo|() } - public final val bb: R|ERROR CLASS: Unresolved name: foo| = #.#() - public get(): R|ERROR CLASS: Unresolved name: foo| + public final val bb: = #.#() + public get(): diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/nestedObjects.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/nestedObjects.fir.txt index fafa5ab1e23..1658ffdabfc 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/nestedObjects.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/nestedObjects.fir.txt @@ -25,7 +25,7 @@ FILE: nestedObjects.kt } } - public final val err: R|ERROR CLASS: Unresolved name: B| = Q|B|.#.# - public get(): R|ERROR CLASS: Unresolved name: B| + public final val err: = Q|B|.#.# + public get(): public final val correct: R|A.B.A| = Q|A.B.A| public get(): R|A.B.A| diff --git a/compiler/fir/analysis-tests/testData/resolve/expresssions/privateObjectLiteral.fir.txt b/compiler/fir/analysis-tests/testData/resolve/expresssions/privateObjectLiteral.fir.txt index cefdbc55d45..e00bb7a0a43 100644 --- a/compiler/fir/analysis-tests/testData/resolve/expresssions/privateObjectLiteral.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/expresssions/privateObjectLiteral.fir.txt @@ -33,7 +33,7 @@ FILE: privateObjectLiteral.kt internal get(): R|kotlin/Any| - public final val w: R|ERROR CLASS: Unresolved name: foo| = this@R|/C|.R|/C.z|.#() - public get(): R|ERROR CLASS: Unresolved name: foo| + public final val w: = this@R|/C|.R|/C.z|.#() + public get(): } diff --git a/compiler/fir/analysis-tests/testData/resolve/innerClasses/inner.fir.txt b/compiler/fir/analysis-tests/testData/resolve/innerClasses/inner.fir.txt index f69193dc99a..85dbfd9adbe 100644 --- a/compiler/fir/analysis-tests/testData/resolve/innerClasses/inner.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/innerClasses/inner.fir.txt @@ -41,7 +41,7 @@ FILE: inner.kt public final fun test(): R|kotlin/Unit| { lval o: R|Owner| = R|/Owner.Owner|() R|/o|.R|/Owner.foo|() - lval err: R|ERROR CLASS: Unresolved name: Inner| = Q|Owner|.#() + lval err: = Q|Owner|.#() R|/err|.#() lval i: R|Owner.Inner| = R|/o|.R|/Owner.Inner.Inner|() R|/i|.R|/Owner.Inner.gau|() diff --git a/compiler/fir/analysis-tests/testData/resolve/nestedClassContructor.fir.txt b/compiler/fir/analysis-tests/testData/resolve/nestedClassContructor.fir.txt index ae96f816ddf..0c47ccc57b1 100644 --- a/compiler/fir/analysis-tests/testData/resolve/nestedClassContructor.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/nestedClassContructor.fir.txt @@ -35,7 +35,7 @@ FILE: nestedClassContructor.kt public final fun foo(): R|kotlin/Unit| { lval a: R|A| = R|/A.A|() lval ac: R|A.C| = Q|A|.R|/A.C.C|() - lval c: R|ERROR CLASS: Unresolved name: C| = #() + lval c: = #() } } diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/inaccessibleJavaGetter.fir.txt b/compiler/fir/analysis-tests/testData/resolve/problems/inaccessibleJavaGetter.fir.txt index 8af78cf71f5..84ae06e8fd2 100644 --- a/compiler/fir/analysis-tests/testData/resolve/problems/inaccessibleJavaGetter.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/problems/inaccessibleJavaGetter.fir.txt @@ -26,7 +26,7 @@ FILE: test.kt public final fun test(): R|kotlin/Unit| { lval descriptor: R|WrappedPropertyDescriptor| = R|/WrappedPropertyDescriptor.WrappedPropertyDescriptor|() lval res1: R|kotlin/String| = R|/descriptor|.R|/WrappedPropertyDescriptor.setter| - lval res2: R|ERROR CLASS: Unresolved name: getSetter| = R|/descriptor|.#() + lval res2: = R|/descriptor|.#() lval res3: R|kotlin/Boolean| = R|/descriptor|.R|/WrappedPropertyDescriptor.isDelegated| - lval res4: R|ERROR CLASS: Unresolved name: isDelegated| = R|/descriptor|.#() + lval res4: = R|/descriptor|.#() } diff --git a/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt b/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt index fccf24ca5b8..6b818655fa7 100644 --- a/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/problems/multipleJavaClassesInOneFile.fir.txt @@ -1,5 +1,5 @@ FILE: main.kt public final fun test(): R|kotlin/Unit| { lval some: R|foo/Some| = R|foo/Some.Some|() - lval another: R|ERROR CLASS: Unresolved name: Another| = #() + lval another: = #() } diff --git a/compiler/fir/analysis-tests/testData/resolve/properties/javaAccessorConversion.fir.txt b/compiler/fir/analysis-tests/testData/resolve/properties/javaAccessorConversion.fir.txt index 1c1ae5491d7..46d0dff10c6 100644 --- a/compiler/fir/analysis-tests/testData/resolve/properties/javaAccessorConversion.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/properties/javaAccessorConversion.fir.txt @@ -1,15 +1,15 @@ FILE: main.kt public final fun test_1(x: R|A|): R|kotlin/Unit| { lval str1: R|ft| = R|/x|.R|/A.vmParameters| - lval str2: R|ERROR CLASS: Unresolved name: vMParameters| = R|/x|.# + lval str2: = R|/x|.# } public final fun test_2(x: R|B|): R|kotlin/Unit| { lval int: R|ft| = R|/x|.R|/B.vmParameters| - lval error: R|ERROR CLASS: Unresolved name: vMParameters| = R|/x|.# + lval error: = R|/x|.# } public final fun test_3(x: R|C|): R|kotlin/Unit| { - lval error: R|ERROR CLASS: Ambiguity: vmParameters, [/C.vmParameters, /C.vmParameters]| = R|/x|.# - lval int: R|ERROR CLASS: Unresolved name: vMParameters| = R|/x|.# + lval error: = R|/x|.# + lval int: = R|/x|.# } public final class Foo : R|kotlin/Any| { public constructor(): R|Foo| { diff --git a/compiler/fir/analysis-tests/testData/resolve/references/leakedImplicitType.fir.txt b/compiler/fir/analysis-tests/testData/resolve/references/leakedImplicitType.fir.txt index cea18ce088e..e8d7505fb0f 100644 --- a/compiler/fir/analysis-tests/testData/resolve/references/leakedImplicitType.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/references/leakedImplicitType.fir.txt @@ -7,7 +7,7 @@ FILE: leakedImplicitType.kt public final fun bar(): R|kotlin/Unit| { } - public final fun f(): R|ERROR CLASS: Unresolved reference: bar| { + public final fun f(): { ^f #()::# } diff --git a/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt b/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt index 1306b0d84f4..e4a999ae344 100644 --- a/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolve/references/referenceToExtension.fir.txt @@ -40,8 +40,8 @@ FILE: referenceToExtension.kt } public final fun test_2(): R|kotlin/Unit| { - lval extensionValRef: R|ERROR CLASS: Unresolved reference: extensionVal| = Q|GenericTest.B|::# - lval extensionFunRef: R|ERROR CLASS: Unresolved reference: extensionFun| = Q|GenericTest.B|::# + lval extensionValRef: = Q|GenericTest.B|::# + lval extensionFunRef: = Q|GenericTest.B|::# } } diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/beyoundCalls.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/beyoundCalls.fir.txt index c205a65cb1e..ca1ef7fcb91 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/beyoundCalls.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/beyoundCalls.fir.txt @@ -13,7 +13,7 @@ FILE: beyoundCalls.kt } public final fun foo(): R|kotlin/Unit| { lval x: R|(kotlin/String) -> kotlin/Int| = ::R|/bar| - lval y: R|ERROR CLASS: Ambiguity: bar, [/bar, /bar]| = ::# + lval y: = ::# lval z: R|kotlin/reflect/KFunction1| = ::R|/baz| lval w: R|(kotlin/String) -> kotlin/Int| = ::R|/foobaz| ::R|/baz| diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/fromBasicDiagnosticTests/moreSpecificAmbiguousExtensions.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/fromBasicDiagnosticTests/moreSpecificAmbiguousExtensions.fir.txt index ce433eb32a7..ab9470ad090 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/fromBasicDiagnosticTests/moreSpecificAmbiguousExtensions.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/callableReferences/fromBasicDiagnosticTests/moreSpecificAmbiguousExtensions.fir.txt @@ -9,7 +9,7 @@ FILE: moreSpecificAmbiguousExtensions.kt } public final fun test(): R|kotlin/Unit| { lval extFun1: R|@ExtensionFunctionType kotlin/reflect/KFunction2| = Q|IA|::R|/extFun| - lval extFun2: R|ERROR CLASS: Ambiguity: extFun, [/extFun, /extFun]| = Q|IB|::# + lval extFun2: = Q|IB|::# } public final fun testWithExpectedType(): R|kotlin/Unit| { lval extFun_AB_A: R|IA.(IB) -> kotlin/Unit| = Q|IA|::R|/extFun| diff --git a/compiler/fir/analysis-tests/testData/resolveWithStdlib/diagnostics/forLoopChecker.fir.txt b/compiler/fir/analysis-tests/testData/resolveWithStdlib/diagnostics/forLoopChecker.fir.txt index 5dabdedd587..71ac03537bd 100644 --- a/compiler/fir/analysis-tests/testData/resolveWithStdlib/diagnostics/forLoopChecker.fir.txt +++ b/compiler/fir/analysis-tests/testData/resolveWithStdlib/diagnostics/forLoopChecker.fir.txt @@ -172,9 +172,9 @@ FILE: forLoopChecker.kt } public final fun test(notRange1: R|NotRange1|, notRange2: R|NotRange2|, notRange3: R|NotRange3|, notRange4: R|NotRange4|, notRange5: R|NotRange5|, notRange6: R|NotRange6|, notRange7: R|NotRange7|, notRange8: R|NotRange8|, notRange9: R|NotRange9|, range0: R|Range0|, range1: R|Range1|): R|kotlin/Unit| { { - lval : R|ERROR CLASS: Unresolved name: iterator| = R|/notRange1|.#() + lval : = R|/notRange1|.#() while(R|/|.#()) { - lval i: R|ERROR CLASS: Unresolved name: next| = R|/|.#() + lval i: = R|/|.#() } } @@ -182,7 +182,7 @@ FILE: forLoopChecker.kt { lval : R|kotlin/Unit| = R|/notRange2|.R|/NotRange2.iterator|() while(R|/|.#()) { - lval i: R|ERROR CLASS: Unresolved name: next| = R|/|.#() + lval i: = R|/|.#() } } @@ -190,7 +190,7 @@ FILE: forLoopChecker.kt { lval : R|ImproperIterator1| = R|/notRange3|.R|/NotRange3.iterator|() while(R|/|.R|/ImproperIterator1.hasNext|()) { - lval i: R|ERROR CLASS: Unresolved name: next| = R|/|.#() + lval i: = R|/|.#() } } diff --git a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt index f5dacf54bd3..94c7c52b7eb 100644 --- a/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt +++ b/compiler/fir/checkers/src/org/jetbrains/kotlin/fir/analysis/collectors/components/ErrorNodeDiagnosticCollectorComponent.kt @@ -58,7 +58,10 @@ class ErrorNodeDiagnosticCollectorComponent( ) return // If the receiver cannot be resolved, we skip reporting any further problems for this call. - if (qualifiedAccess?.dispatchReceiver.hasUnresolvedNameError() || qualifiedAccess?.extensionReceiver.hasUnresolvedNameError() || qualifiedAccess?.explicitReceiver.hasUnresolvedNameError()) return + if (qualifiedAccess?.dispatchReceiver.hasUnresolvedNameError() || + qualifiedAccess?.extensionReceiver.hasUnresolvedNameError() || + qualifiedAccess?.explicitReceiver.hasUnresolvedNameError() + ) return reportFirDiagnostic(errorNamedReference.diagnostic, source, reporter, data, qualifiedAccess?.source) } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt index c7cd0df6186..d769dd12dfa 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/CopyUtils.kt @@ -90,14 +90,20 @@ fun FirAnonymousFunction.copy( } } - fun FirTypeRef.resolvedTypeFromPrototype( type: ConeKotlinType ): FirResolvedTypeRef { - return buildResolvedTypeRef { - source = this@resolvedTypeFromPrototype.source - this.type = type - annotations += this@resolvedTypeFromPrototype.annotations + return if (type is ConeKotlinErrorType) { + buildErrorTypeRef { + source = this@resolvedTypeFromPrototype.source + diagnostic = type.diagnostic + } + } else { + buildResolvedTypeRef { + source = this@resolvedTypeFromPrototype.source + this.type = type + annotations += this@resolvedTypeFromPrototype.annotations + } } } diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt index 110bf34f9a0..a5d6b669016 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/transformers/body/resolve/FirDeclarationsResolveTransformer.kt @@ -673,10 +673,8 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor if (param.returnTypeRef is FirResolvedTypeRef) { param } else { - val resolvedType = buildResolvedTypeRef { - source = param.source - type = resolvedLambdaAtom.parameters[index] - } + val resolvedType = + param.returnTypeRef.resolvedTypeFromPrototype(resolvedLambdaAtom.parameters[index]) param.replaceReturnTypeRef(resolvedType) param } @@ -809,6 +807,12 @@ open class FirDeclarationsResolveTransformer(transformer: FirBodyResolveTransfor is FirImplicitTypeRef -> buildErrorTypeRef { diagnostic = ConeSimpleDiagnostic("No result type for initializer", DiagnosticKind.InferenceError) } + is FirErrorTypeRef -> buildErrorTypeRef { + diagnostic = resultType.diagnostic + resultType.source?.fakeElement(FirFakeSourceElementKind.ImplicitTypeRef)?.let { + source = it + } + } else -> { buildResolvedTypeRef { type = resultType.coneType diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt index a70f64b8421..2d0f3748240 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/types/TypeUtils.kt @@ -204,11 +204,7 @@ fun FirTypeRef.withReplacedReturnType(newType: ConeKotlinType?): FirTypeRef { require(this is FirResolvedTypeRef || newType == null) if (newType == null) return this - return buildResolvedTypeRef { - source = this@withReplacedReturnType.source - type = newType - annotations += this@withReplacedReturnType.annotations - } + return resolvedTypeFromPrototype(newType) } fun FirTypeRef.withReplacedConeType( @@ -218,14 +214,24 @@ fun FirTypeRef.withReplacedConeType( require(this is FirResolvedTypeRef) if (newType == null) return this - return buildResolvedTypeRef { - source = if (firFakeSourceElementKind != null) - this@withReplacedConeType.source?.fakeElement(firFakeSourceElementKind) + val newSource = + if (firFakeSourceElementKind != null) + this.source?.fakeElement(firFakeSourceElementKind) else - this@withReplacedConeType.source - type = newType - annotations += this@withReplacedConeType.annotations - delegatedTypeRef = this@withReplacedConeType.delegatedTypeRef + this.source + + return if (newType is ConeKotlinErrorType) { + buildErrorTypeRef { + source = newSource + diagnostic = newType.diagnostic + } + } else { + buildResolvedTypeRef { + source = newSource + type = newType + annotations += this@withReplacedConeType.annotations + delegatedTypeRef = this@withReplacedConeType.delegatedTypeRef + } } } diff --git a/compiler/testData/diagnostics/tests/SafeCallOnFakePackage.fir.kt b/compiler/testData/diagnostics/tests/SafeCallOnFakePackage.fir.kt index 666e78bbe27..dd371a01999 100644 --- a/compiler/testData/diagnostics/tests/SafeCallOnFakePackage.fir.kt +++ b/compiler/testData/diagnostics/tests/SafeCallOnFakePackage.fir.kt @@ -12,5 +12,5 @@ val s: String = "test" fun ff() { val a = Test?.FOO val b = foo?.s - System?.out.println(a + b) + System?.out.println(a + b) } diff --git a/compiler/testData/diagnostics/tests/functionAsExpression/WithGenericParameters.fir.kt b/compiler/testData/diagnostics/tests/functionAsExpression/WithGenericParameters.fir.kt index a83ae2a8e6b..17ea14c6a0f 100644 --- a/compiler/testData/diagnostics/tests/functionAsExpression/WithGenericParameters.fir.kt +++ b/compiler/testData/diagnostics/tests/functionAsExpression/WithGenericParameters.fir.kt @@ -13,7 +13,7 @@ fun fun_with_where() = fun () {}) devNull(fun T.() {}) - devNull(fun (): T = null!!) + devNull(fun (): T = null!!) devNull(fun (t: T) {}) devNull(fun () where T:A {}) } diff --git a/compiler/testData/diagnostics/tests/regressions/kt10843.fir.kt b/compiler/testData/diagnostics/tests/regressions/kt10843.fir.kt index 4fc6089a8a8..9f41a1e530c 100644 --- a/compiler/testData/diagnostics/tests/regressions/kt10843.fir.kt +++ b/compiler/testData/diagnostics/tests/regressions/kt10843.fir.kt @@ -1,7 +1,7 @@ // !WITH_NEW_INFERENCE // NI_EXPECTED_FILE // See EA-76890 / KT-10843: NPE during analysis -fun lambda(x : Int?) = x?.let l { +fun lambda(x : Int?) = x?.let l { y -> if (y > 0) return@l x y diff --git a/compiler/testData/diagnostics/testsWithStdLib/resolve/javaStaticMembers.fir.kt b/compiler/testData/diagnostics/testsWithStdLib/resolve/javaStaticMembers.fir.kt index 36ab797b176..52e50757c2a 100644 --- a/compiler/testData/diagnostics/testsWithStdLib/resolve/javaStaticMembers.fir.kt +++ b/compiler/testData/diagnostics/testsWithStdLib/resolve/javaStaticMembers.fir.kt @@ -8,5 +8,5 @@ fun ff() { val a = Test.FOO val b = Test?.FOO System.out.println(a + b) - System?.out.println(a + b) + System?.out.println(a + b) }