diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java index bec0848383fb..053f4448e1d2 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/evaluation/DefaultCodeFragmentFactory.java @@ -79,7 +79,7 @@ public class DefaultCodeFragmentFactory extends CodeFragmentFactory { return null; } - if (parameters.getInvocationCount() <= 1 && JavaCompletionUtil.containsMethodCalls(expression)) { + if (parameters.getInvocationCount() <= 1 && JavaCompletionUtil.mayHaveSideEffects(expression)) { final CompletionService service = CompletionService.getCompletionService(); if (service.getAdvertisementText() == null && parameters.getInvocationCount() < 2) { service.setAdvertisementText("Invoke completion once more to see runtime type variants"); diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java index a97e1316b6ed..2e168b6291ab 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/JavaCompletionUtil.java @@ -677,18 +677,19 @@ public class JavaCompletionUtil { return ret; } - @Nullable - static PsiElement getQualifier(final PsiElement element) { - return element instanceof PsiJavaCodeReferenceElement ? ((PsiJavaCodeReferenceElement)element).getQualifier() : null; - } - - public static boolean containsMethodCalls(@Nullable final PsiElement qualifier) { - if (qualifier == null) return false; - if (qualifier instanceof PsiMethodCallExpression || qualifier instanceof PsiNewExpression) return true; - if (qualifier instanceof PsiArrayAccessExpression) { - return containsMethodCalls(((PsiArrayAccessExpression)qualifier).getArrayExpression()); + public static boolean mayHaveSideEffects(@Nullable final PsiElement element) { + if (element == null) return false; + if (element instanceof PsiMethodCallExpression || element instanceof PsiNewExpression) return true; + if (element instanceof PsiTypeCastExpression) { + return mayHaveSideEffects(((PsiTypeCastExpression)element).getOperand()); } - return containsMethodCalls(getQualifier(qualifier)); + if (element instanceof PsiArrayAccessExpression) { + return mayHaveSideEffects(((PsiArrayAccessExpression)element).getArrayExpression()); + } + if (element instanceof PsiJavaCodeReferenceElement) { + return mayHaveSideEffects(((PsiJavaCodeReferenceElement)element).getQualifier()); + } + return true; } public static void insertClassReference(@NotNull PsiClass psiClass, @NotNull PsiFile file, int offset) { diff --git a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java index 454fcf02d7b1..b164555b8576 100644 --- a/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java +++ b/java/java-impl/src/com/intellij/codeInsight/completion/ReferenceExpressionCompletionContributor.java @@ -274,7 +274,9 @@ public class ReferenceExpressionCompletionContributor { } if (itemType == null) return; - final PsiElement qualifier = JavaCompletionUtil.getQualifier(reference.getElement()); + final PsiElement element1 = reference.getElement(); + final PsiElement qualifier = + element1 instanceof PsiJavaCodeReferenceElement ? ((PsiJavaCodeReferenceElement)element1).getQualifier() : null; final PsiType expectedType = parameters.getExpectedType(); if (!OBJECT_METHOD_PATTERN.accepts(object) || allowGetClass(object, parameters)) { if (parameters.getParameters().getInvocationCount() >= 3 || !itemType.equalsToText(CommonClassNames.JAVA_LANG_STRING)) { @@ -398,7 +400,7 @@ public class ReferenceExpressionCompletionContributor { } final String bracketSpace = getSpace(CodeStyleSettingsManager.getSettings(element.getProject()).SPACE_WITHIN_BRACKETS); - if (object instanceof PsiVariable && !JavaCompletionUtil.containsMethodCalls(qualifier)) { + if (object instanceof PsiVariable && !JavaCompletionUtil.mayHaveSideEffects(qualifier)) { final PsiVariable variable = (PsiVariable)object; addToArrayConversion(element, prefix, "new " + componentType.getCanonicalText() +