Minor. Reformat KtLightClassForSourceDeclaration.kt
This commit is contained in:
+46
-48
@@ -38,7 +38,6 @@ import com.intellij.psi.util.CachedValuesManager
|
|||||||
import com.intellij.psi.util.PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
|
import com.intellij.psi.util.PsiModificationTracker.OUT_OF_CODE_BLOCK_MODIFICATION_COUNT
|
||||||
import com.intellij.psi.util.PsiUtilCore
|
import com.intellij.psi.util.PsiUtilCore
|
||||||
import com.intellij.util.IncorrectOperationException
|
import com.intellij.util.IncorrectOperationException
|
||||||
import com.intellij.util.SystemProperties
|
|
||||||
import com.intellij.util.containers.ContainerUtil
|
import com.intellij.util.containers.ContainerUtil
|
||||||
import org.jetbrains.annotations.NonNls
|
import org.jetbrains.annotations.NonNls
|
||||||
import org.jetbrains.kotlin.asJava.ImpreciseResolveResult
|
import org.jetbrains.kotlin.asJava.ImpreciseResolveResult
|
||||||
@@ -71,8 +70,8 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
import javax.swing.Icon
|
import javax.swing.Icon
|
||||||
|
|
||||||
abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtClassOrObject)
|
abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtClassOrObject) : KtLazyLightClass(classOrObject.manager),
|
||||||
: KtLazyLightClass(classOrObject.manager), StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> {
|
StubBasedPsiElement<KotlinClassOrObjectStub<out KtClassOrObject>> {
|
||||||
private val lightIdentifier = KtLightIdentifier(this, classOrObject)
|
private val lightIdentifier = KtLightIdentifier(this, classOrObject)
|
||||||
|
|
||||||
private val _extendsList by lazyPub { createExtendsList() }
|
private val _extendsList by lazyPub { createExtendsList() }
|
||||||
@@ -115,10 +114,11 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
override fun findReferenceAt(offset: Int) = ktFile.findReferenceAt(offset)
|
override fun findReferenceAt(offset: Int) = ktFile.findReferenceAt(offset)
|
||||||
|
|
||||||
override fun processDeclarations(
|
override fun processDeclarations(
|
||||||
processor: PsiScopeProcessor,
|
processor: PsiScopeProcessor,
|
||||||
state: ResolveState,
|
state: ResolveState,
|
||||||
lastParent: PsiElement?,
|
lastParent: PsiElement?,
|
||||||
place: PsiElement): Boolean {
|
place: PsiElement
|
||||||
|
): Boolean {
|
||||||
if (!super.processDeclarations(processor, state, lastParent, place)) return false
|
if (!super.processDeclarations(processor, state, lastParent, place)) return false
|
||||||
|
|
||||||
// We have to explicitly process package declarations if current file belongs to default package
|
// We have to explicitly process package declarations if current file belongs to default package
|
||||||
@@ -201,8 +201,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
// Top-level private class has PACKAGE_LOCAL visibility in Java
|
// Top-level private class has PACKAGE_LOCAL visibility in Java
|
||||||
// Nested private class has PRIVATE visibility
|
// Nested private class has PRIVATE visibility
|
||||||
psiModifiers.add(if (classOrObject.isTopLevel()) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE)
|
psiModifiers.add(if (classOrObject.isTopLevel()) PsiModifier.PACKAGE_LOCAL else PsiModifier.PRIVATE)
|
||||||
}
|
} else if (!psiModifiers.contains(PsiModifier.PROTECTED)) {
|
||||||
else if (!psiModifiers.contains(PsiModifier.PROTECTED)) {
|
|
||||||
psiModifiers.add(PsiModifier.PUBLIC)
|
psiModifiers.add(PsiModifier.PUBLIC)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -210,8 +209,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
// FINAL
|
// FINAL
|
||||||
if (isAbstract() || isSealed()) {
|
if (isAbstract() || isSealed()) {
|
||||||
psiModifiers.add(PsiModifier.ABSTRACT)
|
psiModifiers.add(PsiModifier.ABSTRACT)
|
||||||
}
|
} else if (!(classOrObject.hasModifier(OPEN_KEYWORD) || (classOrObject is KtClass && classOrObject.isEnum()))) {
|
||||||
else if (!(classOrObject.hasModifier(OPEN_KEYWORD) || (classOrObject is KtClass && classOrObject.isEnum()))) {
|
|
||||||
psiModifiers.add(PsiModifier.FINAL)
|
psiModifiers.add(PsiModifier.FINAL)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,8 +279,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
val qualifiedName: String? = if (baseClass is KtLightClassForSourceDeclaration) {
|
val qualifiedName: String? = if (baseClass is KtLightClassForSourceDeclaration) {
|
||||||
val baseDescriptor = baseClass.getDescriptor()
|
val baseDescriptor = baseClass.getDescriptor()
|
||||||
if (baseDescriptor != null) DescriptorUtils.getFqName(baseDescriptor).asString() else null
|
if (baseDescriptor != null) DescriptorUtils.getFqName(baseDescriptor).asString() else null
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
baseClass.qualifiedName
|
baseClass.qualifiedName
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,11 +298,11 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
override fun getOwnInnerClasses(): List<PsiClass> {
|
override fun getOwnInnerClasses(): List<PsiClass> {
|
||||||
val result = ArrayList<PsiClass>()
|
val result = ArrayList<PsiClass>()
|
||||||
classOrObject.declarations.filterIsInstance<KtClassOrObject>()
|
classOrObject.declarations.filterIsInstance<KtClassOrObject>()
|
||||||
// workaround for ClassInnerStuffCache not supporting classes with null names, see KT-13927
|
// workaround for ClassInnerStuffCache not supporting classes with null names, see KT-13927
|
||||||
// inner classes with null names can't be searched for and can't be used from java anyway
|
// inner classes with null names can't be searched for and can't be used from java anyway
|
||||||
// we can't prohibit creating light classes with null names either since they can contain members
|
// we can't prohibit creating light classes with null names either since they can contain members
|
||||||
.filter { it.name != null }
|
.filter { it.name != null }
|
||||||
.mapNotNullTo(result) { create(it) }
|
.mapNotNullTo(result) { create(it) }
|
||||||
|
|
||||||
if (classOrObject.hasInterfaceDefaultImpls) {
|
if (classOrObject.hasInterfaceDefaultImpls) {
|
||||||
result.add(KtLightClassForInterfaceDefaultImpls(classOrObject))
|
result.add(KtLightClassForInterfaceDefaultImpls(classOrObject))
|
||||||
@@ -327,17 +324,17 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
private val JAVA_API_STUB = Key.create<CachedValue<LightClassDataHolder.ForClass>>("JAVA_API_STUB")
|
private val JAVA_API_STUB = Key.create<CachedValue<LightClassDataHolder.ForClass>>("JAVA_API_STUB")
|
||||||
|
|
||||||
private val jetTokenToPsiModifier = listOf(
|
private val jetTokenToPsiModifier = listOf(
|
||||||
PUBLIC_KEYWORD to PsiModifier.PUBLIC,
|
PUBLIC_KEYWORD to PsiModifier.PUBLIC,
|
||||||
INTERNAL_KEYWORD to PsiModifier.PUBLIC,
|
INTERNAL_KEYWORD to PsiModifier.PUBLIC,
|
||||||
PROTECTED_KEYWORD to PsiModifier.PROTECTED,
|
PROTECTED_KEYWORD to PsiModifier.PROTECTED,
|
||||||
FINAL_KEYWORD to PsiModifier.FINAL)
|
FINAL_KEYWORD to PsiModifier.FINAL
|
||||||
|
)
|
||||||
|
|
||||||
fun create(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? =
|
fun create(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? =
|
||||||
CachedValuesManager.getCachedValue(classOrObject) {
|
CachedValuesManager.getCachedValue(classOrObject) {
|
||||||
CachedValueProvider.Result
|
CachedValueProvider.Result
|
||||||
.create(createNoCache(classOrObject), OUT_OF_CODE_BLOCK_MODIFICATION_COUNT)
|
.create(createNoCache(classOrObject), OUT_OF_CODE_BLOCK_MODIFICATION_COUNT)
|
||||||
}
|
}
|
||||||
|
|
||||||
fun createNoCache(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? {
|
fun createNoCache(classOrObject: KtClassOrObject): KtLightClassForSourceDeclaration? {
|
||||||
if (classOrObject.shouldNotBeVisibleAsLightClass()) {
|
if (classOrObject.shouldNotBeVisibleAsLightClass()) {
|
||||||
@@ -365,17 +362,18 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
return InvalidLightClassDataHolder
|
return InvalidLightClassDataHolder
|
||||||
}
|
}
|
||||||
|
|
||||||
return classOrObject.containingKtFile.script?.let { KtLightClassForScript.getLightClassCachedValue(it).value } ?:
|
return classOrObject.containingKtFile.script?.let { KtLightClassForScript.getLightClassCachedValue(it).value }
|
||||||
getLightClassCachedValue(classOrObject).value
|
?: getLightClassCachedValue(classOrObject).value
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun getLightClassCachedValue(classOrObject: KtClassOrObject): CachedValue<LightClassDataHolder.ForClass> {
|
private fun getLightClassCachedValue(classOrObject: KtClassOrObject): CachedValue<LightClassDataHolder.ForClass> {
|
||||||
var value =
|
var value =
|
||||||
getOutermostClassOrObject(classOrObject).getUserData(JAVA_API_STUB) // stub computed for outer class can be used for inner/nested
|
getOutermostClassOrObject(classOrObject).getUserData(JAVA_API_STUB) // stub computed for outer class can be used for inner/nested
|
||||||
?: classOrObject.getUserData(JAVA_API_STUB)
|
?: classOrObject.getUserData(JAVA_API_STUB)
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
value = CachedValuesManager.getManager(classOrObject.project).createCachedValue(
|
value = CachedValuesManager.getManager(classOrObject.project).createCachedValue(
|
||||||
LightClassDataProviderForClassOrObject(classOrObject), false)
|
LightClassDataProviderForClassOrObject(classOrObject), false
|
||||||
|
)
|
||||||
value = classOrObject.putUserDataIfAbsent(JAVA_API_STUB, value)
|
value = classOrObject.putUserDataIfAbsent(JAVA_API_STUB, value)
|
||||||
}
|
}
|
||||||
return value
|
return value
|
||||||
@@ -388,9 +386,9 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
|
|
||||||
val fqName = FqNameUnsafe(qualifiedName)
|
val fqName = FqNameUnsafe(qualifiedName)
|
||||||
val mappedQName =
|
val mappedQName =
|
||||||
if (fqName.isSafe)
|
if (fqName.isSafe)
|
||||||
JavaToKotlinClassMap.mapJavaToKotlin(fqName.toSafe())?.asSingleFqName()?.asString()
|
JavaToKotlinClassMap.mapJavaToKotlin(fqName.toSafe())?.asSingleFqName()?.asString()
|
||||||
else null
|
else null
|
||||||
if (qualifiedName == mappedQName) return true
|
if (qualifiedName == mappedQName) return true
|
||||||
|
|
||||||
for (superType in classDescriptor.typeConstructor.supertypes) {
|
for (superType in classDescriptor.typeConstructor.supertypes) {
|
||||||
@@ -429,8 +427,7 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
}
|
}
|
||||||
|
|
||||||
private fun getSupertypeByPsi(): PsiImmediateClassType? {
|
private fun getSupertypeByPsi(): PsiImmediateClassType? {
|
||||||
return classOrObject.defaultJavaAncestorQualifiedName()?.let {
|
return classOrObject.defaultJavaAncestorQualifiedName()?.let { ancestorFqName ->
|
||||||
ancestorFqName ->
|
|
||||||
JavaPsiFacade.getInstance(project).findClass(ancestorFqName, resolveScope)?.let {
|
JavaPsiFacade.getInstance(project).findClass(ancestorFqName, resolveScope)?.let {
|
||||||
PsiImmediateClassType(it, createSubstitutor(it))
|
PsiImmediateClassType(it, createSubstitutor(it))
|
||||||
}
|
}
|
||||||
@@ -443,17 +440,17 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
}
|
}
|
||||||
val javaLangEnumsTypeParameter = ancestor.typeParameters.firstOrNull() ?: return PsiSubstitutor.EMPTY
|
val javaLangEnumsTypeParameter = ancestor.typeParameters.firstOrNull() ?: return PsiSubstitutor.EMPTY
|
||||||
return PsiSubstitutorImpl.createSubstitutor(
|
return PsiSubstitutorImpl.createSubstitutor(
|
||||||
mapOf(
|
mapOf(
|
||||||
javaLangEnumsTypeParameter to PsiImmediateClassType(this, PsiSubstitutor.EMPTY)
|
javaLangEnumsTypeParameter to PsiImmediateClassType(this, PsiSubstitutor.EMPTY)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override val originKind: LightClassOriginKind
|
override val originKind: LightClassOriginKind
|
||||||
get() = LightClassOriginKind.SOURCE
|
get() = LightClassOriginKind.SOURCE
|
||||||
|
|
||||||
private class KtLightClassModifierList(containingClass: KtLightClassForSourceDeclaration)
|
private class KtLightClassModifierList(containingClass: KtLightClassForSourceDeclaration) :
|
||||||
: KtLightModifierList<KtLightClassForSourceDeclaration>(containingClass) {
|
KtLightModifierList<KtLightClassForSourceDeclaration>(containingClass) {
|
||||||
|
|
||||||
private val modifiers by lazyPub { containingClass.computeModifiers() }
|
private val modifiers by lazyPub { containingClass.computeModifiers() }
|
||||||
|
|
||||||
@@ -470,20 +467,21 @@ abstract class KtLightClassForSourceDeclaration(protected val classOrObject: KtC
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun KtLightClassForSourceDeclaration.isPossiblyAffectedByAllOpen() = !isAnnotationType && !isInterface && kotlinOrigin.annotationEntries.isNotEmpty()
|
fun KtLightClassForSourceDeclaration.isPossiblyAffectedByAllOpen() =
|
||||||
|
!isAnnotationType && !isInterface && kotlinOrigin.annotationEntries.isNotEmpty()
|
||||||
|
|
||||||
fun getOutermostClassOrObject(classOrObject: KtClassOrObject): KtClassOrObject {
|
fun getOutermostClassOrObject(classOrObject: KtClassOrObject): KtClassOrObject {
|
||||||
val outermostClass = KtPsiUtil.getOutermostClassOrObject(classOrObject) ?:
|
val outermostClass = KtPsiUtil.getOutermostClassOrObject(classOrObject)
|
||||||
throw IllegalStateException("Attempt to build a light class for a local class: " + classOrObject.text)
|
?: throw IllegalStateException("Attempt to build a light class for a local class: " + classOrObject.text)
|
||||||
|
|
||||||
return outermostClass
|
return outermostClass
|
||||||
}
|
}
|
||||||
|
|
||||||
interface LightClassInheritanceHelper {
|
interface LightClassInheritanceHelper {
|
||||||
fun isInheritor(
|
fun isInheritor(
|
||||||
lightClass: KtLightClass,
|
lightClass: KtLightClass,
|
||||||
baseClass: PsiClass,
|
baseClass: PsiClass,
|
||||||
checkDeep: Boolean
|
checkDeep: Boolean
|
||||||
): ImpreciseResolveResult
|
): ImpreciseResolveResult
|
||||||
|
|
||||||
object NoHelp : LightClassInheritanceHelper {
|
object NoHelp : LightClassInheritanceHelper {
|
||||||
@@ -492,7 +490,7 @@ interface LightClassInheritanceHelper {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
fun getService(project: Project): LightClassInheritanceHelper =
|
fun getService(project: Project): LightClassInheritanceHelper =
|
||||||
ServiceManager.getService(project, LightClassInheritanceHelper::class.java) ?: NoHelp
|
ServiceManager.getService(project, LightClassInheritanceHelper::class.java) ?: NoHelp
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user