This commit is contained in:
Alexey Kudravtsev
2009-10-06 16:23:40 +04:00
parent 402b56afa1
commit 7ef01d2fe6
7 changed files with 40 additions and 49 deletions
@@ -356,8 +356,8 @@ public class ClsStubBuilder {
@Override
protected TypeInfo createReturnType() {
modlist[0] = new PsiModifierListStubImpl(this, packMethodFlags(access));
String returnType;
parsedViaGenericSignature[0] = false;
String returnType;
if (signature == null) {
returnType = parseMethodViaDescription(desc, this, args);
}
@@ -370,7 +370,7 @@ public class ClsStubBuilder {
returnType = parseMethodViaDescription(desc, this, args);
}
}
return (TypeInfo.fromString(returnType));
return TypeInfo.fromString(returnType);
}
};
@@ -23,12 +23,6 @@ public class PsiModifierListStubImpl extends StubBase<PsiModifierList> implement
@SuppressWarnings({"HardCodedStringLiteral"})
public String toString() {
StringBuilder builder = new StringBuilder();
builder.
append("PsiModifierListStub[").
append("mask=").append(getModifiersMask()).
append("]");
return builder.toString();
return "PsiModifierListStub[" + "mask=" + getModifiersMask() + "]";
}
}
@@ -65,7 +65,7 @@ public class JavaResolveCache {
}
@Nullable
public PsiType getType(@NotNull PsiExpression expr, @NotNull Function<PsiExpression, PsiType> f) {
public <T extends PsiExpression> PsiType getType(@NotNull T expr, @NotNull Function<T, PsiType> f) {
PsiType type = myCalculatedTypes.get(expr);
if (type == null) {
type = f.fun(expr);
@@ -56,9 +56,9 @@ public class PsiBinaryExpressionImpl extends ExpressionPsiElement implements Psi
return result;
}
private static final Function<PsiExpression,PsiType> MY_TYPE_EVALUATOR = new Function<PsiExpression, PsiType>() {
public PsiType fun(PsiExpression expression) {
return doGetType((PsiBinaryExpressionImpl)expression);
private static final Function<PsiBinaryExpressionImpl,PsiType> MY_TYPE_EVALUATOR = new Function<PsiBinaryExpressionImpl, PsiType>() {
public PsiType fun(PsiBinaryExpressionImpl expression) {
return doGetType(expression);
}
};
public PsiType getType() {
@@ -121,10 +121,10 @@ public class PsiMethodCallExpressionImpl extends ExpressionPsiElement implements
private static final TypeEvaluator ourTypeEvaluator = new TypeEvaluator();
private static class TypeEvaluator implements Function<PsiExpression, PsiType> {
private static class TypeEvaluator implements Function<PsiMethodCallExpression, PsiType> {
@Nullable
public PsiType fun(final PsiExpression call) {
PsiReferenceExpression methodExpression = ((PsiMethodCallExpression)call).getMethodExpression();
public PsiType fun(final PsiMethodCallExpression call) {
PsiReferenceExpression methodExpression = call.getMethodExpression();
PsiType theOnly = null;
final JavaResolveResult[] results = methodExpression.multiResolve(false);
for (int i = 0; i < results.length; i++) {
@@ -135,7 +135,8 @@ public class PsiMethodCallExpressionImpl extends ExpressionPsiElement implements
if (i == 0) {
theOnly = type;
} else if (!theOnly.equals(type)) {
}
else if (!theOnly.equals(type)) {
return null;
}
}
@@ -252,8 +252,7 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements
final ClassResolverProcessor processor = new ClassResolverProcessor(className, this);
PsiScopesUtil.resolveAndWalk(processor, this, null);
JavaResolveResult[] result = processor.getResult();
return result;
return processor.getResult();
}
private JavaResolveResult[] resolveToVariable() {
@@ -293,15 +292,14 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements
private final TypeEvaluator ourTypeEvaluator = new TypeEvaluator();
private static class TypeEvaluator implements Function<PsiExpression, PsiType> {
public PsiType fun(final PsiExpression expr) {
final PsiReferenceExpressionImpl refExpr = (PsiReferenceExpressionImpl)expr;
JavaResolveResult result = refExpr.advancedResolve(false);
private static class TypeEvaluator implements Function<PsiReferenceExpressionImpl, PsiType> {
public PsiType fun(final PsiReferenceExpressionImpl expr) {
JavaResolveResult result = expr.advancedResolve(false);
PsiElement resolve = result.getElement();
if (resolve == null) {
ASTNode refName = refExpr.findChildByRole(ChildRole.REFERENCE_NAME);
ASTNode refName = expr.findChildByRole(ChildRole.REFERENCE_NAME);
if (refName != null && refName.getText().equals(LENGTH)) {
ASTNode qualifier = refExpr.findChildByRole(ChildRole.QUALIFIER);
ASTNode qualifier = expr.findChildByRole(ChildRole.QUALIFIER);
if (qualifier != null && ElementType.EXPRESSION_BIT_SET.contains(qualifier.getElementType())) {
PsiType type = ((PsiExpression)SourceTreeToPsiMap.treeElementToPsi(qualifier)).getType();
if (type instanceof PsiArrayType) {
@@ -328,7 +326,7 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements
return null;
}
if (ret == null) return null;
final LanguageLevel languageLevel = PsiUtil.getLanguageLevel(refExpr);
final LanguageLevel languageLevel = PsiUtil.getLanguageLevel(expr);
if (ret instanceof PsiClassType) {
ret = ((PsiClassType)ret).setLanguageLevel(languageLevel);
}
@@ -336,7 +334,7 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements
if (languageLevel.compareTo(LanguageLevel.JDK_1_5) >= 0) {
if (owner != null && PsiUtil.isRawSubstitutor(owner, result.getSubstitutor())) return TypeConversionUtil.erasure(ret);
PsiType substitutedType = result.getSubstitutor().substitute(ret);
return PsiImplUtil.normalizeWildcardTypeByPosition(substitutedType, refExpr);
return PsiImplUtil.normalizeWildcardTypeByPosition(substitutedType, expr);
}
return TypeConversionUtil.erasure(ret);
@@ -366,6 +364,7 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements
}
@NotNull
public Object[] getVariants() {
//this reference's variants are rather obtained with processVariants()
return ArrayUtil.EMPTY_OBJECT_ARRAY;
@@ -418,12 +417,7 @@ public class PsiReferenceExpressionImpl extends ExpressionPsiElement implements
public int getTextOffset() {
ASTNode refName = findChildByRole(ChildRole.REFERENCE_NAME);
if (refName != null) {
return refName.getStartOffset();
}
else {
return super.getTextOffset();
}
return refName == null ? super.getTextOffset() : refName.getStartOffset();
}
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
@@ -200,10 +200,7 @@ public class TypeConversionUtil {
if (!fromClass.isInterface()) {
if (toClass.isInterface()) {
return !fromClass.hasModifierProperty(PsiModifier.FINAL) &&
checkSuperTypesWithDifferentTypeArguments(toResult, fromClass, manager,
fromResult.getSubstitutor(),
new THashSet<PsiClass>(),
languageLevel);
checkSuperTypesWithDifferentTypeArguments(toResult, fromClass, manager, fromResult.getSubstitutor(), null, languageLevel);
}
else {
if (manager.areElementsEquivalent(fromClass, toClass)) {
@@ -211,12 +208,10 @@ public class TypeConversionUtil {
}
if (toClass.isInheritor(fromClass, true)) {
return checkSuperTypesWithDifferentTypeArguments(fromResult, toClass, manager, toResult.getSubstitutor(), new THashSet<PsiClass>(),
languageLevel);
return checkSuperTypesWithDifferentTypeArguments(fromResult, toClass, manager, toResult.getSubstitutor(), null, languageLevel);
}
else if (fromClass.isInheritor(toClass, true)) {
return checkSuperTypesWithDifferentTypeArguments(toResult, fromClass, manager, fromResult.getSubstitutor(), new THashSet<PsiClass>(),
languageLevel);
return checkSuperTypesWithDifferentTypeArguments(toResult, fromClass, manager, fromResult.getSubstitutor(), null, languageLevel);
}
return false;
@@ -225,8 +220,7 @@ public class TypeConversionUtil {
else {
if (!toClass.isInterface()) {
if (!toClass.hasModifierProperty(PsiModifier.FINAL)) {
return checkSuperTypesWithDifferentTypeArguments(fromResult, toClass, manager, toResult.getSubstitutor(), new THashSet<PsiClass>(),
languageLevel);
return checkSuperTypesWithDifferentTypeArguments(fromResult, toClass, manager, toResult.getSubstitutor(), null, languageLevel);
}
else {
if (!toClass.isInheritor(fromClass, true)) return false;
@@ -257,14 +251,20 @@ public class TypeConversionUtil {
}
else {
//In jls3 check for super interface with distinct type arguments
PsiClassType.ClassResolveResult baseResult;
PsiClass derived;
PsiSubstitutor derivedSubstitutor;
if (toClass.isInheritor(fromClass, true)) {
return checkSuperTypesWithDifferentTypeArguments(fromResult, toClass, manager, toResult.getSubstitutor(), new THashSet<PsiClass>(),
languageLevel);
baseResult = fromResult;
derived = toClass;
derivedSubstitutor = toResult.getSubstitutor();
}
else {
return checkSuperTypesWithDifferentTypeArguments(toResult, fromClass, manager, fromResult.getSubstitutor(), new THashSet<PsiClass>(),
languageLevel);
baseResult = toResult;
derived = fromClass;
derivedSubstitutor = fromResult.getSubstitutor();
}
return checkSuperTypesWithDifferentTypeArguments(baseResult, derived, manager, derivedSubstitutor, null, languageLevel);
}
}
}
@@ -285,9 +285,9 @@ public class TypeConversionUtil {
PsiClass derived,
PsiManager manager,
PsiSubstitutor derivedSubstitutor,
final Set<PsiClass> visited,
Set<PsiClass> visited,
final LanguageLevel languageLevel) {
if (!visited.add(derived)) return true;
if (visited != null && visited.contains(derived)) return true;
if (languageLevel.compareTo(LanguageLevel.JDK_1_5) < 0) return true;
PsiClass base = baseResult.getElement();
@@ -302,6 +302,8 @@ public class TypeConversionUtil {
if (!areSameArgumentTypes(derived, baseSubstitutor, derivedSubstitutor)) return false;
}
if (visited == null) visited = new THashSet<PsiClass>();
visited.add(derived);
for (PsiClass aSuper : supers) {
PsiSubstitutor s = getSuperClassSubstitutor(aSuper, derived, derivedSubstitutor);
if (!checkSuperTypesWithDifferentTypeArguments(baseResult, aSuper, manager, s, visited, languageLevel)) return false;