Refactor light classes: move light members creation to their respective classes

This commit is contained in:
Pavel V. Talanov
2017-02-16 18:01:01 +03:00
parent 15b063d236
commit 22fb9ec5e1
3 changed files with 22 additions and 18 deletions
@@ -25,22 +25,15 @@ import com.intellij.psi.impl.light.AbstractLightClass;
import com.intellij.psi.impl.source.ClassInnerStuffCache;
import com.intellij.psi.impl.source.PsiExtensibleClass;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.util.Function;
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.builder.ClsWrapperStubPsiFactory;
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin;
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration;
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 org.jetbrains.kotlin.psi.KtDeclaration;
import org.jetbrains.kotlin.psi.KtProperty;
import org.jetbrains.kotlin.psi.KtPropertyAccessor;
import java.util.List;
@@ -124,8 +117,7 @@ public abstract class KtLightClassBase extends AbstractLightClass implements KtL
return ContainerUtil.map(getDelegate().getFields(), new Function<PsiField, PsiField>() {
@Override
public PsiField fun(PsiField field) {
LightMemberOrigin origin = ClsWrapperStubPsiFactory.getMemberOrigin(field);
return KtLightFieldImpl.Factory.create(origin, field, KtLightClassBase.this);
return KtLightFieldImpl.Factory.fromClsField(field, KtLightClassBase.this);
}
});
}
@@ -136,14 +128,7 @@ public abstract class KtLightClassBase extends AbstractLightClass implements KtL
return ArraysKt.map(getDelegate().getMethods(), new Function1<PsiMethod, PsiMethod>() {
@Override
public PsiMethod invoke(PsiMethod method) {
LightMemberOriginForDeclaration origin = ClsWrapperStubPsiFactory.getMemberOrigin(method);
KtDeclaration originalElement = origin != null ? origin.getOriginalElement() : null;
if (originalElement instanceof KtPropertyAccessor) {
//noinspection ConstantConditions
origin = origin.copy(PsiTreeUtil.getParentOfType(originalElement, KtProperty.class), origin.getOriginKind());
}
return KtLightMethodImpl.Factory.create(method, origin, KtLightClassBase.this);
return KtLightMethodImpl.fromClsMethod(method, KtLightClassBase.this);
}
});
}
@@ -18,13 +18,13 @@ package org.jetbrains.kotlin.asJava.elements
import com.intellij.navigation.ItemPresentation
import com.intellij.navigation.ItemPresentationProviders
import com.intellij.navigation.NavigationItem
import com.intellij.openapi.util.TextRange
import com.intellij.psi.*
import com.intellij.psi.impl.PsiVariableEx
import com.intellij.psi.impl.light.LightElement
import com.intellij.util.IncorrectOperationException
import org.jetbrains.annotations.NonNls
import org.jetbrains.kotlin.asJava.builder.ClsWrapperStubPsiFactory
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.classes.KtLightClass
@@ -168,5 +168,11 @@ sealed class KtLightFieldImpl(
else -> return KtLightFieldForDeclaration(origin, delegate, containingClass)
}
}
@JvmStatic
fun fromClsField(field: PsiField, containingClass: KtLightClass): KtLightField {
val origin = ClsWrapperStubPsiFactory.getMemberOrigin(field)
return KtLightFieldImpl.create(origin, field, containingClass)
}
}
}
@@ -27,6 +27,7 @@ import com.intellij.psi.scope.PsiScopeProcessor
import com.intellij.psi.util.*
import com.intellij.util.IncorrectOperationException
import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.builder.ClsWrapperStubPsiFactory
import org.jetbrains.kotlin.asJava.builder.LightMemberOrigin
import org.jetbrains.kotlin.asJava.builder.LightMemberOriginForDeclaration
import org.jetbrains.kotlin.asJava.classes.KtLightClass
@@ -236,6 +237,18 @@ sealed class KtLightMethodImpl(
else -> KtLightMethodForDeclaration(delegate, origin, containingClass)
}
}
@JvmStatic
fun fromClsMethod(method: PsiMethod, containingClass: KtLightClass): KtLightMethodImpl {
var origin = ClsWrapperStubPsiFactory.getMemberOrigin(method)
val originalElement = if (origin != null) origin.originalElement else null
if (originalElement is KtPropertyAccessor) {
origin = origin!!.copy(PsiTreeUtil.getParentOfType(originalElement, KtProperty::class.java)!!, origin.originKind)
}
return KtLightMethodImpl.create(method, origin, containingClass)
}
}
}