Revert "[light classes] drop old light classes and backend: iteration #2"
This reverts commit 97ce502cbe.
This commit is contained in:
+8
-1
@@ -5,9 +5,11 @@
|
||||
|
||||
package org.jetbrains.kotlin.asJava.builder
|
||||
|
||||
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub
|
||||
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
||||
|
||||
interface LightClassDataHolder {
|
||||
val javaFileStub: PsiJavaFileStub
|
||||
val extraDiagnostics: Diagnostics
|
||||
|
||||
interface ForClass : LightClassDataHolder
|
||||
@@ -16,11 +18,16 @@ interface LightClassDataHolder {
|
||||
}
|
||||
|
||||
object InvalidLightClassDataHolder : LightClassDataHolder.ForClass {
|
||||
override val extraDiagnostics: Diagnostics get() = shouldNotBeCalled()
|
||||
override val javaFileStub: PsiJavaFileStub
|
||||
get() = shouldNotBeCalled()
|
||||
|
||||
override val extraDiagnostics: Diagnostics
|
||||
get() = shouldNotBeCalled()
|
||||
|
||||
private fun shouldNotBeCalled(): Nothing = throw UnsupportedOperationException("Should not be called")
|
||||
}
|
||||
|
||||
class LightClassDataHolderImpl(
|
||||
override val javaFileStub: PsiJavaFileStub,
|
||||
override val extraDiagnostics: Diagnostics
|
||||
) : LightClassDataHolder.ForClass, LightClassDataHolder.ForFacade, LightClassDataHolder.ForScript
|
||||
|
||||
+1
@@ -47,6 +47,7 @@ abstract class KtLightClassForFacadeImpl constructor(
|
||||
FakeFileForLightClass(
|
||||
firstFileInFacade,
|
||||
lightClass = { this },
|
||||
stub = { null },
|
||||
packageFqName = facadeClassFqName.parent()
|
||||
)
|
||||
}
|
||||
|
||||
+1
@@ -43,6 +43,7 @@ abstract class KtLightClassForScript(val script: KtScript) : KtLazyLightClass(sc
|
||||
FakeFileForLightClass(
|
||||
script.containingKtFile,
|
||||
lightClass = { this },
|
||||
stub = { null },
|
||||
packageFqName = fqName.parent(),
|
||||
)
|
||||
}
|
||||
|
||||
+13
@@ -12,6 +12,7 @@ import com.intellij.openapi.util.Key
|
||||
import com.intellij.openapi.util.TextRange
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.impl.InheritanceImplUtil
|
||||
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub
|
||||
import com.intellij.psi.impl.source.PsiImmediateClassType
|
||||
import com.intellij.psi.impl.source.tree.TreeUtil
|
||||
import com.intellij.psi.scope.PsiScopeProcessor
|
||||
@@ -43,6 +44,7 @@ import org.jetbrains.kotlin.load.java.structure.LightClassOriginKind
|
||||
import org.jetbrains.kotlin.name.FqNameUnsafe
|
||||
import org.jetbrains.kotlin.psi.*
|
||||
import org.jetbrains.kotlin.psi.debugText.getDebugText
|
||||
import org.jetbrains.kotlin.psi.psiUtil.getElementTextWithContext
|
||||
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
|
||||
import org.jetbrains.kotlin.psi.psiUtil.parentsWithSelf
|
||||
import org.jetbrains.kotlin.psi.stubs.KotlinClassOrObjectStub
|
||||
@@ -97,13 +99,24 @@ abstract class KtLightClassForSourceDeclaration(
|
||||
abstract override fun getParent(): PsiElement?
|
||||
abstract override fun getQualifiedName(): String?
|
||||
|
||||
private fun getJavaFileStub(): PsiJavaFileStub = getLightClassDataHolder().javaFileStub
|
||||
|
||||
fun getDescriptor() =
|
||||
LightClassGenerationSupport.getInstance(project).resolveToDescriptor(classOrObject) as? ClassDescriptor
|
||||
|
||||
protected fun getLightClassDataHolder(): LightClassDataHolder.ForClass {
|
||||
val lightClassData = getLightClassDataHolder(classOrObject)
|
||||
if (lightClassData is InvalidLightClassDataHolder) {
|
||||
LOG.error("Invalid light class data for existing light class:\n$lightClassData\n${classOrObject.getElementTextWithContext()}")
|
||||
}
|
||||
return lightClassData
|
||||
}
|
||||
|
||||
private val _containingFile: PsiFile by lazyPub {
|
||||
object : FakeFileForLightClass(
|
||||
classOrObject.containingKtFile,
|
||||
{ if (classOrObject.isTopLevel()) this else create(getOutermostClassOrObject(classOrObject))!! },
|
||||
{ getJavaFileStub() }
|
||||
) {
|
||||
override fun findReferenceAt(offset: Int) = ktFile.findReferenceAt(offset)
|
||||
|
||||
|
||||
+1
-6
@@ -7,7 +7,6 @@ package org.jetbrains.kotlin.asJava.classes
|
||||
|
||||
import com.intellij.psi.*
|
||||
import com.intellij.psi.impl.PsiImplUtil
|
||||
import com.intellij.psi.impl.compiled.ClsJavaCodeReferenceElementImpl
|
||||
import com.intellij.psi.impl.light.LightIdentifier
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightAbstractAnnotation
|
||||
import org.jetbrains.kotlin.asJava.elements.KtLightElementBase
|
||||
@@ -48,11 +47,7 @@ class KtUltraLightSimpleAnnotation(
|
||||
parent: PsiElement,
|
||||
private val nameReferenceElementProvider: (() -> PsiJavaCodeReferenceElement?)? = null,
|
||||
) : KtLightAbstractAnnotation(parent) {
|
||||
private val _nameReferenceElement: PsiJavaCodeReferenceElement? by lazyPub {
|
||||
nameReferenceElementProvider?.invoke() ?: annotationFqName?.let { ClsJavaCodeReferenceElementImpl(parent, it) }
|
||||
}
|
||||
|
||||
override fun getNameReferenceElement(): PsiJavaCodeReferenceElement? = _nameReferenceElement
|
||||
override fun getNameReferenceElement(): PsiJavaCodeReferenceElement? = nameReferenceElementProvider?.invoke()
|
||||
|
||||
private val parameterList = ParameterListImpl()
|
||||
|
||||
|
||||
@@ -69,6 +69,9 @@ internal class KtUltraLightFieldForSourceDeclaration(
|
||||
private val lightIdentifier = KtLightIdentifier(this, declaration)
|
||||
|
||||
override fun getNameIdentifier(): PsiIdentifier = lightIdentifier
|
||||
override fun getText(): String? = kotlinOrigin.text
|
||||
override fun getTextRange(): TextRange = kotlinOrigin.textRange
|
||||
override fun getTextOffset(): Int = kotlinOrigin.textOffset
|
||||
override fun getStartOffsetInParent(): Int = kotlinOrigin.startOffsetInParent
|
||||
override fun isWritable(): Boolean = kotlinOrigin.isWritable
|
||||
override fun getNavigationElement(): PsiElement = kotlinOrigin.navigationElement ?: this
|
||||
@@ -103,10 +106,6 @@ internal open class KtUltraLightFieldImpl protected constructor(
|
||||
|
||||
override fun getLanguage(): Language = KotlinLanguage.INSTANCE
|
||||
|
||||
override fun getText(): String? = kotlinOrigin.text
|
||||
override fun getTextRange(): TextRange? = kotlinOrigin.textRange
|
||||
override fun getTextOffset(): Int = kotlinOrigin.textOffset
|
||||
|
||||
private val variableDescriptor: VariableDescriptor?
|
||||
get() = declaration.resolve()
|
||||
?.let { it as? PropertyDescriptor ?: it as? ValueParameterDescriptor }
|
||||
@@ -117,14 +116,11 @@ internal open class KtUltraLightFieldImpl protected constructor(
|
||||
declaration.delegateExpression?.let {
|
||||
LightClassGenerationSupport.getInstance(project).analyze(it).getType(it)
|
||||
}
|
||||
|
||||
declaration is KtObjectDeclaration ->
|
||||
(declaration.resolve() as? ClassDescriptor)?.defaultType
|
||||
|
||||
declaration is KtEnumEntry -> {
|
||||
(containingClass.kotlinOrigin?.resolve() as? ClassDescriptor)?.defaultType
|
||||
}
|
||||
|
||||
else -> {
|
||||
declaration.getKotlinType()
|
||||
}
|
||||
@@ -149,7 +145,6 @@ internal open class KtUltraLightFieldImpl protected constructor(
|
||||
kotlinType?.asPsiType(support, TypeMappingMode.DEFAULT, this)
|
||||
?.let(TypeConversionUtil::erasure)
|
||||
?: nonExistent()
|
||||
|
||||
else -> {
|
||||
val kotlinType = declaration.getKotlinType() ?: return@lazyPub PsiType.NULL
|
||||
val descriptor = variableDescriptor ?: return@lazyPub PsiType.NULL
|
||||
|
||||
+5
-7
@@ -90,9 +90,8 @@ internal abstract class KtUltraLightParameter(
|
||||
ultraLightMethod,
|
||||
ultraLightMethod.language
|
||||
), KtUltraLightElementWithNullabilityAnnotation<KtParameter, PsiParameter>, KtLightParameter {
|
||||
override fun isEquivalentTo(another: PsiElement?): Boolean {
|
||||
return another is KtParameter && kotlinOrigin?.isEquivalentTo(another) == true || this == another
|
||||
}
|
||||
|
||||
override fun isEquivalentTo(another: PsiElement?): Boolean = kotlinOrigin == another
|
||||
|
||||
private val lightModifierList by lazyPub { KtLightSimpleModifierList(this, emptySet()) }
|
||||
|
||||
@@ -101,10 +100,6 @@ internal abstract class KtUltraLightParameter(
|
||||
override fun getNavigationElement(): PsiElement = kotlinOrigin ?: method.navigationElement
|
||||
override fun getUseScope(): SearchScope = kotlinOrigin?.useScope ?: LocalSearchScope(this)
|
||||
|
||||
override fun getText(): String? = kotlinOrigin?.text.orEmpty()
|
||||
override fun getTextRange(): TextRange? = kotlinOrigin?.textRange
|
||||
override fun getTextOffset(): Int = kotlinOrigin?.textOffset ?: super.getTextOffset()
|
||||
|
||||
override fun isValid() = parent.isValid
|
||||
|
||||
override fun computeQualifiedNameForNullabilityAnnotation(kotlinType: KotlinType?): String? {
|
||||
@@ -203,6 +198,9 @@ internal class KtUltraLightParameterForSource(
|
||||
}
|
||||
}
|
||||
|
||||
override fun getText(): String? = kotlinOrigin.text
|
||||
override fun getTextRange(): TextRange = kotlinOrigin.textRange
|
||||
override fun getTextOffset(): Int = kotlinOrigin.textOffset
|
||||
override fun getStartOffsetInParent(): Int = kotlinOrigin.startOffsetInParent
|
||||
override fun isWritable(): Boolean = kotlinOrigin.isWritable
|
||||
override fun getNavigationElement(): PsiElement = kotlinOrigin.navigationElement
|
||||
|
||||
+4
-2
@@ -19,6 +19,7 @@ import com.intellij.psi.impl.java.stubs.impl.PsiJavaFileStubImpl
|
||||
import com.intellij.psi.impl.source.PsiFileImpl
|
||||
import com.intellij.psi.impl.source.SourceTreeToPsiMap
|
||||
import com.intellij.psi.impl.source.tree.TreeElement
|
||||
import com.intellij.psi.stubs.PsiClassHolderFileStub
|
||||
import com.intellij.psi.util.PsiUtil
|
||||
import com.intellij.reference.SoftReference
|
||||
import com.intellij.util.AstLoadingFilter
|
||||
@@ -32,7 +33,8 @@ import java.lang.ref.Reference
|
||||
open class FakeFileForLightClass(
|
||||
val ktFile: KtFile,
|
||||
private val lightClass: () -> KtLightClass,
|
||||
private val packageFqName: FqName = ktFile.packageFqName,
|
||||
private val stub: () -> PsiClassHolderFileStub<*>?,
|
||||
private val packageFqName: FqName = ktFile.packageFqName
|
||||
) : ClsFileImpl(ktFile.viewProvider) {
|
||||
|
||||
override fun getVirtualFile(): VirtualFile =
|
||||
@@ -47,7 +49,7 @@ open class FakeFileForLightClass(
|
||||
return javaFileStub
|
||||
}
|
||||
|
||||
override fun getStub() = createFakeJavaFileStub()
|
||||
override fun getStub() = stub() ?: createFakeJavaFileStub()
|
||||
|
||||
override fun getClasses() = arrayOf(lightClass())
|
||||
|
||||
|
||||
+6
-17
@@ -20,7 +20,6 @@ import org.jetbrains.kotlin.psi.KtAnnotationEntry
|
||||
import org.jetbrains.kotlin.psi.KtClass
|
||||
import org.jetbrains.kotlin.psi.KtModifierListOwner
|
||||
import org.jetbrains.kotlin.resolve.constants.ArrayValue
|
||||
import org.jetbrains.kotlin.resolve.constants.ConstantValue
|
||||
import org.jetbrains.kotlin.resolve.constants.EnumValue
|
||||
import org.jetbrains.kotlin.resolve.constants.KClassValue
|
||||
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
|
||||
@@ -92,10 +91,11 @@ internal fun PsiAnnotation.tryConvertAsTarget(support: KtUltraLightSupport): KtL
|
||||
|
||||
val targetAttributes = "value" to ArrayValue(convertedValues) { module -> module.builtIns.array.defaultType }
|
||||
|
||||
return asUltraLightSimpleAnnotation(
|
||||
return KtUltraLightSimpleAnnotation(
|
||||
JAVA_LANG_ANNOTATION_TARGET,
|
||||
listOf(targetAttributes),
|
||||
support,
|
||||
parent
|
||||
)
|
||||
}
|
||||
|
||||
@@ -111,28 +111,17 @@ internal fun createRetentionRuntimeAnnotation(support: KtUltraLightSupport, pare
|
||||
JAVA_LANG_ANNOTATION_RETENTION,
|
||||
listOf("value" to retentionMapping["kotlin.annotation.AnnotationRetention.RUNTIME"]!!),
|
||||
support,
|
||||
parent,
|
||||
)
|
||||
|
||||
internal fun PsiAnnotation.asUltraLightSimpleAnnotation(
|
||||
qualifier: String,
|
||||
argumentsList: List<Pair<String, ConstantValue<*>>>,
|
||||
ultraLightSupport: KtUltraLightSupport,
|
||||
): KtLightAbstractAnnotation = KtUltraLightSimpleAnnotation(
|
||||
annotationFqName = qualifier,
|
||||
argumentsList = argumentsList,
|
||||
ultraLightSupport = ultraLightSupport,
|
||||
parent = parent,
|
||||
nameReferenceElementProvider = { nameReferenceElement }
|
||||
parent
|
||||
)
|
||||
|
||||
internal fun PsiAnnotation.tryConvertAsRetention(support: KtUltraLightSupport): KtLightAbstractAnnotation? {
|
||||
if (FqNames.retention.asString() != qualifiedName) return null
|
||||
val convertedValue = extractAnnotationFqName("value")?.let { retentionMapping[it] } ?: return null
|
||||
return asUltraLightSimpleAnnotation(
|
||||
return KtUltraLightSimpleAnnotation(
|
||||
JAVA_LANG_ANNOTATION_RETENTION,
|
||||
listOf("value" to convertedValue),
|
||||
support,
|
||||
parent
|
||||
)
|
||||
}
|
||||
|
||||
@@ -182,5 +171,5 @@ private fun PsiAnnotation.tryConvertAs(
|
||||
from: FqName,
|
||||
to: String,
|
||||
): KtLightAbstractAnnotation? = takeIf { from.asString() == qualifiedName }?.let {
|
||||
asUltraLightSimpleAnnotation(to, emptyList(), support)
|
||||
KtUltraLightSimpleAnnotation(to, emptyList(), support, parent)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user