FIR: forbid top-level destructuring declarations #KT-50468 Fixed
This commit is contained in:
+1
-1
@@ -64,7 +64,7 @@ internal class LLFirDesignatedAnnotationsResolveTransformed(
|
|||||||
when (declaration) {
|
when (declaration) {
|
||||||
is FirClass, is FirTypeAlias ->
|
is FirClass, is FirTypeAlias ->
|
||||||
declaration.ensurePhase(FirResolvePhase.COMPILER_REQUIRED_ANNOTATIONS)
|
declaration.ensurePhase(FirResolvePhase.COMPILER_REQUIRED_ANNOTATIONS)
|
||||||
is FirFunction, is FirProperty, is FirEnumEntry, is FirField, is FirAnonymousInitializer ->
|
is FirFunction, is FirProperty, is FirEnumEntry, is FirField, is FirAnonymousInitializer, is FirErrorProperty ->
|
||||||
Unit
|
Unit
|
||||||
else ->
|
else ->
|
||||||
error("Unexpected type: ${declaration::class.simpleName}")
|
error("Unexpected type: ${declaration::class.simpleName}")
|
||||||
|
|||||||
+6
@@ -512,6 +512,12 @@ public class DiagnosisCompilerFirTestdataTestGenerated extends AbstractDiagnosis
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/throwableSubclass.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/throwableSubclass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("topLevelDestruction.kt")
|
||||||
|
public void testTopLevelDestruction() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/topLevelDestruction.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("treeSet.kt")
|
@TestMetadata("treeSet.kt")
|
||||||
public void testTreeSet() throws Exception {
|
public void testTreeSet() throws Exception {
|
||||||
|
|||||||
+5
@@ -434,6 +434,11 @@ public class LazyBodyIsNotTouchedTilContractsPhaseTestGenerated extends Abstract
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/throwableSubclass.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/throwableSubclass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("topLevelDestruction.kt")
|
||||||
|
public void testTopLevelDestruction() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/topLevelDestruction.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("treeSet.kt")
|
@TestMetadata("treeSet.kt")
|
||||||
public void testTreeSet() throws Exception {
|
public void testTreeSet() throws Exception {
|
||||||
runTest("compiler/fir/analysis-tests/testData/resolve/treeSet.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/treeSet.kt");
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
FILE: topLevelDestruction.kt
|
||||||
|
<ERROR TYPE REF: Destructuring declarations are only allowed for local variables/values>
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
val <!SYNTAX!>(x, y)<!> = Pair(1, 2)
|
||||||
+6
@@ -512,6 +512,12 @@ public class FirDiagnosticTestGenerated extends AbstractFirDiagnosticTest {
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/throwableSubclass.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/throwableSubclass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("topLevelDestruction.kt")
|
||||||
|
public void testTopLevelDestruction() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/topLevelDestruction.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("treeSet.kt")
|
@TestMetadata("treeSet.kt")
|
||||||
public void testTreeSet() throws Exception {
|
public void testTreeSet() throws Exception {
|
||||||
|
|||||||
+6
@@ -512,6 +512,12 @@ public class FirDiagnosticsWithLightTreeTestGenerated extends AbstractFirDiagnos
|
|||||||
runTest("compiler/fir/analysis-tests/testData/resolve/throwableSubclass.kt");
|
runTest("compiler/fir/analysis-tests/testData/resolve/throwableSubclass.kt");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@TestMetadata("topLevelDestruction.kt")
|
||||||
|
public void testTopLevelDestruction() throws Exception {
|
||||||
|
runTest("compiler/fir/analysis-tests/testData/resolve/topLevelDestruction.kt");
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@TestMetadata("treeSet.kt")
|
@TestMetadata("treeSet.kt")
|
||||||
public void testTreeSet() throws Exception {
|
public void testTreeSet() throws Exception {
|
||||||
|
|||||||
+15
-15
@@ -8,11 +8,8 @@ package org.jetbrains.kotlin.fir.lightTree.converter
|
|||||||
import com.intellij.lang.LighterASTNode
|
import com.intellij.lang.LighterASTNode
|
||||||
import com.intellij.psi.TokenType
|
import com.intellij.psi.TokenType
|
||||||
import com.intellij.util.diff.FlyweightCapableTreeStructure
|
import com.intellij.util.diff.FlyweightCapableTreeStructure
|
||||||
|
import org.jetbrains.kotlin.*
|
||||||
import org.jetbrains.kotlin.ElementTypeUtils.isExpression
|
import org.jetbrains.kotlin.ElementTypeUtils.isExpression
|
||||||
import org.jetbrains.kotlin.KtFakeSourceElementKind
|
|
||||||
import org.jetbrains.kotlin.KtLightSourceElement
|
|
||||||
import org.jetbrains.kotlin.KtSourceElement
|
|
||||||
import org.jetbrains.kotlin.KtNodeTypes
|
|
||||||
import org.jetbrains.kotlin.KtNodeTypes.*
|
import org.jetbrains.kotlin.KtNodeTypes.*
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames
|
import org.jetbrains.kotlin.builtins.StandardNames
|
||||||
import org.jetbrains.kotlin.builtins.StandardNames.DEFAULT_VALUE_PARAMETER
|
import org.jetbrains.kotlin.builtins.StandardNames.DEFAULT_VALUE_PARAMETER
|
||||||
@@ -22,7 +19,6 @@ import org.jetbrains.kotlin.descriptors.Visibilities
|
|||||||
import org.jetbrains.kotlin.descriptors.Visibility
|
import org.jetbrains.kotlin.descriptors.Visibility
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget
|
||||||
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*
|
import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.*
|
||||||
import org.jetbrains.kotlin.fakeElement
|
|
||||||
import org.jetbrains.kotlin.fir.*
|
import org.jetbrains.kotlin.fir.*
|
||||||
import org.jetbrains.kotlin.fir.builder.*
|
import org.jetbrains.kotlin.fir.builder.*
|
||||||
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
import org.jetbrains.kotlin.fir.contracts.FirContractDescription
|
||||||
@@ -94,18 +90,20 @@ class DeclarationsConverter(
|
|||||||
val firDeclarationList = mutableListOf<FirDeclaration>()
|
val firDeclarationList = mutableListOf<FirDeclaration>()
|
||||||
context.packageFqName = FqName.ROOT
|
context.packageFqName = FqName.ROOT
|
||||||
var packageDirective: FirPackageDirective? = null
|
var packageDirective: FirPackageDirective? = null
|
||||||
file.forEachChildren {
|
file.forEachChildren { child ->
|
||||||
when (it.tokenType) {
|
@Suppress("RemoveRedundantQualifierName")
|
||||||
FILE_ANNOTATION_LIST -> fileAnnotationList += convertFileAnnotationList(it)
|
when (child.tokenType) {
|
||||||
|
FILE_ANNOTATION_LIST -> fileAnnotationList += convertFileAnnotationList(child)
|
||||||
PACKAGE_DIRECTIVE -> {
|
PACKAGE_DIRECTIVE -> {
|
||||||
packageDirective = convertPackageDirective(it).also { context.packageFqName = it.packageFqName }
|
packageDirective = convertPackageDirective(child).also { context.packageFqName = it.packageFqName }
|
||||||
}
|
}
|
||||||
IMPORT_LIST -> importList += convertImportDirectives(it)
|
IMPORT_LIST -> importList += convertImportDirectives(child)
|
||||||
CLASS -> firDeclarationList += convertClass(it)
|
CLASS -> firDeclarationList += convertClass(child)
|
||||||
FUN -> firDeclarationList += convertFunctionDeclaration(it) as FirDeclaration
|
FUN -> firDeclarationList += convertFunctionDeclaration(child) as FirDeclaration
|
||||||
KtNodeTypes.PROPERTY -> firDeclarationList += convertPropertyDeclaration(it)
|
KtNodeTypes.PROPERTY -> firDeclarationList += convertPropertyDeclaration(child)
|
||||||
TYPEALIAS -> firDeclarationList += convertTypeAlias(it)
|
TYPEALIAS -> firDeclarationList += convertTypeAlias(child)
|
||||||
OBJECT_DECLARATION -> firDeclarationList += convertClass(it)
|
OBJECT_DECLARATION -> firDeclarationList += convertClass(child)
|
||||||
|
DESTRUCTURING_DECLARATION -> firDeclarationList += buildErrorTopLevelDestructuringDeclaration(child.toFirSourceElement())
|
||||||
SCRIPT -> {
|
SCRIPT -> {
|
||||||
// TODO: scripts aren't supported yet
|
// TODO: scripts aren't supported yet
|
||||||
}
|
}
|
||||||
@@ -134,6 +132,7 @@ class DeclarationsConverter(
|
|||||||
|
|
||||||
fun convertBlockExpressionWithoutBuilding(block: LighterASTNode): FirBlockBuilder {
|
fun convertBlockExpressionWithoutBuilding(block: LighterASTNode): FirBlockBuilder {
|
||||||
val firStatements = block.forEachChildrenReturnList<FirStatement> { node, container ->
|
val firStatements = block.forEachChildrenReturnList<FirStatement> { node, container ->
|
||||||
|
@Suppress("RemoveRedundantQualifierName")
|
||||||
when (node.tokenType) {
|
when (node.tokenType) {
|
||||||
CLASS, OBJECT_DECLARATION -> container += convertClass(node) as FirStatement
|
CLASS, OBJECT_DECLARATION -> container += convertClass(node) as FirStatement
|
||||||
FUN -> container += convertFunctionDeclaration(node)
|
FUN -> container += convertFunctionDeclaration(node)
|
||||||
@@ -791,6 +790,7 @@ class DeclarationsConverter(
|
|||||||
*/
|
*/
|
||||||
private fun convertClassBody(classBody: LighterASTNode, classWrapper: ClassWrapper): List<FirDeclaration> {
|
private fun convertClassBody(classBody: LighterASTNode, classWrapper: ClassWrapper): List<FirDeclaration> {
|
||||||
return classBody.forEachChildrenReturnList { node, container ->
|
return classBody.forEachChildrenReturnList { node, container ->
|
||||||
|
@Suppress("RemoveRedundantQualifierName")
|
||||||
when (node.tokenType) {
|
when (node.tokenType) {
|
||||||
ENUM_ENTRY -> container += convertEnumEntry(node, classWrapper)
|
ENUM_ENTRY -> container += convertEnumEntry(node, classWrapper)
|
||||||
CLASS -> container += convertClass(node)
|
CLASS -> container += convertClass(node)
|
||||||
|
|||||||
@@ -929,9 +929,12 @@ open class RawFirBuilder(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (declaration in file.declarations) {
|
for (declaration in file.declarations) {
|
||||||
// TODO: scripts aren't supported yet
|
declarations += when (declaration) {
|
||||||
if (declaration is KtScript) continue
|
// TODO: scripts aren't supported yet
|
||||||
declarations += declaration.convert<FirDeclaration>()
|
is KtScript -> continue
|
||||||
|
is KtDestructuringDeclaration -> buildErrorTopLevelDestructuringDeclaration(declaration.toFirSourceElement())
|
||||||
|
else -> declaration.convert()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+11
@@ -1261,6 +1261,17 @@ abstract class BaseFirBuilder<T>(val baseSession: FirSession, val context: Conte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected fun buildErrorTopLevelDestructuringDeclaration(source: KtSourceElement) = buildErrorProperty {
|
||||||
|
this.source = source
|
||||||
|
moduleData = baseModuleData
|
||||||
|
origin = FirDeclarationOrigin.Source
|
||||||
|
name = Name.special("<destructuring>")
|
||||||
|
diagnostic = ConeSimpleDiagnostic(
|
||||||
|
"Destructuring declarations are only allowed for local variables/values", DiagnosticKind.Syntax
|
||||||
|
)
|
||||||
|
symbol = FirErrorPropertySymbol(diagnostic)
|
||||||
|
}
|
||||||
|
|
||||||
enum class ValueParameterDeclaration {
|
enum class ValueParameterDeclaration {
|
||||||
OTHER,
|
OTHER,
|
||||||
LAMBDA,
|
LAMBDA,
|
||||||
|
|||||||
Reference in New Issue
Block a user