From 56f6a73de75cb7c0deaacf963a3582d85471e289 Mon Sep 17 00:00:00 2001 From: peter Date: Wed, 24 Sep 2014 13:49:37 +0200 Subject: [PATCH] purity inference: take into account constructor calls --- .../codeInspection/dataFlow/PurityInference.java | 10 ++++++---- .../PurityInferenceFromSourceTest.groovy | 14 ++++++++++++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/PurityInference.java b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/PurityInference.java index 6550cd60d270..6ceaeec72ae5 100644 --- a/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/PurityInference.java +++ b/java/java-analysis-impl/src/com/intellij/codeInspection/dataFlow/PurityInference.java @@ -59,7 +59,7 @@ public class PurityInference { final Ref impureFound = Ref.create(false); final Ref hasReturns = Ref.create(false); - final List calls = ContainerUtil.newArrayList(); + final List calls = ContainerUtil.newArrayList(); body.accept(new JavaRecursiveElementWalkingVisitor() { @Override public void visitAssignmentExpression(PsiAssignmentExpression expression) { @@ -98,9 +98,11 @@ public class PurityInference { } @Override - public void visitMethodCallExpression(PsiMethodCallExpression expression) { - calls.add(expression); - super.visitMethodCallExpression(expression); + public void visitCallExpression(PsiCallExpression callExpression) { + if (!(callExpression instanceof PsiNewExpression) || ((PsiNewExpression)callExpression).getArrayDimensions().length == 0) { + calls.add(callExpression); + } + super.visitCallExpression(callExpression); } }); diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/PurityInferenceFromSourceTest.groovy b/java/java-tests/testSrc/com/intellij/codeInspection/PurityInferenceFromSourceTest.groovy index a77607314101..2e6ad00aba4c 100644 --- a/java/java-tests/testSrc/com/intellij/codeInspection/PurityInferenceFromSourceTest.groovy +++ b/java/java-tests/testSrc/com/intellij/codeInspection/PurityInferenceFromSourceTest.groovy @@ -136,6 +136,20 @@ public Foo() { """ } + public void "test calling constructor with side effects"() { + assertPure false, """ + Object newExample() { + return new Example1(); + } + + private int created = 0; + + Example1() { + created++; + } + """ + } + private void assertPure(boolean expected, String classBody) { def clazz = myFixture.addClass("final class Foo { $classBody }") assert expected == PurityInference.inferPurity(clazz.methods[0])