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.descriptors.SourceElement
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.load.kotlin.JvmPackagePartSource
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.psi.*
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.impl.*
import org.jetbrains.kotlin.resolve.jvm.JvmClassName
@@ -46,7 +44,7 @@ fun createPackageFacadeStub(
packageFqName: FqName,
c: ClsStubBuilderContext
): KotlinFileStubImpl {
val fileStub = KotlinFileStubForIde.forFile(packageFqName, isScript = false)
val fileStub = KotlinFileStubImpl.forFile(packageFqName, isScript = false)
setupFileStub(fileStub, packageFqName)
createPackageDeclarationsStubs(
fileStub, c, ProtoContainer.Package(packageFqName, c.nameResolver, c.typeTable, source = null), packageProto
@@ -60,7 +58,7 @@ fun createFileFacadeStub(
c: ClsStubBuilderContext
): KotlinFileStubImpl {
val packageFqName = facadeFqName.parent()
val fileStub = KotlinFileStubForIde.forFileFacadeStub(facadeFqName)
val fileStub = KotlinFileStubImpl.forFileFacadeStub(facadeFqName)
setupFileStub(fileStub, packageFqName)
val container = ProtoContainer.Package(
packageFqName, c.nameResolver, c.typeTable,
@@ -78,7 +76,7 @@ fun createMultifileClassStub(
): KotlinFileStubImpl {
val packageFqName = header.packageName?.let { FqName(it) } ?: facadeFqName.parent()
val partNames = header.data?.asList()?.map { it.substringAfterLast('/') }
val fileStub = KotlinFileStubForIde.forMultifileClassStub(facadeFqName, partNames)
val fileStub = KotlinFileStubImpl.forMultifileClassStub(packageFqName, facadeFqName, partNames)
setupFileStub(fileStub, packageFqName)
for (partFile in partFiles) {
val partHeader = partFile.classHeader
@@ -96,7 +94,7 @@ fun createMultifileClassStub(
fun createIncompatibleAbiVersionFileStub() = createFileStub(FqName.ROOT, isScript = false)
fun createFileStub(packageFqName: FqName, isScript: Boolean): KotlinFileStubImpl {
val fileStub = KotlinFileStubForIde.forFile(packageFqName, isScript)
val fileStub = KotlinFileStubImpl.forFile(packageFqName, isScript)
setupFileStub(fileStub, packageFqName)
return fileStub
}
@@ -67,7 +67,7 @@ open class StubIndexService protected constructor() {
open fun deserializeFileStub(dataStream: StubInputStream): KotlinFileStub {
val packageFqNameAsString = dataStream.readName()
val isScript = dataStream.readBoolean()
return KotlinFileStubImpl(null, packageFqNameAsString!!, isScript)
return KotlinFileStubImpl(null, packageFqNameAsString!!.string, isScript)
}
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.PsiFileStubImpl
import com.intellij.psi.tree.IStubFileElementType
import com.intellij.util.io.StringRef
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.Name
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi.stubs.KotlinFileStub
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.utils.addToStdlib.firstIsInstanceOrNull
open class KotlinFileStubImpl(
jetFile: KtFile?,
private val packageName: StringRef,
private val isScript: Boolean
) : PsiFileStubImpl<KtFile>(jetFile), KotlinFileStub, PsiClassHolderFileStub<KtFile> {
class KotlinFileStubImpl(
ktFile: KtFile?,
private val packageName: String,
private val isScript: Boolean,
private val facadeFqNameString: String?,
val partSimpleName: String?,
val facadePartSimpleNames: List<String>?,
) : PsiFileStubImpl<KtFile>(ktFile), KotlinFileStub, PsiClassHolderFileStub<KtFile> {
constructor(jetFile: KtFile?, packageName: String, isScript: Boolean)
: this(jetFile, StringRef.fromString(packageName)!!, isScript)
constructor(jetFile: KtFile?, packageName: String, isScript: Boolean) : this(
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 getType(): IStubFileElementType<KotlinFileStub> = FILE
@@ -56,4 +73,34 @@ open class KotlinFileStubImpl(
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,
)
}
}