Refactor delegate members to light members conversion

This commit is contained in:
Pavel V. Talanov
2017-03-15 15:53:31 +03:00
parent eedcc19209
commit f1c0d5316f
5 changed files with 53 additions and 150 deletions
@@ -66,13 +66,9 @@ interface LightClassData {
} }
class LightClassDataImpl(override val clsDelegate: PsiClass) : LightClassData { class LightClassDataImpl(override val clsDelegate: PsiClass) : LightClassData {
override fun getOwnFields(containingClass: KtLightClass): List<KtLightField> { override fun getOwnFields(containingClass: KtLightClass) = KtLightFieldImpl.fromClsFields(clsDelegate, containingClass)
return clsDelegate.fields.map { KtLightFieldImpl.fromClsField(it, containingClass) }
}
override fun getOwnMethods(containingClass: KtLightClass): List<KtLightMethod> { override fun getOwnMethods(containingClass: KtLightClass) = KtLightMethodImpl.fromClsMethods(clsDelegate, containingClass)
return clsDelegate.methods.map { KtLightMethodImpl.fromClsMethod(it, containingClass) }
}
} }
object InvalidLightClassDataHolder : LightClassDataHolder.ForClass { object InvalidLightClassDataHolder : LightClassDataHolder.ForClass {
@@ -14,161 +14,71 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.asJava.classes; package org.jetbrains.kotlin.asJava.classes
import com.intellij.lang.Language; import com.intellij.navigation.ItemPresentationProviders
import com.intellij.navigation.ItemPresentation; import com.intellij.psi.*
import com.intellij.navigation.ItemPresentationProviders; import com.intellij.psi.impl.PsiClassImplUtil
import com.intellij.psi.*; import com.intellij.psi.impl.light.AbstractLightClass
import com.intellij.psi.impl.PsiClassImplUtil; import com.intellij.psi.impl.source.ClassInnerStuffCache
import com.intellij.psi.impl.light.AbstractLightClass; import com.intellij.psi.impl.source.PsiExtensibleClass
import com.intellij.psi.impl.source.ClassInnerStuffCache; import com.intellij.psi.scope.PsiScopeProcessor
import com.intellij.psi.impl.source.PsiExtensibleClass; import org.jetbrains.kotlin.asJava.elements.KtLightFieldImpl
import com.intellij.psi.scope.PsiScopeProcessor; import org.jetbrains.kotlin.asJava.elements.KtLightMethodImpl
import com.intellij.util.Function; import org.jetbrains.kotlin.idea.KotlinLanguage
import com.intellij.util.containers.ContainerUtil;
import kotlin.collections.ArraysKt;
import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.asJava.elements.KtLightFieldImpl;
import org.jetbrains.kotlin.asJava.elements.KtLightMethodImpl;
import org.jetbrains.kotlin.idea.KotlinLanguage;
import org.jetbrains.kotlin.psi.KtClassOrObject;
import java.util.List; abstract class KtLightClassBase protected constructor(manager: PsiManager)
: AbstractLightClass(manager, KotlinLanguage.INSTANCE), KtLightClass, PsiExtensibleClass {
private val myInnersCache = ClassInnerStuffCache(this)
public abstract class KtLightClassBase extends AbstractLightClass implements KtLightClass, PsiExtensibleClass { override fun getDelegate() = clsDelegate
private final ClassInnerStuffCache myInnersCache = new ClassInnerStuffCache(this);
protected KtLightClassBase(PsiManager manager) { override fun getFields() = myInnersCache.fields
super(manager, KotlinLanguage.INSTANCE);
}
@NotNull override fun getMethods() = myInnersCache.methods
@Override
public PsiClass getDelegate() {
return getClsDelegate();
}
@Override override fun getConstructors() = myInnersCache.constructors
@NotNull
public PsiField[] getFields() {
return myInnersCache.getFields();
}
@Override override fun getInnerClasses() = myInnersCache.innerClasses
@NotNull
public PsiMethod[] getMethods() {
return myInnersCache.getMethods();
}
@Override override fun getAllFields() = PsiClassImplUtil.getAllFields(this)
@NotNull
public PsiMethod[] getConstructors() {
return myInnersCache.getConstructors();
}
@Override override fun getAllMethods() = PsiClassImplUtil.getAllMethods(this)
@NotNull
public PsiClass[] getInnerClasses() {
return myInnersCache.getInnerClasses();
}
@Override override fun getAllInnerClasses() = PsiClassImplUtil.getAllInnerClasses(this)
@NotNull
public PsiField[] getAllFields() {
return PsiClassImplUtil.getAllFields(this);
}
@Override override fun findFieldByName(name: String, checkBases: Boolean) = myInnersCache.findFieldByName(name, checkBases)
@NotNull
public PsiMethod[] getAllMethods() {
return PsiClassImplUtil.getAllMethods(this);
}
@Override override fun findMethodsByName(name: String, checkBases: Boolean) = myInnersCache.findMethodsByName(name, checkBases)
@NotNull
public PsiClass[] getAllInnerClasses() {
return PsiClassImplUtil.getAllInnerClasses(this);
}
@Override override fun findInnerClassByName(name: String, checkBases: Boolean) = myInnersCache.findInnerClassByName(name, checkBases)
public PsiField findFieldByName(String name, boolean checkBases) {
return myInnersCache.findFieldByName(name, checkBases);
}
@Override override fun getOwnFields(): List<PsiField> = KtLightFieldImpl.fromClsFields(delegate, this)
@NotNull
public PsiMethod[] findMethodsByName(String name, boolean checkBases) {
return myInnersCache.findMethodsByName(name, checkBases);
}
@Override override fun getOwnMethods(): List<PsiMethod> = KtLightMethodImpl.fromClsMethods(delegate, this)
public PsiClass findInnerClassByName(String name, boolean checkBases) {
return myInnersCache.findInnerClassByName(name, checkBases);
}
/** override fun processDeclarations(
* @see org.jetbrains.kotlin.codegen.binding.CodegenBinding#ENUM_ENTRY_CLASS_NEED_SUBCLASS processor: PsiScopeProcessor, state: ResolveState, lastParent: PsiElement?, place: PsiElement
*/ ): Boolean {
@NotNull if (isEnum) {
@Override if (!PsiClassImplUtil.processDeclarationsInEnum(processor, state, myInnersCache)) return false
public List<PsiField> getOwnFields() {
return ContainerUtil.map(getDelegate().getFields(), new Function<PsiField, PsiField>() {
@Override
public PsiField fun(PsiField field) {
return KtLightFieldImpl.Factory.fromClsField(field, KtLightClassBase.this);
}
});
}
@NotNull
@Override
public List<PsiMethod> getOwnMethods() {
return ArraysKt.map(getDelegate().getMethods(), new Function1<PsiMethod, PsiMethod>() {
@Override
public PsiMethod invoke(PsiMethod method) {
return KtLightMethodImpl.fromClsMethod(method, KtLightClassBase.this);
}
});
}
@Override
public boolean processDeclarations(
@NotNull PsiScopeProcessor processor, @NotNull ResolveState state, PsiElement lastParent, @NotNull PsiElement place
) {
if (isEnum()) {
if (!PsiClassImplUtil.processDeclarationsInEnum(processor, state, myInnersCache)) return false;
} }
return super.processDeclarations(processor, state, lastParent, place); return super.processDeclarations(processor, state, lastParent, place)
} }
@Override override fun getText(): String {
public String getText() { val origin = kotlinOrigin
KtClassOrObject origin = getKotlinOrigin(); return if (origin == null) "" else origin.text
return origin == null ? "" : origin.getText();
} }
@NotNull override fun getLanguage() = KotlinLanguage.INSTANCE
@Override
public Language getLanguage() {
return KotlinLanguage.INSTANCE;
}
@Override override fun getPresentation() = ItemPresentationProviders.getItemPresentation(this)
public ItemPresentation getPresentation() {
return ItemPresentationProviders.getItemPresentation(this);
}
@Override abstract override fun equals(other: Any?): Boolean
public abstract boolean equals(Object obj);
@Override abstract override fun hashCode(): Int
public abstract int hashCode();
@Override override fun getContext() = parent
public PsiElement getContext() {
return getParent();
}
} }
@@ -183,10 +183,9 @@ sealed class KtLightFieldImpl<T: PsiField>(
return KtLightFieldForDeclaration(origin, computeRealDelegate, containingClass, dummyDelegate) return KtLightFieldForDeclaration(origin, computeRealDelegate, containingClass, dummyDelegate)
} }
@JvmStatic fun fromClsFields(delegateClass: PsiClass, containingClass: KtLightClass) = delegateClass.fields.map {
fun fromClsField(field: PsiField, containingClass: KtLightClass): KtLightField { val origin = ClsWrapperStubPsiFactory.getMemberOrigin(it)
val origin = ClsWrapperStubPsiFactory.getMemberOrigin(field) KtLightFieldImpl.create(origin, it, containingClass)
return KtLightFieldImpl.create(origin, field, containingClass)
} }
} }
} }
@@ -238,13 +238,6 @@ class KtLightMethodImpl private constructor(
return KtLightMethodImpl({ delegate}, origin, containingClass) return KtLightMethodImpl({ delegate}, origin, containingClass)
} }
@JvmStatic
fun fromClsMethod(method: PsiMethod, containingClass: KtLightClass): KtLightMethodImpl {
val origin = ClsWrapperStubPsiFactory.getMemberOrigin(method)
return KtLightMethodImpl.create(method, adjustMethodOrigin(origin), containingClass)
}
@JvmStatic
fun lazy( fun lazy(
dummyDelegate: PsiMethod?, dummyDelegate: PsiMethod?,
containingClass: KtLightClass, containingClass: KtLightClass,
@@ -253,6 +246,11 @@ class KtLightMethodImpl private constructor(
): KtLightMethodImpl { ): KtLightMethodImpl {
return KtLightMethodImpl(computeRealDelegate, adjustMethodOrigin(origin), containingClass, dummyDelegate) return KtLightMethodImpl(computeRealDelegate, adjustMethodOrigin(origin), containingClass, dummyDelegate)
} }
fun fromClsMethods(delegateClass: PsiClass, containingClass: KtLightClass) = delegateClass.methods.map {
val origin = ClsWrapperStubPsiFactory.getMemberOrigin(it)
KtLightMethodImpl.create(it, adjustMethodOrigin(origin), containingClass)
}
} }
override fun getName() = dummyDelegate?.name ?: clsDelegate.name override fun getName() = dummyDelegate?.name ?: clsDelegate.name
@@ -79,7 +79,7 @@ sealed class LazyLightClassDataHolder(
private val dummyDelegate: PsiClass? by lazyPub { inexactResult?.let(findDelegate) } private val dummyDelegate: PsiClass? by lazyPub { inexactResult?.let(findDelegate) }
override fun getOwnFields(containingClass: KtLightClass): List<KtLightField> { override fun getOwnFields(containingClass: KtLightClass): List<KtLightField> {
if (dummyDelegate == null) return clsDelegate.fields.map { KtLightFieldImpl.fromClsField(it, containingClass) } if (dummyDelegate == null) return KtLightFieldImpl.fromClsFields(clsDelegate, containingClass)
return dummyDelegate!!.fields.map { dummyField -> return dummyDelegate!!.fields.map { dummyField ->
val memberOrigin = ClsWrapperStubPsiFactory.getMemberOrigin(dummyField)!! val memberOrigin = ClsWrapperStubPsiFactory.getMemberOrigin(dummyField)!!
@@ -93,7 +93,7 @@ sealed class LazyLightClassDataHolder(
} }
override fun getOwnMethods(containingClass: KtLightClass): List<KtLightMethod> { override fun getOwnMethods(containingClass: KtLightClass): List<KtLightMethod> {
if (dummyDelegate == null) return clsDelegate.methods.map { KtLightMethodImpl.fromClsMethod(it, containingClass) } if (dummyDelegate == null) return KtLightMethodImpl.fromClsMethods(clsDelegate, containingClass)
return dummyDelegate!!.methods.map { dummyMethod -> return dummyDelegate!!.methods.map { dummyMethod ->
val methodName = dummyMethod.name val methodName = dummyMethod.name