diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java index f1d7aeaf79f..2548a6385e7 100644 --- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java +++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsTestGenerated.java @@ -9106,6 +9106,22 @@ public class FirOldFrontendDiagnosticsTestGenerated extends AbstractFirDiagnosti } } + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/exceptions") + @TestDataPath("$PROJECT_ROOT") + public class Exceptions extends AbstractFirDiagnosticTest { + @Test + public void testAllFilesPresentInExceptions() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/exceptions"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @Test + @TestMetadata("kt24158.kt") + public void testKt24158() throws Exception { + runTest("compiler/testData/diagnostics/tests/exceptions/kt24158.kt"); + } + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/exposed") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java index cc87ec933f7..0cfccd158c5 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java +++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java @@ -459,17 +459,13 @@ public class KotlinExpressionParsing extends AbstractKotlinParsing { if (!firstExpressionParsed) { expression.drop(); expression = mark(); + firstExpressionParsed = parseAtomicExpression(); + continue; } parseSelectorCallExpression(); - if (firstExpressionParsed) { - expression.done(expressionType); - } - else { - firstExpressionParsed = true; - continue; - } + expression.done(expressionType); } else if (atSet(Precedence.POSTFIX.getOperations())) { parseOperationReference(); diff --git a/compiler/psi/src/org/jetbrains/kotlin/psi/KtQualifiedExpression.kt b/compiler/psi/src/org/jetbrains/kotlin/psi/KtQualifiedExpression.kt index 3f152ac8646..a0641c0ebb8 100644 --- a/compiler/psi/src/org/jetbrains/kotlin/psi/KtQualifiedExpression.kt +++ b/compiler/psi/src/org/jetbrains/kotlin/psi/KtQualifiedExpression.kt @@ -39,7 +39,7 @@ interface KtQualifiedExpression : KtExpression { val operationSign: KtSingleValueToken get() = operationTokenNode.elementType as KtSingleValueToken - private fun KtQualifiedExpression.getExpression(afterOperation: Boolean): KtExpression? { + private fun getExpression(afterOperation: Boolean): KtExpression? { return operationTokenNode.psi?.siblings(afterOperation, false)?.firstIsInstanceOrNull() } } diff --git a/compiler/testData/diagnostics/tests/exceptions/kt24158.kt b/compiler/testData/diagnostics/tests/exceptions/kt24158.kt new file mode 100644 index 00000000000..3962bc19907 --- /dev/null +++ b/compiler/testData/diagnostics/tests/exceptions/kt24158.kt @@ -0,0 +1,10 @@ +// FIR_IDENTICAL +// SKIP_TXT + +fun main() { + null + $foo.$bar. +} + +fun foo2() { + null + $foo. $bar . $baz . +} diff --git a/compiler/testData/psi/recovery/kt24158.kt b/compiler/testData/psi/recovery/kt24158.kt new file mode 100644 index 00000000000..e632182a94d --- /dev/null +++ b/compiler/testData/psi/recovery/kt24158.kt @@ -0,0 +1,7 @@ +fun main() { + null + $foo.$bar. +} + +fun foo2() { + null + $foo. $bar . $baz . +} diff --git a/compiler/testData/psi/recovery/kt24158.txt b/compiler/testData/psi/recovery/kt24158.txt new file mode 100644 index 00000000000..7d8e9e9fde8 --- /dev/null +++ b/compiler/testData/psi/recovery/kt24158.txt @@ -0,0 +1,69 @@ +KtFile: kt24158.kt + PACKAGE_DIRECTIVE + + IMPORT_LIST + + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('main') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + NULL + PsiElement(null)('null') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + PsiErrorElement:Expecting an element + PsiElement(FIELD_IDENTIFIER)('$foo') + PsiElement(DOT)('.') + PsiErrorElement:Expecting an element + PsiElement(FIELD_IDENTIFIER)('$bar') + PsiElement(DOT)('.') + PsiErrorElement:Expecting an element + + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') + PsiWhiteSpace('\n\n') + FUN + PsiElement(fun)('fun') + PsiWhiteSpace(' ') + PsiElement(IDENTIFIER)('foo2') + VALUE_PARAMETER_LIST + PsiElement(LPAR)('(') + PsiElement(RPAR)(')') + PsiWhiteSpace(' ') + BLOCK + PsiElement(LBRACE)('{') + PsiWhiteSpace('\n ') + BINARY_EXPRESSION + NULL + PsiElement(null)('null') + PsiWhiteSpace(' ') + OPERATION_REFERENCE + PsiElement(PLUS)('+') + PsiWhiteSpace(' ') + PsiErrorElement:Expecting an element + PsiElement(FIELD_IDENTIFIER)('$foo') + PsiElement(DOT)('.') + PsiWhiteSpace(' ') + PsiErrorElement:Expecting an element + PsiElement(FIELD_IDENTIFIER)('$bar') + PsiWhiteSpace(' ') + PsiElement(DOT)('.') + PsiWhiteSpace(' ') + PsiErrorElement:Expecting an element + PsiElement(FIELD_IDENTIFIER)('$baz') + PsiWhiteSpace(' ') + PsiElement(DOT)('.') + PsiErrorElement:Expecting an element + + PsiWhiteSpace('\n') + PsiElement(RBRACE)('}') diff --git a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java index 6702ff74293..1add6f160e2 100644 --- a/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java +++ b/compiler/tests-common-new/tests-gen/org/jetbrains/kotlin/test/runners/DiagnosticTestGenerated.java @@ -9112,6 +9112,22 @@ public class DiagnosticTestGenerated extends AbstractDiagnosticTest { } } + @Nested + @TestMetadata("compiler/testData/diagnostics/tests/exceptions") + @TestDataPath("$PROJECT_ROOT") + public class Exceptions extends AbstractDiagnosticTest { + @Test + public void testAllFilesPresentInExceptions() throws Exception { + KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/exceptions"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true); + } + + @Test + @TestMetadata("kt24158.kt") + public void testKt24158() throws Exception { + runTest("compiler/testData/diagnostics/tests/exceptions/kt24158.kt"); + } + } + @Nested @TestMetadata("compiler/testData/diagnostics/tests/exposed") @TestDataPath("$PROJECT_ROOT") diff --git a/compiler/tests-gen/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java index e1581e98ba7..9ace12ccd68 100644 --- a/compiler/tests-gen/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java +++ b/compiler/tests-gen/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java @@ -2273,6 +2273,11 @@ public class ParsingTestGenerated extends AbstractParsingTest { runTest("compiler/testData/psi/recovery/kt2172.kt"); } + @TestMetadata("kt24158.kt") + public void testKt24158() throws Exception { + runTest("compiler/testData/psi/recovery/kt24158.kt"); + } + @TestMetadata("kt5102.kt") public void testKt5102() throws Exception { runTest("compiler/testData/psi/recovery/kt5102.kt");