Source element for file classes.
This commit is contained in:
committed by
Dmitry Petrov
parent
16334771ad
commit
233a979932
+12
-8
@@ -24,10 +24,10 @@ import org.jetbrains.kotlin.ir.IrElement
|
|||||||
import org.jetbrains.kotlin.ir.SourceManager
|
import org.jetbrains.kotlin.ir.SourceManager
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
|
||||||
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
|
||||||
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
|
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
|
||||||
|
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
|
||||||
import java.lang.AssertionError
|
import java.lang.AssertionError
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
@@ -42,20 +42,24 @@ class JvmFileClassProvider : Psi2IrTranslator.PostprocessingStep {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private val fileClassInfoByFileEntry = HashMap<SourceManager.FileEntry, JvmFileClassInfo>()
|
private val fileClassInfoByFileEntry = HashMap<SourceManager.FileEntry, JvmFileClassInfo>()
|
||||||
|
private val sourceElementByFileEntry = HashMap<SourceManager.FileEntry, SourceElement>()
|
||||||
|
|
||||||
private fun recordFileClassInfo(context: GeneratorContext, irFile: IrFile) {
|
private fun recordFileClassInfo(context: GeneratorContext, irFile: IrFile) {
|
||||||
val jvmFileClassInfo = context.sourceManager.getFileClassInfo(irFile.fileEntry)
|
context.sourceManager.getKtFile(irFile)?.let { ktFile ->
|
||||||
|
sourceElementByFileEntry[irFile.fileEntry] = KotlinSourceElement(ktFile)
|
||||||
|
}
|
||||||
|
val jvmFileClassInfo = context.sourceManager.getFileClassInfo(irFile) ?: return
|
||||||
fileClassInfoByFileEntry[irFile.fileEntry] = jvmFileClassInfo
|
fileClassInfoByFileEntry[irFile.fileEntry] = jvmFileClassInfo
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun PsiSourceManager.getKtFile(fileEntry: SourceManager.FileEntry) =
|
private fun PsiSourceManager.getFileClassInfo(irFile: IrFile): JvmFileClassInfo? {
|
||||||
getPsiFile(fileEntry as PsiSourceManager.PsiFileEntry) as KtFile
|
val file = getKtFile(irFile) ?: return null
|
||||||
|
return JvmFileClassUtil.getFileClassInfoNoResolve(file)
|
||||||
private fun PsiSourceManager.getFileClassInfo(fileEntry: SourceManager.FileEntry): JvmFileClassInfo =
|
}
|
||||||
JvmFileClassUtil.getFileClassInfoNoResolve(getKtFile(fileEntry))
|
|
||||||
|
|
||||||
fun createFileClassDescriptor(fileEntry: SourceManager.FileEntry, packageFragment: PackageFragmentDescriptor): FileClassDescriptor {
|
fun createFileClassDescriptor(fileEntry: SourceManager.FileEntry, packageFragment: PackageFragmentDescriptor): FileClassDescriptor {
|
||||||
val fileClassInfo = fileClassInfoByFileEntry[fileEntry] ?: throw AssertionError("No file class info for ${fileEntry.name})")
|
val fileClassInfo = fileClassInfoByFileEntry[fileEntry] ?: throw AssertionError("No file class info for ${fileEntry.name})")
|
||||||
return FileClassDescriptorImpl(fileClassInfo.fileClassFqName.shortName(), packageFragment, SourceElement.NO_SOURCE)
|
val sourceElement = sourceElementByFileEntry[fileEntry] ?: SourceElement.NO_SOURCE
|
||||||
|
return FileClassDescriptorImpl(fileClassInfo.fileClassFqName.shortName(), packageFragment, sourceElement)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ import com.intellij.psi.PsiFile
|
|||||||
import org.jetbrains.kotlin.ir.SourceManager
|
import org.jetbrains.kotlin.ir.SourceManager
|
||||||
import org.jetbrains.kotlin.ir.SourceRangeInfo
|
import org.jetbrains.kotlin.ir.SourceRangeInfo
|
||||||
import org.jetbrains.kotlin.ir.declarations.IrFile
|
import org.jetbrains.kotlin.ir.declarations.IrFile
|
||||||
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
|
||||||
class PsiSourceManager : SourceManager {
|
class PsiSourceManager : SourceManager {
|
||||||
@@ -67,15 +68,15 @@ class PsiSourceManager : SourceManager {
|
|||||||
override fun toString(): String = getRecognizableName()
|
override fun toString(): String = getRecognizableName()
|
||||||
}
|
}
|
||||||
|
|
||||||
private val fileEntriesByPsiFile = HashMap<PsiFile, PsiFileEntry>()
|
private val fileEntriesByKtFile = HashMap<KtFile, PsiFileEntry>()
|
||||||
private val fileEntriesByIrFile = HashMap<IrFile, PsiFileEntry>()
|
private val fileEntriesByIrFile = HashMap<IrFile, PsiFileEntry>()
|
||||||
private val psiFileByFileEntry = HashMap<PsiFileEntry, PsiFile>()
|
private val ktFileByFileEntry = HashMap<PsiFileEntry, KtFile>()
|
||||||
|
|
||||||
fun createFileEntry(psiFile: PsiFile): PsiFileEntry {
|
fun createFileEntry(ktFile: KtFile): PsiFileEntry {
|
||||||
if (psiFile in fileEntriesByPsiFile) error("PsiFileEntry is already created for $psiFile")
|
if (ktFile in fileEntriesByKtFile) error("PsiFileEntry is already created for $ktFile")
|
||||||
val newEntry = PsiFileEntry(psiFile)
|
val newEntry = PsiFileEntry(ktFile)
|
||||||
fileEntriesByPsiFile[psiFile] = newEntry
|
fileEntriesByKtFile[ktFile] = newEntry
|
||||||
psiFileByFileEntry[newEntry] = psiFile
|
ktFileByFileEntry[newEntry] = ktFile
|
||||||
return newEntry
|
return newEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -83,14 +84,14 @@ class PsiSourceManager : SourceManager {
|
|||||||
fileEntriesByIrFile[irFile] = fileEntry
|
fileEntriesByIrFile[irFile] = fileEntry
|
||||||
}
|
}
|
||||||
|
|
||||||
fun getOrCreateFileEntry(psiFile: PsiFile): PsiFileEntry =
|
fun getOrCreateFileEntry(ktFile: KtFile): PsiFileEntry =
|
||||||
fileEntriesByPsiFile.getOrElse(psiFile) { createFileEntry(psiFile) }
|
fileEntriesByKtFile.getOrElse(ktFile) { createFileEntry(ktFile) }
|
||||||
|
|
||||||
fun getFileEntry(psiFile: PsiFile): PsiFileEntry? =
|
fun getKtFile(fileEntry: PsiFileEntry): KtFile? =
|
||||||
fileEntriesByPsiFile[psiFile]
|
ktFileByFileEntry[fileEntry]
|
||||||
|
|
||||||
fun getPsiFile(fileEntry: PsiFileEntry) =
|
fun getKtFile(irFile: IrFile): KtFile? =
|
||||||
psiFileByFileEntry[fileEntry]
|
(irFile.fileEntry as? PsiFileEntry)?.let { ktFileByFileEntry[it] }
|
||||||
|
|
||||||
override fun getFileEntry(irFile: IrFile): SourceManager.FileEntry =
|
override fun getFileEntry(irFile: IrFile): SourceManager.FileEntry =
|
||||||
fileEntriesByIrFile[irFile]!!
|
fileEntriesByIrFile[irFile]!!
|
||||||
|
|||||||
Reference in New Issue
Block a user