[FIR] remove user code leaks from compiler.fir.raw-fir module, add more information to some errors

This commit is contained in:
Ilya Kirillov
2023-07-04 12:32:53 +02:00
committed by Space Team
parent d43057e19a
commit 9f847da13e
2 changed files with 30 additions and 9 deletions
@@ -50,6 +50,9 @@ import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull import org.jetbrains.kotlin.utils.addToStdlib.firstIsInstanceOrNull
import org.jetbrains.kotlin.utils.addToStdlib.runIf import org.jetbrains.kotlin.utils.addToStdlib.runIf
import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled import org.jetbrains.kotlin.utils.addToStdlib.shouldNotBeCalled
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import org.jetbrains.kotlin.utils.exceptions.requireWithAttachment
import org.jetbrains.kotlin.utils.exceptions.withPsiEntry
open class PsiRawFirBuilder( open class PsiRawFirBuilder(
session: FirSession, session: FirSession,
@@ -1117,17 +1120,19 @@ open class PsiRawFirBuilder(
for (declaration in file.declarations) { for (declaration in file.declarations) {
declarations += when (declaration) { declarations += when (declaration) {
is KtScript -> { is KtScript -> {
require(file.declarations.size == 1) { "Expect the script to be the only declaration in the file $name" } requireWithAttachment(file.declarations.size == 1, message = { "Expect the script to be the only declaration in the file" }) {
convertScript(declaration, this.name) { withEntry("fileName", file.name)
for (configurator in baseSession.extensionService.scriptConfigurators) { }
with(configurator) { configure(this@buildFile) } convertScript(declaration, this.name) {
} for (configurator in baseSession.extensionService.scriptConfigurators) {
with(configurator) { configure(this@buildFile) }
} }
} }
is KtDestructuringDeclaration -> buildErrorTopLevelDestructuringDeclaration(declaration.toFirSourceElement())
else -> declaration.convert()
} }
is KtDestructuringDeclaration -> buildErrorTopLevelDestructuringDeclaration(declaration.toFirSourceElement())
else -> declaration.convert()
} }
}
for (danglingModifierList in file.danglingModifierLists) { for (danglingModifierList in file.danglingModifierLists) {
declarations += buildErrorTopLevelDeclarationForDanglingModifierList(danglingModifierList) declarations += buildErrorTopLevelDeclarationForDanglingModifierList(danglingModifierList)
@@ -2262,7 +2267,9 @@ open class PsiRawFirBuilder(
is KtEscapeStringTemplateEntry -> KtNodeTypes.ESCAPE_STRING_TEMPLATE_ENTRY is KtEscapeStringTemplateEntry -> KtNodeTypes.ESCAPE_STRING_TEMPLATE_ENTRY
is KtSimpleNameStringTemplateEntry -> KtNodeTypes.SHORT_STRING_TEMPLATE_ENTRY is KtSimpleNameStringTemplateEntry -> KtNodeTypes.SHORT_STRING_TEMPLATE_ENTRY
is KtBlockStringTemplateEntry -> KtNodeTypes.LONG_STRING_TEMPLATE_ENTRY is KtBlockStringTemplateEntry -> KtNodeTypes.LONG_STRING_TEMPLATE_ENTRY
else -> error("invalid node type $element") else -> errorWithAttachment("invalid node type ${element::class.java}") {
withPsiEntry("element", element)
}
} }
}, },
convertTemplateEntry = { convertTemplateEntry = {
@@ -5,6 +5,7 @@
package org.jetbrains.kotlin.fir.builder package org.jetbrains.kotlin.fir.builder
import com.intellij.psi.PsiElement
import com.intellij.psi.tree.IElementType import com.intellij.psi.tree.IElementType
import org.jetbrains.kotlin.* import org.jetbrains.kotlin.*
import org.jetbrains.kotlin.KtNodeTypes.* import org.jetbrains.kotlin.KtNodeTypes.*
@@ -38,6 +39,9 @@ import org.jetbrains.kotlin.parsing.*
import org.jetbrains.kotlin.psi.KtPsiUtil import org.jetbrains.kotlin.psi.KtPsiUtil
import org.jetbrains.kotlin.types.ConstantValueKind import org.jetbrains.kotlin.types.ConstantValueKind
import org.jetbrains.kotlin.util.OperatorNameConventions import org.jetbrains.kotlin.util.OperatorNameConventions
import org.jetbrains.kotlin.utils.exceptions.ExceptionAttachmentBuilder
import org.jetbrains.kotlin.utils.exceptions.errorWithAttachment
import org.jetbrains.kotlin.utils.exceptions.withPsiEntry
//T can be either PsiElement, or LighterASTNode //T can be either PsiElement, or LighterASTNode
abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context: Context<T> = Context()) { abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context: Context<T> = Context()) {
@@ -417,10 +421,20 @@ abstract class AbstractRawFirBuilder<T>(val baseSession: FirSession, val context
setType = false setType = false
) )
else -> else ->
throw AssertionError("Unknown literal type: $type, $text") errorWithAttachment("Unknown literal type: $type") {
withSourceElementEntry("literal", expression)
}
} }
} }
protected fun ExceptionAttachmentBuilder.withSourceElementEntry(name: String, element: T?) {
when (element) {
is PsiElement -> withPsiEntry(name, element)
else -> withEntry(name, element) { it.asText}
}
}
fun convertUnaryPlusMinusCallOnIntegerLiteralIfNecessary( fun convertUnaryPlusMinusCallOnIntegerLiteralIfNecessary(
source: T, source: T,
receiver: FirExpression, receiver: FirExpression,