From f0c51d2ce7fc974180dee8f6744f9ca2c77e3cc8 Mon Sep 17 00:00:00 2001 From: "Maxim.Medvedev" Date: Fri, 3 Aug 2012 15:08:54 +0400 Subject: [PATCH] Groovy 'a in Clazz': replace check for resole to class with heuristic --- .../controlFlow/ControlFlowBuilderUtil.java | 26 ++++++++++++++++++- .../controlFlow/InstanceOfInstruction.java | 8 +++--- 2 files changed, 30 insertions(+), 4 deletions(-) diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/ControlFlowBuilderUtil.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/ControlFlowBuilderUtil.java index 124c89d6dfc0..a9e013b5ea38 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/ControlFlowBuilderUtil.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/ControlFlowBuilderUtil.java @@ -16,6 +16,7 @@ package org.jetbrains.plugins.groovy.lang.psi.controlFlow; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.psi.JavaPsiFacade; import com.intellij.psi.PsiClass; import com.intellij.util.ArrayUtil; import gnu.trove.TIntHashSet; @@ -170,10 +171,33 @@ public class ControlFlowBuilderUtil { GrExpression left = binary.getLeftOperand(); GrExpression right = binary.getRightOperand(); if (left instanceof GrReferenceExpression && ((GrReferenceExpression)left).getQualifier() == null && - right instanceof GrReferenceExpression && ((GrReferenceExpression)right).resolve() instanceof PsiClass) { + right instanceof GrReferenceExpression && isClassHeuristic((GrReferenceExpression)right)) { return true; } } return false; } + + private static boolean isClassHeuristic(GrReferenceExpression ref) { + if (findClassByText(ref)) { + return true; + } + + GrExpression qualifier = ref.getQualifier(); + while (qualifier != null) { + if (!(qualifier instanceof GrReferenceExpression)) return false; + qualifier = ((GrReferenceExpression)qualifier).getQualifier(); + } + + final String name = ref.getName(); + if (name == null || Character.isLowerCase(name.charAt(0))) return false; + + return true; + } + + private static boolean findClassByText(GrReferenceExpression ref) { + final String text = ref.getText(); + final PsiClass aClass = JavaPsiFacade.getInstance(ref.getProject()).findClass(text, ref.getResolveScope()); + return aClass != null; + } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/InstanceOfInstruction.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/InstanceOfInstruction.java index 688479064a49..a766d27726fb 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/InstanceOfInstruction.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/lang/psi/controlFlow/InstanceOfInstruction.java @@ -57,9 +57,11 @@ public class InstanceOfInstruction extends InstructionImpl implements MixinTypeI GrExpression left = ((GrBinaryExpression)element).getLeftOperand(); GrExpression right = ((GrBinaryExpression)element).getRightOperand(); GroovyResolveResult result = ((GrReferenceExpression)right).advancedResolve(); - PsiClass resolved = (PsiClass)result.getElement(); - PsiClassType type = JavaPsiFacade.getElementFactory(element.getProject()).createType(resolved, result.getSubstitutor()); - return new Pair(left, type); + final PsiElement resolved = result.getElement(); + if (resolved instanceof PsiClass) { + PsiClassType type = JavaPsiFacade.getElementFactory(element.getProject()).createType((PsiClass)resolved, result.getSubstitutor()); + return new Pair(left, type); + } } return null; }