KT-8263: Conditional operators are not parsed correctly
diff --git a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java
index 1ecc29b..d85c1e3 100644
--- a/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java
+++ b/analysis/low-level-api-fir/tests/org/jetbrains/kotlin/analysis/low/level/api/fir/diagnostic/compiler/based/DiagnosisCompilerTestFE10TestdataTestGenerated.java
@@ -32150,6 +32150,28 @@
         }
 
         @Nested
+        @TestMetadata("compiler/testData/diagnostics/tests/typeArguments")
+        @TestDataPath("$PROJECT_ROOT")
+        public class TypeArguments {
+            @Test
+            public void testAllFilesPresentInTypeArguments() throws Exception {
+                KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/typeArguments"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
+            }
+
+            @Test
+            @TestMetadata("allowTypeArgumentListLikeExpressions.kt")
+            public void testAllowTypeArgumentListLikeExpressions() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.kt");
+            }
+
+            @Test
+            @TestMetadata("forbidTypeArgumentListLikeExpressions.kt")
+            public void testForbidTypeArgumentListLikeExpressions() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.kt");
+            }
+        }
+
+        @Nested
         @TestMetadata("compiler/testData/diagnostics/tests/typeParameters")
         @TestDataPath("$PROJECT_ROOT")
         public class TypeParameters {
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 b35843a..277a3d1 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
@@ -32150,6 +32150,28 @@
         }
 
         @Nested
+        @TestMetadata("compiler/testData/diagnostics/tests/typeArguments")
+        @TestDataPath("$PROJECT_ROOT")
+        public class TypeArguments {
+            @Test
+            public void testAllFilesPresentInTypeArguments() throws Exception {
+                KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/typeArguments"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
+            }
+
+            @Test
+            @TestMetadata("allowTypeArgumentListLikeExpressions.kt")
+            public void testAllowTypeArgumentListLikeExpressions() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.kt");
+            }
+
+            @Test
+            @TestMetadata("forbidTypeArgumentListLikeExpressions.kt")
+            public void testForbidTypeArgumentListLikeExpressions() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.kt");
+            }
+        }
+
+        @Nested
         @TestMetadata("compiler/testData/diagnostics/tests/typeParameters")
         @TestDataPath("$PROJECT_ROOT")
         public class TypeParameters {
diff --git a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java
index 3669397..665ad8d 100644
--- a/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java
+++ b/compiler/fir/analysis-tests/tests-gen/org/jetbrains/kotlin/test/runners/FirOldFrontendDiagnosticsWithLightTreeTestGenerated.java
@@ -32150,6 +32150,28 @@
         }
 
         @Nested
+        @TestMetadata("compiler/testData/diagnostics/tests/typeArguments")
+        @TestDataPath("$PROJECT_ROOT")
+        public class TypeArguments {
+            @Test
+            public void testAllFilesPresentInTypeArguments() throws Exception {
+                KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/typeArguments"), Pattern.compile("^(.+)\\.kt$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
+            }
+
+            @Test
+            @TestMetadata("allowTypeArgumentListLikeExpressions.kt")
+            public void testAllowTypeArgumentListLikeExpressions() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.kt");
+            }
+
+            @Test
+            @TestMetadata("forbidTypeArgumentListLikeExpressions.kt")
+            public void testForbidTypeArgumentListLikeExpressions() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.kt");
+            }
+        }
+
+        @Nested
         @TestMetadata("compiler/testData/diagnostics/tests/typeParameters")
         @TestDataPath("$PROJECT_ROOT")
         public class TypeParameters {
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java
index d489c85..2ef6afd 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java
+++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/Errors.java
@@ -235,6 +235,7 @@
     DiagnosticFactoryForDeprecation1<PsiElement, CallableDescriptor> PROGRESSIONS_CHANGING_RESOLVE = DiagnosticFactoryForDeprecation1.create(LanguageFeature.ProgressionsChangingResolve);
 
     DiagnosticFactory0<PsiElement> EXPRESSION_AFTER_TYPE_REFERENCE_WITHOUT_SPACING_NOT_ALLOWED = DiagnosticFactory0.create(ERROR);
+    DiagnosticFactory0<PsiElement> TYPE_ARGUMENT_LIST_LIKE_EXPRESSION = DiagnosticFactory0.create(ERROR);
 
     ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java
index 90f906e..dd3ca33 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java
+++ b/compiler/frontend/src/org/jetbrains/kotlin/diagnostics/rendering/DefaultErrorMessages.java
@@ -629,6 +629,7 @@
                                                "See https://youtrack.jetbrains.com/issue/KT-49276 for more details. " +
                                                "Please specify a progression type of argument explicitly through explicit cast to resolve to a proper declaration", COMPACT);
         MAP.put(EXPRESSION_AFTER_TYPE_REFERENCE_WITHOUT_SPACING_NOT_ALLOWED, "Expression body directly after type without a whitespace in-between the '>=' is only allowed since version 1.8");
+        MAP.put(TYPE_ARGUMENT_LIST_LIKE_EXPRESSION, "Type argument list like expressions are only allowed since version 1.8");
 
         MAP.put(TOO_MANY_ARGUMENTS, "Too many arguments for {0}", FQ_NAMES_IN_TYPES);
 
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt
index 8d1fcf4..92817d8 100644
--- a/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/PlatformConfiguratorBase.kt
@@ -54,6 +54,7 @@
     UnsupportedUntilRangeDeclarationChecker,
     DataObjectContentChecker,
     ExpressionAfterTypeParameterWithoutSpacingChecker,
+    TypeArgumentListLikeExpressionsChecker,
 )
 
 private val DEFAULT_CALL_CHECKERS = listOf(
diff --git a/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/TypeArgumentListLikeExpressionsChecker.kt b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/TypeArgumentListLikeExpressionsChecker.kt
new file mode 100644
index 0000000..67da88b
--- /dev/null
+++ b/compiler/frontend/src/org/jetbrains/kotlin/resolve/checkers/TypeArgumentListLikeExpressionsChecker.kt
@@ -0,0 +1,50 @@
+/*
+ * 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.resolve.checkers
+
+import org.jetbrains.kotlin.KtNodeTypes
+import org.jetbrains.kotlin.config.LanguageFeature
+import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
+import org.jetbrains.kotlin.diagnostics.Errors
+import org.jetbrains.kotlin.psi.*
+import org.jetbrains.kotlin.psi.psiUtil.children
+
+object TypeArgumentListLikeExpressionsChecker : DeclarationChecker {
+
+    override fun check(declaration: KtDeclaration, descriptor: DeclarationDescriptor, context: DeclarationCheckerContext) {
+        if (context.languageVersionSettings.supportsFeature(LanguageFeature.AllowTypeArgumentListLikeExpressions)) return
+        if (declaration.parent !is KtFile) return
+
+        val visitor = object : KtTreeVisitorVoid() {
+            override fun visitBinaryExpression(expression: KtBinaryExpression) {
+                super.visitBinaryExpression(expression)
+
+                if (wasTypeArgumentListLikeExpression(expression)) {
+                    context.trace.report(Errors.TYPE_ARGUMENT_LIST_LIKE_EXPRESSION.on(expression.operationReference))
+                }
+            }
+
+            override fun visitUserType(type: KtUserType) {
+                super.visitUserType(type)
+
+                if (wasTypeArgumentListLikeExpression(type)) {
+                    var parent = type.parent ?: return
+                    while (parent !is KtBinaryExpression) {
+                        parent = parent.parent ?: return
+                    }
+
+                    context.trace.report(Errors.TYPE_ARGUMENT_LIST_LIKE_EXPRESSION.on(parent.operationReference))
+                }
+            }
+
+            private fun wasTypeArgumentListLikeExpression(element: KtElement): Boolean {
+                return element.node.children().any { it.elementType == KtNodeTypes.TYPE_ARGUMENT_LIST_LIKE_EXPRESSION }
+            }
+        }
+
+        declaration.accept(visitor)
+    }
+}
\ No newline at end of file
diff --git a/compiler/psi/src/org/jetbrains/kotlin/KtNodeTypes.java b/compiler/psi/src/org/jetbrains/kotlin/KtNodeTypes.java
index 3705c99..48c1485 100644
--- a/compiler/psi/src/org/jetbrains/kotlin/KtNodeTypes.java
+++ b/compiler/psi/src/org/jetbrains/kotlin/KtNodeTypes.java
@@ -149,6 +149,8 @@
     IElementType CLASS_LITERAL_EXPRESSION  = new KtNodeType("CLASS_LITERAL_EXPRESSION", KtClassLiteralExpression.class);
     IElementType SAFE_ACCESS_EXPRESSION    = new KtNodeType("SAFE_ACCESS_EXPRESSION", KtSafeQualifiedExpression.class);
 
+    IElementType TYPE_ARGUMENT_LIST_LIKE_EXPRESSION = new IElementType("TYPE_ARGUMENT_LIST_LIKE_EXPRESSION", null);
+
     IElementType OBJECT_LITERAL            = new KtNodeType("OBJECT_LITERAL", KtObjectLiteralExpression.class);
 
     IElementType WHEN                      = new KtNodeType("WHEN", KtWhenExpression.class);
diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java
index 931b5aa..94df92a 100644
--- a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java
+++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinExpressionParsing.java
@@ -21,6 +21,7 @@
 import com.intellij.lang.Language;
 import com.intellij.lang.PsiBuilder;
 import com.intellij.openapi.project.Project;
+import com.intellij.psi.TokenType;
 import com.intellij.psi.tree.IElementType;
 import com.intellij.psi.tree.TokenSet;
 import org.jetbrains.annotations.NotNull;
@@ -68,20 +69,17 @@
         return builder.build();
     }
 
-    private static final TokenSet TYPE_ARGUMENT_LIST_STOPPERS = TokenSet.create(
-            INTEGER_LITERAL, FLOAT_LITERAL, CHARACTER_LITERAL, OPEN_QUOTE,
-            PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, INTERFACE_KEYWORD, CLASS_KEYWORD, THIS_KEYWORD, VAL_KEYWORD, VAR_KEYWORD,
-            FUN_KEYWORD, FOR_KEYWORD, NULL_KEYWORD,
-            TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD,
-            CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD, TRY_KEYWORD, ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD,
-            WHEN_KEYWORD, RBRACKET, RBRACE, RPAR, PLUSPLUS, MINUSMINUS, EXCLEXCL,
-            //            MUL,
-            PLUS, MINUS, EXCL, DIV, PERC, LTEQ,
-            // TODO GTEQ,   foo<bar, baz>=x
-            EQEQEQ, EXCLEQEQEQ, EQEQ, EXCLEQ, ANDAND, OROR, SAFE_ACCESS, ELVIS,
-            SEMICOLON, RANGE, RANGE_UNTIL, EQ, MULTEQ, DIVEQ, PERCEQ, PLUSEQ, MINUSEQ, NOT_IN, NOT_IS,
-            COLONCOLON,
-            COLON
+    private static final TokenSet STRONG_TYPE_ARGUMENT_LIST_POSTFIX_INDICATORS = TokenSet.orSet(
+            TokenSet.create(COLONCOLON, QUEST, LBRACKET, TokenType.BAD_CHARACTER), Precedence.POSTFIX.getOperations()
+    );
+    private static final TokenSet WEAK_TYPE_ARGUMENT_LIST_POSTFIX_INDICATORS = TokenSet.create(
+            RBRACKET, RBRACE, RPAR, EQ, COLON, SEMICOLON, COMMA,
+
+            EQEQEQ, EXCLEQEQEQ, EQEQ, EXCLEQ, ELVIS, AS_KEYWORD, IS_KEYWORD, NOT_IS, NOT_IN, RANGE, RANGE_UNTIL, ARROW,
+
+            PACKAGE_KEYWORD, CLASS_KEYWORD, INTERFACE_KEYWORD, OBJECT_KEYWORD, TYPE_ALIAS_KEYWORD, SUPER_KEYWORD, VAL_KEYWORD,
+            VAR_KEYWORD, FUN_KEYWORD, RETURN_KEYWORD, FOR_KEYWORD, WHILE_KEYWORD, DO_KEYWORD, BREAK_KEYWORD, CONTINUE_KEYWORD,
+            THROW_KEYWORD
     );
 
     /*package*/ static final TokenSet EXPRESSION_FIRST = TokenSet.create(
@@ -168,7 +166,7 @@
         AS(AS_KEYWORD, AS_SAFE) {
             @Override
             public IElementType parseRightHandSide(IElementType operation, KotlinExpressionParsing parser) {
-                parser.myKotlinParsing.parseTypeRefWithoutIntersections();
+                parser.myKotlinParsing.parseTypeRefWithoutIntersections(/* partOfExpression */ true);
                 return BINARY_WITH_TYPE;
             }
 
@@ -187,7 +185,7 @@
             @Override
             public IElementType parseRightHandSide(IElementType operation, KotlinExpressionParsing parser) {
                 if (operation == IS_KEYWORD || operation == NOT_IS) {
-                    parser.myKotlinParsing.parseTypeRefWithoutIntersections();
+                    parser.myKotlinParsing.parseTypeRefWithoutIntersections(/* partOfExpression */ true);
                     return IS_EXPRESSION;
                 }
 
@@ -402,7 +400,7 @@
 
         if (at(LT)) {
             PsiBuilder.Marker typeArgumentList = mark();
-            if (myKotlinParsing.tryParseTypeArgumentList(TYPE_ARGUMENT_LIST_STOPPERS)) {
+            if (parseCallSuffixTypeArgumentList()) {
                 typeArgumentList.error("Type arguments are not allowed");
             }
             else {
@@ -410,7 +408,7 @@
             }
         }
 
-        if (at(LPAR) && !myBuilder.newlineBeforeCurrentToken()) {
+        if (isAtValueArgumentList()) {
             PsiBuilder.Marker lpar = mark();
             parseCallSuffix();
             lpar.error("This syntax is reserved for future use; to call a reference, enclose it in parentheses: (foo::bar)(args)");
@@ -494,37 +492,143 @@
 
     /*
      * callSuffix
-     *   : typeArguments? valueArguments annotatedLambda
-     *   : typeArguments annotatedLambda
+     *   : typeArguments? valueArguments? annotatedLambda*
      *   ;
      */
     private boolean parseCallSuffix() {
-        if (parseCallWithClosure()) {
-            // do nothing
+        if (at(LT) && parseCallSuffixTypeArgumentList()) {
+            if (at(LPAR) && !myBuilder.newlineBeforeCurrentToken()) parseValueArgumentList();
+            parseCallWithClosure();
+
+            return true;
         }
         else if (at(LPAR)) {
             parseValueArgumentList();
             parseCallWithClosure();
+
+            return true;
         }
-        else if (at(LT)) {
-            PsiBuilder.Marker typeArgumentList = mark();
-            if (myKotlinParsing.tryParseTypeArgumentList(TYPE_ARGUMENT_LIST_STOPPERS)) {
-                typeArgumentList.done(TYPE_ARGUMENT_LIST);
-                if (!myBuilder.newlineBeforeCurrentToken() && at(LPAR)) parseValueArgumentList();
-                parseCallWithClosure();
-            }
-            else {
-                typeArgumentList.rollbackTo();
-                return false;
-            }
+        else if (parseCallWithClosure()) {
+            return true;
         }
-        else {
+
+        return false;
+    }
+
+    private boolean parseCallSuffixTypeArgumentList() {
+        PsiBuilder.Marker typeArgumentList = mark();
+
+        KotlinParsing.TypeArgumentListKind kind = myKotlinParsing.tryParseTypeArgumentList();
+
+        // If the parsed section did not fulfill the criteria of a type argument list or
+        // if there's no indication of an intended call suffix, drop the type argument list.
+        if (kind == KotlinParsing.TypeArgumentListKind.NONE) {
+            typeArgumentList.rollbackTo();
+
             return false;
         }
 
+        if (!isAtTypeArgumentListPostfixIndicator()) {
+            typeArgumentList.rollbackTo();
+
+            mark().done(TYPE_ARGUMENT_LIST_LIKE_EXPRESSION);
+            return false;
+        }
+
+        // If the parsed section could have been a faulty type argument type list, check
+        // whether it could have also been parsed as the right-hand side of a comparison
+        // expression correctly. If so, we have never had a faulty type argument list in
+        // the first place, and therefor it must be dropped.
+        if (kind == KotlinParsing.TypeArgumentListKind.FAULTY_TYPE_ARGUMENT_LIST) {
+            // For better error highlighting we only try to produce a faulty type argument list, if
+            // there are strong indicators. Otherwise, we would lean too much towards call suffixes
+            // in cases like when typing "x < 0 && 1 > ", where the last element hasn't been typed
+            // yet.
+            if (!isAtStrongTypeArgumentListPostfixIndicator()) {
+                typeArgumentList.rollbackTo();
+
+                mark().done(TYPE_ARGUMENT_LIST_LIKE_EXPRESSION);
+                return false;
+            }
+
+            typeArgumentList.rollbackTo();
+
+            if (isAtConditionalExpression()) {
+                mark().done(TYPE_ARGUMENT_LIST_LIKE_EXPRESSION);
+                return false;
+            }
+
+            typeArgumentList = mark();
+
+            myKotlinParsing.tryParseTypeArgumentList();
+        }
+
+        // At this point we're sure that it's either a correct type argument list followed
+        // by some indication of a call suffix or that it's faulty type argument list that
+        // is definitely not a correct right-hand side of an expression and is followed by
+        // a strong indication of a call suffix.
+
+        typeArgumentList.done(TYPE_ARGUMENT_LIST);
+
         return true;
     }
 
+    private boolean isAtTypeArgumentListPostfixIndicator() {
+        return isAtStrongTypeArgumentListPostfixIndicator() || isAtWeakTypeArgumentListPostfixIndicator();
+    }
+
+    private boolean isAtStrongTypeArgumentListPostfixIndicator() {
+        // The start of a value argument list or an annotated lambda indicates a type argument list.
+        // <...>(  <...>{  <...>@identifier{  <...>identifier@{  <...>[
+        // Postfix expression are usually not applied to non-null boolean comparisons.
+        // <...>::  <...>?  <...>.  <...>?.  <...>!!  <...>++  <...>--
+        return isAtValueArgumentList() || isAtAnnotatedLambda() || atSet(STRONG_TYPE_ARGUMENT_LIST_POSTFIX_INDICATORS);
+    }
+
+    private boolean isAtWeakTypeArgumentListPostfixIndicator() {
+        // Line breaks are only available outside of value argument list. This is an incomplete line of code.
+        // <...>↵
+        // Other limiting tokens are also a likely indicator of an indented function call.
+        // <...>)  <...>]  <...>}  <...>,  <...>:  <...>=
+        // Operators are unlikely to be applied to non-null booleans.
+        // <...>==  <...>!=  <...>===  <...>!==  <...> as  <...> is  <...> in
+        // Hard keywords hint towards some formatting issue where line breaks are missing
+        // <...>fun  <...>var  <...>var  <...>object
+        return myBuilder.newlineBeforeCurrentToken() || atSet(WEAK_TYPE_ARGUMENT_LIST_POSTFIX_INDICATORS);
+    }
+
+    boolean isAtConditionalExpression() {
+        assert _at(LT) : "caller must check that current token is LT";
+
+        PsiBuilder.Marker marker = mark();
+
+        advance(); // LT
+
+        boolean hasNoErrors;
+
+        do {
+            PsiBuilder.Marker errorScope = mark();
+
+            parseExpression();
+
+            hasNoErrors = !myBuilder.hasErrorsAfter(errorScope);
+            errorScope.drop();
+
+            if (!hasNoErrors) break;
+
+            if (at(COMMA)) {
+                advance();
+            }
+            else {
+                break;
+            }
+        } while (true);
+
+        marker.rollbackTo();
+
+        return hasNoErrors;
+    }
+
     /*
      * atomicExpression typeParameters? valueParameters? functionLiteral*
      */
@@ -594,6 +698,24 @@
         return true;
     }
 
+    private boolean isAtAnnotatedLambda() {
+        // "{"
+        if (_at(LBRACE)) {
+            return true;
+        }
+        // IDENTIFIER "@" "{"
+        else if (_at(IDENTIFIER) && myBuilder.rawLookup(1) == AT && myBuilder.rawLookup(2) == LBRACE) {
+            return true;
+        }
+        // "@"
+        else if (_at(AT)) {
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+
     private static void doneOrDrop(
             @NotNull PsiBuilder.Marker marker,
             @NotNull IElementType type,
@@ -993,7 +1115,7 @@
                     error("Expecting a type");
                 }
                 else {
-                    myKotlinParsing.parseTypeRef();
+                    myKotlinParsing.parseTypeRef(/* partOfExpression */ false);
                 }
                 condition.done(WHEN_CONDITION_IS_PATTERN);
                 break;
@@ -1271,7 +1393,7 @@
 
             if (at(COLON)) {
                 advance(); // COLON
-                myKotlinParsing.parseTypeRef(ARROW_COMMA_SET);
+                myKotlinParsing.parseTypeRef(ARROW_COMMA_SET, /* partOfExpression */ false);
             }
             parameter.done(VALUE_PARAMETER);
 
@@ -1497,7 +1619,7 @@
 
                     if (at(COLON)) {
                         advance(); // COLON
-                        myKotlinParsing.parseTypeRef(IN_KEYWORD_SET);
+                        myKotlinParsing.parseTypeRef(IN_KEYWORD_SET, /* partOfExpression */ false);
                     }
                 }
                 parameter.done(VALUE_PARAMETER);
@@ -1813,7 +1935,7 @@
     }
 
     /*
-     * "this" ("<" type ">")? label?
+     * "super" ("<" type ">")? label?
      */
     private void parseSuperExpression() {
         assert _at(SUPER_KEYWORD);
@@ -1830,7 +1952,7 @@
             myBuilder.disableNewlines();
             advance(); // LT
 
-            myKotlinParsing.parseTypeRef();
+            myKotlinParsing.parseTypeRef(/* partOfExpression */ false);
 
             if (at(GT)) {
                 advance(); // GT
@@ -1888,6 +2010,10 @@
         list.done(VALUE_ARGUMENT_LIST);
     }
 
+    private boolean isAtValueArgumentList() {
+        return _at(LPAR) && !myBuilder.newlineBeforeCurrentToken();
+    }
+
     /*
      * (SimpleName "=")? "*"? element
      */
diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinParsing.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinParsing.java
index 1bf9760..b5655b7 100644
--- a/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinParsing.java
+++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/KotlinParsing.java
@@ -105,6 +105,21 @@
     private final static TokenSet EOL_OR_SEMICOLON_RBRACE_SET = TokenSet.create(EOL_OR_SEMICOLON, RBRACE);
     private final static TokenSet CLASS_INTERFACE_SET = TokenSet.create(CLASS_KEYWORD, INTERFACE_KEYWORD);
 
+    private static final TokenSet TYPE_ARGUMENT_LIST_RECOVERY_SET = TokenSet.create(
+            INTEGER_LITERAL, FLOAT_LITERAL, CHARACTER_LITERAL, OPEN_QUOTE,
+            PACKAGE_KEYWORD, AS_KEYWORD, TYPE_ALIAS_KEYWORD, INTERFACE_KEYWORD, CLASS_KEYWORD, THIS_KEYWORD, VAL_KEYWORD, VAR_KEYWORD,
+            FUN_KEYWORD, FOR_KEYWORD, NULL_KEYWORD,
+            TRUE_KEYWORD, FALSE_KEYWORD, IS_KEYWORD, THROW_KEYWORD, RETURN_KEYWORD, BREAK_KEYWORD,
+            CONTINUE_KEYWORD, OBJECT_KEYWORD, IF_KEYWORD, TRY_KEYWORD, ELSE_KEYWORD, WHILE_KEYWORD, DO_KEYWORD,
+            WHEN_KEYWORD, RBRACKET, RBRACE, RPAR, PLUSPLUS, MINUSMINUS, EXCLEXCL,
+            //            MUL,
+            PLUS, MINUS, EXCL, DIV, PERC, LTEQ,
+            GTEQ, GT, EQEQEQ, EXCLEQEQEQ, EQEQ, EXCLEQ, ANDAND, OROR, SAFE_ACCESS, ELVIS,
+            SEMICOLON, RANGE, RANGE_UNTIL, EQ, MULTEQ, DIVEQ, PERCEQ, PLUSEQ, MINUSEQ, NOT_IN, NOT_IS,
+            COLONCOLON,
+            COLON
+    );
+
     static KotlinParsing createForTopLevel(SemanticWhitespaceAwarePsiBuilder builder) {
         return new KotlinParsing(builder, true);
     }
@@ -195,7 +210,7 @@
 
     void parseTypeCodeFragment() {
         PsiBuilder.Marker marker = mark();
-        parseTypeRef();
+        parseTypeRef(/* partOfExpression */ false);
 
         checkForUnexpectedSymbols();
 
@@ -714,7 +729,7 @@
         if (myExpressionParsing.isAtLabelDefinitionOrMissingIdentifier()) {
             myExpressionParsing.parseLabelDefinition();
         }
-        parseTypeRef();
+        parseTypeRef(/* partOfExpression */ false);
         contextReceiver.done(CONTEXT_RECEIVER);
     }
 
@@ -939,11 +954,11 @@
 
         PsiBuilder.Marker reference = mark();
         PsiBuilder.Marker typeReference = mark();
-        parseUserType();
+        parseUserType(/* partOfExpression */ false);
         typeReference.done(TYPE_REFERENCE);
         reference.done(CONSTRUCTOR_CALLEE);
 
-        parseTypeArgumentList();
+        parseTypeArgumentList(/* partOfExpression */ false);
 
         boolean whitespaceAfterAnnotation = WHITE_SPACE_OR_COMMENT_BIT_SET.contains(myBuilder.rawLookup(-1));
         boolean shouldBeParsedNextAsFunctionalType = at(LPAR) && whitespaceAfterAnnotation && mode.withSignificantWhitespaceBeforeArguments;
@@ -1425,7 +1440,7 @@
 
         expect(EQ, "Expecting '='", TOP_LEVEL_DECLARATION_FIRST_SEMICOLON_SET);
 
-        parseTypeRef();
+        parseTypeRef(/* partOfExpression */ false);
 
         consumeIf(SEMICOLON);
 
@@ -1497,7 +1512,7 @@
             noTypeReference = false;
             PsiBuilder.Marker type = mark();
             advance(); // COLON
-            parseTypeRef();
+            parseTypeRef(/* partOfExpression */ false);
             errorIf(type, multiDeclaration, "Type annotations are not allowed on destructuring declarations");
         }
 
@@ -1599,7 +1614,7 @@
 
                 if (at(COLON)) {
                     advance(); // COLON
-                    parseTypeRef(follow);
+                    parseTypeRef(follow, /* partOfExpression */ false);
                 }
                 property.done(DESTRUCTURING_DECLARATION_ENTRY);
 
@@ -1694,7 +1709,7 @@
 
                 if (at(COLON)) {
                     advance(); // COLON
-                    parseTypeRef();
+                    parseTypeRef(/* partOfExpression */ false);
                 }
                 setterParameter.done(VALUE_PARAMETER);
                 if (at(COMMA)) {
@@ -1714,7 +1729,7 @@
         if (at(COLON)) {
             advance();
 
-            parseTypeRef();
+            parseTypeRef(/* partOfExpression */ false);
         }
 
         if (propertyComponentKind != PropertyComponentKind.FIELD) {
@@ -1808,7 +1823,7 @@
         if (at(COLON)) {
             advance(); // COLON
 
-            parseTypeRef();
+            parseTypeRef(/* partOfExpression */ false);
         }
 
         boolean functionContractOccurred = parseFunctionContract();
@@ -1851,7 +1866,7 @@
 
         if (!receiverPresent) return false;
 
-        createTruncatedBuilder(lastDot).parseTypeRefWithoutIntersections();
+        createTruncatedBuilder(lastDot).parseTypeRefWithoutIntersections(/* partOfExpression */ false);
 
         if (atSet(RECEIVER_TYPE_TERMINATORS)) {
             advance(); // expectation
@@ -1992,7 +2007,7 @@
     private void parseDelegationSpecifier() {
         PsiBuilder.Marker delegator = mark();
         PsiBuilder.Marker reference = mark();
-        parseTypeRef();
+        parseTypeRef(/* partOfExpression */ false);
 
         if (at(BY_KEYWORD)) {
             reference.drop();
@@ -2103,7 +2118,7 @@
 
         expect(COLON, "Expecting ':' before the upper bound", LBRACE_RBRACE_TYPE_REF_FIRST_SET);
 
-        parseTypeRef();
+        parseTypeRef(/* partOfExpression */ false);
 
         constraint.done(TYPE_CONSTRAINT);
     }
@@ -2135,7 +2150,7 @@
 
         if (at(COLON)) {
             advance(); // COLON
-            parseTypeRef();
+            parseTypeRef(/* partOfExpression */ false);
         }
 
         mark.done(TYPE_PARAMETER);
@@ -2158,26 +2173,30 @@
      *   : typeReference "?"
      *   ;
      */
-    void parseTypeRef() {
-        parseTypeRef(TokenSet.EMPTY);
+    void parseTypeRef(boolean partOfExpression) {
+        parseTypeRef(TokenSet.EMPTY, partOfExpression);
     }
 
-    void parseTypeRefWithoutIntersections() {
-        parseTypeRef(TokenSet.EMPTY, /* allowSimpleIntersectionTypes */ false);
+    void parseTypeRefWithoutIntersections(boolean partOfExpression) {
+        parseTypeRef(TokenSet.EMPTY, partOfExpression, /* allowSimpleIntersectionTypes */ false);
     }
 
-    void parseTypeRef(TokenSet extraRecoverySet) {
-        parseTypeRef(extraRecoverySet, /* allowSimpleIntersectionTypes */ true);
+    void parseTypeRef(TokenSet extraRecoverySet, boolean partOfExpression) {
+        parseTypeRef(extraRecoverySet, partOfExpression, /* allowSimpleIntersectionTypes */ true);
     }
 
-    private void parseTypeRef(TokenSet extraRecoverySet, boolean allowSimpleIntersectionTypes) {
-        PsiBuilder.Marker typeRefMarker = parseTypeRefContents(extraRecoverySet, allowSimpleIntersectionTypes);
+    private void parseTypeRef(TokenSet extraRecoverySet, boolean partOfExpression, boolean allowSimpleIntersectionTypes) {
+        PsiBuilder.Marker typeRefMarker = parseTypeRefContents(extraRecoverySet, partOfExpression, allowSimpleIntersectionTypes);
         typeRefMarker.done(TYPE_REFERENCE);
     }
 
     // The extraRecoverySet is needed for the foo(bar<x, 1, y>(z)) case, to tell whether we should stop
     // on expression-indicating symbols or not
-    private PsiBuilder.Marker parseTypeRefContents(TokenSet extraRecoverySet, boolean allowSimpleIntersectionTypes) {
+    private PsiBuilder.Marker parseTypeRefContents(
+            TokenSet extraRecoverySet,
+            boolean partOfExpression,
+            boolean allowSimpleIntersectionTypes
+    ) {
         PsiBuilder.Marker typeRefMarker = mark();
 
         parseTypeModifierList();
@@ -2203,14 +2222,14 @@
             dynamicType.done(DYNAMIC_TYPE);
         }
         else if (at(IDENTIFIER) || at(PACKAGE_KEYWORD) || atParenthesizedMutableForPlatformTypes(0)) {
-            parseUserType();
+            parseUserType(partOfExpression);
         }
         else if (at(LPAR)) {
             PsiBuilder.Marker functionOrParenthesizedType = mark();
 
             // This may be a function parameter list or just a parenthesized type
             advance(); // LPAR
-            parseTypeRefContents(TokenSet.EMPTY, /* allowSimpleIntersectionTypes */ true).drop(); // parenthesized types, no reference element around it is needed
+            parseTypeRefContents(TokenSet.EMPTY, /* partOfExpression */ false, /* allowSimpleIntersectionTypes */ true).drop(); // parenthesized types, no reference element around it is needed
 
             if (at(RPAR) && lookahead(1) != ARROW) {
                 // It's a parenthesized type
@@ -2252,7 +2271,7 @@
             leftTypeRef.done(TYPE_REFERENCE);
 
             advance(); // &
-            parseTypeRef(extraRecoverySet, /* allowSimpleIntersectionTypes */ true);
+            parseTypeRef(extraRecoverySet, /* allowSimpleIntersectionTypes */ false, true /* partOfExpression */);
 
             intersectionType.done(INTERSECTION_TYPE);
             wasIntersection = true;
@@ -2317,7 +2336,7 @@
      *    - (Mutable)List<Foo>!
      *    - Array<(out) Foo>!
      */
-    private void parseUserType() {
+    private void parseUserType(boolean partOfExpression) {
         PsiBuilder.Marker userType = mark();
 
         if (at(PACKAGE_KEYWORD)) {
@@ -2340,7 +2359,7 @@
                 break;
             }
 
-            parseTypeArgumentList();
+            parseTypeArgumentList(partOfExpression);
 
             recoverOnPlatformTypeSuffix();
 
@@ -2410,20 +2429,72 @@
     /*
      *  (optionalProjection type){","}
      */
-    private void parseTypeArgumentList() {
+    private void parseTypeArgumentList(boolean partOfExpression) {
         if (!at(LT)) return;
 
-        PsiBuilder.Marker list = mark();
+        PsiBuilder.Marker typeArgumentList = mark();
 
-        tryParseTypeArgumentList(TokenSet.EMPTY);
+        TypeArgumentListKind kind = tryParseTypeArgumentList();
 
-        list.done(TYPE_ARGUMENT_LIST);
+        if (kind == TypeArgumentListKind.NONE && partOfExpression) {
+            typeArgumentList.rollbackTo();
+
+            mark().done(TYPE_ARGUMENT_LIST_LIKE_EXPRESSION);
+            return;
+        }
+
+        // Type argument lists that appear inside of expressions might also be comparisons:
+        // some(a as Int < 3, y > z)
+        if (kind == TypeArgumentListKind.FAULTY_TYPE_ARGUMENT_LIST && partOfExpression) {
+            typeArgumentList.rollbackTo();
+
+            if (myExpressionParsing.isAtConditionalExpression()) {
+                mark().done(TYPE_ARGUMENT_LIST_LIKE_EXPRESSION);
+                return;
+            }
+
+            typeArgumentList = mark();
+
+            tryParseTypeArgumentList();
+        }
+
+        typeArgumentList.done(TYPE_ARGUMENT_LIST);
     }
 
-    boolean tryParseTypeArgumentList(TokenSet extraRecoverySet) {
+    /**
+     * Tries to parse a section into a type argument list and reports how successful the attempt was.
+     * <p>
+     * The returned value of the method indicates to what degree the parsed section can be considered a type
+     * argument list.
+     * <p>
+     * {@link TypeArgumentListKind#TYPE_ARGUMENT_LIST} states the section should most likely be considered as
+     * a type argument list. This is the case, if any of the following conditions apply:
+     * <ul>
+     *  <li> the type argument list contains no syntax errors.
+     *  <li> the type argument list is empty
+     * </ul>
+     * <p>
+     * {@link TypeArgumentListKind#FAULTY_TYPE_ARGUMENT_LIST} indicates that the section may be considered as
+     * a type argument list. This is the case, if any of the following conditions apply:
+     * <ul>
+     *  <li> the sections contains syntax errors, but ends with a '>'
+     * </ul>
+     * <p>
+     * {@link TypeArgumentListKind#NONE} indicates that the section must not be considered as a type argument
+     * list. This is the case, if none of the above cases apply.
+     */
+    TypeArgumentListKind tryParseTypeArgumentList() {
+        assert _at(LT) : "caller must check that current token is LT";
+
+        PsiBuilder.Marker errorScope = mark();
+
         myBuilder.disableNewlines();
         advance(); // LT
 
+        // Even if the type argument list is empty, we still want to "try" to parse it in
+        // order to get error highlighting for the missing type
+        boolean empty = at(GT) || at(GTEQ);
+
         while (true) {
             PsiBuilder.Marker projection = mark();
 
@@ -2437,25 +2508,46 @@
                 advance(); // MUL
             }
             else {
-                parseTypeRef(extraRecoverySet);
+                parseTypeRef(TYPE_ARGUMENT_LIST_RECOVERY_SET, /* partOfExpression */ false);
             }
             projection.done(TYPE_PROJECTION);
+
             if (!at(COMMA)) break;
             advance(); // COMMA
-            if (at(GT)) {
-                break;
-            }
+            if (at(GT) || at(GTEQ)) break;
         }
 
+        myBuilder.disableJoiningComplexTokens();
+
         boolean atGT = at(GT);
-        if (!atGT) {
-            error("Expecting a '>'");
-        }
-        else {
+
+        if (atGT) {
             advance(); // GT
         }
+        else {
+            error("Expecting a '>'");
+        }
+
+        myBuilder.restoreJoiningComplexTokensState();
+
         myBuilder.restoreNewlinesState();
-        return atGT;
+
+        boolean success = !myBuilder.hasErrorsAfter(errorScope);
+        errorScope.drop();
+
+        if (success || empty) {
+            return TypeArgumentListKind.TYPE_ARGUMENT_LIST;
+        }
+        else if (atGT) {
+            return TypeArgumentListKind.FAULTY_TYPE_ARGUMENT_LIST;
+        }
+        else {
+            return TypeArgumentListKind.NONE;
+        }
+    }
+
+    public enum TypeArgumentListKind {
+        TYPE_ARGUMENT_LIST, FAULTY_TYPE_ARGUMENT_LIST, NONE,
     }
 
     /*
@@ -2473,7 +2565,7 @@
         parseValueParameterList(true, /* typeRequired  = */ true, TokenSet.EMPTY);
 
         expect(ARROW, "Expecting '->' to specify return type of a function type", TYPE_REF_FIRST);
-        parseTypeRef();
+        parseTypeRef(/* partOfExpression */ false);
 
         return functionType;
     }
@@ -2513,7 +2605,7 @@
                     if (!tryParseValueParameter(typeRequired)) {
                         PsiBuilder.Marker valueParameter = mark();
                         parseFunctionTypeValueParameterModifierList();
-                        parseTypeRef();
+                        parseTypeRef(/* partOfExpression */ false);
                         closeDeclarationWithCommentBinders(valueParameter, VALUE_PARAMETER, false);
                     }
                 }
@@ -2593,7 +2685,7 @@
             else {
                 noErrors = false;
             }
-            parseTypeRef();
+            parseTypeRef(/* partOfExpression */ false);
         }
         else {
             expect(IDENTIFIER, "Parameter name expected", PARAMETER_NAME_RECOVERY_SET);
@@ -2608,7 +2700,7 @@
                     return false;
                 }
 
-                parseTypeRef();
+                parseTypeRef(/* partOfExpression */ false);
             }
             else if (typeRequired) {
                 errorWithRecovery("Parameters must have type annotation", PARAMETER_NAME_RECOVERY_SET);
diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilder.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilder.java
index 64b05d6..1c6b644 100644
--- a/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilder.java
+++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilder.java
@@ -34,4 +34,6 @@
 
     @Override
     boolean isWhitespaceOrComment(@NotNull IElementType elementType);
+
+    boolean hasErrorsAfter(@NotNull PsiBuilder.Marker marker);
 }
diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderAdapter.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderAdapter.java
index 55f2bc8..2a90b11 100644
--- a/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderAdapter.java
+++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderAdapter.java
@@ -68,4 +68,9 @@
     public boolean isWhitespaceOrComment(@NotNull IElementType elementType) {
         return myBuilder.isWhitespaceOrComment(elementType);
     }
+
+    @Override
+    public boolean hasErrorsAfter(@NotNull Marker marker) {
+        return myBuilder.hasErrorsAfter(marker);
+    }
 }
diff --git a/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java b/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java
index 7ef5b63..287b41e 100644
--- a/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java
+++ b/compiler/psi/src/org/jetbrains/kotlin/parsing/SemanticWhitespaceAwarePsiBuilderImpl.java
@@ -202,4 +202,10 @@
         }
         return getJoinedTokenType(super.lookAhead(steps), 2);
     }
+
+    @Override
+    public boolean hasErrorsAfter(@NotNull Marker marker) {
+        assert delegateImpl != null : "PsiBuilderImpl not found";
+        return delegateImpl.hasErrorsAfter(marker);
+    }
 }
diff --git a/compiler/testData/diagnostics/tests/syntax/complicatedLTGT.fir.kt b/compiler/testData/diagnostics/tests/syntax/complicatedLTGT.fir.kt
deleted file mode 100644
index 7fe44c5..0000000
--- a/compiler/testData/diagnostics/tests/syntax/complicatedLTGT.fir.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-// SKIP_TXT
-// ISSUE: KT-8263
-
-fun test(x: Int, y: Int) {
-    if (<!CONDITION_TYPE_MISMATCH!>x < (<!SYNTAX!>if<!><!SYNTAX!><!> <!SYNTAX!>(<!><!UNRESOLVED_REFERENCE!><!SYNTAX!><!>y<!> ><!><!SYNTAX!><!> 115<!SYNTAX!>) 1 else 2))<!> {
-        Unit
-    }
-}
diff --git a/compiler/testData/diagnostics/tests/syntax/complicatedLTGT.kt b/compiler/testData/diagnostics/tests/syntax/complicatedLTGT.kt
index 5ae6154..ec6ebc0 100644
--- a/compiler/testData/diagnostics/tests/syntax/complicatedLTGT.kt
+++ b/compiler/testData/diagnostics/tests/syntax/complicatedLTGT.kt
@@ -1,8 +1,9 @@
+// FIR_IDENTICAL
 // SKIP_TXT
 // ISSUE: KT-8263
 
 fun test(x: Int, y: Int) {
-    if (<!UNRESOLVED_REFERENCE!>x<!> < (<!SYNTAX!>if<!><!SYNTAX!><!> <!SYNTAX!>(<!><!UNRESOLVED_REFERENCE!><!SYNTAX!><!>y<!> ><!SYNTAX!><!> 115<!SYNTAX!>) 1 else 2))<!> {
+    if (x < (if (y > 115) 1 else 2)) {
         Unit
     }
 }
diff --git a/compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.kt b/compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.kt
new file mode 100644
index 0000000..9c029ba
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.kt
@@ -0,0 +1,22 @@
+// FIR_IDENTICAL
+// !LANGUAGE: +AllowTypeArgumentListLikeExpressions
+// ISSUE: KT-8263
+
+fun f(x: Int, y: Int, z: () -> Any, a: (Boolean, Boolean) -> Unit, b: (Any?) -> Unit) {
+    a(x < -1, (-3) > 3)
+    a(x < (-1), -3 > 3)
+    a(x < (-1), (-3) > 3)
+    a(x < y, -3 > 3)
+    a(x < y, x > 2)
+
+    b(x < if (y > (0)) y else 0)
+    b(x < (if (y > (0)) y else 0))
+    b(x < when (y > (0)) { else -> 0 })
+    b(x < (when (y > (0)) { else -> 0 }))
+
+    b(z() as Int < 15)
+    b(z() as Int < y)
+    b(z() is Int < true)
+    b(z() !is Int < true)
+    b(z() !is Int < true > false)
+}
diff --git a/compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.txt b/compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.txt
new file mode 100644
index 0000000..3fcb421
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.txt
@@ -0,0 +1,4 @@
+package
+
+public fun f(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int, /*2*/ z: () -> kotlin.Any, /*3*/ a: (kotlin.Boolean, kotlin.Boolean) -> kotlin.Unit, /*4*/ b: (kotlin.Any?) -> kotlin.Unit): kotlin.Unit
+
diff --git a/compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.fir.kt b/compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.fir.kt
new file mode 100644
index 0000000..cea14e9
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.fir.kt
@@ -0,0 +1,21 @@
+// !LANGUAGE: -AllowTypeArgumentListLikeExpressions
+// ISSUE: KT-8263
+
+fun f(x: Int, y: Int, z: () -> Any, a: (Boolean, Boolean) -> Unit, b: (Any?) -> Unit) {
+    a(x < -1, (-3) > 3)
+    a(x < (-1), -3 > 3)
+    a(x < (-1), (-3) > 3)
+    a(x < y, -3 > 3)
+    a(x < y, x > 2)
+
+    b(x < if (y > (0)) y else 0)
+    b(x < (if (y > (0)) y else 0))
+    b(x < when (y > (0)) { else -> 0 })
+    b(x < (when (y > (0)) { else -> 0 }))
+
+    b(z() as Int < 15)
+    b(z() as Int < y)
+    b(z() is Int < true)
+    b(z() !is Int < true)
+    b(z() !is Int < true > false)
+}
\ No newline at end of file
diff --git a/compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.kt b/compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.kt
new file mode 100644
index 0000000..0b8a87f506
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.kt
@@ -0,0 +1,21 @@
+// !LANGUAGE: -AllowTypeArgumentListLikeExpressions
+// ISSUE: KT-8263
+
+fun f(x: Int, y: Int, z: () -> Any, a: (Boolean, Boolean) -> Unit, b: (Any?) -> Unit) {
+    a(x < -1, (-3) > 3)
+    a(x < (-1), -3 > 3)
+    a(x <!TYPE_ARGUMENT_LIST_LIKE_EXPRESSION!><<!> (-1), (-3) > 3)
+    a(x < y, -3 > 3)
+    a(x <!TYPE_ARGUMENT_LIST_LIKE_EXPRESSION!><<!> y, x > 2)
+
+    b(x < if (y > (0)) y else 0)
+    b(x <!TYPE_ARGUMENT_LIST_LIKE_EXPRESSION!><<!> (if (y > (0)) y else 0))
+    b(x < when (y > (0)) { else -> 0 })
+    b(x <!TYPE_ARGUMENT_LIST_LIKE_EXPRESSION!><<!> (when (y > (0)) { else -> 0 }))
+
+    b(z() as Int <!TYPE_ARGUMENT_LIST_LIKE_EXPRESSION!><<!> 15)
+    b(z() as Int <!TYPE_ARGUMENT_LIST_LIKE_EXPRESSION!><<!> y)
+    b(z() is Int <!TYPE_ARGUMENT_LIST_LIKE_EXPRESSION!><<!> true)
+    b(z() !is Int <!TYPE_ARGUMENT_LIST_LIKE_EXPRESSION!><<!> true)
+    b(z() !is Int <!TYPE_ARGUMENT_LIST_LIKE_EXPRESSION!><<!> true > false)
+}
diff --git a/compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.txt b/compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.txt
new file mode 100644
index 0000000..3fcb421
--- /dev/null
+++ b/compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.txt
@@ -0,0 +1,4 @@
+package
+
+public fun f(/*0*/ x: kotlin.Int, /*1*/ y: kotlin.Int, /*2*/ z: () -> kotlin.Any, /*3*/ a: (kotlin.Boolean, kotlin.Boolean) -> kotlin.Unit, /*4*/ b: (kotlin.Any?) -> kotlin.Unit): kotlin.Unit
+
diff --git a/compiler/testData/psi/DoubleColon_ERR.txt b/compiler/testData/psi/DoubleColon_ERR.txt
index ed39825..0c1b785 100644
--- a/compiler/testData/psi/DoubleColon_ERR.txt
+++ b/compiler/testData/psi/DoubleColon_ERR.txt
@@ -159,37 +159,39 @@
         REFERENCE_EXPRESSION
           PsiElement(IDENTIFIER)('a')
         PsiErrorElement:Type arguments are not allowed
-          PsiElement(LT)('<')
-          TYPE_PROJECTION
-            TYPE_REFERENCE
-              USER_TYPE
-                REFERENCE_EXPRESSION
-                  PsiElement(IDENTIFIER)('b')
-          PsiElement(GT)('>')
+          TYPE_ARGUMENT_LIST
+            PsiElement(LT)('<')
+            TYPE_PROJECTION
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('b')
+            PsiElement(GT)('>')
       PsiWhiteSpace('\n    ')
       CALLABLE_REFERENCE_EXPRESSION
         PsiElement(COLONCOLON)('::')
         REFERENCE_EXPRESSION
           PsiElement(IDENTIFIER)('a')
         PsiErrorElement:Type arguments are not allowed
-          PsiElement(LT)('<')
-          TYPE_PROJECTION
-            TYPE_REFERENCE
-              USER_TYPE
-                REFERENCE_EXPRESSION
-                  PsiElement(IDENTIFIER)('b')
-          PsiElement(COMMA)(',')
-          TYPE_PROJECTION
-            TYPE_REFERENCE
-              USER_TYPE
-                REFERENCE_EXPRESSION
-                  PsiElement(IDENTIFIER)('c')
-                TYPE_ARGUMENT_LIST
-                  PsiElement(LT)('<')
-                  TYPE_PROJECTION
-                    PsiElement(MUL)('*')
-                  PsiElement(GT)('>')
-          PsiElement(GT)('>')
+          TYPE_ARGUMENT_LIST
+            PsiElement(LT)('<')
+            TYPE_PROJECTION
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('b')
+            PsiElement(COMMA)(',')
+            TYPE_PROJECTION
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('c')
+                  TYPE_ARGUMENT_LIST
+                    PsiElement(LT)('<')
+                    TYPE_PROJECTION
+                      PsiElement(MUL)('*')
+                    PsiElement(GT)('>')
+            PsiElement(GT)('>')
       PsiWhiteSpace('\n    ')
       CALLABLE_REFERENCE_EXPRESSION
         REFERENCE_EXPRESSION
@@ -198,26 +200,28 @@
         REFERENCE_EXPRESSION
           PsiElement(IDENTIFIER)('b')
         PsiErrorElement:Type arguments are not allowed
-          PsiElement(LT)('<')
-          TYPE_PROJECTION
-            TYPE_REFERENCE
-              USER_TYPE
-                REFERENCE_EXPRESSION
-                  PsiElement(IDENTIFIER)('c')
-          PsiElement(GT)('>')
+          TYPE_ARGUMENT_LIST
+            PsiElement(LT)('<')
+            TYPE_PROJECTION
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('c')
+            PsiElement(GT)('>')
       PsiWhiteSpace('\n\n    ')
       CALLABLE_REFERENCE_EXPRESSION
         PsiElement(COLONCOLON)('::')
         REFERENCE_EXPRESSION
           PsiElement(IDENTIFIER)('a')
         PsiErrorElement:Type arguments are not allowed
-          PsiElement(LT)('<')
-          TYPE_PROJECTION
-            TYPE_REFERENCE
-              USER_TYPE
-                REFERENCE_EXPRESSION
-                  PsiElement(IDENTIFIER)('b')
-          PsiElement(GT)('>')
+          TYPE_ARGUMENT_LIST
+            PsiElement(LT)('<')
+            TYPE_PROJECTION
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('b')
+            PsiElement(GT)('>')
         PsiErrorElement:This syntax is reserved for future use; to call a reference, enclose it in parentheses: (foo::bar)(args)
           VALUE_ARGUMENT_LIST
             PsiElement(LPAR)('(')
diff --git a/compiler/testData/psi/TypeExpressionAmbiguities_ERR.txt b/compiler/testData/psi/TypeExpressionAmbiguities_ERR.txt
index 3ff766d..5f75167 100644
--- a/compiler/testData/psi/TypeExpressionAmbiguities_ERR.txt
+++ b/compiler/testData/psi/TypeExpressionAmbiguities_ERR.txt
@@ -299,50 +299,46 @@
         PsiWhiteSpace(' ')
         PsiElement(IDENTIFIER)('c')
       PsiWhiteSpace('\n    ')
-      BINARY_WITH_TYPE
-        REFERENCE_EXPRESSION
-          PsiElement(IDENTIFIER)('d')
-        PsiWhiteSpace(' ')
-        OPERATION_REFERENCE
-          PsiElement(as)('as')
-        PsiWhiteSpace(' ')
-        TYPE_REFERENCE
-          USER_TYPE
-            REFERENCE_EXPRESSION
-              PsiElement(IDENTIFIER)('Foo')
-            PsiWhiteSpace(' ')
-            TYPE_ARGUMENT_LIST
-              PsiElement(LT)('<')
+      BINARY_EXPRESSION
+        BINARY_WITH_TYPE
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('d')
+          PsiWhiteSpace(' ')
+          OPERATION_REFERENCE
+            PsiElement(as)('as')
+          PsiWhiteSpace(' ')
+          TYPE_REFERENCE
+            USER_TYPE
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('Foo')
               PsiWhiteSpace(' ')
-              TYPE_PROJECTION
-                TYPE_REFERENCE
-                  USER_TYPE
-                    REFERENCE_EXPRESSION
-                      PsiElement(IDENTIFIER)('bar')
-              PsiErrorElement:Expecting a '>'
+              TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
                 <empty list>
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        PsiWhiteSpace(' ')
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('bar')
       PsiWhiteSpace('\n    ')
-      IS_EXPRESSION
-        REFERENCE_EXPRESSION
-          PsiElement(IDENTIFIER)('x')
-        PsiWhiteSpace(' ')
-        OPERATION_REFERENCE
-          PsiElement(is)('is')
-        PsiWhiteSpace(' ')
-        TYPE_REFERENCE
-          USER_TYPE
-            REFERENCE_EXPRESSION
-              PsiElement(IDENTIFIER)('Foo')
-            PsiWhiteSpace(' ')
-            TYPE_ARGUMENT_LIST
-              PsiElement(LT)('<')
+      BINARY_EXPRESSION
+        IS_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('x')
+          PsiWhiteSpace(' ')
+          OPERATION_REFERENCE
+            PsiElement(is)('is')
+          PsiWhiteSpace(' ')
+          TYPE_REFERENCE
+            USER_TYPE
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('Foo')
               PsiWhiteSpace(' ')
-              TYPE_PROJECTION
-                TYPE_REFERENCE
-                  USER_TYPE
-                    REFERENCE_EXPRESSION
-                      PsiElement(IDENTIFIER)('bar')
-              PsiErrorElement:Expecting a '>'
+              TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
                 <empty list>
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        PsiWhiteSpace(' ')
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('bar')
       PsiWhiteSpace('\n')
       PsiElement(RBRACE)('}')
\ No newline at end of file
diff --git a/compiler/testData/psi/complicateLTGT.txt b/compiler/testData/psi/complicateLTGT.txt
index cbeb21e..3d445cb 100644
--- a/compiler/testData/psi/complicateLTGT.txt
+++ b/compiler/testData/psi/complicateLTGT.txt
@@ -37,57 +37,48 @@
         PsiWhiteSpace(' ')
         PsiElement(LPAR)('(')
         CONDITION
-          CALL_EXPRESSION
+          BINARY_EXPRESSION
             REFERENCE_EXPRESSION
               PsiElement(IDENTIFIER)('x')
             PsiWhiteSpace(' ')
-            TYPE_ARGUMENT_LIST
+            TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+              <empty list>
+            OPERATION_REFERENCE
               PsiElement(LT)('<')
-              PsiWhiteSpace(' ')
-              TYPE_PROJECTION
-                TYPE_REFERENCE
-                  FUNCTION_TYPE
-                    VALUE_PARAMETER_LIST
-                      PsiElement(LPAR)('(')
-                      VALUE_PARAMETER
-                        TYPE_REFERENCE
-                          PsiErrorElement:Type expected
-                            PsiElement(if)('if')
-                      PsiErrorElement:Expecting comma or ')'
-                        <empty list>
-                      PsiWhiteSpace(' ')
-                      PsiErrorElement:Expecting ')'
-                        PsiElement(LPAR)('(')
-                    PsiErrorElement:Expecting '->' to specify return type of a function type
-                      <empty list>
-                    TYPE_REFERENCE
-                      USER_TYPE
-                        REFERENCE_EXPRESSION
-                          PsiElement(IDENTIFIER)('y')
-              PsiWhiteSpace(' ')
-              PsiElement(GT)('>')
-        PsiErrorElement:Expecting ')
-          <empty list>
+            PsiWhiteSpace(' ')
+            PARENTHESIZED
+              PsiElement(LPAR)('(')
+              IF
+                PsiElement(if)('if')
+                PsiWhiteSpace(' ')
+                PsiElement(LPAR)('(')
+                CONDITION
+                  BINARY_EXPRESSION
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('y')
+                    PsiWhiteSpace(' ')
+                    OPERATION_REFERENCE
+                      PsiElement(GT)('>')
+                    PsiWhiteSpace(' ')
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('115')
+                PsiElement(RPAR)(')')
+                PsiWhiteSpace(' ')
+                THEN
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('1')
+                PsiWhiteSpace(' ')
+                PsiElement(else)('else')
+                PsiWhiteSpace(' ')
+                ELSE
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('2')
+              PsiElement(RPAR)(')')
+        PsiElement(RPAR)(')')
         PsiWhiteSpace(' ')
         THEN
-          INTEGER_CONSTANT
-            PsiElement(INTEGER_LITERAL)('115')
-      PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line)
-        PsiElement(RPAR)(')')
-        PsiWhiteSpace(' ')
-        PsiElement(INTEGER_LITERAL)('1')
-        PsiWhiteSpace(' ')
-        PsiElement(else)('else')
-        PsiWhiteSpace(' ')
-        PsiElement(INTEGER_LITERAL)('2')
-        PsiElement(RPAR)(')')
-        PsiElement(RPAR)(')')
-      PsiWhiteSpace(' ')
-      LAMBDA_EXPRESSION
-        FUNCTION_LITERAL
-          PsiElement(LBRACE)('{')
           BLOCK
-            <empty list>
-          PsiElement(RBRACE)('}')
+            PsiElement(LBRACE)('{')
+            PsiElement(RBRACE)('}')
       PsiWhiteSpace('\n')
       PsiElement(RBRACE)('}')
\ No newline at end of file
diff --git a/compiler/testData/psi/complicateLTGTE.txt b/compiler/testData/psi/complicateLTGTE.txt
index 61b65e9..b8c3f56 100644
--- a/compiler/testData/psi/complicateLTGTE.txt
+++ b/compiler/testData/psi/complicateLTGTE.txt
@@ -41,6 +41,8 @@
             REFERENCE_EXPRESSION
               PsiElement(IDENTIFIER)('x')
             PsiWhiteSpace(' ')
+            TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+              <empty list>
             OPERATION_REFERENCE
               PsiElement(LT)('<')
             PsiWhiteSpace(' ')
diff --git a/compiler/testData/psi/typeArgumentList/correctness/binaryExpressionsInFunctionCall.kt b/compiler/testData/psi/typeArgumentList/correctness/binaryExpressionsInFunctionCall.kt
new file mode 100644
index 0000000..97f804e
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/correctness/binaryExpressionsInFunctionCall.kt
@@ -0,0 +1,40 @@
+fun f() {
+    a(x < 1, 2 > 3)
+    a(x < 0x32, (9f) > 3)
+    a(x < (2.0), 2 > 3)
+    a(x < (-1), (-3) > 3)
+    a(x < y > false)
+
+    a(x < "", 2 > (3))
+    a(x < y, false > { 3 })
+    a(x < (1), 2 > (3))
+    a(x < (1), (2) > { 3 })
+    a(x < (y + z), z > (3))
+    a(x < y, z - w > { 10 })
+    a(x < y++, z > { 7 })
+    a(x < y, -z > (1))
+    a(x < y + 1 > (0))
+    a(x < (y + 1) > (false))
+    a(x < (y++) > (false))
+    a(x < y!! > (false))
+    a(x < (y!!) > (false))
+    a(x < (if (z > (y)) 1 else 0))
+    a(x < (when (z > (y)) { else -> 5 }))
+    a(x < y && z > (0))
+    a(x < y || z > { 3.141 })
+
+    a(x as Int < 1)
+    a(x as Int < y)
+    a(x as Int < 3 > false)
+    a(x as? Int < 10)
+    a(x as? Int < y)
+    a(x as? Int < 0.3 > "false")
+    a(x is Int < 100L)
+    a(x is Int < y)
+    a(x is Int < true > z)
+    a(x !is Int < 1000.0)
+    a(x !is Int < y)
+    a(x !is Int < 0b110 > 'c')
+    a(x !is Int < (if (z > (y)) 1 else 0))
+    a(x as Int < (when (z > (y)) { else -> 5 }))
+}
diff --git a/compiler/testData/psi/typeArgumentList/correctness/binaryExpressionsInFunctionCall.txt b/compiler/testData/psi/typeArgumentList/correctness/binaryExpressionsInFunctionCall.txt
new file mode 100644
index 0000000..eb8cbcb
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/correctness/binaryExpressionsInFunctionCall.txt
@@ -0,0 +1,1308 @@
+KtFile: binaryExpressionsInFunctionCall.kt
+  PACKAGE_DIRECTIVE
+    <empty list>
+  IMPORT_LIST
+    <empty list>
+  FUN
+    PsiElement(fun)('fun')
+    PsiWhiteSpace(' ')
+    PsiElement(IDENTIFIER)('f')
+    VALUE_PARAMETER_LIST
+      PsiElement(LPAR)('(')
+      PsiElement(RPAR)(')')
+    PsiWhiteSpace(' ')
+    BLOCK
+      PsiElement(LBRACE)('{')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('1')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('2')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('3')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('0x32')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                FLOAT_CONSTANT
+                  PsiElement(FLOAT_CONSTANT)('9f')
+                PsiElement(RPAR)(')')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('3')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                FLOAT_CONSTANT
+                  PsiElement(FLOAT_CONSTANT)('2.0')
+                PsiElement(RPAR)(')')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('2')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('3')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                PREFIX_EXPRESSION
+                  OPERATION_REFERENCE
+                    PsiElement(MINUS)('-')
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('1')
+                PsiElement(RPAR)(')')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                PREFIX_EXPRESSION
+                  OPERATION_REFERENCE
+                    PsiElement(MINUS)('-')
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('3')
+                PsiElement(RPAR)(')')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('3')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                  <empty list>
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              BOOLEAN_CONSTANT
+                PsiElement(false)('false')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              STRING_TEMPLATE
+                PsiElement(OPEN_QUOTE)('"')
+                PsiElement(CLOSING_QUOTE)('"')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('2')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('3')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BOOLEAN_CONSTANT
+                PsiElement(false)('false')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_EXPRESSION
+                FUNCTION_LITERAL
+                  PsiElement(LBRACE)('{')
+                  PsiWhiteSpace(' ')
+                  BLOCK
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('3')
+                  PsiWhiteSpace(' ')
+                  PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('1')
+                PsiElement(RPAR)(')')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('2')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('3')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('1')
+                PsiElement(RPAR)(')')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('2')
+                PsiElement(RPAR)(')')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_EXPRESSION
+                FUNCTION_LITERAL
+                  PsiElement(LBRACE)('{')
+                  PsiWhiteSpace(' ')
+                  BLOCK
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('3')
+                  PsiWhiteSpace(' ')
+                  PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                BINARY_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('y')
+                  PsiWhiteSpace(' ')
+                  OPERATION_REFERENCE
+                    PsiElement(PLUS)('+')
+                  PsiWhiteSpace(' ')
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('z')
+                PsiElement(RPAR)(')')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('z')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('3')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(MINUS)('-')
+                PsiWhiteSpace(' ')
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('w')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_EXPRESSION
+                FUNCTION_LITERAL
+                  PsiElement(LBRACE)('{')
+                  PsiWhiteSpace(' ')
+                  BLOCK
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('10')
+                  PsiWhiteSpace(' ')
+                  PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              POSTFIX_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+                OPERATION_REFERENCE
+                  PsiElement(PLUSPLUS)('++')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('z')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_EXPRESSION
+                FUNCTION_LITERAL
+                  PsiElement(LBRACE)('{')
+                  PsiWhiteSpace(' ')
+                  BLOCK
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('7')
+                  PsiWhiteSpace(' ')
+                  PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              PREFIX_EXPRESSION
+                OPERATION_REFERENCE
+                  PsiElement(MINUS)('-')
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('1')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                BINARY_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('y')
+                  PsiWhiteSpace(' ')
+                  OPERATION_REFERENCE
+                    PsiElement(PLUS)('+')
+                  PsiWhiteSpace(' ')
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('1')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('0')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                PARENTHESIZED
+                  PsiElement(LPAR)('(')
+                  BINARY_EXPRESSION
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('y')
+                    PsiWhiteSpace(' ')
+                    OPERATION_REFERENCE
+                      PsiElement(PLUS)('+')
+                    PsiWhiteSpace(' ')
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('1')
+                  PsiElement(RPAR)(')')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                BOOLEAN_CONSTANT
+                  PsiElement(false)('false')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                  <empty list>
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                PARENTHESIZED
+                  PsiElement(LPAR)('(')
+                  POSTFIX_EXPRESSION
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('y')
+                    OPERATION_REFERENCE
+                      PsiElement(PLUSPLUS)('++')
+                  PsiElement(RPAR)(')')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                BOOLEAN_CONSTANT
+                  PsiElement(false)('false')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                POSTFIX_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('y')
+                  OPERATION_REFERENCE
+                    PsiElement(EXCLEXCL)('!!')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                BOOLEAN_CONSTANT
+                  PsiElement(false)('false')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                  <empty list>
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                PARENTHESIZED
+                  PsiElement(LPAR)('(')
+                  POSTFIX_EXPRESSION
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('y')
+                    OPERATION_REFERENCE
+                      PsiElement(EXCLEXCL)('!!')
+                  PsiElement(RPAR)(')')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                BOOLEAN_CONSTANT
+                  PsiElement(false)('false')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                IF
+                  PsiElement(if)('if')
+                  PsiWhiteSpace(' ')
+                  PsiElement(LPAR)('(')
+                  CONDITION
+                    BINARY_EXPRESSION
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('z')
+                      PsiWhiteSpace(' ')
+                      OPERATION_REFERENCE
+                        PsiElement(GT)('>')
+                      PsiWhiteSpace(' ')
+                      PARENTHESIZED
+                        PsiElement(LPAR)('(')
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('y')
+                        PsiElement(RPAR)(')')
+                  PsiElement(RPAR)(')')
+                  PsiWhiteSpace(' ')
+                  THEN
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('1')
+                  PsiWhiteSpace(' ')
+                  PsiElement(else)('else')
+                  PsiWhiteSpace(' ')
+                  ELSE
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('0')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                WHEN
+                  PsiElement(when)('when')
+                  PsiWhiteSpace(' ')
+                  PsiElement(LPAR)('(')
+                  BINARY_EXPRESSION
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('z')
+                    PsiWhiteSpace(' ')
+                    OPERATION_REFERENCE
+                      PsiElement(GT)('>')
+                    PsiWhiteSpace(' ')
+                    PARENTHESIZED
+                      PsiElement(LPAR)('(')
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                      PsiElement(RPAR)(')')
+                  PsiElement(RPAR)(')')
+                  PsiWhiteSpace(' ')
+                  PsiElement(LBRACE)('{')
+                  PsiWhiteSpace(' ')
+                  WHEN_ENTRY
+                    PsiElement(else)('else')
+                    PsiWhiteSpace(' ')
+                    PsiElement(ARROW)('->')
+                    PsiWhiteSpace(' ')
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('5')
+                  PsiWhiteSpace(' ')
+                  PsiElement(RBRACE)('}')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(ANDAND)('&&')
+              PsiWhiteSpace(' ')
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(GT)('>')
+                PsiWhiteSpace(' ')
+                PARENTHESIZED
+                  PsiElement(LPAR)('(')
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('0')
+                  PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(OROR)('||')
+              PsiWhiteSpace(' ')
+              BINARY_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(GT)('>')
+                PsiWhiteSpace(' ')
+                LAMBDA_EXPRESSION
+                  FUNCTION_LITERAL
+                    PsiElement(LBRACE)('{')
+                    PsiWhiteSpace(' ')
+                    BLOCK
+                      FLOAT_CONSTANT
+                        PsiElement(FLOAT_CONSTANT)('3.141')
+                    PsiWhiteSpace(' ')
+                    PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_WITH_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(as)('as')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('1')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_WITH_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(as)('as')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('y')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                BINARY_WITH_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiWhiteSpace(' ')
+                  OPERATION_REFERENCE
+                    PsiElement(as)('as')
+                  PsiWhiteSpace(' ')
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('Int')
+                      PsiWhiteSpace(' ')
+                      TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                        <empty list>
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('3')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              BOOLEAN_CONSTANT
+                PsiElement(false)('false')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_WITH_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(AS_SAFE)('as?')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('10')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_WITH_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(AS_SAFE)('as?')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('y')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                BINARY_WITH_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiWhiteSpace(' ')
+                  OPERATION_REFERENCE
+                    PsiElement(AS_SAFE)('as?')
+                  PsiWhiteSpace(' ')
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('Int')
+                      PsiWhiteSpace(' ')
+                      TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                        <empty list>
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                FLOAT_CONSTANT
+                  PsiElement(FLOAT_CONSTANT)('0.3')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              STRING_TEMPLATE
+                PsiElement(OPEN_QUOTE)('"')
+                LITERAL_STRING_TEMPLATE_ENTRY
+                  PsiElement(REGULAR_STRING_PART)('false')
+                PsiElement(CLOSING_QUOTE)('"')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              IS_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(is)('is')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('100L')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              IS_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(is)('is')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('y')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                IS_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiWhiteSpace(' ')
+                  OPERATION_REFERENCE
+                    PsiElement(is)('is')
+                  PsiWhiteSpace(' ')
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('Int')
+                      PsiWhiteSpace(' ')
+                      TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                        <empty list>
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                BOOLEAN_CONSTANT
+                  PsiElement(true)('true')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('z')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              IS_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(NOT_IS)('!is')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              FLOAT_CONSTANT
+                PsiElement(FLOAT_CONSTANT)('1000.0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              IS_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(NOT_IS)('!is')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('y')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_EXPRESSION
+                IS_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiWhiteSpace(' ')
+                  OPERATION_REFERENCE
+                    PsiElement(NOT_IS)('!is')
+                  PsiWhiteSpace(' ')
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('Int')
+                      PsiWhiteSpace(' ')
+                      TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                        <empty list>
+                OPERATION_REFERENCE
+                  PsiElement(LT)('<')
+                PsiWhiteSpace(' ')
+                INTEGER_CONSTANT
+                  PsiElement(INTEGER_LITERAL)('0b110')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              CHARACTER_CONSTANT
+                PsiElement(CHARACTER_LITERAL)(''c'')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              IS_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(NOT_IS)('!is')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                IF
+                  PsiElement(if)('if')
+                  PsiWhiteSpace(' ')
+                  PsiElement(LPAR)('(')
+                  CONDITION
+                    BINARY_EXPRESSION
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('z')
+                      PsiWhiteSpace(' ')
+                      OPERATION_REFERENCE
+                        PsiElement(GT)('>')
+                      PsiWhiteSpace(' ')
+                      PARENTHESIZED
+                        PsiElement(LPAR)('(')
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('y')
+                        PsiElement(RPAR)(')')
+                  PsiElement(RPAR)(')')
+                  PsiWhiteSpace(' ')
+                  THEN
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('1')
+                  PsiWhiteSpace(' ')
+                  PsiElement(else)('else')
+                  PsiWhiteSpace(' ')
+                  ELSE
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('0')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_WITH_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(as)('as')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    PsiWhiteSpace(' ')
+                    TYPE_ARGUMENT_LIST_LIKE_EXPRESSION
+                      <empty list>
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              PARENTHESIZED
+                PsiElement(LPAR)('(')
+                WHEN
+                  PsiElement(when)('when')
+                  PsiWhiteSpace(' ')
+                  PsiElement(LPAR)('(')
+                  BINARY_EXPRESSION
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('z')
+                    PsiWhiteSpace(' ')
+                    OPERATION_REFERENCE
+                      PsiElement(GT)('>')
+                    PsiWhiteSpace(' ')
+                    PARENTHESIZED
+                      PsiElement(LPAR)('(')
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                      PsiElement(RPAR)(')')
+                  PsiElement(RPAR)(')')
+                  PsiWhiteSpace(' ')
+                  PsiElement(LBRACE)('{')
+                  PsiWhiteSpace(' ')
+                  WHEN_ENTRY
+                    PsiElement(else)('else')
+                    PsiWhiteSpace(' ')
+                    PsiElement(ARROW)('->')
+                    PsiWhiteSpace(' ')
+                    INTEGER_CONSTANT
+                      PsiElement(INTEGER_LITERAL)('5')
+                  PsiWhiteSpace(' ')
+                  PsiElement(RBRACE)('}')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n')
+      PsiElement(RBRACE)('}')
\ No newline at end of file
diff --git a/compiler/testData/psi/typeArgumentList/correctness/callExpressionsAnyLHSAtomicExpression.kt b/compiler/testData/psi/typeArgumentList/correctness/callExpressionsAnyLHSAtomicExpression.kt
new file mode 100644
index 0000000..00a7668
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/correctness/callExpressionsAnyLHSAtomicExpression.kt
@@ -0,0 +1,27 @@
+fun f() {
+    (x)<y, z>(0)
+    x[]<y, z>(0)
+    this<y, z>(0)
+    super<y, z>(0)
+    this<y, z>(0)
+    object : C{}<y, z>(0)
+    throw<y, z>(0)
+    return<y, z>(0)
+    continue<y, z>(0)
+    break<y, z>(0)
+    if (x < 0) { 1 } else { 1 }<y, z>(0)
+    when { else -> 1 }<y, z>(0)
+    try { 1 } finally {}<y, z>(0)
+    for (i in 0 until 10) {}<y, z>(0)
+    while (true) {}<y, z>(0)
+    do {} while (true)<y, z>(0)
+    x<y, z>(0);
+    { x }<y, z>(0)
+    ""<y, z>(0)
+    1<y, z>(0)
+    0L<y, z>(0)
+    3.141<y, z>(0)
+    2.718f<y, z>(0)
+    0xF7E<y, z>(0)
+    0b101<y, z>(0)
+}
diff --git a/compiler/testData/psi/typeArgumentList/correctness/callExpressionsAnyLHSAtomicExpression.txt b/compiler/testData/psi/typeArgumentList/correctness/callExpressionsAnyLHSAtomicExpression.txt
new file mode 100644
index 0000000..73e857d
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/correctness/callExpressionsAnyLHSAtomicExpression.txt
@@ -0,0 +1,785 @@
+KtFile: callExpressionsAnyLHSAtomicExpression.kt
+  PACKAGE_DIRECTIVE
+    <empty list>
+  IMPORT_LIST
+    <empty list>
+  FUN
+    PsiElement(fun)('fun')
+    PsiWhiteSpace(' ')
+    PsiElement(IDENTIFIER)('f')
+    VALUE_PARAMETER_LIST
+      PsiElement(LPAR)('(')
+      PsiElement(RPAR)(')')
+    PsiWhiteSpace(' ')
+    BLOCK
+      PsiElement(LBRACE)('{')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        PARENTHESIZED
+          PsiElement(LPAR)('(')
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('x')
+          PsiElement(RPAR)(')')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        ARRAY_ACCESS_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('x')
+          INDICES
+            PsiElement(LBRACKET)('[')
+            PsiErrorElement:Expecting an index element
+              <empty list>
+            PsiElement(RBRACKET)(']')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        THIS_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(this)('this')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        SUPER_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(super)('super')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        THIS_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(this)('this')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        OBJECT_LITERAL
+          OBJECT_DECLARATION
+            PsiElement(object)('object')
+            PsiWhiteSpace(' ')
+            PsiElement(COLON)(':')
+            PsiWhiteSpace(' ')
+            SUPER_TYPE_LIST
+              SUPER_TYPE_ENTRY
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('C')
+            CLASS_BODY
+              PsiElement(LBRACE)('{')
+              PsiElement(RBRACE)('}')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        THROW
+          PsiElement(throw)('throw')
+          PsiErrorElement:Expecting an expression
+            <empty list>
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        RETURN
+          PsiElement(return)('return')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        CONTINUE
+          PsiElement(continue)('continue')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        BREAK
+          PsiElement(break)('break')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        IF
+          PsiElement(if)('if')
+          PsiWhiteSpace(' ')
+          PsiElement(LPAR)('(')
+          CONDITION
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+          PsiWhiteSpace(' ')
+          THEN
+            BLOCK
+              PsiElement(LBRACE)('{')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('1')
+              PsiWhiteSpace(' ')
+              PsiElement(RBRACE)('}')
+          PsiWhiteSpace(' ')
+          PsiElement(else)('else')
+          PsiWhiteSpace(' ')
+          ELSE
+            BLOCK
+              PsiElement(LBRACE)('{')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('1')
+              PsiWhiteSpace(' ')
+              PsiElement(RBRACE)('}')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        WHEN
+          PsiElement(when)('when')
+          PsiWhiteSpace(' ')
+          PsiElement(LBRACE)('{')
+          PsiWhiteSpace(' ')
+          WHEN_ENTRY
+            PsiElement(else)('else')
+            PsiWhiteSpace(' ')
+            PsiElement(ARROW)('->')
+            PsiWhiteSpace(' ')
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('1')
+          PsiWhiteSpace(' ')
+          PsiElement(RBRACE)('}')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        TRY
+          PsiElement(try)('try')
+          PsiWhiteSpace(' ')
+          BLOCK
+            PsiElement(LBRACE)('{')
+            PsiWhiteSpace(' ')
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('1')
+            PsiWhiteSpace(' ')
+            PsiElement(RBRACE)('}')
+          PsiWhiteSpace(' ')
+          FINALLY
+            PsiElement(finally)('finally')
+            PsiWhiteSpace(' ')
+            BLOCK
+              PsiElement(LBRACE)('{')
+              PsiElement(RBRACE)('}')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        FOR
+          PsiElement(for)('for')
+          PsiWhiteSpace(' ')
+          PsiElement(LPAR)('(')
+          VALUE_PARAMETER
+            PsiElement(IDENTIFIER)('i')
+          PsiWhiteSpace(' ')
+          PsiElement(in)('in')
+          PsiWhiteSpace(' ')
+          LOOP_RANGE
+            BINARY_EXPRESSION
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('0')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(IDENTIFIER)('until')
+              PsiWhiteSpace(' ')
+              INTEGER_CONSTANT
+                PsiElement(INTEGER_LITERAL)('10')
+          PsiElement(RPAR)(')')
+          PsiWhiteSpace(' ')
+          BODY
+            BLOCK
+              PsiElement(LBRACE)('{')
+              PsiElement(RBRACE)('}')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        WHILE
+          PsiElement(while)('while')
+          PsiWhiteSpace(' ')
+          PsiElement(LPAR)('(')
+          CONDITION
+            BOOLEAN_CONSTANT
+              PsiElement(true)('true')
+          PsiElement(RPAR)(')')
+          PsiWhiteSpace(' ')
+          BODY
+            BLOCK
+              PsiElement(LBRACE)('{')
+              PsiElement(RBRACE)('}')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        DO_WHILE
+          PsiElement(do)('do')
+          PsiWhiteSpace(' ')
+          BODY
+            BLOCK
+              PsiElement(LBRACE)('{')
+              PsiElement(RBRACE)('}')
+          PsiWhiteSpace(' ')
+          PsiElement(while)('while')
+          PsiWhiteSpace(' ')
+          PsiElement(LPAR)('(')
+          CONDITION
+            BOOLEAN_CONSTANT
+              PsiElement(true)('true')
+          PsiElement(RPAR)(')')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('x')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiElement(SEMICOLON)(';')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        LAMBDA_EXPRESSION
+          FUNCTION_LITERAL
+            PsiElement(LBRACE)('{')
+            PsiWhiteSpace(' ')
+            BLOCK
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+            PsiWhiteSpace(' ')
+            PsiElement(RBRACE)('}')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        STRING_TEMPLATE
+          PsiElement(OPEN_QUOTE)('"')
+          PsiElement(CLOSING_QUOTE)('"')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        INTEGER_CONSTANT
+          PsiElement(INTEGER_LITERAL)('1')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        INTEGER_CONSTANT
+          PsiElement(INTEGER_LITERAL)('0L')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        FLOAT_CONSTANT
+          PsiElement(FLOAT_CONSTANT)('3.141')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        FLOAT_CONSTANT
+          PsiElement(FLOAT_CONSTANT)('2.718f')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        INTEGER_CONSTANT
+          PsiElement(INTEGER_LITERAL)('0xF7E')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        INTEGER_CONSTANT
+          PsiElement(INTEGER_LITERAL)('0b101')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('y')
+          PsiElement(COMMA)(',')
+          PsiWhiteSpace(' ')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('z')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            INTEGER_CONSTANT
+              PsiElement(INTEGER_LITERAL)('0')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n')
+      PsiElement(RBRACE)('}')
\ No newline at end of file
diff --git a/compiler/testData/psi/typeArgumentList/correctness/callExpressionsInFunctionCall.kt b/compiler/testData/psi/typeArgumentList/correctness/callExpressionsInFunctionCall.kt
new file mode 100644
index 0000000..cb4c6d0
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/correctness/callExpressionsInFunctionCall.kt
@@ -0,0 +1,22 @@
+fun f() {
+    a(x<y>(3))
+    a(x<y> { "" })
+    a(x<y, z>(""))
+    a(x<y, z> { 7 })
+    a(x<(y), z> { 1.011f })
+    a(x<y, (z)>(0x5F))
+    a(x<(y), (z)>(0b1110))
+    a(x<v.x, v.y> { 7 })
+    a(x<v.x, (v.y)>(0))
+    a(x<(v.x.z), v.y>('y'))
+    a(x<(v), (v.x.y.z)>("""word"""))
+    a(Array<String>::class)
+    a(Array<String>?::class)
+
+    a(x as List<String>)
+    a(x as? List<String>)
+    a(x is List<String>)
+    a(x !is List<String>)
+    a(x as Int<x> > false)
+    a(x as Int<x, y> == z)
+}
diff --git a/compiler/testData/psi/typeArgumentList/correctness/callExpressionsInFunctionCall.txt b/compiler/testData/psi/typeArgumentList/correctness/callExpressionsInFunctionCall.txt
new file mode 100644
index 0000000..6b1e765
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/correctness/callExpressionsInFunctionCall.txt
@@ -0,0 +1,664 @@
+KtFile: callExpressionsInFunctionCall.kt
+  PACKAGE_DIRECTIVE
+    <empty list>
+  IMPORT_LIST
+    <empty list>
+  FUN
+    PsiElement(fun)('fun')
+    PsiWhiteSpace(' ')
+    PsiElement(IDENTIFIER)('f')
+    VALUE_PARAMETER_LIST
+      PsiElement(LPAR)('(')
+      PsiElement(RPAR)(')')
+    PsiWhiteSpace(' ')
+    BLOCK
+      PsiElement(LBRACE)('{')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                PsiElement(GT)('>')
+              VALUE_ARGUMENT_LIST
+                PsiElement(LPAR)('(')
+                VALUE_ARGUMENT
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('3')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_ARGUMENT
+                LAMBDA_EXPRESSION
+                  FUNCTION_LITERAL
+                    PsiElement(LBRACE)('{')
+                    PsiWhiteSpace(' ')
+                    BLOCK
+                      STRING_TEMPLATE
+                        PsiElement(OPEN_QUOTE)('"')
+                        PsiElement(CLOSING_QUOTE)('"')
+                    PsiWhiteSpace(' ')
+                    PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                PsiElement(COMMA)(',')
+                PsiWhiteSpace(' ')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('z')
+                PsiElement(GT)('>')
+              VALUE_ARGUMENT_LIST
+                PsiElement(LPAR)('(')
+                VALUE_ARGUMENT
+                  STRING_TEMPLATE
+                    PsiElement(OPEN_QUOTE)('"')
+                    PsiElement(CLOSING_QUOTE)('"')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                PsiElement(COMMA)(',')
+                PsiWhiteSpace(' ')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('z')
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_ARGUMENT
+                LAMBDA_EXPRESSION
+                  FUNCTION_LITERAL
+                    PsiElement(LBRACE)('{')
+                    PsiWhiteSpace(' ')
+                    BLOCK
+                      INTEGER_CONSTANT
+                        PsiElement(INTEGER_LITERAL)('7')
+                    PsiWhiteSpace(' ')
+                    PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiElement(LPAR)('(')
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                    PsiElement(RPAR)(')')
+                PsiElement(COMMA)(',')
+                PsiWhiteSpace(' ')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('z')
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_ARGUMENT
+                LAMBDA_EXPRESSION
+                  FUNCTION_LITERAL
+                    PsiElement(LBRACE)('{')
+                    PsiWhiteSpace(' ')
+                    BLOCK
+                      FLOAT_CONSTANT
+                        PsiElement(FLOAT_CONSTANT)('1.011f')
+                    PsiWhiteSpace(' ')
+                    PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                PsiElement(COMMA)(',')
+                PsiWhiteSpace(' ')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiElement(LPAR)('(')
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('z')
+                    PsiElement(RPAR)(')')
+                PsiElement(GT)('>')
+              VALUE_ARGUMENT_LIST
+                PsiElement(LPAR)('(')
+                VALUE_ARGUMENT
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('0x5F')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiElement(LPAR)('(')
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                    PsiElement(RPAR)(')')
+                PsiElement(COMMA)(',')
+                PsiWhiteSpace(' ')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiElement(LPAR)('(')
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('z')
+                    PsiElement(RPAR)(')')
+                PsiElement(GT)('>')
+              VALUE_ARGUMENT_LIST
+                PsiElement(LPAR)('(')
+                VALUE_ARGUMENT
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('0b1110')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('v')
+                      PsiElement(DOT)('.')
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('x')
+                PsiElement(COMMA)(',')
+                PsiWhiteSpace(' ')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('v')
+                      PsiElement(DOT)('.')
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_ARGUMENT
+                LAMBDA_EXPRESSION
+                  FUNCTION_LITERAL
+                    PsiElement(LBRACE)('{')
+                    PsiWhiteSpace(' ')
+                    BLOCK
+                      INTEGER_CONSTANT
+                        PsiElement(INTEGER_LITERAL)('7')
+                    PsiWhiteSpace(' ')
+                    PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('v')
+                      PsiElement(DOT)('.')
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('x')
+                PsiElement(COMMA)(',')
+                PsiWhiteSpace(' ')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiElement(LPAR)('(')
+                    USER_TYPE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('v')
+                      PsiElement(DOT)('.')
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                    PsiElement(RPAR)(')')
+                PsiElement(GT)('>')
+              VALUE_ARGUMENT_LIST
+                PsiElement(LPAR)('(')
+                VALUE_ARGUMENT
+                  INTEGER_CONSTANT
+                    PsiElement(INTEGER_LITERAL)('0')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiElement(LPAR)('(')
+                    USER_TYPE
+                      USER_TYPE
+                        USER_TYPE
+                          REFERENCE_EXPRESSION
+                            PsiElement(IDENTIFIER)('v')
+                        PsiElement(DOT)('.')
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('x')
+                      PsiElement(DOT)('.')
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('z')
+                    PsiElement(RPAR)(')')
+                PsiElement(COMMA)(',')
+                PsiWhiteSpace(' ')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('v')
+                      PsiElement(DOT)('.')
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('y')
+                PsiElement(GT)('>')
+              VALUE_ARGUMENT_LIST
+                PsiElement(LPAR)('(')
+                VALUE_ARGUMENT
+                  CHARACTER_CONSTANT
+                    PsiElement(CHARACTER_LITERAL)(''y'')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiElement(LPAR)('(')
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('v')
+                    PsiElement(RPAR)(')')
+                PsiElement(COMMA)(',')
+                PsiWhiteSpace(' ')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiElement(LPAR)('(')
+                    USER_TYPE
+                      USER_TYPE
+                        USER_TYPE
+                          USER_TYPE
+                            REFERENCE_EXPRESSION
+                              PsiElement(IDENTIFIER)('v')
+                          PsiElement(DOT)('.')
+                          REFERENCE_EXPRESSION
+                            PsiElement(IDENTIFIER)('x')
+                        PsiElement(DOT)('.')
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('y')
+                      PsiElement(DOT)('.')
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('z')
+                    PsiElement(RPAR)(')')
+                PsiElement(GT)('>')
+              VALUE_ARGUMENT_LIST
+                PsiElement(LPAR)('(')
+                VALUE_ARGUMENT
+                  STRING_TEMPLATE
+                    PsiElement(OPEN_QUOTE)('"""')
+                    LITERAL_STRING_TEMPLATE_ENTRY
+                      PsiElement(REGULAR_STRING_PART)('word')
+                    PsiElement(CLOSING_QUOTE)('"""')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CLASS_LITERAL_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('Array')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('String')
+                  PsiElement(GT)('>')
+              PsiElement(COLONCOLON)('::')
+              PsiElement(class)('class')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CLASS_LITERAL_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('Array')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('String')
+                  PsiElement(GT)('>')
+              PsiElement(QUEST)('?')
+              PsiElement(COLONCOLON)('::')
+              PsiElement(class)('class')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_WITH_TYPE
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(as)('as')
+              PsiWhiteSpace(' ')
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('List')
+                  TYPE_ARGUMENT_LIST
+                    PsiElement(LT)('<')
+                    TYPE_PROJECTION
+                      TYPE_REFERENCE
+                        USER_TYPE
+                          REFERENCE_EXPRESSION
+                            PsiElement(IDENTIFIER)('String')
+                    PsiElement(GT)('>')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_WITH_TYPE
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(AS_SAFE)('as?')
+              PsiWhiteSpace(' ')
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('List')
+                  TYPE_ARGUMENT_LIST
+                    PsiElement(LT)('<')
+                    TYPE_PROJECTION
+                      TYPE_REFERENCE
+                        USER_TYPE
+                          REFERENCE_EXPRESSION
+                            PsiElement(IDENTIFIER)('String')
+                    PsiElement(GT)('>')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            IS_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(is)('is')
+              PsiWhiteSpace(' ')
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('List')
+                  TYPE_ARGUMENT_LIST
+                    PsiElement(LT)('<')
+                    TYPE_PROJECTION
+                      TYPE_REFERENCE
+                        USER_TYPE
+                          REFERENCE_EXPRESSION
+                            PsiElement(IDENTIFIER)('String')
+                    PsiElement(GT)('>')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            IS_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(NOT_IS)('!is')
+              PsiWhiteSpace(' ')
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('List')
+                  TYPE_ARGUMENT_LIST
+                    PsiElement(LT)('<')
+                    TYPE_PROJECTION
+                      TYPE_REFERENCE
+                        USER_TYPE
+                          REFERENCE_EXPRESSION
+                            PsiElement(IDENTIFIER)('String')
+                    PsiElement(GT)('>')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_WITH_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(as)('as')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    TYPE_ARGUMENT_LIST
+                      PsiElement(LT)('<')
+                      TYPE_PROJECTION
+                        TYPE_REFERENCE
+                          USER_TYPE
+                            REFERENCE_EXPRESSION
+                              PsiElement(IDENTIFIER)('x')
+                      PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              BOOLEAN_CONSTANT
+                PsiElement(false)('false')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              BINARY_WITH_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiWhiteSpace(' ')
+                OPERATION_REFERENCE
+                  PsiElement(as)('as')
+                PsiWhiteSpace(' ')
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('Int')
+                    TYPE_ARGUMENT_LIST
+                      PsiElement(LT)('<')
+                      TYPE_PROJECTION
+                        TYPE_REFERENCE
+                          USER_TYPE
+                            REFERENCE_EXPRESSION
+                              PsiElement(IDENTIFIER)('x')
+                      PsiElement(COMMA)(',')
+                      PsiWhiteSpace(' ')
+                      TYPE_PROJECTION
+                        TYPE_REFERENCE
+                          USER_TYPE
+                            REFERENCE_EXPRESSION
+                              PsiElement(IDENTIFIER)('y')
+                      PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              OPERATION_REFERENCE
+                PsiElement(EQEQ)('==')
+              PsiWhiteSpace(' ')
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('z')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n')
+      PsiElement(RBRACE)('}')
\ No newline at end of file
diff --git a/compiler/testData/psi/typeArgumentList/recovery/callExpressions.kt b/compiler/testData/psi/typeArgumentList/recovery/callExpressions.kt
new file mode 100644
index 0000000..377d682
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/recovery/callExpressions.kt
@@ -0,0 +1,24 @@
+fun f() {
+    call<x>
+    call<x>()
+    call<x> { }
+    call<x>::
+    call<x>[]
+    call<x>?
+    call<x>?.
+    call<x>.
+    call<x>++
+    call<x>--
+    call<x>!!
+
+    a(call<x>())
+    a(call<x> { })
+    a(call<x>::)
+    a(call<x>[])
+    a(call<x>?)
+    a(call<x>?.)
+    a(call<x>.)
+    a(call<x>++)
+    a(call<x>--)
+    a(call<x>!!)
+}
\ No newline at end of file
diff --git a/compiler/testData/psi/typeArgumentList/recovery/callExpressions.txt b/compiler/testData/psi/typeArgumentList/recovery/callExpressions.txt
new file mode 100644
index 0000000..a34fd0d
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/recovery/callExpressions.txt
@@ -0,0 +1,417 @@
+KtFile: callExpressions.kt
+  PACKAGE_DIRECTIVE
+    <empty list>
+  IMPORT_LIST
+    <empty list>
+  FUN
+    PsiElement(fun)('fun')
+    PsiWhiteSpace(' ')
+    PsiElement(IDENTIFIER)('f')
+    VALUE_PARAMETER_LIST
+      PsiElement(LPAR)('(')
+      PsiElement(RPAR)(')')
+    PsiWhiteSpace(' ')
+    BLOCK
+      PsiElement(LBRACE)('{')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+          PsiElement(GT)('>')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+          PsiElement(GT)('>')
+        PsiWhiteSpace(' ')
+        LAMBDA_ARGUMENT
+          LAMBDA_EXPRESSION
+            FUNCTION_LITERAL
+              PsiElement(LBRACE)('{')
+              PsiWhiteSpace(' ')
+              BLOCK
+                <empty list>
+              PsiElement(RBRACE)('}')
+      PsiWhiteSpace('\n    ')
+      ARRAY_ACCESS_EXPRESSION
+        CALLABLE_REFERENCE_EXPRESSION
+          CALL_EXPRESSION
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('call')
+            TYPE_ARGUMENT_LIST
+              PsiElement(LT)('<')
+              TYPE_PROJECTION
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('x')
+              PsiElement(GT)('>')
+          PsiElement(COLONCOLON)('::')
+          PsiWhiteSpace('\n    ')
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('call')
+          PsiErrorElement:Type arguments are not allowed
+            TYPE_ARGUMENT_LIST
+              PsiElement(LT)('<')
+              TYPE_PROJECTION
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('x')
+              PsiElement(GT)('>')
+        INDICES
+          PsiElement(LBRACKET)('[')
+          PsiErrorElement:Expecting an index element
+            <empty list>
+          PsiElement(RBRACKET)(']')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              USER_TYPE
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+          PsiElement(GT)('>')
+      PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line)
+        PsiElement(QUEST)('?')
+      PsiWhiteSpace('\n    ')
+      POSTFIX_EXPRESSION
+        DOT_QUALIFIED_EXPRESSION
+          SAFE_ACCESS_EXPRESSION
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('x')
+                PsiElement(GT)('>')
+            PsiElement(SAFE_ACCESS)('?.')
+            PsiWhiteSpace('\n    ')
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('x')
+                PsiElement(GT)('>')
+          PsiElement(DOT)('.')
+          PsiWhiteSpace('\n    ')
+          CALL_EXPRESSION
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('call')
+            TYPE_ARGUMENT_LIST
+              PsiElement(LT)('<')
+              TYPE_PROJECTION
+                TYPE_REFERENCE
+                  USER_TYPE
+                    REFERENCE_EXPRESSION
+                      PsiElement(IDENTIFIER)('x')
+              PsiElement(GT)('>')
+        OPERATION_REFERENCE
+          PsiElement(PLUSPLUS)('++')
+      PsiWhiteSpace('\n    ')
+      POSTFIX_EXPRESSION
+        CALL_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('call')
+          TYPE_ARGUMENT_LIST
+            PsiElement(LT)('<')
+            TYPE_PROJECTION
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+            PsiElement(GT)('>')
+        OPERATION_REFERENCE
+          PsiElement(MINUSMINUS)('--')
+      PsiWhiteSpace('\n    ')
+      POSTFIX_EXPRESSION
+        CALL_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('call')
+          TYPE_ARGUMENT_LIST
+            PsiElement(LT)('<')
+            TYPE_PROJECTION
+              TYPE_REFERENCE
+                USER_TYPE
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+            PsiElement(GT)('>')
+        OPERATION_REFERENCE
+          PsiElement(EXCLEXCL)('!!')
+      PsiWhiteSpace('\n\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('x')
+                PsiElement(GT)('>')
+              VALUE_ARGUMENT_LIST
+                PsiElement(LPAR)('(')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('x')
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_ARGUMENT
+                LAMBDA_EXPRESSION
+                  FUNCTION_LITERAL
+                    PsiElement(LBRACE)('{')
+                    PsiWhiteSpace(' ')
+                    BLOCK
+                      <empty list>
+                    PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALLABLE_REFERENCE_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('x')
+                  PsiElement(GT)('>')
+              PsiElement(COLONCOLON)('::')
+              REFERENCE_EXPRESSION
+                PsiErrorElement:Expecting an identifier
+                  <empty list>
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            ARRAY_ACCESS_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('x')
+                  PsiElement(GT)('>')
+              INDICES
+                PsiElement(LBRACKET)('[')
+                PsiErrorElement:Expecting an index element
+                  <empty list>
+                PsiElement(RBRACKET)(']')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    USER_TYPE
+                      REFERENCE_EXPRESSION
+                        PsiElement(IDENTIFIER)('x')
+                PsiElement(GT)('>')
+          PsiErrorElement:Expecting ')'
+            PsiElement(QUEST)('?')
+      PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line)
+        PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            SAFE_ACCESS_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('x')
+                  PsiElement(GT)('>')
+              PsiElement(SAFE_ACCESS)('?.')
+              PsiErrorElement:Expecting an element
+                <empty list>
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            DOT_QUALIFIED_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('x')
+                  PsiElement(GT)('>')
+              PsiElement(DOT)('.')
+              PsiErrorElement:Expecting an element
+                <empty list>
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            POSTFIX_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('x')
+                  PsiElement(GT)('>')
+              OPERATION_REFERENCE
+                PsiElement(PLUSPLUS)('++')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            POSTFIX_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('x')
+                  PsiElement(GT)('>')
+              OPERATION_REFERENCE
+                PsiElement(MINUSMINUS)('--')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            POSTFIX_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      USER_TYPE
+                        REFERENCE_EXPRESSION
+                          PsiElement(IDENTIFIER)('x')
+                  PsiElement(GT)('>')
+              OPERATION_REFERENCE
+                PsiElement(EXCLEXCL)('!!')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n')
+      PsiElement(RBRACE)('}')
diff --git a/compiler/testData/psi/typeArgumentList/recovery/callExpressions_ERR.kt b/compiler/testData/psi/typeArgumentList/recovery/callExpressions_ERR.kt
new file mode 100644
index 0000000..04ff987
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/recovery/callExpressions_ERR.kt
@@ -0,0 +1,45 @@
+fun f() {
+    call<>
+    call<x.>
+    call<>()
+    call<x.>()
+    call<> { }
+    call<x.> { }
+    call<>::
+    call<x.>::
+    call<>[]
+    call<x.>[]
+    call<>?
+    call<x.>?
+    call<>?.
+    call<x.>?.
+    call<>.
+    call<x.>.
+    call<>++
+    call<x.>++
+    call<>--
+    call<x.>--
+    call<>!!
+    call<x.>!!
+
+    a(call<>())
+    a(call<x.>())
+    a(call<> { })
+    a(call<x.> { })
+    a(call<>::)
+    a(call<x.>::)
+    a(call<>[])
+    a(call<x.>[])
+    a(call<>?)
+    a(call<x.>?)
+    a(call<>?.)
+    a(call<x.>?.)
+    a(call<>.)
+    a(call<x.>.)
+    a(call<>++)
+    a(call<x.>++)
+    a(call<>--)
+    a(call<x.>--)
+    a(call<>!!)
+    a(call<x.>!!)
+}
\ No newline at end of file
diff --git a/compiler/testData/psi/typeArgumentList/recovery/callExpressions_ERR.txt b/compiler/testData/psi/typeArgumentList/recovery/callExpressions_ERR.txt
new file mode 100644
index 0000000..6adf1b7
--- /dev/null
+++ b/compiler/testData/psi/typeArgumentList/recovery/callExpressions_ERR.txt
@@ -0,0 +1,800 @@
+KtFile: callExpressions_ERR.kt
+  PACKAGE_DIRECTIVE
+    <empty list>
+  IMPORT_LIST
+    <empty list>
+  FUN
+    PsiElement(fun)('fun')
+    PsiWhiteSpace(' ')
+    PsiElement(IDENTIFIER)('f')
+    VALUE_PARAMETER_LIST
+      PsiElement(LPAR)('(')
+      PsiElement(RPAR)(')')
+    PsiWhiteSpace(' ')
+    BLOCK
+      PsiElement(LBRACE)('{')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              PsiErrorElement:Type expected
+                <empty list>
+          PsiElement(GT)('>')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        DOT_QUALIFIED_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('x')
+          PsiElement(DOT)('.')
+          PsiErrorElement:Expecting an element
+            PsiElement(GT)('>')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              PsiErrorElement:Type expected
+                <empty list>
+          PsiElement(GT)('>')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        DOT_QUALIFIED_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('x')
+          PsiElement(DOT)('.')
+          CALL_EXPRESSION
+            PsiErrorElement:Expecting an element
+              PsiElement(GT)('>')
+            VALUE_ARGUMENT_LIST
+              PsiElement(LPAR)('(')
+              PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              PsiErrorElement:Type expected
+                <empty list>
+          PsiElement(GT)('>')
+        PsiWhiteSpace(' ')
+        LAMBDA_ARGUMENT
+          LAMBDA_EXPRESSION
+            FUNCTION_LITERAL
+              PsiElement(LBRACE)('{')
+              PsiWhiteSpace(' ')
+              BLOCK
+                <empty list>
+              PsiElement(RBRACE)('}')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        DOT_QUALIFIED_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('x')
+          PsiElement(DOT)('.')
+          CALL_EXPRESSION
+            PsiErrorElement:Expecting an element
+              PsiElement(GT)('>')
+            PsiWhiteSpace(' ')
+            LAMBDA_ARGUMENT
+              LAMBDA_EXPRESSION
+                FUNCTION_LITERAL
+                  PsiElement(LBRACE)('{')
+                  PsiWhiteSpace(' ')
+                  BLOCK
+                    <empty list>
+                  PsiElement(RBRACE)('}')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        CALLABLE_REFERENCE_EXPRESSION
+          CALL_EXPRESSION
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('call')
+            TYPE_ARGUMENT_LIST
+              PsiElement(LT)('<')
+              TYPE_PROJECTION
+                TYPE_REFERENCE
+                  PsiErrorElement:Type expected
+                    <empty list>
+              PsiElement(GT)('>')
+          PsiElement(COLONCOLON)('::')
+          PsiWhiteSpace('\n    ')
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        ARRAY_ACCESS_EXPRESSION
+          CALLABLE_REFERENCE_EXPRESSION
+            DOT_QUALIFIED_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiElement(DOT)('.')
+              PsiErrorElement:Expecting an element
+                PsiElement(GT)('>')
+            PsiElement(COLONCOLON)('::')
+            PsiWhiteSpace('\n    ')
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('call')
+            PsiErrorElement:Type arguments are not allowed
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiErrorElement:Type expected
+                      <empty list>
+                PsiElement(GT)('>')
+          INDICES
+            PsiElement(LBRACKET)('[')
+            PsiErrorElement:Expecting an index element
+              <empty list>
+            PsiElement(RBRACKET)(']')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        ARRAY_ACCESS_EXPRESSION
+          DOT_QUALIFIED_EXPRESSION
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('x')
+            PsiElement(DOT)('.')
+            PsiErrorElement:Expecting an element
+              PsiElement(GT)('>')
+          INDICES
+            PsiElement(LBRACKET)('[')
+            PsiErrorElement:Expecting an index element
+              <empty list>
+            PsiElement(RBRACKET)(']')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        TYPE_ARGUMENT_LIST
+          PsiElement(LT)('<')
+          TYPE_PROJECTION
+            TYPE_REFERENCE
+              PsiErrorElement:Type expected
+                <empty list>
+          PsiElement(GT)('>')
+      PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line)
+        PsiElement(QUEST)('?')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        DOT_QUALIFIED_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('x')
+          PsiElement(DOT)('.')
+          PsiErrorElement:Expecting an element
+            PsiElement(GT)('>')
+      PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line)
+        PsiElement(QUEST)('?')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        BINARY_EXPRESSION
+          SAFE_ACCESS_EXPRESSION
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiErrorElement:Type expected
+                      <empty list>
+                PsiElement(GT)('>')
+            PsiElement(SAFE_ACCESS)('?.')
+            PsiWhiteSpace('\n    ')
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('call')
+          OPERATION_REFERENCE
+            PsiElement(LT)('<')
+          DOT_QUALIFIED_EXPRESSION
+            SAFE_ACCESS_EXPRESSION
+              DOT_QUALIFIED_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiElement(DOT)('.')
+                PsiErrorElement:Expecting an element
+                  PsiElement(GT)('>')
+              PsiElement(SAFE_ACCESS)('?.')
+              PsiWhiteSpace('\n    ')
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      PsiErrorElement:Type expected
+                        <empty list>
+                  PsiElement(GT)('>')
+            PsiElement(DOT)('.')
+            PsiWhiteSpace('\n    ')
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        POSTFIX_EXPRESSION
+          DOT_QUALIFIED_EXPRESSION
+            DOT_QUALIFIED_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('x')
+              PsiElement(DOT)('.')
+              PsiErrorElement:Expecting an element
+                PsiElement(GT)('>')
+            PsiElement(DOT)('.')
+            PsiWhiteSpace('\n    ')
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiErrorElement:Type expected
+                      <empty list>
+                PsiElement(GT)('>')
+          OPERATION_REFERENCE
+            PsiElement(PLUSPLUS)('++')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        POSTFIX_EXPRESSION
+          DOT_QUALIFIED_EXPRESSION
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('x')
+            PsiElement(DOT)('.')
+            PsiErrorElement:Expecting an element
+              PsiElement(GT)('>')
+          OPERATION_REFERENCE
+            PsiElement(PLUSPLUS)('++')
+      PsiWhiteSpace('\n    ')
+      POSTFIX_EXPRESSION
+        CALL_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('call')
+          TYPE_ARGUMENT_LIST
+            PsiElement(LT)('<')
+            TYPE_PROJECTION
+              TYPE_REFERENCE
+                PsiErrorElement:Type expected
+                  <empty list>
+            PsiElement(GT)('>')
+        OPERATION_REFERENCE
+          PsiElement(MINUSMINUS)('--')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        POSTFIX_EXPRESSION
+          DOT_QUALIFIED_EXPRESSION
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('x')
+            PsiElement(DOT)('.')
+            PsiErrorElement:Expecting an element
+              PsiElement(GT)('>')
+          OPERATION_REFERENCE
+            PsiElement(MINUSMINUS)('--')
+      PsiWhiteSpace('\n    ')
+      POSTFIX_EXPRESSION
+        CALL_EXPRESSION
+          REFERENCE_EXPRESSION
+            PsiElement(IDENTIFIER)('call')
+          TYPE_ARGUMENT_LIST
+            PsiElement(LT)('<')
+            TYPE_PROJECTION
+              TYPE_REFERENCE
+                PsiErrorElement:Type expected
+                  <empty list>
+            PsiElement(GT)('>')
+        OPERATION_REFERENCE
+          PsiElement(EXCLEXCL)('!!')
+      PsiWhiteSpace('\n    ')
+      BINARY_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('call')
+        OPERATION_REFERENCE
+          PsiElement(LT)('<')
+        POSTFIX_EXPRESSION
+          DOT_QUALIFIED_EXPRESSION
+            REFERENCE_EXPRESSION
+              PsiElement(IDENTIFIER)('x')
+            PsiElement(DOT)('.')
+            PsiErrorElement:Expecting an element
+              PsiElement(GT)('>')
+          OPERATION_REFERENCE
+            PsiElement(EXCLEXCL)('!!')
+      PsiWhiteSpace('\n\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiErrorElement:Type expected
+                      <empty list>
+                PsiElement(GT)('>')
+              VALUE_ARGUMENT_LIST
+                PsiElement(LPAR)('(')
+                PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              DOT_QUALIFIED_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiElement(DOT)('.')
+                CALL_EXPRESSION
+                  PsiErrorElement:Expecting an element
+                    PsiElement(GT)('>')
+                  VALUE_ARGUMENT_LIST
+                    PsiElement(LPAR)('(')
+                    PsiElement(RPAR)(')')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiErrorElement:Type expected
+                      <empty list>
+                PsiElement(GT)('>')
+              PsiWhiteSpace(' ')
+              LAMBDA_ARGUMENT
+                LAMBDA_EXPRESSION
+                  FUNCTION_LITERAL
+                    PsiElement(LBRACE)('{')
+                    PsiWhiteSpace(' ')
+                    BLOCK
+                      <empty list>
+                    PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              DOT_QUALIFIED_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiElement(DOT)('.')
+                CALL_EXPRESSION
+                  PsiErrorElement:Expecting an element
+                    PsiElement(GT)('>')
+                  PsiWhiteSpace(' ')
+                  LAMBDA_ARGUMENT
+                    LAMBDA_EXPRESSION
+                      FUNCTION_LITERAL
+                        PsiElement(LBRACE)('{')
+                        PsiWhiteSpace(' ')
+                        BLOCK
+                          <empty list>
+                        PsiElement(RBRACE)('}')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALLABLE_REFERENCE_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      PsiErrorElement:Type expected
+                        <empty list>
+                  PsiElement(GT)('>')
+              PsiElement(COLONCOLON)('::')
+              REFERENCE_EXPRESSION
+                PsiErrorElement:Expecting an identifier
+                  <empty list>
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              CALLABLE_REFERENCE_EXPRESSION
+                DOT_QUALIFIED_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiElement(DOT)('.')
+                  PsiErrorElement:Expecting an element
+                    PsiElement(GT)('>')
+                PsiElement(COLONCOLON)('::')
+                REFERENCE_EXPRESSION
+                  PsiErrorElement:Expecting an identifier
+                    <empty list>
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            ARRAY_ACCESS_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      PsiErrorElement:Type expected
+                        <empty list>
+                  PsiElement(GT)('>')
+              INDICES
+                PsiElement(LBRACKET)('[')
+                PsiErrorElement:Expecting an index element
+                  <empty list>
+                PsiElement(RBRACKET)(']')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              ARRAY_ACCESS_EXPRESSION
+                DOT_QUALIFIED_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiElement(DOT)('.')
+                  PsiErrorElement:Expecting an element
+                    PsiElement(GT)('>')
+                INDICES
+                  PsiElement(LBRACKET)('[')
+                  PsiErrorElement:Expecting an index element
+                    <empty list>
+                  PsiElement(RBRACKET)(']')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            CALL_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              TYPE_ARGUMENT_LIST
+                PsiElement(LT)('<')
+                TYPE_PROJECTION
+                  TYPE_REFERENCE
+                    PsiErrorElement:Type expected
+                      <empty list>
+                PsiElement(GT)('>')
+          PsiErrorElement:Expecting ')'
+            PsiElement(QUEST)('?')
+      PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line)
+        PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              DOT_QUALIFIED_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('x')
+                PsiElement(DOT)('.')
+                PsiErrorElement:Expecting an element
+                  PsiElement(GT)('>')
+          PsiErrorElement:Expecting ')'
+            PsiElement(QUEST)('?')
+      PsiErrorElement:Unexpected tokens (use ';' to separate expressions on the same line)
+        PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            SAFE_ACCESS_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      PsiErrorElement:Type expected
+                        <empty list>
+                  PsiElement(GT)('>')
+              PsiElement(SAFE_ACCESS)('?.')
+              PsiErrorElement:Expecting an element
+                <empty list>
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              SAFE_ACCESS_EXPRESSION
+                DOT_QUALIFIED_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiElement(DOT)('.')
+                  PsiErrorElement:Expecting an element
+                    PsiElement(GT)('>')
+                PsiElement(SAFE_ACCESS)('?.')
+                PsiErrorElement:Expecting an element
+                  <empty list>
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            DOT_QUALIFIED_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      PsiErrorElement:Type expected
+                        <empty list>
+                  PsiElement(GT)('>')
+              PsiElement(DOT)('.')
+              PsiErrorElement:Expecting an element
+                <empty list>
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              DOT_QUALIFIED_EXPRESSION
+                DOT_QUALIFIED_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiElement(DOT)('.')
+                  PsiErrorElement:Expecting an element
+                    PsiElement(GT)('>')
+                PsiElement(DOT)('.')
+                PsiErrorElement:Expecting an element
+                  <empty list>
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            POSTFIX_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      PsiErrorElement:Type expected
+                        <empty list>
+                  PsiElement(GT)('>')
+              OPERATION_REFERENCE
+                PsiElement(PLUSPLUS)('++')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              POSTFIX_EXPRESSION
+                DOT_QUALIFIED_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiElement(DOT)('.')
+                  PsiErrorElement:Expecting an element
+                    PsiElement(GT)('>')
+                OPERATION_REFERENCE
+                  PsiElement(PLUSPLUS)('++')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            POSTFIX_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      PsiErrorElement:Type expected
+                        <empty list>
+                  PsiElement(GT)('>')
+              OPERATION_REFERENCE
+                PsiElement(MINUSMINUS)('--')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              POSTFIX_EXPRESSION
+                DOT_QUALIFIED_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiElement(DOT)('.')
+                  PsiErrorElement:Expecting an element
+                    PsiElement(GT)('>')
+                OPERATION_REFERENCE
+                  PsiElement(MINUSMINUS)('--')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            POSTFIX_EXPRESSION
+              CALL_EXPRESSION
+                REFERENCE_EXPRESSION
+                  PsiElement(IDENTIFIER)('call')
+                TYPE_ARGUMENT_LIST
+                  PsiElement(LT)('<')
+                  TYPE_PROJECTION
+                    TYPE_REFERENCE
+                      PsiErrorElement:Type expected
+                        <empty list>
+                  PsiElement(GT)('>')
+              OPERATION_REFERENCE
+                PsiElement(EXCLEXCL)('!!')
+          PsiElement(RPAR)(')')
+      PsiWhiteSpace('\n    ')
+      CALL_EXPRESSION
+        REFERENCE_EXPRESSION
+          PsiElement(IDENTIFIER)('a')
+        VALUE_ARGUMENT_LIST
+          PsiElement(LPAR)('(')
+          VALUE_ARGUMENT
+            BINARY_EXPRESSION
+              REFERENCE_EXPRESSION
+                PsiElement(IDENTIFIER)('call')
+              OPERATION_REFERENCE
+                PsiElement(LT)('<')
+              POSTFIX_EXPRESSION
+                DOT_QUALIFIED_EXPRESSION
+                  REFERENCE_EXPRESSION
+                    PsiElement(IDENTIFIER)('x')
+                  PsiElement(DOT)('.')
+                  PsiErrorElement:Expecting an element
+                    PsiElement(GT)('>')
+                OPERATION_REFERENCE
+                  PsiElement(EXCLEXCL)('!!')
+          PsiElement(RPAR)(')')
+      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 52106c6..4525519 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
@@ -32240,6 +32240,28 @@
         }
 
         @Nested
+        @TestMetadata("compiler/testData/diagnostics/tests/typeArguments")
+        @TestDataPath("$PROJECT_ROOT")
+        public class TypeArguments {
+            @Test
+            public void testAllFilesPresentInTypeArguments() throws Exception {
+                KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/diagnostics/tests/typeArguments"), Pattern.compile("^(.*)\\.kts?$"), Pattern.compile("^(.+)\\.fir\\.kts?$"), true);
+            }
+
+            @Test
+            @TestMetadata("allowTypeArgumentListLikeExpressions.kt")
+            public void testAllowTypeArgumentListLikeExpressions() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/typeArguments/allowTypeArgumentListLikeExpressions.kt");
+            }
+
+            @Test
+            @TestMetadata("forbidTypeArgumentListLikeExpressions.kt")
+            public void testForbidTypeArgumentListLikeExpressions() throws Exception {
+                runTest("compiler/testData/diagnostics/tests/typeArguments/forbidTypeArgumentListLikeExpressions.kt");
+            }
+        }
+
+        @Nested
         @TestMetadata("compiler/testData/diagnostics/tests/typeParameters")
         @TestDataPath("$PROJECT_ROOT")
         public class TypeParameters {
diff --git a/compiler/tests-gen/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java b/compiler/tests-gen/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java
index 69faed2..835334b 100644
--- a/compiler/tests-gen/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java
+++ b/compiler/tests-gen/org/jetbrains/kotlin/parsing/ParsingTestGenerated.java
@@ -2908,6 +2908,70 @@
                 runTest("compiler/testData/psi/stringTemplates/StringTemplateWithTryWithoutBlockInShortEntry.kt");
             }
         }
+
+        @TestMetadata("compiler/testData/psi/typeArgumentList")
+        @TestDataPath("$PROJECT_ROOT")
+        @RunWith(JUnit3RunnerWithInners.class)
+        public static class TypeArgumentList extends AbstractParsingTest {
+            private void runTest(String testDataFilePath) throws Exception {
+                KotlinTestUtils.runTest(this::doParsingTest, this, testDataFilePath);
+            }
+
+            public void testAllFilesPresentInTypeArgumentList() throws Exception {
+                KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/psi/typeArgumentList"), Pattern.compile("^(.*)\\.kts?$"), null, true);
+            }
+
+            @TestMetadata("compiler/testData/psi/typeArgumentList/correctness")
+            @TestDataPath("$PROJECT_ROOT")
+            @RunWith(JUnit3RunnerWithInners.class)
+            public static class Correctness extends AbstractParsingTest {
+                private void runTest(String testDataFilePath) throws Exception {
+                    KotlinTestUtils.runTest(this::doParsingTest, this, testDataFilePath);
+                }
+
+                public void testAllFilesPresentInCorrectness() throws Exception {
+                    KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/psi/typeArgumentList/correctness"), Pattern.compile("^(.*)\\.kts?$"), null, true);
+                }
+
+                @TestMetadata("binaryExpressionsInFunctionCall.kt")
+                public void testBinaryExpressionsInFunctionCall() throws Exception {
+                    runTest("compiler/testData/psi/typeArgumentList/correctness/binaryExpressionsInFunctionCall.kt");
+                }
+
+                @TestMetadata("callExpressionsAnyLHSAtomicExpression.kt")
+                public void testCallExpressionsAnyLHSAtomicExpression() throws Exception {
+                    runTest("compiler/testData/psi/typeArgumentList/correctness/callExpressionsAnyLHSAtomicExpression.kt");
+                }
+
+                @TestMetadata("callExpressionsInFunctionCall.kt")
+                public void testCallExpressionsInFunctionCall() throws Exception {
+                    runTest("compiler/testData/psi/typeArgumentList/correctness/callExpressionsInFunctionCall.kt");
+                }
+            }
+
+            @TestMetadata("compiler/testData/psi/typeArgumentList/recovery")
+            @TestDataPath("$PROJECT_ROOT")
+            @RunWith(JUnit3RunnerWithInners.class)
+            public static class Recovery extends AbstractParsingTest {
+                private void runTest(String testDataFilePath) throws Exception {
+                    KotlinTestUtils.runTest(this::doParsingTest, this, testDataFilePath);
+                }
+
+                public void testAllFilesPresentInRecovery() throws Exception {
+                    KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("compiler/testData/psi/typeArgumentList/recovery"), Pattern.compile("^(.*)\\.kts?$"), null, true);
+                }
+
+                @TestMetadata("callExpressions.kt")
+                public void testCallExpressions() throws Exception {
+                    runTest("compiler/testData/psi/typeArgumentList/recovery/callExpressions.kt");
+                }
+
+                @TestMetadata("callExpressions_ERR.kt")
+                public void testCallExpressions_ERR() throws Exception {
+                    runTest("compiler/testData/psi/typeArgumentList/recovery/callExpressions_ERR.kt");
+                }
+            }
+        }
     }
 
     @TestMetadata("compiler/testData/parseCodeFragment/expression")
diff --git a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
index 6754cd0..a9f2d35 100644
--- a/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
+++ b/compiler/util/src/org/jetbrains/kotlin/config/LanguageVersionSettings.kt
@@ -265,6 +265,7 @@
     DataObjects(KOTLIN_1_8), // KT-4107
     LightweightLambdas(KOTLIN_1_8, defaultState = State.DISABLED),
     AllowExpressionAfterTypeReferenceWithoutSpacing(KOTLIN_1_8, kind = BUG_FIX), // KT-35811
+    AllowTypeArgumentListLikeExpressions(KOTLIN_1_8, kind = BUG_FIX), // KT-8263
 
     // 1.9