[Low Level FIR] fix exception when creating symbol by invalid code
diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java new file mode 100644 index 0000000..8d6136e1 --- /dev/null +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java
@@ -0,0 +1,70 @@ +/* + * Copyright 2010-2022 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.analysis.api.fe10.test.cases.generated.cases.symbols; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fe10.test.configurator.AnalysisApiFe10TestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSingleSymbolByPsi; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi") +@TestDataPath("$PROJECT_ROOT") +public class Fe10IdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends AbstractSingleSymbolByPsi { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFe10TestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fe10, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSingleSymbolByPsi() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/singleSymbolByPsi"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors") + @TestDataPath("$PROJECT_ROOT") + public class Errors { + @Test + public void testAllFilesPresentInErrors() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("anonympuseObjectInInvalidPosition.kt") + public void testAnonympuseObjectInInvalidPosition() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.kt"); + } + + @Test + @TestMetadata("objectWithTypeArgsAsExpression.kt") + public void testObjectWithTypeArgsAsExpression() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.kt"); + } + } +}
diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java new file mode 100644 index 0000000..ab6018c --- /dev/null +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java
@@ -0,0 +1,70 @@ +/* + * Copyright 2010-2022 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.analysis.api.fir.test.cases.generated.cases.symbols; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.fir.test.configurators.AnalysisApiFirTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSingleSymbolByPsi; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi") +@TestDataPath("$PROJECT_ROOT") +public class FirIdeNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends AbstractSingleSymbolByPsi { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Ide + ) + ); + } + + @Test + public void testAllFilesPresentInSingleSymbolByPsi() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/singleSymbolByPsi"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors") + @TestDataPath("$PROJECT_ROOT") + public class Errors { + @Test + public void testAllFilesPresentInErrors() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("anonympuseObjectInInvalidPosition.kt") + public void testAnonympuseObjectInInvalidPosition() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.kt"); + } + + @Test + @TestMetadata("objectWithTypeArgsAsExpression.kt") + public void testObjectWithTypeArgsAsExpression() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.kt"); + } + } +}
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSingleSymbolByPsi.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSingleSymbolByPsi.kt new file mode 100644 index 0000000..afd4645 --- /dev/null +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/cases/symbols/AbstractSingleSymbolByPsi.kt
@@ -0,0 +1,20 @@ +/* + * Copyright 2010-2022 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.analysis.api.impl.base.test.cases.symbols + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.test.framework.services.expressionMarkerProvider +import org.jetbrains.kotlin.psi.KtDeclaration +import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.test.services.TestServices + +abstract class AbstractSingleSymbolByPsi : AbstractSymbolTest() { + override fun KtAnalysisSession.collectSymbols(ktFile: KtFile, testServices: TestServices): SymbolsData { + val declaration = testServices.expressionMarkerProvider.getSelectedElementOfType<KtDeclaration>(ktFile) + val symbol = declaration.getSymbol() + return SymbolsData(listOf(symbol)) + } +} \ No newline at end of file
diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java new file mode 100644 index 0000000..d51a91a --- /dev/null +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated.java
@@ -0,0 +1,70 @@ +/* + * Copyright 2010-2022 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.analysis.api.standalone.fir.test.cases.generated.cases.symbols; + +import com.intellij.testFramework.TestDataPath; +import org.jetbrains.kotlin.test.util.KtTestUtil; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.kotlin.analysis.api.standalone.fir.test.AnalysisApiFirStandaloneModeTestConfiguratorFactory; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfiguratorFactoryData; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.TestModuleKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.FrontendKind; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisSessionMode; +import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiMode; +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSingleSymbolByPsi; +import org.jetbrains.kotlin.test.TestMetadata; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import java.io.File; +import java.util.regex.Pattern; + +/** This class is generated by {@link org.jetbrains.kotlin.generators.tests.analysis.api.GenerateAnalysisApiTestsKt}. DO NOT MODIFY MANUALLY */ +@SuppressWarnings("all") +@TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi") +@TestDataPath("$PROJECT_ROOT") +public class FirStandaloneNormalAnalysisSourceModuleSingleSymbolByPsiGenerated extends AbstractSingleSymbolByPsi { + @NotNull + @Override + public AnalysisApiTestConfigurator getConfigurator() { + return AnalysisApiFirStandaloneModeTestConfiguratorFactory.INSTANCE.createConfigurator( + new AnalysisApiTestConfiguratorFactoryData( + FrontendKind.Fir, + TestModuleKind.Source, + AnalysisSessionMode.Normal, + AnalysisApiMode.Standalone + ) + ); + } + + @Test + public void testAllFilesPresentInSingleSymbolByPsi() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/singleSymbolByPsi"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Nested + @TestMetadata("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors") + @TestDataPath("$PROJECT_ROOT") + public class Errors { + @Test + public void testAllFilesPresentInErrors() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("anonympuseObjectInInvalidPosition.kt") + public void testAnonympuseObjectInInvalidPosition() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.kt"); + } + + @Test + @TestMetadata("objectWithTypeArgsAsExpression.kt") + public void testObjectWithTypeArgsAsExpression() throws Exception { + runTest("analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.kt"); + } + } +}
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.descriptors.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.descriptors.txt new file mode 100644 index 0000000..ca0d176 --- /dev/null +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.descriptors.txt
@@ -0,0 +1,3 @@ +KtErrorCallInfo: + candidateCalls = [] + diagnostic = ERROR<ASSIGNMENT_IN_EXPRESSION_CONTEXT: Assignments are not expressions, and only expressions are allowed in this context> \ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.txt b/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.txt index e58ddba..0f14bf4 100644 --- a/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.txt +++ b/analysis/analysis-api/testData/components/callResolver/resolveCall/invalidCode/getterAssignment.txt
@@ -1,3 +1,3 @@ KtErrorCallInfo: candidateCalls = [] - diagnostic = ERROR<ASSIGNMENT_IN_EXPRESSION_CONTEXT: Assignments are not expressions, and only expressions are allowed in this context> + diagnostic = ERROR<VARIABLE_EXPECTED: Variable expected> \ No newline at end of file
diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.kt new file mode 100644 index 0000000..72ea85d --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.kt
@@ -0,0 +1,7 @@ +private val _commonSettingsLazy: A = null = <expr>object : A<Int> { + override fun x() {} +}</expr> + +interface A<T> { + fun x() +}
diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.pretty.txt new file mode 100644 index 0000000..d1fe996 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.pretty.txt
@@ -0,0 +1 @@ +object : A<kotlin.Int>
diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.txt new file mode 100644 index 0000000..408e336 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/anonympuseObjectInInvalidPosition.txt
@@ -0,0 +1,13 @@ +KtAnonymousObjectSymbol: + annotationsList: [] + classIdIfNonLocal: null + classKind: ANONYMOUS_OBJECT + name: null + origin: SOURCE + superTypes: [ + A<kotlin/Int> + ] + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null
diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.descriptors.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.descriptors.pretty.txt new file mode 100644 index 0000000..d281175 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.descriptors.pretty.txt
@@ -0,0 +1 @@ +object<LanguageVersionSettings> \ No newline at end of file
diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.kt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.kt new file mode 100644 index 0000000..986da96 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.kt
@@ -0,0 +1,3 @@ +private val commonSettingsLazy = <expr>object A<LanguageVersionSettings> { + println(x) +}</expr>
diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.pretty.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.pretty.txt new file mode 100644 index 0000000..e2f6b77 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.pretty.txt
@@ -0,0 +1 @@ +object
diff --git a/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.txt b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.txt new file mode 100644 index 0000000..be4b3f7 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/singleSymbolByPsi/errors/objectWithTypeArgsAsExpression.txt
@@ -0,0 +1,13 @@ +KtAnonymousObjectSymbol: + annotationsList: [] + classIdIfNonLocal: null + classKind: ANONYMOUS_OBJECT + name: null + origin: SOURCE + superTypes: [ + kotlin/Any + ] + symbolKind: LOCAL + typeParameters: [] + getContainingModule: KtSourceModule "Sources of main" + deprecationStatus: null
diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/errors/anonympuseObjectInInvalidPosition.kt b/analysis/low-level-api-fir/testdata/lazyResolve/errors/anonympuseObjectInInvalidPosition.kt new file mode 100644 index 0000000..dc8c640 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/errors/anonympuseObjectInInvalidPosition.kt
@@ -0,0 +1,7 @@ +private val resolveMe: A = null = <expr>object : A<Int> { + override fun x() {} +}</expr> + +interface A<T> { + fun x() +}
diff --git a/analysis/low-level-api-fir/testdata/lazyResolve/errors/anonympuseObjectInInvalidPosition.txt b/analysis/low-level-api-fir/testdata/lazyResolve/errors/anonympuseObjectInInvalidPosition.txt new file mode 100644 index 0000000..e83e7c7 --- /dev/null +++ b/analysis/low-level-api-fir/testdata/lazyResolve/errors/anonympuseObjectInInvalidPosition.txt
@@ -0,0 +1,162 @@ + +RAW_FIR: +FILE: anonympuseObjectInInvalidPosition.kt + private final? [RAW_FIR] val resolveMe: A = LAZY_EXPRESSION + private [RAW_FIR] get(): A + public? final? [RAW_FIR] interface A<[RAW_FIR] T> : R|kotlin/Any| { + public? final? [RAW_FIR] fun x(): R|kotlin/Unit| + + } + +IMPORTS: +FILE: anonympuseObjectInInvalidPosition.kt + private final? [RAW_FIR] val resolveMe: A = LAZY_EXPRESSION + private [RAW_FIR] get(): A + public? final? [RAW_FIR] interface A<[RAW_FIR] T> : R|kotlin/Any| { + public? final? [RAW_FIR] fun x(): R|kotlin/Unit| + + } + +COMPILER_REQUIRED_ANNOTATIONS: +FILE: anonympuseObjectInInvalidPosition.kt + private final? [COMPILER_REQUIRED_ANNOTATIONS] val resolveMe: A = LAZY_EXPRESSION + private [COMPILER_REQUIRED_ANNOTATIONS] get(): A + public? final? [RAW_FIR] interface A<[RAW_FIR] T> : R|kotlin/Any| { + public? final? [RAW_FIR] fun x(): R|kotlin/Unit| + + } + +COMPANION_GENERATION: +FILE: anonympuseObjectInInvalidPosition.kt + private final? [COMPANION_GENERATION] val resolveMe: A = LAZY_EXPRESSION + private [COMPANION_GENERATION] get(): A + public? final? [RAW_FIR] interface A<[RAW_FIR] T> : R|kotlin/Any| { + public? final? [RAW_FIR] fun x(): R|kotlin/Unit| + + } + +SUPER_TYPES: +FILE: anonympuseObjectInInvalidPosition.kt + private final? [SUPER_TYPES] val resolveMe: A = LAZY_EXPRESSION + private [SUPER_TYPES] get(): A + public? final? [RAW_FIR] interface A<[RAW_FIR] T> : R|kotlin/Any| { + public? final? [RAW_FIR] fun x(): R|kotlin/Unit| + + } + +TYPES: +FILE: anonympuseObjectInInvalidPosition.kt + private final? [TYPES] val resolveMe: <ERROR TYPE REF: Wrong number of type arguments> = LAZY_EXPRESSION + private [TYPES] get(): <ERROR TYPE REF: Wrong number of type arguments> + public? final? [COMPILER_REQUIRED_ANNOTATIONS] interface A<[COMPILER_REQUIRED_ANNOTATIONS] T> : R|kotlin/Any| { + public? final? [COMPILER_REQUIRED_ANNOTATIONS] fun x(): R|kotlin/Unit| + + } + +STATUS: +FILE: anonympuseObjectInInvalidPosition.kt + private final [STATUS] val resolveMe: <ERROR TYPE REF: Wrong number of type arguments> = LAZY_EXPRESSION + private [STATUS] get(): <ERROR TYPE REF: Wrong number of type arguments> + public? final? [COMPILER_REQUIRED_ANNOTATIONS] interface A<[COMPILER_REQUIRED_ANNOTATIONS] T> : R|kotlin/Any| { + public? final? [COMPILER_REQUIRED_ANNOTATIONS] fun x(): R|kotlin/Unit| + + } + +ARGUMENTS_OF_ANNOTATIONS: +FILE: anonympuseObjectInInvalidPosition.kt + private final [ARGUMENTS_OF_ANNOTATIONS] val resolveMe: <ERROR TYPE REF: Wrong number of type arguments> = LAZY_EXPRESSION + private [ARGUMENTS_OF_ANNOTATIONS] get(): <ERROR TYPE REF: Wrong number of type arguments> + public? final? [COMPILER_REQUIRED_ANNOTATIONS] interface A<[COMPILER_REQUIRED_ANNOTATIONS] T> : R|kotlin/Any| { + public? final? [COMPILER_REQUIRED_ANNOTATIONS] fun x(): R|kotlin/Unit| + + } + +CONTRACTS: +FILE: anonympuseObjectInInvalidPosition.kt + private final [CONTRACTS] val resolveMe: <ERROR TYPE REF: Wrong number of type arguments> = ERROR_EXPR(Should have initializer)<Unsupported LValue: NULL># = object : A<Int> { + private [RAW_FIR] [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| { + super<<implicit>>() + } + + public? open? override [RAW_FIR] fun x(): R|kotlin/Unit| { + } + + } + + private [CONTRACTS] get(): <ERROR TYPE REF: Wrong number of type arguments> + public? final? [COMPILER_REQUIRED_ANNOTATIONS] interface A<[COMPILER_REQUIRED_ANNOTATIONS] T> : R|kotlin/Any| { + public? final? [COMPILER_REQUIRED_ANNOTATIONS] fun x(): R|kotlin/Unit| + + } + +IMPLICIT_TYPES_BODY_RESOLVE: +FILE: anonympuseObjectInInvalidPosition.kt + private final [IMPLICIT_TYPES_BODY_RESOLVE] val resolveMe: <ERROR TYPE REF: Wrong number of type arguments> = ERROR_EXPR(Should have initializer)<Unsupported LValue: NULL># = object : A<Int> { + private [RAW_FIR] [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| { + super<<implicit>>() + } + + public? open? override [RAW_FIR] fun x(): R|kotlin/Unit| { + } + + } + + private [IMPLICIT_TYPES_BODY_RESOLVE] get(): <ERROR TYPE REF: Wrong number of type arguments> + public? final? [COMPILER_REQUIRED_ANNOTATIONS] interface A<[COMPILER_REQUIRED_ANNOTATIONS] T> : R|kotlin/Any| { + public? final? [COMPILER_REQUIRED_ANNOTATIONS] fun x(): R|kotlin/Unit| + + } + +EXPECT_ACTUAL_MATCHING: +FILE: anonympuseObjectInInvalidPosition.kt + private final [EXPECT_ACTUAL_MATCHING] val resolveMe: <ERROR TYPE REF: Wrong number of type arguments> = ERROR_EXPR(Should have initializer)<Unsupported LValue: NULL># = object : A<Int> { + private [RAW_FIR] [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| { + super<<implicit>>() + } + + public? open? override [RAW_FIR] fun x(): R|kotlin/Unit| { + } + + } + + private [EXPECT_ACTUAL_MATCHING] get(): <ERROR TYPE REF: Wrong number of type arguments> + public? final? [COMPILER_REQUIRED_ANNOTATIONS] interface A<[COMPILER_REQUIRED_ANNOTATIONS] T> : R|kotlin/Any| { + public? final? [COMPILER_REQUIRED_ANNOTATIONS] fun x(): R|kotlin/Unit| + + } + +BODY_RESOLVE: +FILE: anonympuseObjectInInvalidPosition.kt + private final [BODY_RESOLVE] val resolveMe: <ERROR TYPE REF: Wrong number of type arguments> = ERROR_EXPR(Should have initializer)<Unsupported LValue: NULL># = object : R|A<kotlin/Int>| { + private [BODY_RESOLVE] [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| { + super<R|kotlin/Any|>() + } + + public final override [BODY_RESOLVE] fun x(): R|kotlin/Unit| { + } + + } + + private [BODY_RESOLVE] get(): <ERROR TYPE REF: Wrong number of type arguments> + public abstract [SUPER_TYPES] interface A<[SUPER_TYPES] T> : R|kotlin/Any| { + public abstract [STATUS] fun x(): R|kotlin/Unit| + + } + +FILE RAW TO BODY: +FILE: anonympuseObjectInInvalidPosition.kt + private final [BODY_RESOLVE] val resolveMe: <ERROR TYPE REF: Wrong number of type arguments> = ERROR_EXPR(Should have initializer)<Unsupported LValue: NULL># = object : R|A<kotlin/Int>| { + private [BODY_RESOLVE] [ContainingClassKey=<anonymous>] constructor(): R|<anonymous>| { + super<R|kotlin/Any|>() + } + + public final override [BODY_RESOLVE] fun x(): R|kotlin/Unit| { + } + + } + + private [BODY_RESOLVE] get(): <ERROR TYPE REF: Wrong number of type arguments> + public abstract [BODY_RESOLVE] interface A<[BODY_RESOLVE] T> : R|kotlin/Any| { + public abstract [BODY_RESOLVE] fun x(): R|kotlin/Unit| + + }
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt index 51d9a4b..f475e18 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/AbstractFirLazyDeclarationResolveTest.kt
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.fir.declarations.FirResolvePhase import org.jetbrains.kotlin.fir.realPsi import org.jetbrains.kotlin.fir.renderer.FirDeclarationRendererWithAttributes +import org.jetbrains.kotlin.fir.renderer.FirErrorExpressionExtendedRenderer import org.jetbrains.kotlin.fir.renderer.FirRenderer import org.jetbrains.kotlin.fir.renderer.FirResolvePhaseRenderer import org.jetbrains.kotlin.fir.symbols.lazyResolveToPhase @@ -57,7 +58,8 @@ val renderer = FirRenderer( builder = resultBuilder, declarationRenderer = FirDeclarationRendererWithAttributes(), - resolvePhaseRenderer = FirResolvePhaseRenderer() + resolvePhaseRenderer = FirResolvePhaseRenderer(), + errorExpressionRenderer = FirErrorExpressionExtendedRenderer(), ) resolveWithClearCaches(ktFile) { firResolveSession -> check(firResolveSession is LLFirSourceResolveSession)
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyDeclarationResolveTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyDeclarationResolveTestGenerated.java index abc40c4..eb0100c 100644 --- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyDeclarationResolveTestGenerated.java +++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/FirLazyDeclarationResolveTestGenerated.java
@@ -161,6 +161,22 @@ } @Nested + @TestMetadata("analysis/low-level-api-fir/testdata/lazyResolve/errors") + @TestDataPath("$PROJECT_ROOT") + public class Errors { + @Test + public void testAllFilesPresentInErrors() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/low-level-api-fir/testdata/lazyResolve/errors"), Pattern.compile("^(.+)\\.kt$"), null, true); + } + + @Test + @TestMetadata("anonympuseObjectInInvalidPosition.kt") + public void testAnonympuseObjectInInvalidPosition() throws Exception { + runTest("analysis/low-level-api-fir/testdata/lazyResolve/errors/anonympuseObjectInInvalidPosition.kt"); + } + } + + @Nested @TestMetadata("analysis/low-level-api-fir/testdata/lazyResolve/functions") @TestDataPath("$PROJECT_ROOT") public class Functions {
diff --git a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt index 62f8716..cdfc861 100644 --- a/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt +++ b/compiler/fir/raw-fir/psi2fir/src/org/jetbrains/kotlin/fir/builder/RawFirBuilder.kt
@@ -202,51 +202,59 @@ // Here we accept lambda as receiver to prevent expression calculation in stub mode private fun (() -> KtExpression?).toFirExpression(errorReason: String): FirExpression = - with(this()) { - convertSafe() ?: buildErrorExpression( - this?.toFirSourceElement(), ConeSimpleDiagnostic(errorReason, DiagnosticKind.ExpressionExpected), - ) - } + this().toFirExpression(errorReason) private fun KtElement?.toFirExpression( errorReason: String, kind: DiagnosticKind = DiagnosticKind.ExpressionExpected ): FirExpression { - val result = this.convertSafe<FirExpression>() + if (this == null) { + return buildErrorExpression(source = null, ConeSimpleDiagnostic(errorReason, kind)) + } - if (result != null) { - if (this == null) { - return result - } - - val callExpressionCallee = (this as? KtCallExpression)?.calleeExpression?.unwrapParenthesesLabelsAndAnnotations() - - if (this is KtNameReferenceExpression || - this is KtConstantExpression || - (this is KtCallExpression && callExpressionCallee !is KtLambdaExpression) || - getQualifiedExpressionForSelector() == null - ) { - return result - } - - return buildErrorExpression { - source = callExpressionCallee?.toFirSourceElement() ?: toFirSourceElement() - diagnostic = - ConeSimpleDiagnostic( - "The expression cannot be a selector (occur after a dot)", - if (callExpressionCallee == null) DiagnosticKind.IllegalSelector else DiagnosticKind.NoReceiverAllowed - ) - expression = result + val result = when (val fir = convertElement(this)) { + is FirExpression -> fir + else -> { + return buildErrorExpression { + nonExpressionElement = fir + diagnostic = ConeSimpleDiagnostic(errorReason, kind) + source = toFirSourceElement() + } } } - return buildErrorExpression( - this?.toFirSourceElement(), ConeSimpleDiagnostic(errorReason, kind), - ) + + val callExpressionCallee = (this as? KtCallExpression)?.calleeExpression?.unwrapParenthesesLabelsAndAnnotations() + + if (this is KtNameReferenceExpression || + this is KtConstantExpression || + (this is KtCallExpression && callExpressionCallee !is KtLambdaExpression) || + getQualifiedExpressionForSelector() == null + ) { + return result + } + + return buildErrorExpression { + source = callExpressionCallee?.toFirSourceElement() ?: toFirSourceElement() + diagnostic = + ConeSimpleDiagnostic( + "The expression cannot be a selector (occur after a dot)", + if (callExpressionCallee == null) DiagnosticKind.IllegalSelector else DiagnosticKind.NoReceiverAllowed + ) + expression = result + } } - private inline fun KtExpression.toFirStatement(errorReasonLazy: () -> String): FirStatement = - convertSafe() ?: buildErrorExpression(this.toFirSourceElement(), ConeSimpleDiagnostic(errorReasonLazy(), DiagnosticKind.Syntax)) + private inline fun KtExpression.toFirStatement(errorReasonLazy: () -> String): FirStatement { + return when (val fir = convertElement(this)) { + is FirStatement -> fir + else -> buildErrorExpression { + nonExpressionElement = fir + diagnostic = ConeSimpleDiagnostic(errorReasonLazy(), DiagnosticKind.Syntax) + source = toFirSourceElement() + } + } + } private fun KtExpression.toFirStatement(): FirStatement = convert()
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirErrorExpression.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirErrorExpression.kt index 83f8782..2b12a00 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirErrorExpression.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/FirErrorExpression.kt
@@ -23,6 +23,7 @@ abstract override val annotations: List<FirAnnotation> abstract override val diagnostic: ConeDiagnostic abstract val expression: FirExpression? + abstract val nonExpressionElement: FirElement? override fun <R, D> accept(visitor: FirVisitor<R, D>, data: D): R = visitor.visitErrorExpression(this, data)
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorExpressionBuilder.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorExpressionBuilder.kt index 4941bc3..252affa 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorExpressionBuilder.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/builder/FirErrorExpressionBuilder.kt
@@ -9,6 +9,7 @@ import kotlin.contracts.* import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.builder.FirAnnotationContainerBuilder import org.jetbrains.kotlin.fir.builder.FirBuilderDsl import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic @@ -33,6 +34,7 @@ override val annotations: MutableList<FirAnnotation> = mutableListOf() lateinit var diagnostic: ConeDiagnostic var expression: FirExpression? = null + var nonExpressionElement: FirElement? = null override fun build(): FirErrorExpression { return FirErrorExpressionImpl( @@ -40,6 +42,7 @@ annotations, diagnostic, expression, + nonExpressionElement, ) }
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt index a78b162..f682bf3 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorExpressionImpl.kt
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.fir.expressions.impl import org.jetbrains.kotlin.KtSourceElement +import org.jetbrains.kotlin.fir.FirElement import org.jetbrains.kotlin.fir.diagnostics.ConeDiagnostic import org.jetbrains.kotlin.fir.diagnostics.ConeStubDiagnostic import org.jetbrains.kotlin.fir.expressions.FirAnnotation @@ -27,6 +28,7 @@ override val annotations: MutableList<FirAnnotation>, override val diagnostic: ConeDiagnostic, override var expression: FirExpression?, + override var nonExpressionElement: FirElement?, ) : FirErrorExpression() { override var typeRef: FirTypeRef = FirErrorTypeRefImpl(source, null, ConeStubDiagnostic(diagnostic), false) @@ -34,12 +36,14 @@ typeRef.accept(visitor, data) annotations.forEach { it.accept(visitor, data) } expression?.accept(visitor, data) + nonExpressionElement?.accept(visitor, data) } override fun <D> transformChildren(transformer: FirTransformer<D>, data: D): FirErrorExpressionImpl { typeRef = typeRef.transform(transformer, data) transformAnnotations(transformer, data) expression = expression?.transform(transformer, data) + nonExpressionElement = nonExpressionElement?.transform(transformer, data) return this }
diff --git a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorLoopImpl.kt b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorLoopImpl.kt index 558fc47..dc758bb 100644 --- a/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorLoopImpl.kt +++ b/compiler/fir/tree/gen/org/jetbrains/kotlin/fir/expressions/impl/FirErrorLoopImpl.kt
@@ -30,7 +30,7 @@ override val diagnostic: ConeDiagnostic, ) : FirErrorLoop() { override var block: FirBlock = FirEmptyExpressionBlock() - override var condition: FirExpression = FirErrorExpressionImpl(source, mutableListOf(), ConeStubDiagnostic(diagnostic), null) + override var condition: FirExpression = FirErrorExpressionImpl(source, mutableListOf(), ConeStubDiagnostic(diagnostic), null, null) override fun <R, D> acceptChildren(visitor: FirVisitor<R, D>, data: D) { annotations.forEach { it.accept(visitor, data) }
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirErrorExpressionRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirErrorExpressionRenderer.kt new file mode 100644 index 0000000..36be4d7 --- /dev/null +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirErrorExpressionRenderer.kt
@@ -0,0 +1,28 @@ +/* + * Copyright 2010-2022 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.fir.renderer + +import org.jetbrains.kotlin.fir.expressions.FirErrorExpression + +abstract class FirErrorExpressionRenderer { + internal lateinit var components: FirRendererComponents + protected val printer get() = components.printer + + abstract fun renderErrorExpression(errorExpression: FirErrorExpression) +} + +class FirErrorExpressionOnlyErrorRenderer : FirErrorExpressionRenderer() { + override fun renderErrorExpression(errorExpression: FirErrorExpression) { + printer.print("ERROR_EXPR(${errorExpression.diagnostic.reason})") + } +} + +class FirErrorExpressionExtendedRenderer : FirErrorExpressionRenderer() { + override fun renderErrorExpression(errorExpression: FirErrorExpression) { + printer.print("ERROR_EXPR(${errorExpression.diagnostic.reason})") + errorExpression.nonExpressionElement?.accept(components.visitor) + } +} \ No newline at end of file
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt index a4df682..a026ce4e 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRenderer.kt
@@ -41,6 +41,7 @@ override val resolvePhaseRenderer: FirResolvePhaseRenderer? = null, override val typeRenderer: ConeTypeRenderer = ConeTypeRendererForDebugging(), override val valueParameterRenderer: FirValueParameterRenderer = FirValueParameterRenderer(), + override val errorExpressionRenderer: FirErrorExpressionRenderer = FirErrorExpressionOnlyErrorRenderer(), ) : FirRendererComponents { override val visitor = Visitor() @@ -75,6 +76,7 @@ typeRenderer.builder = builder typeRenderer.idRenderer = idRenderer valueParameterRenderer.components = this + errorExpressionRenderer.components = this } fun renderElementAsString(element: FirElement): String { @@ -1000,7 +1002,7 @@ } override fun visitErrorExpression(errorExpression: FirErrorExpression) { - print("ERROR_EXPR(${errorExpression.diagnostic.reason})") + errorExpressionRenderer.renderErrorExpression(errorExpression) } override fun visitResolvedQualifier(resolvedQualifier: FirResolvedQualifier) {
diff --git a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt index 44191f4..0814e2a 100644 --- a/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt +++ b/compiler/fir/tree/src/org/jetbrains/kotlin/fir/renderer/FirRendererComponents.kt
@@ -23,4 +23,5 @@ val resolvePhaseRenderer: FirResolvePhaseRenderer? val typeRenderer: ConeTypeRenderer val valueParameterRenderer: FirValueParameterRenderer + val errorExpressionRenderer: FirErrorExpressionRenderer } \ No newline at end of file
diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt index 67f53ae..4fbf04e 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/ImplementationConfigurator.kt
@@ -159,7 +159,7 @@ impl(errorLoop) { default("block", "FirEmptyExpressionBlock()") - default("condition", "FirErrorExpressionImpl(source, mutableListOf(), ConeStubDiagnostic(diagnostic), null)") + default("condition", "FirErrorExpressionImpl(source, mutableListOf(), ConeStubDiagnostic(diagnostic), null, null)") useTypes(emptyExpressionBlock, coneStubDiagnosticType) }
diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt index ee43664..4dd7be4 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/NodeConfigurator.kt
@@ -32,6 +32,7 @@ import org.jetbrains.kotlin.fir.tree.generator.FieldSets.visibility import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFieldConfigurator import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder +import org.jetbrains.kotlin.fir.tree.generator.context.AbstractFirTreeBuilder.Companion.baseFirElement import org.jetbrains.kotlin.fir.tree.generator.context.type import org.jetbrains.kotlin.fir.tree.generator.model.* import org.jetbrains.kotlin.serialization.deserialization.descriptors.DeserializedContainerSource @@ -105,6 +106,7 @@ errorExpression.configure { +field("expression", expression, nullable = true) + +field("nonExpressionElement", baseFirElement, nullable = true) } errorFunction.configure {
diff --git a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/util/BaseTransformerTypeFinder.kt b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/util/BaseTransformerTypeFinder.kt index 26c5b49..405d538 100644 --- a/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/util/BaseTransformerTypeFinder.kt +++ b/compiler/fir/tree/tree-generator/src/org/jetbrains/kotlin/fir/tree/generator/util/BaseTransformerTypeFinder.kt
@@ -19,6 +19,7 @@ is FieldList -> field.baseType as AbstractElement else -> throw IllegalArgumentException() } + if (fieldElement == AbstractFirTreeBuilder.baseFirElement) continue usedAsFieldType[fieldElement] = true } }
diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt index be672b8..501ac2c 100644 --- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt +++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt
@@ -36,6 +36,7 @@ import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.components.typeProvider.AbstractHasCommonSubtypeTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.references.AbstractReferenceResolveTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.scopes.* +import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSingleSymbolByPsi import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByFqNameTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByPsiTest import org.jetbrains.kotlin.analysis.api.impl.base.test.cases.symbols.AbstractSymbolByReferenceTest @@ -110,6 +111,10 @@ model("symbolByPsi") } + test(AbstractSingleSymbolByPsi::class) { + model("singleSymbolByPsi") + } + test( AbstractSymbolByFqNameTest::class ) {