Groovy 'a in Clazz': replace check for resole to class with heuristic

This commit is contained in:
Maxim.Medvedev
2012-08-03 15:15:36 +04:00
parent 67807be7a3
commit f0c51d2ce7
2 changed files with 30 additions and 4 deletions
@@ -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;
}
}
@@ -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<GrExpression, PsiType>(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<GrExpression, PsiType>(left, type);
}
}
return null;
}