Merge KotlinFileStubImpl and KotlinFileStubForIde into KotlinFileStubImpl

as the only difference is additional fields in KotlinFileStubForIde
This commit is contained in:
Ilya Kirillov
2021-12-10 17:32:35 +01:00
parent a9d7e5db72
commit 53346e0aa6
3 changed files with 61 additions and 16 deletions
@@ -8,7 +8,6 @@ import com.intellij.util.io.StringRef
import org.jetbrains.kotlin.builtins.StandardNames import org.jetbrains.kotlin.builtins.StandardNames
import org.jetbrains.kotlin.descriptors.SourceElement import org.jetbrains.kotlin.descriptors.SourceElement
import org.jetbrains.kotlin.psi.stubs.builder.flags.FlagsToModifiers import org.jetbrains.kotlin.psi.stubs.builder.flags.FlagsToModifiers
import org.jetbrains.kotlin.idea.stubindex.KotlinFileStubForIde
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinaryClass
@@ -22,7 +21,6 @@ import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.protobuf.MessageLite import org.jetbrains.kotlin.protobuf.MessageLite
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.stubs.KotlinUserTypeStub import org.jetbrains.kotlin.psi.stubs.KotlinUserTypeStub
import org.jetbrains.kotlin.psi.stubs.builder.*
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes
import org.jetbrains.kotlin.psi.stubs.impl.* import org.jetbrains.kotlin.psi.stubs.impl.*
import org.jetbrains.kotlin.resolve.jvm.JvmClassName import org.jetbrains.kotlin.resolve.jvm.JvmClassName
@@ -46,7 +44,7 @@ fun createPackageFacadeStub(
packageFqName: FqName, packageFqName: FqName,
c: ClsStubBuilderContext c: ClsStubBuilderContext
): KotlinFileStubImpl { ): KotlinFileStubImpl {
val fileStub = KotlinFileStubForIde.forFile(packageFqName, isScript = false) val fileStub = KotlinFileStubImpl.forFile(packageFqName, isScript = false)
setupFileStub(fileStub, packageFqName) setupFileStub(fileStub, packageFqName)
createPackageDeclarationsStubs( createPackageDeclarationsStubs(
fileStub, c, ProtoContainer.Package(packageFqName, c.nameResolver, c.typeTable, source = null), packageProto fileStub, c, ProtoContainer.Package(packageFqName, c.nameResolver, c.typeTable, source = null), packageProto
@@ -60,7 +58,7 @@ fun createFileFacadeStub(
c: ClsStubBuilderContext c: ClsStubBuilderContext
): KotlinFileStubImpl { ): KotlinFileStubImpl {
val packageFqName = facadeFqName.parent() val packageFqName = facadeFqName.parent()
val fileStub = KotlinFileStubForIde.forFileFacadeStub(facadeFqName) val fileStub = KotlinFileStubImpl.forFileFacadeStub(facadeFqName)
setupFileStub(fileStub, packageFqName) setupFileStub(fileStub, packageFqName)
val container = ProtoContainer.Package( val container = ProtoContainer.Package(
packageFqName, c.nameResolver, c.typeTable, packageFqName, c.nameResolver, c.typeTable,
@@ -78,7 +76,7 @@ fun createMultifileClassStub(
): KotlinFileStubImpl { ): KotlinFileStubImpl {
val packageFqName = header.packageName?.let { FqName(it) } ?: facadeFqName.parent() val packageFqName = header.packageName?.let { FqName(it) } ?: facadeFqName.parent()
val partNames = header.data?.asList()?.map { it.substringAfterLast('/') } val partNames = header.data?.asList()?.map { it.substringAfterLast('/') }
val fileStub = KotlinFileStubForIde.forMultifileClassStub(facadeFqName, partNames) val fileStub = KotlinFileStubImpl.forMultifileClassStub(packageFqName, facadeFqName, partNames)
setupFileStub(fileStub, packageFqName) setupFileStub(fileStub, packageFqName)
for (partFile in partFiles) { for (partFile in partFiles) {
val partHeader = partFile.classHeader val partHeader = partFile.classHeader
@@ -96,7 +94,7 @@ fun createMultifileClassStub(
fun createIncompatibleAbiVersionFileStub() = createFileStub(FqName.ROOT, isScript = false) fun createIncompatibleAbiVersionFileStub() = createFileStub(FqName.ROOT, isScript = false)
fun createFileStub(packageFqName: FqName, isScript: Boolean): KotlinFileStubImpl { fun createFileStub(packageFqName: FqName, isScript: Boolean): KotlinFileStubImpl {
val fileStub = KotlinFileStubForIde.forFile(packageFqName, isScript) val fileStub = KotlinFileStubImpl.forFile(packageFqName, isScript)
setupFileStub(fileStub, packageFqName) setupFileStub(fileStub, packageFqName)
return fileStub return fileStub
} }
@@ -67,7 +67,7 @@ open class StubIndexService protected constructor() {
open fun deserializeFileStub(dataStream: StubInputStream): KotlinFileStub { open fun deserializeFileStub(dataStream: StubInputStream): KotlinFileStub {
val packageFqNameAsString = dataStream.readName() val packageFqNameAsString = dataStream.readName()
val isScript = dataStream.readBoolean() val isScript = dataStream.readBoolean()
return KotlinFileStubImpl(null, packageFqNameAsString!!, isScript) return KotlinFileStubImpl(null, packageFqNameAsString!!.string, isScript)
} }
companion object { companion object {
@@ -21,8 +21,8 @@ import com.intellij.psi.impl.java.stubs.PsiClassStub
import com.intellij.psi.stubs.PsiClassHolderFileStub import com.intellij.psi.stubs.PsiClassHolderFileStub
import com.intellij.psi.stubs.PsiFileStubImpl import com.intellij.psi.stubs.PsiFileStubImpl
import com.intellij.psi.tree.IStubFileElementType import com.intellij.psi.tree.IStubFileElementType
import com.intellij.util.io.StringRef
import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.stubs.KotlinFileStub import org.jetbrains.kotlin.psi.stubs.KotlinFileStub
import org.jetbrains.kotlin.psi.stubs.KotlinImportAliasStub import org.jetbrains.kotlin.psi.stubs.KotlinImportAliasStub
@@ -31,16 +31,33 @@ import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes.FILE
import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes.IMPORT_LIST import org.jetbrains.kotlin.psi.stubs.elements.KtStubElementTypes.IMPORT_LIST
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
open class KotlinFileStubImpl( class KotlinFileStubImpl(
jetFile: KtFile?, ktFile: KtFile?,
private val packageName: StringRef, private val packageName: String,
private val isScript: Boolean private val isScript: Boolean,
) : PsiFileStubImpl<KtFile>(jetFile), KotlinFileStub, PsiClassHolderFileStub<KtFile> { private val facadeFqNameString: String?,
val partSimpleName: String?,
val facadePartSimpleNames: List<String>?,
) : PsiFileStubImpl<KtFile>(ktFile), KotlinFileStub, PsiClassHolderFileStub<KtFile> {
constructor(jetFile: KtFile?, packageName: String, isScript: Boolean) constructor(jetFile: KtFile?, packageName: String, isScript: Boolean) : this(
: this(jetFile, StringRef.fromString(packageName)!!, isScript) jetFile,
packageName,
isScript,
facadeFqNameString = null,
partSimpleName = null,
facadePartSimpleNames = null
)
override fun getPackageFqName(): FqName = FqName(StringRef.toString(packageName)!!) private fun String.relativeToPackage() = getPackageFqName().child(Name.identifier(this))
val partFqName: FqName?
get() = partSimpleName?.relativeToPackage()
val facadeFqName: FqName?
get() = facadeFqNameString?.let(::FqName)
override fun getPackageFqName(): FqName = FqName(packageName)
override fun isScript(): Boolean = isScript override fun isScript(): Boolean = isScript
override fun getType(): IStubFileElementType<KotlinFileStub> = FILE override fun getType(): IStubFileElementType<KotlinFileStub> = FILE
@@ -56,4 +73,34 @@ open class KotlinFileStubImpl(
it.childrenStubs.firstIsInstanceOrNull<KotlinImportAliasStub>()?.getName() == alias it.childrenStubs.firstIsInstanceOrNull<KotlinImportAliasStub>()?.getName() == alias
} }
} }
companion object {
fun forFile(packageFqName: FqName, isScript: Boolean): KotlinFileStubImpl = KotlinFileStubImpl(
ktFile = null,
packageName = packageFqName.asString(),
facadeFqNameString = null,
partSimpleName = null,
facadePartSimpleNames = null,
isScript = isScript
)
fun forFileFacadeStub(facadeFqName: FqName): KotlinFileStubImpl = KotlinFileStubImpl(
ktFile = null,
packageName = facadeFqName.parent().asString(),
facadeFqNameString = facadeFqName.asString(),
partSimpleName = facadeFqName.shortName().asString(),
facadePartSimpleNames = null,
isScript = false
)
fun forMultifileClassStub(packageFqName: FqName, facadeFqName: FqName, partNames: List<String>?): KotlinFileStubImpl =
KotlinFileStubImpl(
ktFile = null,
packageName = packageFqName.asString(),
facadeFqNameString = facadeFqName.asString(),
partSimpleName = null,
facadePartSimpleNames = partNames,
isScript = false,
)
}
} }