From 9ede882cd583082cb294e70ddbc1c9bc96f658eb Mon Sep 17 00:00:00 2001 From: Svetlana Isakova Date: Fri, 8 Jun 2012 18:24:26 +0400 Subject: [PATCH] KT-2226 Parameter used as delegation by object marked as unused #KT-2226 fixed --- .../jet/lang/cfg/JetControlFlowProcessor.java | 11 ++-- .../cfg/ObjectExpression.instructions | 55 +++++++++++++++++++ compiler/testData/cfg/ObjectExpression.jet | 11 ++++ .../tests/controlFlowAnalysis/kt2226.jet | 15 +++++ 4 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 compiler/testData/cfg/ObjectExpression.instructions create mode 100644 compiler/testData/cfg/ObjectExpression.jet create mode 100644 compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2226.jet 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 4a2fd8bb33a..f80a31ea08f 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/cfg/JetControlFlowProcessor.java @@ -21,6 +21,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.tree.IElementType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jet.JetNodeTypes; import org.jetbrains.jet.lang.cfg.pseudocode.LocalDeclarationInstruction; import org.jetbrains.jet.lang.cfg.pseudocode.Pseudocode; import org.jetbrains.jet.lang.cfg.pseudocode.JetControlFlowInstructionsGenerator; @@ -865,9 +866,6 @@ public class JetControlFlowProcessor { @Override public void visitObjectDeclaration(JetObjectDeclaration objectDeclaration) { -// for (JetDelegationSpecifier delegationSpecifier : objectDeclaration.getDelegationSpecifiers()) { -// value(delegationSpecifier, inCondition); -// } visitClassOrObject(objectDeclaration); } @@ -891,7 +889,7 @@ public class JetControlFlowProcessor { public void visitAnonymousInitializer(JetClassInitializer classInitializer) { value(classInitializer.getBody(), inCondition); } - + private void visitClassOrObject(JetClassOrObject classOrObject) { for (JetDelegationSpecifier specifier : classOrObject.getDelegationSpecifiers()) { value(specifier, inCondition); @@ -926,6 +924,11 @@ public class JetControlFlowProcessor { } } + @Override + public void visitDelegationByExpressionSpecifier(JetDelegatorByExpressionSpecifier specifier) { + value(specifier.getDelegateExpression(), inCondition); + } + @Override public void visitJetElement(JetElement element) { builder.unsupported(element); diff --git a/compiler/testData/cfg/ObjectExpression.instructions b/compiler/testData/cfg/ObjectExpression.instructions new file mode 100644 index 00000000000..05ebfb46f15 --- /dev/null +++ b/compiler/testData/cfg/ObjectExpression.instructions @@ -0,0 +1,55 @@ +== A == +trait A { + fun foo() : Int +} +--------------------- +l0: + NEXT:[] PREV:[] +l1: + NEXT:[] PREV:[] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[, ] +===================== +== B == +class B : A { + override fun foo() = 10 +} +--------------------- +l0: + NEXT:[unsupported(DELEGATOR_SUPER_CLASS : A)] PREV:[] + unsupported(DELEGATOR_SUPER_CLASS : A) NEXT:[] PREV:[] +l1: + NEXT:[] PREV:[unsupported(DELEGATOR_SUPER_CLASS : A)] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[, ] +===================== +== foo == +fun foo(b: B) : Int { + val o = object : A by b {} + return o.foo() +} +--------------------- +l0: + NEXT:[v(b: B)] PREV:[] + v(b: B) NEXT:[w(b)] PREV:[] + w(b) NEXT:[v(val o = object : A by b {})] PREV:[v(b: B)] + v(val o = object : A by b {}) NEXT:[r(b)] PREV:[w(b)] + r(b) NEXT:[r(object : A by b {})] PREV:[v(val o = object : A by b {})] + r(object : A by b {}) NEXT:[w(o)] PREV:[r(b)] + w(o) NEXT:[r(o)] PREV:[r(object : A by b {})] + r(o) NEXT:[r(foo)] PREV:[w(o)] + r(foo) NEXT:[r(foo())] PREV:[r(o)] + r(foo()) NEXT:[r(o.foo())] PREV:[r(foo)] + r(o.foo()) NEXT:[ret(*) l1] PREV:[r(foo())] + ret(*) l1 NEXT:[] PREV:[r(o.foo())] +l1: + NEXT:[] PREV:[ret(*) l1] +error: + NEXT:[] PREV:[] +sink: + NEXT:[] PREV:[, ] +===================== diff --git a/compiler/testData/cfg/ObjectExpression.jet b/compiler/testData/cfg/ObjectExpression.jet new file mode 100644 index 00000000000..cf5ba96f594 --- /dev/null +++ b/compiler/testData/cfg/ObjectExpression.jet @@ -0,0 +1,11 @@ +trait A { + fun foo() : Int +} + +class B : A { + override fun foo() = 10 +} +fun foo(b: B) : Int { + val o = object : A by b {} + return o.foo() +} diff --git a/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2226.jet b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2226.jet new file mode 100644 index 00000000000..a846732a18d --- /dev/null +++ b/compiler/testData/diagnostics/tests/controlFlowAnalysis/kt2226.jet @@ -0,0 +1,15 @@ +//KT-2226 Parameter used as delegation by object marked as unused +package a + +trait A { + fun foo() : Int +} + +class B : A { + override fun foo() = 10 +} +fun foo(b: B) : Int { + val o = object : A by b { + } + return o.foo() +} \ No newline at end of file