Add UL support for classes

This commit is contained in:
Igor Yakovlev
2019-06-06 23:02:50 +03:00
parent b7849da19e
commit 44f19e1225
3 changed files with 64 additions and 6 deletions
@@ -0,0 +1,59 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
package org.jetbrains.kotlin.asJava.classes
import com.intellij.psi.HierarchicalMethodSignature
import com.intellij.psi.PsiClass
import com.intellij.psi.PsiElement
import com.intellij.psi.impl.PsiSuperMethodImplUtil
import org.jetbrains.kotlin.asJava.elements.KtLightField
import org.jetbrains.kotlin.asJava.elements.KtLightMethod
import org.jetbrains.kotlin.psi.KtClassOrObject
class KtUltraLightInlineClass(
classOrObject: KtClassOrObject,
support: KtUltraLightSupport
) : KtUltraLightClass(classOrObject, support) {
override fun getDelegate(): PsiClass =
throw IllegalStateException("Cls delegate shouldn't be loaded for not too complex ultra-light classes! Qualified name: $qualifiedName")
override fun getScope(): PsiElement? = parent
private val _ownMethods: List<KtLightMethod> by lazyPub {
val inlineClassParameter = classOrObject
.primaryConstructor
?.valueParameters
?.firstOrNull()
?: return@lazyPub emptyList()
UltraLightMembersCreator(
containingClass = this,
containingClassIsNamedObject = false,
containingClassIsSealed = false,
mangleInternalFunctions = false,
support = support
).run {
propertyAccessors(
inlineClassParameter,
mutable = false,
forceStatic = false,
onlyJvmStatic = false
)
}
}
override fun getOwnFields(): List<KtLightField> = emptyList()
override fun getOwnMethods() = _ownMethods
override fun getVisibleSignatures(): MutableCollection<HierarchicalMethodSignature> = PsiSuperMethodImplUtil.getVisibleSignatures(this)
override fun copy(): KtUltraLightInlineClass =
KtUltraLightInlineClass(classOrObject, support)
}
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.psi.psiUtil.hasSuspendModifier
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.descriptorUtil.isPublishedApi
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.inline.isInlineOnly
import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_OVERLOADS_FQ_NAME
import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_SYNTHETIC_ANNOTATION_FQ_NAME
@@ -147,10 +147,7 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG
}
private fun findTooComplexDeclaration(declaration: KtDeclaration): PsiElement? {
if (declaration.hasExpectModifier() ||
declaration.hasModifier(KtTokens.ANNOTATION_KEYWORD) ||
declaration.hasModifier(KtTokens.INLINE_KEYWORD) && declaration is KtClassOrObject
) {
if (declaration.hasExpectModifier() || declaration.hasModifier(KtTokens.ANNOTATION_KEYWORD)) {
return declaration
}
@@ -213,7 +210,10 @@ class IDELightClassGenerationSupport(private val project: Project) : LightClassG
val module = ModuleUtilCore.findModuleForPsiElement(element) ?: return null
return KtUltraLightClass(element, KtUltraLightSupportImpl(element, module))
return KtUltraLightSupportImpl(element, module).let {
if (element.hasModifier(KtTokens.INLINE_KEYWORD)) KtUltraLightInlineClass(element, it)
else KtUltraLightClass(element, it)
}
}
private fun implementsKotlinCollection(classOrObject: KtClassOrObject): Boolean {