From 9195d8e12ab7cab99c6b27ff6f2afeb8ec95ff3a Mon Sep 17 00:00:00 2001 From: Anna Kozlova Date: Tue, 1 Apr 2014 16:56:06 +0200 Subject: [PATCH] stop replacement chain calls to sequences when root type changes during call chain; this-chain is not supported though --- .../MethodCallChainPredicate.java | 37 ++++++++----------- .../ipp/concatenation/call_chain/Builder.java | 6 +++ .../call_chain/Builder_after.java | 7 ++++ .../call_chain/ThisCollapse.java | 12 ++++++ .../call_chain/Transformation.java | 12 ++++++ .../MakeCallChainIntoCallSequenceTest.java | 37 +++++++++++++++++++ 6 files changed, 89 insertions(+), 22 deletions(-) create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Builder.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Builder_after.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/ThisCollapse.java create mode 100644 plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Transformation.java create mode 100644 plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/concatenation/MakeCallChainIntoCallSequenceTest.java diff --git a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/MethodCallChainPredicate.java b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/MethodCallChainPredicate.java index 57eb68d61e49..2b29a2aa5f4e 100644 --- a/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/MethodCallChainPredicate.java +++ b/plugins/IntentionPowerPak/src/com/siyeh/ipp/concatenation/MethodCallChainPredicate.java @@ -45,52 +45,45 @@ class MethodCallChainPredicate implements PsiElementPredicate { } private static boolean isCallChain(PsiElement element) { - PsiClass aClass1 = getQualifierExpressionType(element); - if (aClass1 == null) { + PsiClassType aClassType1 = getQualifierExpressionType(element); + if (aClassType1 == null) { return false; } boolean first = true; - while (aClass1 != null) { + while (true) { final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)element; final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); - PsiClass aClass2 = getQualifierExpressionType(qualifierExpression); + PsiClassType expressionType = getQualifierExpressionType(qualifierExpression); if (!first) { - if (aClass2 == null) { + if (expressionType == null) { + if (qualifierExpression instanceof PsiMethodCallExpression && + ((PsiMethodCallExpression)qualifierExpression).getMethodExpression().getQualifierExpression() == null) { + return false; + } return true; } } else { first = false; } - if (!aClass1.equals(aClass2)) { + if (!aClassType1.equals(expressionType)) { return false; } - aClass1 = aClass2; + aClassType1 = expressionType; element = qualifierExpression; } - return true; } @Nullable - private static PsiClass getQualifierExpressionType(PsiElement element) { + private static PsiClassType getQualifierExpressionType(PsiElement element) { if (!(element instanceof PsiMethodCallExpression)) { return null; } + final PsiMethodCallExpression methodCallExpression = (PsiMethodCallExpression)element; - final PsiMethod method = methodCallExpression.resolveMethod(); - if (method != null) { - return method.getContainingClass(); - } final PsiReferenceExpression methodExpression = methodCallExpression.getMethodExpression(); final PsiExpression qualifierExpression = methodExpression.getQualifierExpression(); - if (!(qualifierExpression instanceof PsiMethodCallExpression)) { - return null; - } - final PsiType type = qualifierExpression.getType(); - if (!(type instanceof PsiClassType)) { - return null; - } - final PsiClassType classType = (PsiClassType)type; - return classType.resolve(); + final PsiType type = qualifierExpression != null ? qualifierExpression.getType() : null; + return type instanceof PsiClassType ? (PsiClassType)type : null; } } \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Builder.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Builder.java new file mode 100644 index 000000000000..107e39219508 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Builder.java @@ -0,0 +1,6 @@ +class Test { + { + StringBuilder text = null; + text.delete(text.length() - 1, text.length()).append(";\n"); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Builder_after.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Builder_after.java new file mode 100644 index 000000000000..5f620e193a8f --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Builder_after.java @@ -0,0 +1,7 @@ +class Test { + { + StringBuilder text = null; + text.delete(text.length() - 1, text.length()); + text.append(";\n"); + } +} \ No newline at end of file diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/ThisCollapse.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/ThisCollapse.java new file mode 100644 index 000000000000..b64676f660f2 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/ThisCollapse.java @@ -0,0 +1,12 @@ +class FooBar { + FooBar> foo() { + return null; + } + + FooBar bar() {return this;} + + void f(FooBar fb) { + foo().bar().toString(); + } + +} diff --git a/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Transformation.java b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Transformation.java new file mode 100644 index 000000000000..060ff0cb1383 --- /dev/null +++ b/plugins/IntentionPowerPak/test/com/siyeh/ipp/concatenation/call_chain/Transformation.java @@ -0,0 +1,12 @@ +class FooBar { + FooBar foo(K k) { + return null; + } + + FooBar bar() {return this;} + + void f(FooBar fb) { + fb.foo(1).bar().toString(); + } + +} diff --git a/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/concatenation/MakeCallChainIntoCallSequenceTest.java b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/concatenation/MakeCallChainIntoCallSequenceTest.java new file mode 100644 index 000000000000..ab60f95f9047 --- /dev/null +++ b/plugins/IntentionPowerPak/testSrc/com/siyeh/ipp/concatenation/MakeCallChainIntoCallSequenceTest.java @@ -0,0 +1,37 @@ +/* + * Copyright 2000-2014 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.siyeh.ipp.concatenation; + +import com.siyeh.IntentionPowerPackBundle; +import com.siyeh.ipp.IPPTestCase; + +public class MakeCallChainIntoCallSequenceTest extends IPPTestCase { + + public void testBuilder() { doTest(); } + public void testTransformation() { assertIntentionNotAvailable();} + //should be probably possible? + public void testThisCollapse() { assertIntentionNotAvailable();} + + @Override + protected String getIntentionName() { + return IntentionPowerPackBundle.message("make.call.chain.into.call.sequence.intention.name"); + } + + @Override + protected String getRelativePath() { + return "concatenation/call_chain"; + } +}