From bec4d1903bed7e825c37a337ee6b1e2b83d20e98 Mon Sep 17 00:00:00 2001 From: Alexander Udalov Date: Mon, 22 Feb 2021 11:20:22 +0100 Subject: [PATCH] IR: move PsiFileEntry to ir.tree, rename to PsiIrFileEntry --- .../kotlin/fir/backend/Fir2IrConverter.kt | 4 +- .../kotlin/backend/jvm/ir/IrUtils.kt | 4 +- .../backend/jvm/lower/FileClassLowering.kt | 5 +- .../kotlin/psi2ir/PsiSourceManager.kt | 66 +----------------- .../psi2ir/generators/ModuleGenerator.kt | 4 +- .../org/jetbrains/kotlin/ir/PsiIrFileEntry.kt | 68 +++++++++++++++++++ 6 files changed, 79 insertions(+), 72 deletions(-) create mode 100644 compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/PsiIrFileEntry.kt diff --git a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt index ae8310cf719..f460020328c 100644 --- a/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt +++ b/compiler/fir/fir2ir/src/org/jetbrains/kotlin/fir/backend/Fir2IrConverter.kt @@ -18,6 +18,7 @@ import org.jetbrains.kotlin.fir.psi import org.jetbrains.kotlin.fir.resolve.ScopeSession import org.jetbrains.kotlin.fir.signaturer.FirMangler import org.jetbrains.kotlin.fir.symbols.FirBuiltinSymbols +import org.jetbrains.kotlin.ir.PsiIrFileEntry import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl import org.jetbrains.kotlin.ir.declarations.impl.IrModuleFragmentImpl @@ -29,7 +30,6 @@ import org.jetbrains.kotlin.ir.util.SymbolTable import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.name.Name import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi2ir.PsiSourceManager import org.jetbrains.kotlin.psi2ir.generators.GeneratorExtensions import org.jetbrains.kotlin.psi2ir.generators.TypeTranslatorImpl import org.jetbrains.kotlin.psi2ir.generators.generateTypicalIrProviderList @@ -57,7 +57,7 @@ class Fir2IrConverter( fun registerFileAndClasses(file: FirFile): IrFile { val irFile = IrFileImpl( - PsiSourceManager.PsiFileEntry(file.psi as KtFile), + PsiIrFileEntry(file.psi as KtFile), moduleDescriptor.getPackage(file.packageFqName).fragments.first() ) declarationStorage.registerFile(file, irFile) diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt index bd2b717ee83..308fe30574a 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/ir/IrUtils.kt @@ -21,6 +21,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.descriptors.deserialization.PLATFORM_DEPENDENT_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.ir.IrElement +import org.jetbrains.kotlin.ir.PsiIrFileEntry import org.jetbrains.kotlin.ir.UNDEFINED_OFFSET import org.jetbrains.kotlin.ir.builders.IrBuilderWithScope import org.jetbrains.kotlin.ir.builders.Scope @@ -45,7 +46,6 @@ import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities import org.jetbrains.kotlin.load.java.JvmAbi import org.jetbrains.kotlin.metadata.jvm.deserialization.JvmProtoBufUtil import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi2ir.PsiSourceManager import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_DEFAULT_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.annotations.JVM_DEFAULT_NO_COMPATIBILITY_FQ_NAME @@ -399,4 +399,4 @@ fun IrClass.getSingleAbstractMethod(): IrSimpleFunction? = functions.singleOrNull { it.modality == Modality.ABSTRACT } fun IrFile.getKtFile(): KtFile? = - (fileEntry as? PsiSourceManager.PsiFileEntry)?.psiFile as KtFile? + (fileEntry as? PsiIrFileEntry)?.psiFile as KtFile? diff --git a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt index 3b329f66c9e..9864dcfae27 100644 --- a/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt +++ b/compiler/ir/backend.jvm/src/org/jetbrains/kotlin/backend/jvm/lower/FileClassLowering.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.descriptors.DescriptorVisibilities import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.fileClasses.JvmFileClassUtil import org.jetbrains.kotlin.fileClasses.JvmSimpleFileClassInfo +import org.jetbrains.kotlin.ir.PsiIrFileEntry import org.jetbrains.kotlin.ir.declarations.* import org.jetbrains.kotlin.ir.declarations.impl.IrClassImpl import org.jetbrains.kotlin.ir.symbols.impl.IrClassSymbolImpl @@ -35,10 +36,8 @@ import org.jetbrains.kotlin.ir.util.* import org.jetbrains.kotlin.load.java.JavaDescriptorVisibilities import org.jetbrains.kotlin.load.kotlin.PackagePartClassUtils import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi2ir.PsiSourceManager import org.jetbrains.kotlin.resolve.inline.INLINE_ONLY_ANNOTATION_FQ_NAME import org.jetbrains.kotlin.resolve.jvm.JvmClassName -import java.util.* internal val fileClassPhase = makeIrModulePhase( ::FileClassLowering, @@ -80,7 +79,7 @@ private class FileClassLowering(val context: JvmBackendContext) : FileLoweringPa private fun createFileClass(irFile: IrFile, fileClassMembers: List): IrClass { val fileEntry = irFile.fileEntry val fileClassInfo = when (fileEntry) { - is PsiSourceManager.PsiFileEntry -> + is PsiIrFileEntry -> JvmFileClassUtil.getFileClassInfoNoResolve(fileEntry.psiFile as KtFile) is NaiveSourceBasedFileEntryImpl -> JvmSimpleFileClassInfo(PackagePartClassUtils.getPackagePartFqName(irFile.fqName, fileEntry.name), false) diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/PsiSourceManager.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/PsiSourceManager.kt index 8bc86609929..cd60218007a 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/PsiSourceManager.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/PsiSourceManager.kt @@ -17,81 +17,21 @@ package org.jetbrains.kotlin.psi2ir import com.intellij.psi.PsiElement -import com.intellij.psi.PsiFile -import com.intellij.psi.util.PsiTreeUtil import org.jetbrains.kotlin.ir.IrElement -import org.jetbrains.kotlin.ir.IrFileEntry -import org.jetbrains.kotlin.ir.SourceRangeInfo +import org.jetbrains.kotlin.ir.PsiIrFileEntry import org.jetbrains.kotlin.ir.declarations.IrDeclaration import org.jetbrains.kotlin.ir.declarations.IrFile import org.jetbrains.kotlin.ir.util.fileOrNull import kotlin.reflect.KClass object PsiSourceManager { - class PsiFileEntry(val psiFile: PsiFile) : IrFileEntry { - private val psiFileName = psiFile.virtualFile?.path ?: psiFile.name - - override val maxOffset: Int - private val lineStartOffsets: IntArray - private val fileViewProvider = psiFile.viewProvider - - init { - val document = fileViewProvider.document ?: throw AssertionError("No document for $psiFile") - maxOffset = document.textLength - lineStartOffsets = IntArray(document.lineCount) { document.getLineStartOffset(it) } - } - - override fun getLineNumber(offset: Int): Int { - if (offset < 0) return -1 - val index = lineStartOffsets.binarySearch(offset) - return if (index >= 0) index else -index - 2 - } - - override fun getColumnNumber(offset: Int): Int { - if (offset < 0) return -1 - val lineNumber = getLineNumber(offset) - return offset - lineStartOffsets[lineNumber] - } - - override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo = - SourceRangeInfo( - filePath = getRecognizableName(), - startOffset = beginOffset, - startLineNumber = getLineNumber(beginOffset), - startColumnNumber = getColumnNumber(beginOffset), - endOffset = endOffset, - endLineNumber = getLineNumber(endOffset), - endColumnNumber = getColumnNumber(endOffset) - ) - - private fun getRecognizableName(): String = psiFileName - - override val name: String get() = getRecognizableName() - - override fun toString(): String = getRecognizableName() - - fun findPsiElement(irElement: IrElement): PsiElement? { - var psiElement = fileViewProvider.findElementAt(irElement.startOffset) - while (psiElement != null) { - if (irElement.endOffset == psiElement.textRange?.endOffset) break - psiElement = psiElement.parent - } - return psiElement - } - - fun findPsiElement(irElement: IrElement, psiElementClass: KClass): E? = - findPsiElement(irElement)?.let { - PsiTreeUtil.getParentOfType(it, psiElementClass.java, false) - } - } - fun findPsiElement(irElement: IrElement, irFile: IrFile, psiElementClass: KClass): E? { - val psiFileEntry = irFile.fileEntry as? PsiFileEntry ?: return null + val psiFileEntry = irFile.fileEntry as? PsiIrFileEntry ?: return null return psiFileEntry.findPsiElement(irElement, psiElementClass) } fun findPsiElement(irElement: IrElement, irFile: IrFile): PsiElement? { - val psiFileEntry = irFile.fileEntry as? PsiFileEntry ?: return null + val psiFileEntry = irFile.fileEntry as? PsiIrFileEntry ?: return null return psiFileEntry.findPsiElement(irElement) } diff --git a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt index 0de4965635b..c8b582789d8 100644 --- a/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt +++ b/compiler/ir/ir.psi2ir/src/org/jetbrains/kotlin/psi2ir/generators/ModuleGenerator.kt @@ -18,6 +18,7 @@ package org.jetbrains.kotlin.psi2ir.generators import org.jetbrains.kotlin.backend.common.CodegenUtil import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.ir.PsiIrFileEntry import org.jetbrains.kotlin.ir.declarations.DescriptorMetadataSource import org.jetbrains.kotlin.ir.declarations.IrModuleFragment import org.jetbrains.kotlin.ir.declarations.impl.IrFileImpl @@ -31,7 +32,6 @@ import org.jetbrains.kotlin.ir.util.patchDeclarationParents import org.jetbrains.kotlin.ir.visitors.acceptChildrenVoid import org.jetbrains.kotlin.ir.visitors.acceptVoid import org.jetbrains.kotlin.psi.KtFile -import org.jetbrains.kotlin.psi2ir.PsiSourceManager import org.jetbrains.kotlin.psi2ir.transformations.insertImplicitCasts import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.lazy.descriptors.findPackageFragmentForFile @@ -102,7 +102,7 @@ class ModuleGenerator( } private fun createEmptyIrFile(ktFile: KtFile): IrFileImpl { - val fileEntry = PsiSourceManager.PsiFileEntry(ktFile) + val fileEntry = PsiIrFileEntry(ktFile) val packageFragmentDescriptor = context.moduleDescriptor.findPackageFragmentForFile(ktFile)!! return IrFileImpl(fileEntry, packageFragmentDescriptor).apply { metadata = DescriptorMetadataSource.File(CodegenUtil.getMemberDescriptorsToGenerate(ktFile, context.bindingContext)) diff --git a/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/PsiIrFileEntry.kt b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/PsiIrFileEntry.kt new file mode 100644 index 00000000000..e6c3c622050 --- /dev/null +++ b/compiler/ir/ir.tree/src/org/jetbrains/kotlin/ir/PsiIrFileEntry.kt @@ -0,0 +1,68 @@ +/* + * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.ir + +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiFile +import com.intellij.psi.util.PsiTreeUtil +import kotlin.reflect.KClass + +class PsiIrFileEntry(val psiFile: PsiFile) : IrFileEntry { + private val psiFileName = psiFile.virtualFile?.path ?: psiFile.name + + override val maxOffset: Int + private val lineStartOffsets: IntArray + private val fileViewProvider = psiFile.viewProvider + + init { + val document = fileViewProvider.document ?: throw AssertionError("No document for $psiFile") + maxOffset = document.textLength + lineStartOffsets = IntArray(document.lineCount) { document.getLineStartOffset(it) } + } + + override fun getLineNumber(offset: Int): Int { + if (offset < 0) return -1 + val index = lineStartOffsets.binarySearch(offset) + return if (index >= 0) index else -index - 2 + } + + override fun getColumnNumber(offset: Int): Int { + if (offset < 0) return -1 + val lineNumber = getLineNumber(offset) + return offset - lineStartOffsets[lineNumber] + } + + override fun getSourceRangeInfo(beginOffset: Int, endOffset: Int): SourceRangeInfo = + SourceRangeInfo( + filePath = getRecognizableName(), + startOffset = beginOffset, + startLineNumber = getLineNumber(beginOffset), + startColumnNumber = getColumnNumber(beginOffset), + endOffset = endOffset, + endLineNumber = getLineNumber(endOffset), + endColumnNumber = getColumnNumber(endOffset) + ) + + private fun getRecognizableName(): String = psiFileName + + override val name: String get() = getRecognizableName() + + override fun toString(): String = getRecognizableName() + + fun findPsiElement(irElement: IrElement): PsiElement? { + var psiElement = fileViewProvider.findElementAt(irElement.startOffset) + while (psiElement != null) { + if (irElement.endOffset == psiElement.textRange?.endOffset) break + psiElement = psiElement.parent + } + return psiElement + } + + fun findPsiElement(irElement: IrElement, psiElementClass: KClass): E? = + findPsiElement(irElement)?.let { + PsiTreeUtil.getParentOfType(it, psiElementClass.java, false) + } +}