This commit is contained in:
Maxim Medvedev
2011-03-17 17:29:58 +03:00
parent 8c91294051
commit 40990b2d09
2 changed files with 30 additions and 22 deletions
@@ -418,7 +418,8 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl<GrExpressi
if (getParent() instanceof GrReferenceExpression) {
result = facade.getElementFactory().createType((PsiClass) resolved);
} else {
result = createJavaLangClassType(facade, facade.getElementFactory().createType((PsiClass)resolved));
result = TypesUtil
.createJavaLangClassType(facade.getElementFactory().createType((PsiClass)resolved), getProject(), getResolveScope());
}
} else if (resolved instanceof GrVariable) {
result = ((GrVariable) resolved).getDeclaredType();
@@ -438,10 +439,11 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl<GrExpressi
"getClass".equals(method.getName())) {
final GrExpression qualifier = getQualifier();
if (PsiUtil.seemsToBeQualifiedClassName(qualifier)) {
result = createJavaLangClassType(facade, facade.getElementFactory().createTypeFromText(qualifier.getText(), this));
result = TypesUtil.createJavaLangClassType(facade.getElementFactory().createTypeFromText(qualifier.getText(), this),
getProject(), getResolveScope());
}
else {
result = getTypeForObjectGetClass(facade, method);
result = getTypeForObjectGetClass(method);
}
} else {
result = PsiUtil.getSmartReturnType(method);
@@ -466,9 +468,10 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl<GrExpressi
if ("class".equals(getReferenceName())) {
if (PsiUtil.seemsToBeQualifiedClassName(qualifier)) {
assert qualifier != null;
result = createJavaLangClassType(facade, facade.getElementFactory().createTypeFromText(qualifier.getText(), this));
result = TypesUtil.createJavaLangClassType(facade.getElementFactory().createTypeFromText(qualifier.getText(), this), getProject(),
getResolveScope());
} else {
result = createJavaLangClassType(facade, getQualifierType());
result = TypesUtil.createJavaLangClassType(getQualifierType(), getProject(), getResolveScope());
}
}
else {
@@ -502,21 +505,6 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl<GrExpressi
}
}
@Nullable
private PsiType createJavaLangClassType(JavaPsiFacade facade, @Nullable PsiType type) {
PsiType result = null;
PsiClass javaLangClass = facade.findClass(CommonClassNames.JAVA_LANG_CLASS, getResolveScope());
if (javaLangClass != null) {
PsiSubstitutor substitutor = PsiSubstitutor.EMPTY;
final PsiTypeParameter[] typeParameters = javaLangClass.getTypeParameters();
if (typeParameters.length == 1) {
substitutor = substitutor.put(typeParameters[0], type);
}
result = facade.getElementFactory().createType(javaLangClass, substitutor);
}
return result;
}
@Nullable
private PsiType getQualifierType() {
final GrExpression qualifier = getQualifierExpression();
@@ -536,14 +524,14 @@ public class GrReferenceExpressionImpl extends GrReferenceElementImpl<GrExpressi
}
@Nullable
private PsiType getTypeForObjectGetClass(JavaPsiFacade facade, PsiMethod method) {
private PsiType getTypeForObjectGetClass(PsiMethod method) {
PsiType type = PsiUtil.getSmartReturnType(method);
if (type instanceof PsiClassType) {
PsiClass clazz = ((PsiClassType)type).resolve();
if (clazz != null && CommonClassNames.JAVA_LANG_CLASS.equals(clazz.getQualifiedName())) {
PsiTypeParameter[] typeParameters = clazz.getTypeParameters();
if (typeParameters.length == 1) {
return createJavaLangClassType(facade, getQualifierType());
return TypesUtil.createJavaLangClassType(getQualifierType(), getProject(), getResolveScope());
}
}
}
@@ -15,6 +15,7 @@
*/
package org.jetbrains.plugins.groovy.lang.psi.impl.statements.expressions;
import com.intellij.openapi.project.Project;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.impl.PsiSubstitutorImpl;
@@ -146,6 +147,7 @@ public class TypesUtil {
ourOperationsToOperatorNames.put(mSTAR, "multiply");
ourOperationsToOperatorNames.put(mDEC, "previous");
ourOperationsToOperatorNames.put(mINC, "next");
ourOperationsToOperatorNames.put(kAS, "asType");
}
private static final TObjectIntHashMap<String> TYPE_TO_RANK = new TObjectIntHashMap<String>();
@@ -491,4 +493,22 @@ public class TypesUtil {
public static PsiClassType createTypeByFQClassName(@NotNull String fqName, @NotNull PsiElement context) {
return GroovyPsiManager.getInstance(context.getProject()).createTypeByFQClassName(fqName, context.getResolveScope());
}
@Nullable
public static PsiType createJavaLangClassType(@Nullable PsiType type,
Project project,
GlobalSearchScope resolveScope) {
final JavaPsiFacade facade = JavaPsiFacade.getInstance(project);
PsiType result = null;
PsiClass javaLangClass = facade.findClass(JAVA_LANG_CLASS, resolveScope);
if (javaLangClass != null) {
PsiSubstitutor substitutor = PsiSubstitutor.EMPTY;
final PsiTypeParameter[] typeParameters = javaLangClass.getTypeParameters();
if (typeParameters.length == 1) {
substitutor = substitutor.put(typeParameters[0], type);
}
result = facade.getElementFactory().createType(javaLangClass, substitutor);
}
return result;
}
}