Refactor: get rid of LightClassUtil#getPsiClass() in favor of KtClassOrObject:toLightClass extension

This commit is contained in:
Pavel V. Talanov
2016-01-21 18:49:02 +03:00
parent 2972dbca00
commit 1fe749c114
23 changed files with 75 additions and 69 deletions
@@ -45,6 +45,8 @@ import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass;
public class JavaElementFinder extends PsiElementFinder implements KotlinFinderMarker { public class JavaElementFinder extends PsiElementFinder implements KotlinFinderMarker {
@NotNull @NotNull
@@ -133,7 +135,7 @@ public class JavaElementFinder extends PsiElementFinder implements KotlinFinderM
for (KtClassOrObject declaration : classOrObjectDeclarations) { for (KtClassOrObject declaration : classOrObjectDeclarations) {
if (!(declaration instanceof KtEnumEntry)) { if (!(declaration instanceof KtEnumEntry)) {
PsiClass lightClass = LightClassUtil.INSTANCE.getPsiClass(declaration); PsiClass lightClass = toLightClass(declaration);
if (lightClass != null) { if (lightClass != null) {
answer.add(lightClass); answer.add(lightClass);
} }
@@ -149,7 +151,7 @@ public class JavaElementFinder extends PsiElementFinder implements KotlinFinderM
for (KtClassOrObject classOrObject : lightClassGenerationSupport.findClassOrObjectDeclarations(qualifiedName.parent(), scope)) { for (KtClassOrObject classOrObject : lightClassGenerationSupport.findClassOrObjectDeclarations(qualifiedName.parent(), scope)) {
//NOTE: can't filter out more interfaces right away because decompiled declarations do not have member bodies //NOTE: can't filter out more interfaces right away because decompiled declarations do not have member bodies
if (classOrObject instanceof KtClass && ((KtClass) classOrObject).isInterface()) { if (classOrObject instanceof KtClass && ((KtClass) classOrObject).isInterface()) {
PsiClass interfaceClass = LightClassUtil.INSTANCE.getPsiClass(classOrObject); PsiClass interfaceClass = toLightClass(classOrObject);
if (interfaceClass != null) { if (interfaceClass != null) {
PsiClass implsClass = interfaceClass.findInnerClassByName(JvmAbi.DEFAULT_IMPLS_CLASS_NAME, false); PsiClass implsClass = interfaceClass.findInnerClassByName(JvmAbi.DEFAULT_IMPLS_CLASS_NAME, false);
if (implsClass != null) { if (implsClass != null) {
@@ -224,7 +226,7 @@ public class JavaElementFinder extends PsiElementFinder implements KotlinFinderM
Collection<KtClassOrObject> declarations = lightClassGenerationSupport.findClassOrObjectDeclarationsInPackage(packageFQN, scope); Collection<KtClassOrObject> declarations = lightClassGenerationSupport.findClassOrObjectDeclarationsInPackage(packageFQN, scope);
for (KtClassOrObject declaration : declarations) { for (KtClassOrObject declaration : declarations) {
PsiClass aClass = LightClassUtil.INSTANCE.getPsiClass(declaration); PsiClass aClass = toLightClass(declaration);
if (aClass != null) { if (aClass != null) {
answer.add(aClass); answer.add(aClass);
} }
@@ -116,12 +116,12 @@ open class KtLightClassForExplicitDeclaration(
val grandparent = parent.parent val grandparent = parent.parent
if (parent is KtClassBody && grandparent is KtClassOrObject) { if (parent is KtClassBody && grandparent is KtClassOrObject) {
return LightClassUtil.getPsiClass(grandparent) return grandparent.toLightClass()
} }
} }
if (declaration is KtClass) { if (declaration is KtClass) {
return LightClassUtil.getPsiClass(declaration) return declaration.toLightClass()
} }
return null return null
} }
@@ -48,12 +48,6 @@ object LightClassUtil {
return null return null
}/*package*/ }/*package*/
fun getPsiClass(classOrObject: KtClassOrObject?): KtLightClass? {
return classOrObject?.let {
return LightClassGenerationSupport.getInstance(it.project).getLightClass(it)
}
}
fun getLightClassAccessorMethod(accessor: KtPropertyAccessor): PsiMethod? = fun getLightClassAccessorMethod(accessor: KtPropertyAccessor): PsiMethod? =
getLightClassAccessorMethods(accessor).firstOrNull() getLightClassAccessorMethods(accessor).firstOrNull()
@@ -94,7 +88,7 @@ object LightClassUtil {
if (origin is KtObjectDeclaration && origin.isCompanion()) { if (origin is KtObjectDeclaration && origin.isCompanion()) {
val containingClass = PsiTreeUtil.getParentOfType(origin, KtClass::class.java) val containingClass = PsiTreeUtil.getParentOfType(origin, KtClass::class.java)
if (containingClass != null) { if (containingClass != null) {
val containingLightClass = getPsiClass(containingClass) val containingLightClass = containingClass.toLightClass()
if (containingLightClass != null) { if (containingLightClass != null) {
psiClass = containingLightClass psiClass = containingLightClass
} }
@@ -156,7 +150,7 @@ object LightClassUtil {
if (declaration is KtParameter) { if (declaration is KtParameter) {
val constructorClass = KtPsiUtil.getClassIfParameterIsProperty(declaration) val constructorClass = KtPsiUtil.getClassIfParameterIsProperty(declaration)
if (constructorClass != null) { if (constructorClass != null) {
return getPsiClass(constructorClass) return constructorClass.toLightClass()
} }
} }
@@ -165,7 +159,7 @@ object LightClassUtil {
} }
if (declaration is KtConstructor<*>) { if (declaration is KtConstructor<*>) {
return getPsiClass(declaration.getContainingClassOrObject()) return declaration.getContainingClassOrObject().toLightClass()
} }
if (!canGenerateLightClass(declaration)) { if (!canGenerateLightClass(declaration)) {
@@ -184,7 +178,7 @@ object LightClassUtil {
} }
else if (parent is KtClassBody) { else if (parent is KtClassBody) {
assert(parent.parent is KtClassOrObject) assert(parent.parent is KtClassOrObject)
return getPsiClass(parent.parent as KtClassOrObject) return (parent.parent as KtClassOrObject).toLightClass()
} }
return null return null
@@ -28,7 +28,7 @@ import org.jetbrains.kotlin.utils.addToStdlib.singletonList
import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList import org.jetbrains.kotlin.utils.addToStdlib.singletonOrEmptyList
import java.util.* import java.util.*
fun KtClassOrObject.toLightClass(): KtLightClass? = LightClassUtil.getPsiClass(this) fun KtClassOrObject.toLightClass(): KtLightClass? = LightClassGenerationSupport.getInstance(project).getLightClass(this)
fun KtFile.findFacadeClass(): KtLightClass? { fun KtFile.findFacadeClass(): KtLightClass? {
return LightClassGenerationSupport.getInstance(project) return LightClassGenerationSupport.getInstance(project)
@@ -38,7 +38,7 @@ fun KtFile.findFacadeClass(): KtLightClass? {
fun KtDeclaration.toLightElements(): List<PsiNamedElement> = fun KtDeclaration.toLightElements(): List<PsiNamedElement> =
when (this) { when (this) {
is KtClassOrObject -> LightClassUtil.getPsiClass(this).singletonOrEmptyList() is KtClassOrObject -> toLightClass().singletonOrEmptyList()
is KtNamedFunction, is KtNamedFunction,
is KtSecondaryConstructor -> LightClassUtil.getLightClassMethods(this as KtFunction) is KtSecondaryConstructor -> LightClassUtil.getLightClassMethods(this as KtFunction)
is KtProperty -> LightClassUtil.getLightClassPropertyMethods(this).toList() is KtProperty -> LightClassUtil.getLightClassPropertyMethods(this).toList()
@@ -59,7 +59,7 @@ fun PsiElement.toLightMethods(): List<PsiMethod> =
is KtProperty -> LightClassUtil.getLightClassPropertyMethods(this).toList() is KtProperty -> LightClassUtil.getLightClassPropertyMethods(this).toList()
is KtParameter -> LightClassUtil.getLightClassPropertyMethods(this).toList() is KtParameter -> LightClassUtil.getLightClassPropertyMethods(this).toList()
is KtPropertyAccessor -> LightClassUtil.getLightClassAccessorMethods(this) is KtPropertyAccessor -> LightClassUtil.getLightClassAccessorMethods(this)
is KtClass -> LightClassUtil.getPsiClass(this)?.getConstructors()?.first().singletonOrEmptyList() is KtClass -> toLightClass()?.getConstructors()?.first().singletonOrEmptyList()
is PsiMethod -> this.singletonList() is PsiMethod -> this.singletonList()
else -> listOf() else -> listOf()
} }
@@ -38,7 +38,7 @@ import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.TestOnly; import org.jetbrains.annotations.TestOnly;
import org.jetbrains.kotlin.asJava.LightClassUtil; import org.jetbrains.kotlin.asJava.LightClassUtilsKt;
import org.jetbrains.kotlin.builtins.DefaultBuiltIns; import org.jetbrains.kotlin.builtins.DefaultBuiltIns;
import org.jetbrains.kotlin.codegen.binding.PsiCodegenPredictor; import org.jetbrains.kotlin.codegen.binding.PsiCodegenPredictor;
import org.jetbrains.kotlin.context.ContextKt; import org.jetbrains.kotlin.context.ContextKt;
@@ -72,6 +72,7 @@ import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass;
import static org.jetbrains.kotlin.idea.decompiler.navigation.MemberMatching.*; import static org.jetbrains.kotlin.idea.decompiler.navigation.MemberMatching.*;
public class SourceNavigationHelper { public class SourceNavigationHelper {
@@ -375,7 +376,7 @@ public class SourceNavigationHelper {
); );
} }
} }
return LightClassUtil.INSTANCE.getPsiClass(classOrObject); return toLightClass(classOrObject);
} }
@Nullable @Nullable
@@ -16,19 +16,18 @@
package org.jetbrains.kotlin.idea.search.declarationsSearch package org.jetbrains.kotlin.idea.search.declarationsSearch
import com.intellij.psi.PsiClass
import com.intellij.util.Query
import com.intellij.psi.PsiModifier
import com.intellij.psi.PsiAnonymousClass import com.intellij.psi.PsiAnonymousClass
import org.jetbrains.kotlin.psi.KtClassOrObject import com.intellij.psi.PsiClass
import org.jetbrains.kotlin.asJava.LightClassUtil import com.intellij.psi.PsiModifier
import com.intellij.psi.PsiElement
import com.intellij.psi.search.searches.ClassInheritorsSearch import com.intellij.psi.search.searches.ClassInheritorsSearch
import com.intellij.util.EmptyQuery import com.intellij.util.EmptyQuery
import com.intellij.util.Query
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.psi.KtClassOrObject
fun HierarchySearchRequest<*>.searchInheritors(): Query<PsiClass> { fun HierarchySearchRequest<*>.searchInheritors(): Query<PsiClass> {
val psiClass: PsiClass? = when (originalElement) { val psiClass: PsiClass? = when (originalElement) {
is KtClassOrObject -> LightClassUtil.getPsiClass(originalElement) is KtClassOrObject -> originalElement.toLightClass()
is PsiClass -> originalElement is PsiClass -> originalElement
else -> null else -> null
} }
@@ -174,7 +174,7 @@ class KotlinReferencesSearcher : QueryExecutorBase<PsiReference, ReferencesSearc
fun processKtClassOrObject(element: KtClassOrObject, queryParameters: ReferencesSearch.SearchParameters) { fun processKtClassOrObject(element: KtClassOrObject, queryParameters: ReferencesSearch.SearchParameters) {
val className = element.name val className = element.name
if (className != null) { if (className != null) {
val lightClass = runReadAction { LightClassUtil.getPsiClass(element) } val lightClass = runReadAction { element.toLightClass() }
if (lightClass != null) { if (lightClass != null) {
searchNamedElement(queryParameters, lightClass, className) searchNamedElement(queryParameters, lightClass, className)
@@ -188,7 +188,7 @@ class KotlinReferencesSearcher : QueryExecutorBase<PsiReference, ReferencesSearc
if (kotlinReferencesSearchOptions?.acceptCompanionObjectMembers == true) { if (kotlinReferencesSearchOptions?.acceptCompanionObjectMembers == true) {
runReadAction { runReadAction {
val originClass = element.getStrictParentOfType<KtClass>() val originClass = element.getStrictParentOfType<KtClass>()
val originLightClass = LightClassUtil.getPsiClass(originClass) val originLightClass = originClass?.toLightClass()
if (originLightClass != null) { if (originLightClass != null) {
val lightDeclarations: List<KtLightElement<*, *>?> = val lightDeclarations: List<KtLightElement<*, *>?> =
originLightClass.methods.map { it as? KtLightMethod } + originLightClass.methods.map { it as? KtLightMethod } +
@@ -214,7 +214,7 @@ class KotlinReferencesSearcher : QueryExecutorBase<PsiReference, ReferencesSearc
.firstOrNull() as? KtObjectDeclaration ?: return null .firstOrNull() as? KtObjectDeclaration ?: return null
if (originObject.isCompanion()) { if (originObject.isCompanion()) {
val originClass = originObject.getStrictParentOfType<KtClass>() val originClass = originObject.getStrictParentOfType<KtClass>()
val originLightClass = LightClassUtil.getPsiClass(originClass) val originLightClass = originClass?.toLightClass()
val allMethods = originLightClass?.allMethods val allMethods = originLightClass?.allMethods
return allMethods?.find { it is KtLightMethod && it.getOrigin() == function } return allMethods?.find { it is KtLightMethod && it.getOrigin() == function }
} }
@@ -266,7 +266,7 @@ class KotlinReferencesSearcher : QueryExecutorBase<PsiReference, ReferencesSearc
runReadAction { runReadAction {
val componentFunctionDescriptor = element.dataClassComponentFunction() val componentFunctionDescriptor = element.dataClassComponentFunction()
if (componentFunctionDescriptor != null) { if (componentFunctionDescriptor != null) {
val containingClass = LightClassUtil.getPsiClass(element.getStrictParentOfType<KtClassOrObject>()) val containingClass = element.getStrictParentOfType<KtClassOrObject>()?.toLightClass()
searchDataClassComponentUsages(queryParameters, containingClass, componentFunctionDescriptor) searchDataClassComponentUsages(queryParameters, containingClass, componentFunctionDescriptor)
} }
} }
@@ -24,7 +24,7 @@ import com.intellij.codeInsight.lookup.LookupElementPresentation
import com.intellij.psi.PsiClass import com.intellij.psi.PsiClass
import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.searches.ClassInheritorsSearch import com.intellij.psi.search.searches.ClassInheritorsSearch
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.descriptors.annotations.Annotations import org.jetbrains.kotlin.descriptors.annotations.Annotations
@@ -114,7 +114,7 @@ class TypeInstantiationItems(
val psiClass: PsiClass = when (declaration) { val psiClass: PsiClass = when (declaration) {
is PsiClass -> declaration is PsiClass -> declaration
is KtClassOrObject -> LightClassUtil.getPsiClass(declaration) ?: return is KtClassOrObject -> declaration.toLightClass() ?: return
else -> return else -> return
} }
add(InheritanceSearcher(psiClass, kotlinClassDescriptor, typeArgs, freeParameters, tail)) add(InheritanceSearcher(psiClass, kotlinClassDescriptor, typeArgs, freeParameters, tail))
@@ -30,7 +30,6 @@ import com.intellij.psi.PsiModifier;
import com.intellij.ui.SimpleColoredComponent; import com.intellij.ui.SimpleColoredComponent;
import com.intellij.ui.StateRestoringCheckBox; import com.intellij.ui.StateRestoringCheckBox;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.asJava.LightClassUtil;
import org.jetbrains.kotlin.asJava.LightClassUtilsKt; import org.jetbrains.kotlin.asJava.LightClassUtilsKt;
import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.idea.KotlinBundle;
import org.jetbrains.kotlin.idea.findUsages.KotlinClassFindUsagesOptions; import org.jetbrains.kotlin.idea.findUsages.KotlinClassFindUsagesOptions;
@@ -41,6 +40,8 @@ import org.jetbrains.kotlin.psi.psiUtil.KtPsiUtilKt;
import javax.swing.*; import javax.swing.*;
import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass;
public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog { public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog {
private StateRestoringCheckBox constructorUsages; private StateRestoringCheckBox constructorUsages;
private StateRestoringCheckBox derivedClasses; private StateRestoringCheckBox derivedClasses;
@@ -62,7 +63,7 @@ public class KotlinFindClassUsagesDialog extends FindClassUsagesDialog {
@NotNull @NotNull
private static PsiClass getRepresentingPsiClass(@NotNull KtClassOrObject classOrObject) { private static PsiClass getRepresentingPsiClass(@NotNull KtClassOrObject classOrObject) {
PsiClass lightClass = LightClassUtil.INSTANCE.getPsiClass(classOrObject); PsiClass lightClass = toLightClass(classOrObject);
if (lightClass != null) return lightClass; if (lightClass != null) return lightClass;
// TODO: Remove this code when light classes are generated for builtins // TODO: Remove this code when light classes are generated for builtins
@@ -31,7 +31,6 @@ import com.intellij.usageView.UsageInfo
import com.intellij.util.FilteredQuery import com.intellij.util.FilteredQuery
import com.intellij.util.Processor import com.intellij.util.Processor
import org.jetbrains.kotlin.asJava.KtLightMethod import org.jetbrains.kotlin.asJava.KtLightMethod
import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.toLightClass import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.findUsages.KotlinClassFindUsagesOptions import org.jetbrains.kotlin.idea.findUsages.KotlinClassFindUsagesOptions
@@ -193,7 +192,7 @@ class KotlinFindClassUsagesHandler(
override fun getStringsToSearch(element: PsiElement): Collection<String> { override fun getStringsToSearch(element: PsiElement): Collection<String> {
val psiClass = when (element) { val psiClass = when (element) {
is PsiClass -> element is PsiClass -> element
is KtClassOrObject -> LightClassUtil.getPsiClass(getElement()) is KtClassOrObject -> getElement().toLightClass()
else -> null else -> null
} ?: return Collections.emptyList() } ?: return Collections.emptyList()
@@ -35,6 +35,8 @@ import org.jetbrains.kotlin.psi.psiUtil.PsiUtilsKt;
import java.util.Map; import java.util.Map;
import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass;
public abstract class KotlinCallTreeStructure extends HierarchyTreeStructure { public abstract class KotlinCallTreeStructure extends HierarchyTreeStructure {
protected final String scopeType; protected final String scopeType;
@@ -102,7 +104,7 @@ public abstract class KotlinCallTreeStructure extends HierarchyTreeStructure {
} }
if (element instanceof KtClassOrObject) { if (element instanceof KtClassOrObject) {
PsiClass psiClass = LightClassUtil.INSTANCE.getPsiClass((KtClassOrObject) element); PsiClass psiClass = toLightClass((KtClassOrObject) element);
if (psiClass == null) return null; if (psiClass == null) return null;
PsiMethod[] constructors = psiClass.getConstructors(); PsiMethod[] constructors = psiClass.getConstructors();
@@ -22,6 +22,7 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtFunction import org.jetbrains.kotlin.psi.KtFunction
import org.jetbrains.kotlin.psi.KtNamedFunction import org.jetbrains.kotlin.psi.KtNamedFunction
@@ -45,8 +46,8 @@ internal fun getPsiClass(element: PsiElement?): PsiClass? {
return when { return when {
element == null -> null element == null -> null
element is PsiClass -> element element is PsiClass -> element
element is KtClass -> LightClassUtil.getPsiClass(element) element is KtClass -> element.toLightClass()
element.parent is KtClass -> LightClassUtil.getPsiClass(element.parent as KtClass) element.parent is KtClass -> (element.parent as KtClass).toLightClass()
else -> null else -> null
} }
} }
@@ -28,13 +28,16 @@ import com.intellij.openapi.project.DumbService
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import com.intellij.psi.search.searches.ClassInheritorsSearch import com.intellij.psi.search.searches.ClassInheritorsSearch
import com.intellij.util.NullableFunction
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtNamedFunction
import org.jetbrains.kotlin.psi.KtProperty
import org.jetbrains.kotlin.psi.psiUtil.isOverridable import org.jetbrains.kotlin.psi.psiUtil.isOverridable
import java.awt.event.MouseEvent import java.awt.event.MouseEvent
import java.util.* import java.util.*
@@ -141,7 +144,7 @@ private fun collectInheritedClassMarker(element: KtClass, result: MutableCollect
return return
} }
val lightClass = LightClassUtil.getPsiClass(element) ?: return val lightClass = element.toLightClass() ?: return
if (ClassInheritorsSearch.search(lightClass, false).findFirst() == null) return if (ClassInheritorsSearch.search(lightClass, false).findFirst() == null) return
@@ -58,6 +58,7 @@ import com.intellij.util.VisibilityUtil
import com.intellij.util.containers.MultiMap import com.intellij.util.containers.MultiMap
import org.jetbrains.kotlin.asJava.KtLightMethod import org.jetbrains.kotlin.asJava.KtLightMethod
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.descriptors.CallableDescriptor import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.descriptors.ClassKind import org.jetbrains.kotlin.descriptors.ClassKind
@@ -548,8 +549,7 @@ fun createJavaClass(klass: KtClass, targetClass: PsiClass?, forcePlainClass: Boo
} }
val javaClass = (targetClass?.add(javaClassToAdd) ?: javaClassToAdd) as PsiClass val javaClass = (targetClass?.add(javaClassToAdd) ?: javaClassToAdd) as PsiClass
val template = LightClassUtil.getPsiClass(klass) val template = klass.toLightClass() ?: throw AssertionError("Can't generate light class: ${klass.getElementTextWithContext()}")
?: throw AssertionError("Can't generate light class: ${klass.getElementTextWithContext()}")
copyModifierListItems(template.modifierList!!, javaClass.modifierList!!) copyModifierListItems(template.modifierList!!, javaClass.modifierList!!)
if (template.isInterface) { if (template.isInterface) {
@@ -24,13 +24,13 @@ import com.intellij.refactoring.RefactoringBundle
import com.intellij.refactoring.rename.naming.AutomaticRenamer import com.intellij.refactoring.rename.naming.AutomaticRenamer
import com.intellij.refactoring.rename.naming.AutomaticRenamerFactory import com.intellij.refactoring.rename.naming.AutomaticRenamerFactory
import com.intellij.usageView.UsageInfo import com.intellij.usageView.UsageInfo
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.asJava.unwrapped import org.jetbrains.kotlin.asJava.unwrapped
import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClass
class AutomaticInheritorRenamer(klass: KtClass, newName: String): AutomaticRenamer() { class AutomaticInheritorRenamer(klass: KtClass, newName: String): AutomaticRenamer() {
init { init {
val lightClass = LightClassUtil.getPsiClass(klass) val lightClass = klass.toLightClass()
if (lightClass != null) { if (lightClass != null) {
for (inheritorLightClass in ClassInheritorsSearch.search(lightClass, true).findAll()) { for (inheritorLightClass in ClassInheritorsSearch.search(lightClass, true).findAll()) {
if ((inheritorLightClass.unwrapped as? PsiNamedElement)?.name != null) { if ((inheritorLightClass.unwrapped as? PsiNamedElement)?.name != null) {
@@ -28,7 +28,7 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.psi.PsiMethod import com.intellij.psi.PsiMethod
import com.intellij.psi.util.PsiTreeUtil import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil import org.jetbrains.kotlin.idea.project.ProjectStructureUtil
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil import org.jetbrains.kotlin.idea.util.ProjectRootsUtil
import org.jetbrains.kotlin.psi.KtClass import org.jetbrains.kotlin.psi.KtClass
@@ -141,7 +141,7 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer<JUnitConfig
val owner = PsiTreeUtil.getParentOfType(function, KtFunction::class.java, KtClass::class.java) val owner = PsiTreeUtil.getParentOfType(function, KtFunction::class.java, KtClass::class.java)
if (owner is KtClass) { if (owner is KtClass) {
val delegate = LightClassUtil.getPsiClass(owner) ?: return null val delegate = owner.toLightClass() ?: return null
val method = delegate.methods.firstOrNull() { it.navigationElement == function } ?: return null val method = delegate.methods.firstOrNull() { it.navigationElement == function } ?: return null
val methodLocation = PsiLocation.fromPsiElement(method) val methodLocation = PsiLocation.fromPsiElement(method)
if (JUnitUtil.isTestMethod(methodLocation, false)) { if (JUnitUtil.isTestMethod(methodLocation, false)) {
@@ -157,14 +157,11 @@ class KotlinJUnitRunConfigurationProducer : RunConfigurationProducer<JUnitConfig
if (!jetClass.isJUnitTestClass()) { if (!jetClass.isJUnitTestClass()) {
jetClass = getTestClassInFile(containingFile) jetClass = getTestClassInFile(containingFile)
} }
if (jetClass != null) { return jetClass?.toLightClass()
return LightClassUtil.getPsiClass(jetClass)
}
return null
} }
private fun KtClass?.isJUnitTestClass() = private fun KtClass?.isJUnitTestClass() =
LightClassUtil.getPsiClass(this)?.let { JUnitUtil.isTestClass(it, false, true) } ?: false this?.toLightClass()?.let { JUnitUtil.isTestClass(it, false, true) } ?: false
private fun getTestClassInFile(jetFile: KtFile) = private fun getTestClassInFile(jetFile: KtFile) =
jetFile.declarations.filterIsInstance<KtClass>().singleOrNull { it.isJUnitTestClass() } jetFile.declarations.filterIsInstance<KtClass>().singleOrNull { it.isJUnitTestClass() }
@@ -36,7 +36,6 @@ import com.theoryinpractice.testng.util.TestNGUtil;
import kotlin.collections.CollectionsKt; import kotlin.collections.CollectionsKt;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.asJava.LightClassUtil;
import org.jetbrains.kotlin.asJava.LightClassUtilsKt; import org.jetbrains.kotlin.asJava.LightClassUtilsKt;
import org.jetbrains.kotlin.idea.project.ProjectStructureUtil; import org.jetbrains.kotlin.idea.project.ProjectStructureUtil;
import org.jetbrains.kotlin.idea.util.ProjectRootsUtil; import org.jetbrains.kotlin.idea.util.ProjectRootsUtil;
@@ -44,6 +43,8 @@ import org.jetbrains.kotlin.psi.*;
import java.util.List; import java.util.List;
import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass;
public class KotlinTestNgConfigurationProducer extends TestNGConfigurationProducer { public class KotlinTestNgConfigurationProducer extends TestNGConfigurationProducer {
@Override @Override
public boolean shouldReplace(ConfigurationFromContext self, ConfigurationFromContext other) { public boolean shouldReplace(ConfigurationFromContext self, ConfigurationFromContext other) {
@@ -88,7 +89,7 @@ public class KotlinTestNgConfigurationProducer extends TestNGConfigurationProduc
KtElement owner = PsiTreeUtil.getParentOfType(function, KtFunction.class, KtClass.class); KtElement owner = PsiTreeUtil.getParentOfType(function, KtFunction.class, KtClass.class);
if (owner instanceof KtClass) { if (owner instanceof KtClass) {
PsiClass delegate = LightClassUtil.INSTANCE.getPsiClass((KtClass) owner); PsiClass delegate = toLightClass((KtClass) owner);
if (delegate != null) { if (delegate != null) {
for (PsiMethod method : delegate.getMethods()) { for (PsiMethod method : delegate.getMethods()) {
if (method.getNavigationElement() == function) { if (method.getNavigationElement() == function) {
@@ -103,7 +104,7 @@ public class KotlinTestNgConfigurationProducer extends TestNGConfigurationProduc
} }
if (declarationToRun instanceof KtClass) { if (declarationToRun instanceof KtClass) {
PsiClass delegate = LightClassUtil.INSTANCE.getPsiClass((KtClassOrObject) declarationToRun); PsiClass delegate = toLightClass((KtClassOrObject) declarationToRun);
if (!isTestNGClass(delegate)) { if (!isTestNGClass(delegate)) {
return false; return false;
} }
@@ -29,6 +29,7 @@ import com.intellij.util.Processor
import com.intellij.util.QueryExecutor import com.intellij.util.QueryExecutor
import com.intellij.util.indexing.FileBasedIndex import com.intellij.util.indexing.FileBasedIndex
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.LightClassUtil
import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.idea.caches.resolve.analyze import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.stubindex.KotlinAnnotationsIndex import org.jetbrains.kotlin.idea.stubindex.KotlinAnnotationsIndex
import org.jetbrains.kotlin.idea.util.application.runReadAction import org.jetbrains.kotlin.idea.util.application.runReadAction
@@ -45,7 +46,7 @@ class KotlinAnnotatedElementsSearcher : QueryExecutor<PsiModifierListOwner, Anno
return processAnnotatedMembers(p.annotationClass, p.scope) { declaration -> return processAnnotatedMembers(p.annotationClass, p.scope) { declaration ->
when (declaration) { when (declaration) {
is KtClass -> { is KtClass -> {
val lightClass = LightClassUtil.getPsiClass(declaration) val lightClass = declaration.toLightClass()
consumer.process(lightClass) consumer.process(lightClass)
} }
is KtNamedFunction, is KtSecondaryConstructor -> { is KtNamedFunction, is KtSecondaryConstructor -> {
@@ -21,7 +21,7 @@ import com.intellij.psi.search.GlobalSearchScope
import com.intellij.psi.search.searches.ClassesWithAnnotatedMembersSearch import com.intellij.psi.search.searches.ClassesWithAnnotatedMembersSearch
import com.intellij.psi.search.searches.ScopedQueryExecutor import com.intellij.psi.search.searches.ScopedQueryExecutor
import com.intellij.util.Processor import com.intellij.util.Processor
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.idea.KotlinFileType import org.jetbrains.kotlin.idea.KotlinFileType
import org.jetbrains.kotlin.idea.search.allScope import org.jetbrains.kotlin.idea.search.allScope
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
@@ -39,7 +39,7 @@ class KotlinClassesWithAnnotatedMembersSearcher : ScopedQueryExecutor<PsiClass,
{ it.getNonStrictParentOfType<KtClassOrObject>() !in processed}) { declaration -> { it.getNonStrictParentOfType<KtClassOrObject>() !in processed}) { declaration ->
val ktClass = declaration.getNonStrictParentOfType<KtClassOrObject>() val ktClass = declaration.getNonStrictParentOfType<KtClassOrObject>()
if (ktClass != null && processed.add(ktClass)) { if (ktClass != null && processed.add(ktClass)) {
val lightClass = LightClassUtil.getPsiClass(ktClass) val lightClass = ktClass.toLightClass()
if (lightClass != null) consumer.process(lightClass) else true if (lightClass != null) consumer.process(lightClass) else true
} }
else else
@@ -36,6 +36,8 @@ import org.jetbrains.kotlin.psi.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass;
public class KotlinDefinitionsSearcher implements QueryExecutor<PsiElement, DefinitionsScopedSearch.SearchParameters> { public class KotlinDefinitionsSearcher implements QueryExecutor<PsiElement, DefinitionsScopedSearch.SearchParameters> {
@Override @Override
public boolean execute(@NotNull DefinitionsScopedSearch.SearchParameters queryParameters, @NotNull Processor<PsiElement> consumer) { public boolean execute(@NotNull DefinitionsScopedSearch.SearchParameters queryParameters, @NotNull Processor<PsiElement> consumer) {
@@ -82,11 +84,11 @@ public class KotlinDefinitionsSearcher implements QueryExecutor<PsiElement, Defi
return element instanceof KtLightMethod && ((KtLightMethod) element).isDelegated(); return element instanceof KtLightMethod && ((KtLightMethod) element).isDelegated();
} }
private static boolean processClassImplementations(final KtClass klass, Processor<PsiElement> consumer) { private static boolean processClassImplementations(@NotNull final KtClass klass, Processor<PsiElement> consumer) {
PsiClass psiClass = ApplicationManager.getApplication().runReadAction(new Computable<PsiClass>() { PsiClass psiClass = ApplicationManager.getApplication().runReadAction(new Computable<PsiClass>() {
@Override @Override
public PsiClass compute() { public PsiClass compute() {
return LightClassUtil.INSTANCE.getPsiClass(klass); return toLightClass(klass);
} }
}); });
if (psiClass != null) { if (psiClass != null) {
@@ -24,7 +24,7 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.testFramework.LightProjectDescriptor import com.intellij.testFramework.LightProjectDescriptor
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
import org.jetbrains.kotlin.asJava.LightClassUtil import org.jetbrains.kotlin.asJava.toLightClass
import org.jetbrains.kotlin.idea.caches.resolve.KtLightClassForDecompiledDeclaration import org.jetbrains.kotlin.idea.caches.resolve.KtLightClassForDecompiledDeclaration
import org.jetbrains.kotlin.idea.test.JdkAndMockLibraryProjectDescriptor import org.jetbrains.kotlin.idea.test.JdkAndMockLibraryProjectDescriptor
import org.jetbrains.kotlin.idea.test.PluginTestCaseBase import org.jetbrains.kotlin.idea.test.PluginTestCaseBase
@@ -50,7 +50,7 @@ class NavigateFromLibrarySourcesTest: LightCodeInsightFixtureTestCase() {
fun testLightClassForLibrarySource() { fun testLightClassForLibrarySource() {
val navigationElement = navigationElementForReferenceInLibrarySource("Foo") val navigationElement = navigationElementForReferenceInLibrarySource("Foo")
assertTrue(navigationElement is KtClassOrObject, "Foo should navigate to JetClassOrObject") assertTrue(navigationElement is KtClassOrObject, "Foo should navigate to JetClassOrObject")
val lightClass = LightClassUtil.getPsiClass(navigationElement as KtClassOrObject) val lightClass = (navigationElement as KtClassOrObject).toLightClass()
assertTrue(lightClass is KtLightClassForDecompiledDeclaration, assertTrue(lightClass is KtLightClassForDecompiledDeclaration,
"Light classes for decompiled declaration should be provided for library source") "Light classes for decompiled declaration should be provided for library source")
assertEquals("Foo", lightClass!!.name) assertEquals("Foo", lightClass!!.name)
@@ -30,6 +30,8 @@ import org.jetbrains.kotlin.idea.test.PluginTestCaseBase;
import org.jetbrains.kotlin.name.SpecialNames; import org.jetbrains.kotlin.name.SpecialNames;
import org.jetbrains.kotlin.psi.*; import org.jetbrains.kotlin.psi.*;
import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass;
public class KotlinJavaFacadeTest extends KotlinLightCodeInsightFixtureTestCase { public class KotlinJavaFacadeTest extends KotlinLightCodeInsightFixtureTestCase {
@NotNull @NotNull
@Override @Override
@@ -212,7 +214,7 @@ public class KotlinJavaFacadeTest extends KotlinLightCodeInsightFixtureTestCase
assertInstanceOf(element, KtClass.class); assertInstanceOf(element, KtClass.class);
KtClass aClass = (KtClass) element; KtClass aClass = (KtClass) element;
PsiClass createdByWrapDelegate = LightClassUtil.INSTANCE.getPsiClass(aClass); PsiClass createdByWrapDelegate = toLightClass(aClass);
assertNull(createdByWrapDelegate); assertNull(createdByWrapDelegate);
} }
@@ -296,7 +298,7 @@ public class KotlinJavaFacadeTest extends KotlinLightCodeInsightFixtureTestCase
assertNotNull("Caret should be placed to class definition", ktClass); assertNotNull("Caret should be placed to class definition", ktClass);
// Should not fail! // Should not fail!
KtLightClass lightClass = (KtLightClass) LightClassUtil.INSTANCE.getPsiClass(ktClass); KtLightClass lightClass = toLightClass(ktClass);
assertNotNull(String.format("Failed to wrap jetClass '%s' to class", ktClass.getText()), lightClass); assertNotNull(String.format("Failed to wrap jetClass '%s' to class", ktClass.getText()), lightClass);
@@ -22,12 +22,13 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.asJava.KtLightClass; import org.jetbrains.kotlin.asJava.KtLightClass;
import org.jetbrains.kotlin.asJava.KtLightClassForExplicitDeclaration; import org.jetbrains.kotlin.asJava.KtLightClassForExplicitDeclaration;
import org.jetbrains.kotlin.asJava.LightClassUtil;
import org.jetbrains.kotlin.idea.caches.resolve.KtLightClassForDecompiledDeclaration; import org.jetbrains.kotlin.idea.caches.resolve.KtLightClassForDecompiledDeclaration;
import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase; import org.jetbrains.kotlin.idea.test.KotlinLightCodeInsightFixtureTestCase;
import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor; import org.jetbrains.kotlin.idea.test.KotlinWithJdkAndRuntimeLightProjectDescriptor;
import org.jetbrains.kotlin.psi.KtClassOrObject; import org.jetbrains.kotlin.psi.KtClassOrObject;
import static org.jetbrains.kotlin.asJava.LightClassUtilsKt.toLightClass;
public class LightClassEqualsTest extends KotlinLightCodeInsightFixtureTestCase { public class LightClassEqualsTest extends KotlinLightCodeInsightFixtureTestCase {
@NotNull @NotNull
@Override @Override
@@ -58,8 +59,8 @@ public class LightClassEqualsTest extends KotlinLightCodeInsightFixtureTestCase
private static void doTestEquals(@Nullable KtClassOrObject origin) { private static void doTestEquals(@Nullable KtClassOrObject origin) {
assertNotNull(origin); assertNotNull(origin);
PsiClass lightClass1 = LightClassUtil.INSTANCE.getPsiClass(origin); PsiClass lightClass1 = toLightClass(origin);
PsiClass lightClass2 = LightClassUtil.INSTANCE.getPsiClass(origin); PsiClass lightClass2 = toLightClass(origin);
assertNotNull(lightClass1); assertNotNull(lightClass1);
assertNotNull(lightClass2); assertNotNull(lightClass2);