Optimization of resolving domain fields.

This commit is contained in:
Sergey Evdokimov
2010-09-07 18:19:59 +04:00
parent 0a7a70db67
commit 7e747e5ec6
5 changed files with 84 additions and 24 deletions
@@ -38,6 +38,7 @@ import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.Collections;
import java.util.Map;
public class PsiElementFactoryImpl extends PsiJavaParserFacadeImpl implements PsiElementFactory {
@@ -275,6 +276,29 @@ public class PsiElementFactoryImpl extends PsiJavaParserFacadeImpl implements Ps
return new PsiClassReferenceType(classReference, null);
}
@NotNull
public PsiClassType createType(@NotNull PsiClass aClass, PsiType parameter) {
PsiTypeParameter[] typeParameters = aClass.getTypeParameters();
assert typeParameters.length == 1;
Map<PsiTypeParameter, PsiType> map = Collections.singletonMap(typeParameters[0], parameter);
return createType(aClass, createSubstitutor(map));
}
@NotNull
public PsiClassType createType(@NotNull PsiClass aClass, PsiType... parameters) {
PsiTypeParameter[] typeParameters = aClass.getTypeParameters();
assert parameters.length == typeParameters.length;
Map<PsiTypeParameter, PsiType> map = new java.util.HashMap<PsiTypeParameter, PsiType>();
for (int i = 0; i < parameters.length; i++) {
map.put(typeParameters[i], parameters[i]);
}
return createType(aClass, createSubstitutor(map));
}
private static class TypeDetacher extends PsiTypeVisitor<PsiType> {
public static final TypeDetacher INSTANCE = new TypeDetacher();
@@ -43,8 +43,8 @@ import java.util.List;
public class LightMethodBuilder extends LightElement implements PsiMethod {
private final String myName;
private Computable<PsiType> myReturnType;
private final LightModifierList myModifierList;
private LightParameterListBuilder myParameterList;
private final PsiModifierList myModifierList;
private PsiParameterList myParameterList;
private Icon myBaseIcon;
private PsiClass myContainingClass;
private boolean myConstructor;
@@ -61,10 +61,18 @@ public class LightMethodBuilder extends LightElement implements PsiMethod {
}
public LightMethodBuilder(PsiManager manager, Language language, String name) {
this(manager, language, name, new LightParameterListBuilder(manager, language), new LightModifierList(manager, language));
}
public LightMethodBuilder(PsiManager manager,
Language language,
String name,
PsiParameterList parameterList,
PsiModifierList modifierList) {
super(manager, language);
myName = name;
myModifierList = new LightModifierList(manager, language);
myParameterList = new LightParameterListBuilder(manager, language);
myParameterList = parameterList;
myModifierList = modifierList;
}
@Override
@@ -126,12 +134,12 @@ public class LightMethodBuilder extends LightElement implements PsiMethod {
}
public LightMethodBuilder addModifier(String modifier) {
myModifierList.addModifier(modifier);
((LightModifierList)myModifierList).addModifier(modifier);
return this;
}
public LightMethodBuilder setModifiers(String... modifiers) {
myModifierList.clearModifiers();
((LightModifierList)myModifierList).clearModifiers();
addModifiers(modifiers);
return this;
}
@@ -145,13 +153,8 @@ public class LightMethodBuilder extends LightElement implements PsiMethod {
return this;
}
public LightMethodBuilder setReturnType(final PsiType returnType) {
return setReturnType(new Computable<PsiType>() {
@Override
public PsiType compute() {
return returnType;
}
});
public LightMethodBuilder setReturnType(PsiType returnType) {
return setReturnType(new Computable.PredefinedValueComputable<PsiType>(returnType));
}
public PsiTypeElement getReturnTypeElement() {
@@ -164,7 +167,7 @@ public class LightMethodBuilder extends LightElement implements PsiMethod {
}
public LightMethodBuilder addParameter(PsiParameter parameter) {
myParameterList.addParameter(parameter);
((LightParameterListBuilder)myParameterList).addParameter(parameter);
return this;
}
@@ -149,6 +149,10 @@ public interface PsiElementFactory extends PsiJavaParserFacade {
*/
@NotNull PsiClassType createType(@NotNull PsiJavaCodeReferenceElement classReference);
@NotNull PsiClassType createType(@NotNull PsiClass aClass, PsiType parameters);
@NotNull PsiClassType createType(@NotNull PsiClass aClass, PsiType... parameters);
/**
* Detaches type from reference(s) or type elements it was created from.
*
@@ -15,9 +15,43 @@
*/
package com.intellij.openapi.util;
import org.jetbrains.annotations.NotNull;
/**
* @author dsl
*/
public interface Computable <T> {
T compute();
class PredefinedValueComputable<T> implements Computable<T> {
private final T myValue;
public PredefinedValueComputable(T value) {
this.myValue = value;
}
@Override
public T compute() {
return myValue;
}
}
abstract class NotNullCachedComputable<T> implements Computable<T> {
private T myValue;
@NotNull
protected abstract T internalCompute();
@NotNull
@Override
public final T compute() {
if (myValue == null) {
myValue = internalCompute();
}
return myValue;
}
}
}
@@ -19,27 +19,23 @@ package org.jetbrains.plugins.groovy.lang.psi.impl;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.lang.psi.GrReferenceElement;
import org.jetbrains.plugins.groovy.lang.psi.api.GroovyResolveResult;
import org.jetbrains.plugins.groovy.lang.psi.api.types.GrCodeReferenceElement;
import java.util.ArrayList;
import java.util.List;
/**
* @author ven
*/
public class GrClassReferenceType extends PsiClassType {
private final GrCodeReferenceElement myReferenceElement;
private final GrReferenceElement myReferenceElement;
public GrClassReferenceType(GrCodeReferenceElement referenceElement) {
public GrClassReferenceType(GrReferenceElement referenceElement) {
super(LanguageLevel.JDK_1_5);
myReferenceElement = referenceElement;
}
public GrClassReferenceType(GrCodeReferenceElement referenceElement, LanguageLevel languageLevel) {
public GrClassReferenceType(GrReferenceElement referenceElement, LanguageLevel languageLevel) {
super(languageLevel);
myReferenceElement = referenceElement;
}
@@ -173,7 +169,6 @@ public class GrClassReferenceType extends PsiClassType {
}
public PsiClassType setLanguageLevel(final LanguageLevel languageLevel) {
GrClassReferenceType copy = new GrClassReferenceType(myReferenceElement,languageLevel);
return copy;
return new GrClassReferenceType(myReferenceElement,languageLevel);
}
}