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.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]!!