Report errors when trying to build decompiled text for light class
This commit is contained in:
@@ -23,16 +23,19 @@ import com.intellij.openapi.project.Project
|
|||||||
import com.intellij.openapi.util.SystemInfo
|
import com.intellij.openapi.util.SystemInfo
|
||||||
import com.intellij.openapi.vfs.VirtualFile
|
import com.intellij.openapi.vfs.VirtualFile
|
||||||
import com.intellij.psi.ClassFileViewProvider
|
import com.intellij.psi.ClassFileViewProvider
|
||||||
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.PsiManager
|
import com.intellij.psi.PsiManager
|
||||||
import com.intellij.psi.impl.compiled.ClsFileImpl
|
import com.intellij.psi.impl.compiled.ClsFileImpl
|
||||||
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub
|
import com.intellij.psi.impl.java.stubs.PsiJavaFileStub
|
||||||
import com.intellij.psi.impl.java.stubs.impl.PsiJavaFileStubImpl
|
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.codegen.state.GenerationState
|
||||||
import org.jetbrains.kotlin.config.CompilerConfiguration
|
import org.jetbrains.kotlin.config.CompilerConfiguration
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.KtFile
|
import org.jetbrains.kotlin.psi.KtFile
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
||||||
|
import java.lang.StringBuilder
|
||||||
|
|
||||||
data class LightClassBuilderResult(val stub: PsiJavaFileStub, val bindingContext: BindingContext, val diagnostics: Diagnostics)
|
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 getPackageName() = packageFqName.asString()
|
||||||
|
|
||||||
override fun isPhysical() = false
|
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
|
javaFileStub.psi = fakeFile
|
||||||
|
|||||||
+4
-1
@@ -31,10 +31,13 @@ abstract class KtLightElementBase(private val parent: PsiElement): LightElement(
|
|||||||
|
|
||||||
override fun getText() = kotlinOrigin?.text ?: ""
|
override fun getText() = kotlinOrigin?.text ?: ""
|
||||||
override fun getTextRange() = kotlinOrigin?.textRange ?: TextRange.EMPTY_RANGE
|
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 isWritable() = kotlinOrigin?.isWritable ?: false
|
||||||
override fun getNavigationElement() = kotlinOrigin?.navigationElement ?: this
|
override fun getNavigationElement() = kotlinOrigin?.navigationElement ?: this
|
||||||
override fun getUseScope() = kotlinOrigin?.useScope ?: super.getUseScope()
|
override fun getUseScope() = kotlinOrigin?.useScope ?: super.getUseScope()
|
||||||
override fun getContainingFile() = parent.containingFile
|
override fun getContainingFile() = parent.containingFile
|
||||||
override fun getPresentation() = (kotlinOrigin ?: this).let { ItemPresentationProviders.getItemPresentation(it) }
|
override fun getPresentation() = (kotlinOrigin ?: this).let { ItemPresentationProviders.getItemPresentation(it) }
|
||||||
override fun isValid() = parent.isValid
|
override fun isValid() = parent.isValid
|
||||||
}
|
override fun findElementAt(offset: Int) = kotlinOrigin?.findElementAt(offset)
|
||||||
|
}
|
||||||
|
|||||||
@@ -97,6 +97,7 @@ class KtLightAnnotationForSourceEntry(
|
|||||||
override fun getNavigationElement() = originalExpression
|
override fun getNavigationElement() = originalExpression
|
||||||
override fun isPhysical(): Boolean = originalExpression?.containingFile == kotlinOrigin.containingFile
|
override fun isPhysical(): Boolean = originalExpression?.containingFile == kotlinOrigin.containingFile
|
||||||
override fun getTextRange() = originalExpression?.textRange ?: TextRange.EMPTY_RANGE
|
override fun getTextRange() = originalExpression?.textRange ?: TextRange.EMPTY_RANGE
|
||||||
|
override fun getStartOffsetInParent() = originalExpression?.startOffsetInParent ?: 0
|
||||||
override fun getParent() = parent
|
override fun getParent() = parent
|
||||||
override fun getText() = originalExpression?.text.orEmpty()
|
override fun getText() = originalExpression?.text.orEmpty()
|
||||||
override fun getContainingFile(): PsiFile? = if (isPhysical) kotlinOrigin.containingFile else delegate.containingFile
|
override fun getContainingFile(): PsiFile? = if (isPhysical) kotlinOrigin.containingFile else delegate.containingFile
|
||||||
|
|||||||
Reference in New Issue
Block a user