Minor. Reformat KtLightClassForSourceDeclaration.kt

This commit is contained in:
Denis Zharkov
2018-10-30 14:49:30 +03:00
parent 0bf3199c19
commit 03e937ddfa
@@ -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
} }
} }