Source element for file classes.

This commit is contained in:
Dmitry Petrov
2016-09-19 14:07:21 +03:00
committed by Dmitry Petrov
parent 16334771ad
commit 233a979932
2 changed files with 26 additions and 21 deletions
@@ -24,10 +24,10 @@ import org.jetbrains.kotlin.ir.IrElement
import org.jetbrains.kotlin.ir.SourceManager
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.ir.declarations.IrModuleFragment
import org.jetbrains.kotlin.psi.KtFile
import org.jetbrains.kotlin.psi2ir.Psi2IrTranslator
import org.jetbrains.kotlin.psi2ir.PsiSourceManager
import org.jetbrains.kotlin.psi2ir.generators.GeneratorContext
import org.jetbrains.kotlin.resolve.source.KotlinSourceElement
import java.lang.AssertionError
import java.util.*
@@ -42,20 +42,24 @@ class JvmFileClassProvider : Psi2IrTranslator.PostprocessingStep {
}
private val fileClassInfoByFileEntry = HashMap<SourceManager.FileEntry, JvmFileClassInfo>()
private val sourceElementByFileEntry = HashMap<SourceManager.FileEntry, SourceElement>()
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
}
private fun PsiSourceManager.getKtFile(fileEntry: SourceManager.FileEntry) =
getPsiFile(fileEntry as PsiSourceManager.PsiFileEntry) as KtFile
private fun PsiSourceManager.getFileClassInfo(fileEntry: SourceManager.FileEntry): JvmFileClassInfo =
JvmFileClassUtil.getFileClassInfoNoResolve(getKtFile(fileEntry))
private fun PsiSourceManager.getFileClassInfo(irFile: IrFile): JvmFileClassInfo? {
val file = getKtFile(irFile) ?: return null
return JvmFileClassUtil.getFileClassInfoNoResolve(file)
}
fun createFileClassDescriptor(fileEntry: SourceManager.FileEntry, packageFragment: PackageFragmentDescriptor): FileClassDescriptor {
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.SourceRangeInfo
import org.jetbrains.kotlin.ir.declarations.IrFile
import org.jetbrains.kotlin.psi.KtFile
import java.util.*
class PsiSourceManager : SourceManager {
@@ -67,15 +68,15 @@ class PsiSourceManager : SourceManager {
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 psiFileByFileEntry = HashMap<PsiFileEntry, PsiFile>()
private val ktFileByFileEntry = HashMap<PsiFileEntry, KtFile>()
fun createFileEntry(psiFile: PsiFile): PsiFileEntry {
if (psiFile in fileEntriesByPsiFile) error("PsiFileEntry is already created for $psiFile")
val newEntry = PsiFileEntry(psiFile)
fileEntriesByPsiFile[psiFile] = newEntry
psiFileByFileEntry[newEntry] = psiFile
fun createFileEntry(ktFile: KtFile): PsiFileEntry {
if (ktFile in fileEntriesByKtFile) error("PsiFileEntry is already created for $ktFile")
val newEntry = PsiFileEntry(ktFile)
fileEntriesByKtFile[ktFile] = newEntry
ktFileByFileEntry[newEntry] = ktFile
return newEntry
}
@@ -83,14 +84,14 @@ class PsiSourceManager : SourceManager {
fileEntriesByIrFile[irFile] = fileEntry
}
fun getOrCreateFileEntry(psiFile: PsiFile): PsiFileEntry =
fileEntriesByPsiFile.getOrElse(psiFile) { createFileEntry(psiFile) }
fun getOrCreateFileEntry(ktFile: KtFile): PsiFileEntry =
fileEntriesByKtFile.getOrElse(ktFile) { createFileEntry(ktFile) }
fun getFileEntry(psiFile: PsiFile): PsiFileEntry? =
fileEntriesByPsiFile[psiFile]
fun getKtFile(fileEntry: PsiFileEntry): KtFile? =
ktFileByFileEntry[fileEntry]
fun getPsiFile(fileEntry: PsiFileEntry) =
psiFileByFileEntry[fileEntry]
fun getKtFile(irFile: IrFile): KtFile? =
(irFile.fileEntry as? PsiFileEntry)?.let { ktFileByFileEntry[it] }
override fun getFileEntry(irFile: IrFile): SourceManager.FileEntry =
fileEntriesByIrFile[irFile]!!