From b7ed68db059b35547374e430442b816f2581eb62 Mon Sep 17 00:00:00 2001 From: Mikhail Glukhikh Date: Thu, 4 Aug 2016 15:05:11 +0300 Subject: [PATCH] CFA: No more UNRESOLVED_CALL for object / enum entry qualifiers (cherry picked from commit 4b09de8) --- .../kotlin/cfg/ControlFlowBuilder.kt | 2 + .../kotlin/cfg/ControlFlowBuilderAdapter.kt | 3 + .../kotlin/cfg/ControlFlowProcessor.kt | 29 ++- .../ControlFlowInstructionsGenerator.kt | 44 ++--- .../kotlin/resolve/calls/tower/TowerLevels.kt | 2 +- .../ObjectEnumQualifiers.instructions | 79 ++++++++ .../classesAndObjects/ObjectEnumQualifiers.kt | 17 ++ .../ObjectEnumQualifiers.values | 37 ++++ .../QualifierReceiverWithOthers.instructions | 171 ++++++++++++++++++ .../QualifierReceiverWithOthers.kt | 21 +++ .../QualifierReceiverWithOthers.values | 75 ++++++++ .../functions/typeParameter.values | 2 +- .../qualifiedExpression/JavaQualifier.kt | 9 + .../qualifiedExpression/JavaQualifier.txt | 13 ++ .../kotlin/cfg/ControlFlowTestGenerated.java | 12 ++ .../kotlin/cfg/PseudoValueTestGenerated.java | 12 ++ .../checkers/DiagnosticsTestGenerated.java | 6 + 17 files changed, 504 insertions(+), 30 deletions(-) create mode 100644 compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.instructions create mode 100644 compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.kt create mode 100644 compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.values create mode 100644 compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.instructions create mode 100644 compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.kt create mode 100644 compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.values create mode 100644 compiler/testData/diagnostics/tests/qualifiedExpression/JavaQualifier.kt create mode 100644 compiler/testData/diagnostics/tests/qualifiedExpression/JavaQualifier.txt diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowBuilder.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowBuilder.kt index c1321a0edc4..d25c7eb7663 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowBuilder.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowBuilder.kt @@ -129,6 +129,8 @@ interface ControlFlowBuilder { operation: PredefinedOperation, inputValues: List): OperationInstruction + fun read(element: KtElement, target: AccessTarget, receiverValues: Map): ReadValueInstruction + fun write( assignment: KtElement, lValue: KtElement, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowBuilderAdapter.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowBuilderAdapter.kt index c37b8b50ce6..36c29ef8048 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowBuilderAdapter.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowBuilderAdapter.kt @@ -176,6 +176,9 @@ abstract class ControlFlowBuilderAdapter : ControlFlowBuilder { delegateBuilder.returnNoValue(returnExpression, subroutine) } + override fun read(element: KtElement, target: AccessTarget, receiverValues: Map) = + delegateBuilder.read(element, target, receiverValues) + override fun write( assignment: KtElement, lValue: KtElement, diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt index 5235b9705bf..9acf5d1f91d 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/ControlFlowProcessor.kt @@ -48,12 +48,11 @@ import org.jetbrains.kotlin.resolve.calls.model.ArgumentMatch import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.VariableAsFunctionResolvedCall import org.jetbrains.kotlin.resolve.calls.tasks.ExplicitReceiverKind +import org.jetbrains.kotlin.resolve.calls.tower.getFakeDescriptorForObject +import org.jetbrains.kotlin.resolve.calls.util.FakeCallableDescriptorForObject import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator -import org.jetbrains.kotlin.resolve.scopes.receivers.ExpressionReceiver -import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitReceiver -import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue -import org.jetbrains.kotlin.resolve.scopes.receivers.TransientReceiver import org.jetbrains.kotlin.types.expressions.DoubleColonLHS +import org.jetbrains.kotlin.resolve.scopes.receivers.* import org.jetbrains.kotlin.types.expressions.OperatorConventions import java.util.* @@ -266,8 +265,14 @@ class ControlFlowProcessor(private val trace: BindingTrace) { if (resolvedCall is VariableAsFunctionResolvedCall) { generateCall(resolvedCall.variableCall) } - else if (!generateCall(expression) && expression.parent !is KtCallExpression) { - createNonSyntheticValue(expression, MagicKind.UNRESOLVED_CALL, generateAndGetReceiverIfAny(expression)) + else { + if (resolvedCall == null) { + val qualifier = trace.bindingContext[BindingContext.QUALIFIER, expression] + if (qualifier != null && generateQualifier(expression, qualifier)) return + } + if (!generateCall(expression) && expression.parent !is KtCallExpression) { + createNonSyntheticValue(expression, MagicKind.UNRESOLVED_CALL, generateAndGetReceiverIfAny(expression)) + } } } @@ -1366,6 +1371,18 @@ class ControlFlowProcessor(private val trace: BindingTrace) { createNonSyntheticValue(element, MagicKind.UNSUPPORTED_ELEMENT) } + private fun generateQualifier(expression: KtExpression, qualifier: Qualifier): Boolean { + val qualifierDescriptor = qualifier.descriptor + if (qualifierDescriptor is ClassDescriptor) { + getFakeDescriptorForObject(qualifierDescriptor)?.let { + mark(expression) + builder.read(expression, AccessTarget.Declaration(it), emptyMap()) + return true + } + } + return false + } + private fun generateCall(callElement: KtElement): Boolean { return checkAndGenerateCall(callElement.getResolvedCall(trace.bindingContext)) } diff --git a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/ControlFlowInstructionsGenerator.kt b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/ControlFlowInstructionsGenerator.kt index 8ce6305f6e5..e22fb3a407a 100644 --- a/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/ControlFlowInstructionsGenerator.kt +++ b/compiler/frontend/src/org/jetbrains/kotlin/cfg/pseudocode/ControlFlowInstructionsGenerator.kt @@ -331,21 +331,19 @@ class ControlFlowInstructionsGenerator : ControlFlowBuilderAdapter() { labelCount = pseudocode.repeatPart(startLabel, finishLabel, labelCount) } - override fun loadConstant(expression: KtExpression, constant: CompileTimeConstant<*>?): InstructionWithValue { - return read(expression) - } + override fun loadConstant(expression: KtExpression, constant: CompileTimeConstant<*>?) = read(expression) - override fun createAnonymousObject(expression: KtObjectLiteralExpression): InstructionWithValue { - return read(expression) - } + override fun createAnonymousObject(expression: KtObjectLiteralExpression) = read(expression) - override fun createLambda(expression: KtFunction): InstructionWithValue { - return read(if (expression is KtFunctionLiteral) expression.getParent() as KtLambdaExpression else expression) - } + override fun createLambda(expression: KtFunction) = + read(if (expression is KtFunctionLiteral) expression.getParent() as KtLambdaExpression else expression) - override fun loadStringTemplate(expression: KtStringTemplateExpression, inputValues: List): InstructionWithValue { - return if (inputValues.isEmpty()) read(expression) else magic(expression, expression, inputValues, MagicKind.STRING_TEMPLATE) - } + override fun loadStringTemplate( + expression: KtStringTemplateExpression, + inputValues: List + ): InstructionWithValue = + if (inputValues.isEmpty()) read(expression) + else magic(expression, expression, inputValues, MagicKind.STRING_TEMPLATE) override fun magic( instructionElement: KtElement, @@ -367,9 +365,8 @@ class ControlFlowInstructionsGenerator : ControlFlowBuilderAdapter() { override fun readVariable( expression: KtExpression, resolvedCall: ResolvedCall<*>, - receiverValues: Map): ReadValueInstruction { - return read(expression, resolvedCall, receiverValues) - } + receiverValues: Map + ) = read(expression, resolvedCall, receiverValues) override fun call( valueElement: KtElement, @@ -404,16 +401,19 @@ class ControlFlowInstructionsGenerator : ControlFlowBuilderAdapter() { } } + override fun read( + element: KtElement, + target: AccessTarget, + receiverValues: Map + ) = ReadValueInstruction(element, currentScope, target, receiverValues, valueFactory).apply { + add(this) + } + private fun read( expression: KtExpression, resolvedCall: ResolvedCall<*>? = null, - receiverValues: Map = emptyMap()): ReadValueInstruction { - val accessTarget = if (resolvedCall != null) AccessTarget.Call(resolvedCall) else AccessTarget.BlackBox - val instruction = ReadValueInstruction( - expression, currentScope, accessTarget, receiverValues, valueFactory) - add(instruction) - return instruction - } + receiverValues: Map = emptyMap() + ) = read(expression, if (resolvedCall != null) AccessTarget.Call(resolvedCall) else AccessTarget.BlackBox, receiverValues) } private class TryFinallyBlockInfo(private val finallyBlock: GenerationTrigger) : BlockInfo() { diff --git a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt index 1412e473d46..9cd5a37b5e9 100644 --- a/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt +++ b/compiler/resolution/src/org/jetbrains/kotlin/resolve/calls/tower/TowerLevels.kt @@ -268,7 +268,7 @@ private fun ResolutionScope.getContributedObjectVariables(name: Name, location: return listOfNotNull(objectDescriptor) } -private fun getFakeDescriptorForObject(classifier: ClassifierDescriptor?): FakeCallableDescriptorForObject? = +fun getFakeDescriptorForObject(classifier: ClassifierDescriptor?): FakeCallableDescriptorForObject? = when (classifier) { is TypeAliasDescriptor -> getFakeDescriptorForObject(classifier.classDescriptor) diff --git a/compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.instructions b/compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.instructions new file mode 100644 index 00000000000..c00c6cdc16d --- /dev/null +++ b/compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.instructions @@ -0,0 +1,79 @@ +== O == +object O { + val y = 1 +} +--------------------- +L0: + 1 + v(val y = 1) + r(1) -> + w(y|) +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== E == +enum class E(val x: Int) { + E1(0) +} +--------------------- +L0: + 1 + v(val x: Int) + magic[FAKE_INITIALIZER](val x: Int) -> + w(x|) +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== C == +class C { + companion object { + val z = 2 + } +} +--------------------- +L0: + 1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== foo == +fun foo() = E1.x + O.y + C.z +--------------------- +L0: + 1 + mark(E1.x) + mark(E1) + r(E1) -> + r(x|) -> + mark(O.y) + mark(O) + r(O) -> + r(y|) -> + mark(E1.x + O.y) + call(E1.x + O.y, plus|, ) -> + mark(C.z) + mark(C) + r(C, Companion) -> + r(z|) -> + mark(E1.x + O.y + C.z) + call(E1.x + O.y + C.z, plus|, ) -> + ret(*|) L1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== diff --git a/compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.kt b/compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.kt new file mode 100644 index 00000000000..b5acfc02c56 --- /dev/null +++ b/compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.kt @@ -0,0 +1,17 @@ +import E.E1 + +object O { + val y = 1 +} + +enum class E(val x: Int) { + E1(0) +} + +class C { + companion object { + val z = 2 + } +} + +fun foo() = E1.x + O.y + C.z diff --git a/compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.values b/compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.values new file mode 100644 index 00000000000..546e8026cab --- /dev/null +++ b/compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.values @@ -0,0 +1,37 @@ +== O == +object O { + val y = 1 +} +--------------------- +1 : Int NEW: r(1) -> +===================== +== E == +enum class E(val x: Int) { + E1(0) +} +--------------------- + : Int NEW: magic[FAKE_INITIALIZER](val x: Int) -> +===================== +== C == +class C { + companion object { + val z = 2 + } +} +--------------------- +===================== +== foo == +fun foo() = E1.x + O.y + C.z +--------------------- +E1 : E NEW: r(E1) -> +x : Int NEW: r(x|) -> +E1.x : Int COPY +O : O NEW: r(O) -> +y : Int NEW: r(y|) -> +O.y : Int COPY +E1.x + O.y : Int NEW: call(E1.x + O.y, plus|, ) -> +C : C.Companion NEW: r(C, Companion) -> +z : Int NEW: r(z|) -> +C.z : Int COPY +E1.x + O.y + C.z : Int NEW: call(E1.x + O.y + C.z, plus|, ) -> +===================== diff --git a/compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.instructions b/compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.instructions new file mode 100644 index 00000000000..0edce3952e6 --- /dev/null +++ b/compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.instructions @@ -0,0 +1,171 @@ +== A == +class A { + companion object +} +--------------------- +L0: + 1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== B == +object B { + val A.Companion.foo: X get() = X +} +--------------------- +L0: + 1 + v(val A.Companion.foo: X get() = X) +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== X == +object X +--------------------- +L0: + 1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== C == +object C { + operator fun X.invoke() = println("Hello!") +} +--------------------- +L0: + 1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== invoke == +operator fun X.invoke() = println("Hello!") +--------------------- +L0: + 1 + mark("Hello!") + r("Hello!") -> + mark(println("Hello!")) + magic[UNRESOLVED_CALL](println("Hello!")|, !) -> + ret(*|) L1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== with == +inline fun with(receiver: T, block: T.() -> R): R = receiver.block() +--------------------- +L0: + 1 + v(receiver: T) + magic[FAKE_INITIALIZER](receiver: T) -> + w(receiver|) + v(block: T.() -> R) + magic[FAKE_INITIALIZER](block: T.() -> R) -> + w(block|) + mark(receiver.block()) + r(block) -> + r(receiver) -> + mark(block()) + call(block(), invoke|, ) -> + ret(*|) L1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== use == +fun use() = with(C) { + with(B) { + A.foo() + } +} +--------------------- +L0: + 1 + r(C) -> + mark({ with(B) { A.foo() } }) + jmp?(L2) NEXT:[r({ with(B) { A.foo() } }) -> , d({ with(B) { A.foo() } })] + d({ with(B) { A.foo() } }) NEXT:[] +L2 [after local declaration]: + r({ with(B) { A.foo() } }) -> PREV:[jmp?(L2)] + mark(with(C) { with(B) { A.foo() } }) + call(with(C) { with(B) { A.foo() } }, with|, ) -> + ret(*|) L1 +L1: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, , d({ with(B) { A.foo() } })] +===================== +== anonymous_0 == +{ + with(B) { + A.foo() + } +} +--------------------- +L3: + 2 + 3 mark(with(B) { A.foo() }) + r(B) -> + mark({ A.foo() }) + jmp?(L5) NEXT:[r({ A.foo() }) -> , d({ A.foo() })] + d({ A.foo() }) NEXT:[] +L5 [after local declaration]: + r({ A.foo() }) -> PREV:[jmp?(L5)] + mark(with(B) { A.foo() }) + call(with(B) { A.foo() }, with|, ) -> + 2 ret(*|) L4 +L4: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, , d({ A.foo() })] +===================== +== anonymous_1 == +{ + A.foo() + } +--------------------- +L6: + 4 + 5 mark(A.foo()) + mark(A.foo()) + magic[IMPLICIT_RECEIVER](foo) -> + mark(A) + r(A, Companion) -> + r(foo|, ) -> + magic[IMPLICIT_RECEIVER](foo()) -> + mark(foo()) + call(foo(), invoke|, ) -> + 4 ret(*|) L7 +L7: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== diff --git a/compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.kt b/compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.kt new file mode 100644 index 00000000000..7d2c17929d8 --- /dev/null +++ b/compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.kt @@ -0,0 +1,21 @@ +class A { + companion object +} + +object B { + val A.Companion.foo: X get() = X +} + +object X + +object C { + operator fun X.invoke() = println("Hello!") +} + +inline fun with(receiver: T, block: T.() -> R): R = receiver.block() + +fun use() = with(C) { + with(B) { + A.foo() + } +} \ No newline at end of file diff --git a/compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.values b/compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.values new file mode 100644 index 00000000000..c006e530617 --- /dev/null +++ b/compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.values @@ -0,0 +1,75 @@ +== A == +class A { + companion object +} +--------------------- +===================== +== B == +object B { + val A.Companion.foo: X get() = X +} +--------------------- +===================== +== X == +object X +--------------------- +===================== +== C == +object C { + operator fun X.invoke() = println("Hello!") +} +--------------------- +===================== +== invoke == +operator fun X.invoke() = println("Hello!") +--------------------- +println !: * +"Hello!" : * NEW: r("Hello!") -> +println("Hello!") : {<: [ERROR : Error function type]} NEW: magic[UNRESOLVED_CALL](println("Hello!")|, !) -> +===================== +== with == +inline fun with(receiver: T, block: T.() -> R): R = receiver.block() +--------------------- + : {<: T} NEW: magic[FAKE_INITIALIZER](receiver: T) -> + : {<: T.() -> R} NEW: magic[FAKE_INITIALIZER](block: T.() -> R) -> +receiver : {<: T} NEW: r(receiver) -> +block : {<: (T) -> R} NEW: r(block) -> +block() : {<: R} NEW: call(block(), invoke|, ) -> +receiver.block() : {<: R} COPY +===================== +== use == +fun use() = with(C) { + with(B) { + A.foo() + } +} +--------------------- +C : C NEW: r(C) -> +{ with(B) { A.foo() } } : {<: C.() -> ???} NEW: r({ with(B) { A.foo() } }) -> +with(C) { with(B) { A.foo() } } : {<: [ERROR : Error function type]} NEW: call(with(C) { with(B) { A.foo() } }, with|, ) -> +===================== +== anonymous_0 == +{ + with(B) { + A.foo() + } +} +--------------------- +B : B NEW: r(B) -> +{ A.foo() } : {<: B.() -> ???} NEW: r({ A.foo() }) -> +with(B) { A.foo() } : {<: ???} NEW: call(with(B) { A.foo() }, with|, ) -> +with(B) { A.foo() } : {<: ???} COPY +===================== +== anonymous_1 == +{ + A.foo() + } +--------------------- + : B NEW: magic[IMPLICIT_RECEIVER](foo) -> + : C NEW: magic[IMPLICIT_RECEIVER](foo()) -> +A : A.Companion NEW: r(A, Companion) -> +foo : X NEW: r(foo|, ) -> +foo() : {<: [ERROR : Error function type]} NEW: call(foo(), invoke|, ) -> +A.foo() : {<: [ERROR : Error function type]} COPY +A.foo() : {<: [ERROR : Error function type]} COPY +===================== diff --git a/compiler/testData/cfg/declarations/functions/typeParameter.values b/compiler/testData/cfg/declarations/functions/typeParameter.values index 5bddf27abc1..b393070f104 100644 --- a/compiler/testData/cfg/declarations/functions/typeParameter.values +++ b/compiler/testData/cfg/declarations/functions/typeParameter.values @@ -4,5 +4,5 @@ fun foo() { } --------------------- T : * NEW: magic[UNRESOLVED_CALL](T) -> -{ T } : * COPY +{ T } : * COPY ===================== diff --git a/compiler/testData/diagnostics/tests/qualifiedExpression/JavaQualifier.kt b/compiler/testData/diagnostics/tests/qualifiedExpression/JavaQualifier.kt new file mode 100644 index 00000000000..b0f497158d2 --- /dev/null +++ b/compiler/testData/diagnostics/tests/qualifiedExpression/JavaQualifier.kt @@ -0,0 +1,9 @@ +// FILE: Owner.java + +public class Owner { + public static final String name = "Owner"; +} + +// FILE: Use.kt + +val x = Owner.name diff --git a/compiler/testData/diagnostics/tests/qualifiedExpression/JavaQualifier.txt b/compiler/testData/diagnostics/tests/qualifiedExpression/JavaQualifier.txt new file mode 100644 index 00000000000..2dbea24f946 --- /dev/null +++ b/compiler/testData/diagnostics/tests/qualifiedExpression/JavaQualifier.txt @@ -0,0 +1,13 @@ +package + +public val x: kotlin.String = "Owner" + +public open class Owner { + public constructor Owner() + public open override /*1*/ /*fake_override*/ fun equals(/*0*/ other: kotlin.Any?): kotlin.Boolean + public open override /*1*/ /*fake_override*/ fun hashCode(): kotlin.Int + public open override /*1*/ /*fake_override*/ fun toString(): kotlin.String + + // Static members + public const final val name: kotlin.String = "Owner" +} diff --git a/compiler/tests/org/jetbrains/kotlin/cfg/ControlFlowTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cfg/ControlFlowTestGenerated.java index 2ede71e9dbf..6e8371ed10a 100644 --- a/compiler/tests/org/jetbrains/kotlin/cfg/ControlFlowTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cfg/ControlFlowTestGenerated.java @@ -374,6 +374,18 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/delegationBySuperCall.kt"); doTest(fileName); } + + @TestMetadata("ObjectEnumQualifiers.kt") + public void testObjectEnumQualifiers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.kt"); + doTest(fileName); + } + + @TestMetadata("QualifierReceiverWithOthers.kt") + public void testQualifierReceiverWithOthers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/cfg/declarations/functionLiterals") diff --git a/compiler/tests/org/jetbrains/kotlin/cfg/PseudoValueTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/cfg/PseudoValueTestGenerated.java index 440d0150fcd..c83e8fdbc87 100644 --- a/compiler/tests/org/jetbrains/kotlin/cfg/PseudoValueTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/cfg/PseudoValueTestGenerated.java @@ -376,6 +376,18 @@ public class PseudoValueTestGenerated extends AbstractPseudoValueTest { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/delegationBySuperCall.kt"); doTest(fileName); } + + @TestMetadata("ObjectEnumQualifiers.kt") + public void testObjectEnumQualifiers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/ObjectEnumQualifiers.kt"); + doTest(fileName); + } + + @TestMetadata("QualifierReceiverWithOthers.kt") + public void testQualifierReceiverWithOthers() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/cfg/declarations/classesAndObjects/QualifierReceiverWithOthers.kt"); + doTest(fileName); + } } @TestMetadata("compiler/testData/cfg/declarations/functionLiterals") diff --git a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java index ef3b5a7651c..13ccff5e43c 100644 --- a/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/kotlin/checkers/DiagnosticsTestGenerated.java @@ -13959,6 +13959,12 @@ public class DiagnosticsTestGenerated extends AbstractDiagnosticsTest { doTest(fileName); } + @TestMetadata("JavaQualifier.kt") + public void testJavaQualifier() throws Exception { + String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/qualifiedExpression/JavaQualifier.kt"); + doTest(fileName); + } + @TestMetadata("PackageVsClass.kt") public void testPackageVsClass() throws Exception { String fileName = KotlinTestUtils.navigationMetadata("compiler/testData/diagnostics/tests/qualifiedExpression/PackageVsClass.kt");