From ecb9a39f94052089aae20d31fa296a9a0cb7b831 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 28 Mar 2018 16:59:06 +0200 Subject: [PATCH] Report errors when trying to build decompiled text for light class --- .../asJava/builder/LightClassBuilder.kt | 29 +++++++++++++++++++ .../asJava/elements/KtLightElementBase.kt | 5 +++- .../asJava/elements/lightAnnotations.kt | 1 + 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassBuilder.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassBuilder.kt index 4a1c6064c4e..d66b4eef98e 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassBuilder.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/builder/LightClassBuilder.kt @@ -23,16 +23,19 @@ import com.intellij.openapi.project.Project import com.intellij.openapi.util.SystemInfo import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.ClassFileViewProvider +import com.intellij.psi.PsiElement import com.intellij.psi.PsiManager import com.intellij.psi.impl.compiled.ClsFileImpl import com.intellij.psi.impl.java.stubs.PsiJavaFileStub import com.intellij.psi.impl.java.stubs.impl.PsiJavaFileStubImpl +import com.intellij.psi.impl.source.tree.TreeElement import org.jetbrains.kotlin.codegen.state.GenerationState import org.jetbrains.kotlin.config.CompilerConfiguration import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtFile import org.jetbrains.kotlin.resolve.BindingContext import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics +import java.lang.StringBuilder data class LightClassBuilderResult(val stub: PsiJavaFileStub, val bindingContext: BindingContext, val diagnostics: Diagnostics) @@ -86,6 +89,32 @@ private fun createJavaFileStub(project: Project, packageFqName: FqName, files: C override fun getPackageName() = packageFqName.asString() override fun isPhysical() = false + + override fun appendMirrorText(indentLevel: Int, buffer: StringBuilder) { + if (files.size == 1) { + LOG.error("Mirror text should never be calculated for light classes generated from a single file") + } + super.appendMirrorText(indentLevel, buffer) + } + + + override fun setMirror(element: TreeElement) { + if (files.size == 1) { + LOG.error("Mirror element should never be set for light classes generated from a single file") + } + super.setMirror(element) + } + + override fun getMirror(): PsiElement { + if (files.size == 1) { + LOG.error("Mirror element should never be calculated for light classes generated from a single file") + } + return super.getMirror() + } + + override fun getText(): String { + return files.singleOrNull()?.text ?: super.getText() + } } javaFileStub.psi = fakeFile diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElementBase.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElementBase.kt index 001f2679fb9..7d209b506e1 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElementBase.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/KtLightElementBase.kt @@ -31,10 +31,13 @@ abstract class KtLightElementBase(private val parent: PsiElement): LightElement( override fun getText() = kotlinOrigin?.text ?: "" override fun getTextRange() = kotlinOrigin?.textRange ?: TextRange.EMPTY_RANGE + override fun getTextOffset() = kotlinOrigin?.textOffset ?: 0 + override fun getStartOffsetInParent() = kotlinOrigin?.startOffsetInParent ?: 0 override fun isWritable() = kotlinOrigin?.isWritable ?: false override fun getNavigationElement() = kotlinOrigin?.navigationElement ?: this override fun getUseScope() = kotlinOrigin?.useScope ?: super.getUseScope() override fun getContainingFile() = parent.containingFile override fun getPresentation() = (kotlinOrigin ?: this).let { ItemPresentationProviders.getItemPresentation(it) } override fun isValid() = parent.isValid -} \ No newline at end of file + override fun findElementAt(offset: Int) = kotlinOrigin?.findElementAt(offset) +} diff --git a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt index bf3ed3f7141..9bb99f0f0db 100644 --- a/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt +++ b/compiler/light-classes/src/org/jetbrains/kotlin/asJava/elements/lightAnnotations.kt @@ -97,6 +97,7 @@ class KtLightAnnotationForSourceEntry( override fun getNavigationElement() = originalExpression override fun isPhysical(): Boolean = originalExpression?.containingFile == kotlinOrigin.containingFile override fun getTextRange() = originalExpression?.textRange ?: TextRange.EMPTY_RANGE + override fun getStartOffsetInParent() = originalExpression?.startOffsetInParent ?: 0 override fun getParent() = parent override fun getText() = originalExpression?.text.orEmpty() override fun getContainingFile(): PsiFile? = if (isPhysical) kotlinOrigin.containingFile else delegate.containingFile