From aa713ef1f67871220ba1f01223458b675d95080b Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Thu, 23 Jan 2014 17:27:08 +0400 Subject: [PATCH] generate pseudocode for property accessor only if the property is local otherwise check it independently like a function --- .../jet/lang/cfg/JetControlFlowProcessor.java | 6 +- .../lang/cfg/JetFlowInformationProvider.java | 10 +--- .../cfg/AnonymousInitializers.instructions | 29 +--------- .../cfg/backingFieldAccess.instructions | 29 +--------- .../testData/cfg/localProperty.instructions | 56 +++++++++++++++++++ compiler/testData/cfg/localProperty.kt | 9 +++ .../checkPropertyAccessor.kt | 38 +++++++++++++ .../jet/cfg/ControlFlowTestGenerated.java | 5 ++ .../checkers/JetDiagnosticsTestGenerated.java | 5 ++ 9 files changed, 123 insertions(+), 64 deletions(-) create mode 100644 compiler/testData/cfg/localProperty.instructions create mode 100644 compiler/testData/cfg/localProperty.kt create mode 100644 compiler/testData/diagnostics/tests/controlFlowAnalysis/checkPropertyAccessor.kt diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java index 0434d0822fc..3656470ebca 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -792,8 +792,10 @@ public class JetControlFlowProcessor { if (delegate != null) { generateInstructions(delegate, NOT_IN_CONDITION); } - for (JetPropertyAccessor accessor : property.getAccessors()) { - generateInstructions(accessor, NOT_IN_CONDITION); + if (JetPsiUtil.isLocal(property)) { + for (JetPropertyAccessor accessor : property.getAccessors()) { + generateInstructions(accessor, NOT_IN_CONDITION); + } } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java index 48747edb144..1488a847e6f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetFlowInformationProvider.java @@ -96,20 +96,14 @@ public class JetFlowInformationProvider { @NotNull JetType expectedReturnType, boolean isLocalObject ) { - boolean isPropertyAccessor = function instanceof JetPropertyAccessor; - if (!isPropertyAccessor) { - recordInitializedVariables(); - } + recordInitializedVariables(); checkDefiniteReturn(expectedReturnType); checkLocalFunctions(); if (isLocalObject) return; - if (!isPropertyAccessor) { - // Property accessor is checked through initialization of a class/object or package properties (at 'checkDeclarationContainer') - markUninitializedVariables(); - } + markUninitializedVariables(); markUnusedVariables(); diff --git a/compiler/testData/cfg/AnonymousInitializers.instructions b/compiler/testData/cfg/AnonymousInitializers.instructions index 6f79af92955..d22d4d0f285 100644 --- a/compiler/testData/cfg/AnonymousInitializers.instructions +++ b/compiler/testData/cfg/AnonymousInitializers.instructions @@ -25,10 +25,7 @@ L0: r(12) w($i) v(val j: Int get() = 20) - jmp?(L2) NEXT:[mark({ $i = 13 }), d(get() = 20)] - d(get() = 20) NEXT:[] -L2: - mark({ $i = 13 }) PREV:[jmp?(L2)] + mark({ $i = 13 }) r(13) w($i) L1: @@ -36,27 +33,5 @@ L1: error: PREV:[] sink: - PREV:[, , d(get() = 20)] -L3: - - r(20) -L4: - NEXT:[] -error: - PREV:[] -sink: - PREV:[, ] -===================== -== get_j == -get() = 20 ---------------------- -L3: - - r(20) -L4: - NEXT:[] -error: - PREV:[] -sink: - PREV:[, ] + PREV:[, ] ===================== diff --git a/compiler/testData/cfg/backingFieldAccess.instructions b/compiler/testData/cfg/backingFieldAccess.instructions index 6059976c1a6..a505eddf68f 100644 --- a/compiler/testData/cfg/backingFieldAccess.instructions +++ b/compiler/testData/cfg/backingFieldAccess.instructions @@ -11,37 +11,12 @@ class C { L0: v(val a: Int get() = 1) - jmp?(L2) NEXT:[mark({ $a }), d(get() = 1)] - d(get() = 1) NEXT:[] -L2: - mark({ $a }) PREV:[jmp?(L2)] + mark({ $a }) r($a) L1: NEXT:[] error: PREV:[] sink: - PREV:[, , d(get() = 1)] -L3: - - r(1) -L4: - NEXT:[] -error: - PREV:[] -sink: - PREV:[, ] -===================== -== get_a == -get() = 1 ---------------------- -L3: - - r(1) -L4: - NEXT:[] -error: - PREV:[] -sink: - PREV:[, ] + PREV:[, ] ===================== diff --git a/compiler/testData/cfg/localProperty.instructions b/compiler/testData/cfg/localProperty.instructions new file mode 100644 index 00000000000..5c20804013e --- /dev/null +++ b/compiler/testData/cfg/localProperty.instructions @@ -0,0 +1,56 @@ +== foo == +fun foo() { + class B { + val a: Int + get() { + val b: Int + return b + } + } +} +--------------------- +L0: + + mark({ class B { val a: Int get() { val b: Int return b } } }) + v(val a: Int get() { val b: Int return b }) + jmp?(L2) NEXT:[, d(get() { val b: Int return b })] + d(get() { val b: Int return b }) NEXT:[] +L1: +L2: + NEXT:[] PREV:[jmp?(L2)] +error: + PREV:[] +sink: + PREV:[, , d(get() { val b: Int return b })] +L3: + + mark({ val b: Int return b }) + v(val b: Int) + r(b) + ret(*) L4 +L4: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== +== get_a == +get() { + val b: Int + return b + } +--------------------- +L3: + + mark({ val b: Int return b }) + v(val b: Int) + r(b) + ret(*) L4 +L4: + NEXT:[] +error: + PREV:[] +sink: + PREV:[, ] +===================== diff --git a/compiler/testData/cfg/localProperty.kt b/compiler/testData/cfg/localProperty.kt new file mode 100644 index 00000000000..06fc0bd5235 --- /dev/null +++ b/compiler/testData/cfg/localProperty.kt @@ -0,0 +1,9 @@ +fun foo() { + class B { + val a: Int + get() { + val b: Int + return b + } + } +} \ No newline at end of file diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/checkPropertyAccessor.kt b/compiler/testData/diagnostics/tests/controlFlowAnalysis/checkPropertyAccessor.kt new file mode 100644 index 00000000000..ee28cdbf7cb --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/checkPropertyAccessor.kt @@ -0,0 +1,38 @@ +package d + +val a: Int + get() { + val b: Int + val c: Int + 42 + + fun bar(): Int { + val d: Int + 42 + return d + } + + return b + } + +class A { + val a: Int + get() { + val b: Int + val c: Int + 42 + return b + } + + fun foo() { + class B { + val a: Int + get() { + val b: Int + val c: Int + 42 + return b + } + } + } +} \ No newline at end of file diff --git a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java index bc5fd592ad9..b26f4701c29 100644 --- a/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/cfg/ControlFlowTestGenerated.java @@ -167,6 +167,11 @@ public class ControlFlowTestGenerated extends AbstractControlFlowTest { doTest("compiler/testData/cfg/LocalDeclarations.kt"); } + @TestMetadata("localProperty.kt") + public void testLocalProperty() throws Exception { + doTest("compiler/testData/cfg/localProperty.kt"); + } + @TestMetadata("MultiDecl.kt") public void testMultiDecl() throws Exception { doTest("compiler/testData/cfg/MultiDecl.kt"); diff --git a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java index 22ad1b728b5..1fa4afdad55 100644 --- a/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java +++ b/compiler/tests/org/jetbrains/jet/checkers/JetDiagnosticsTestGenerated.java @@ -1493,6 +1493,11 @@ public class JetDiagnosticsTestGenerated extends AbstractJetDiagnosticsTest { doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/checkInnerLocalDeclarations.kt"); } + @TestMetadata("checkPropertyAccessor.kt") + public void testCheckPropertyAccessor() throws Exception { + doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/checkPropertyAccessor.kt"); + } + @TestMetadata("DeadCode.kt") public void testDeadCode() throws Exception { doTest("compiler/testData/diagnostics/tests/controlFlowAnalysis/DeadCode.kt");