type casts may have side effects if their operands do

This commit is contained in:
peter
2012-05-23 17:12:42 +02:00
parent 7db9489814
commit fb6f640511
3 changed files with 17 additions and 14 deletions
@@ -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");
@@ -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) {
@@ -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() +