diff --git a/.idea/vcs.xml b/.idea/vcs.xml
index cfc97b321d9..9d7262701af 100644
--- a/.idea/vcs.xml
+++ b/.idea/vcs.xml
@@ -44,5 +44,6 @@
+
\ No newline at end of file
diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt
index a3678efb1f4..65662187fba 100644
--- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt
+++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10ExpressionTypeProvider.kt
@@ -7,8 +7,8 @@ package org.jetbrains.kotlin.analysis.api.descriptors.components
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.analysis.api.components.KtExpressionTypeProvider
-import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisFacade.AnalysisMode
+import org.jetbrains.kotlin.analysis.api.descriptors.KtFe10AnalysisSession
import org.jetbrains.kotlin.analysis.api.descriptors.components.base.Fe10KtAnalysisSessionComponent
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken
diff --git a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/descriptors/test/components/expressionTypeProvider/AbstractKtFe10DeclarationReturnTypeTest.kt b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/descriptors/test/components/expressionTypeProvider/AbstractKtFe10DeclarationReturnTypeTest.kt
new file mode 100644
index 00000000000..e853e173d1a
--- /dev/null
+++ b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/descriptors/test/components/expressionTypeProvider/AbstractKtFe10DeclarationReturnTypeTest.kt
@@ -0,0 +1,11 @@
+/*
+ * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.descriptors.test.components.expressionTypeProvider
+
+import org.jetbrains.kotlin.analysis.api.descriptors.test.KtFe10FrontendApiTestConfiguratorService
+import org.jetbrains.kotlin.analysis.api.impl.base.test.components.expressionTypeProvider.AbstractDeclarationReturnTypeTest
+
+abstract class AbstractKtFe10DeclarationReturnTypeTest : AbstractDeclarationReturnTypeTest(KtFe10FrontendApiTestConfiguratorService)
\ No newline at end of file
diff --git a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/descriptors/test/components/expressionTypeProvider/KtFe10DeclarationReturnTypeTestGenerated.java b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/descriptors/test/components/expressionTypeProvider/KtFe10DeclarationReturnTypeTestGenerated.java
new file mode 100644
index 00000000000..563dcced31d
--- /dev/null
+++ b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/descriptors/test/components/expressionTypeProvider/KtFe10DeclarationReturnTypeTestGenerated.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.descriptors.test.components.expressionTypeProvider;
+
+import com.intellij.testFramework.TestDataPath;
+import org.jetbrains.kotlin.test.util.KtTestUtil;
+import org.jetbrains.kotlin.test.TestMetadata;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.util.regex.Pattern;
+
+/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
+@SuppressWarnings("all")
+@TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType")
+@TestDataPath("$PROJECT_ROOT")
+public class KtFe10DeclarationReturnTypeTestGenerated extends AbstractKtFe10DeclarationReturnTypeTest {
+ @Test
+ public void testAllFilesPresentInDeclarationReturnType() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("declarationInPrimaryConstructor.kt")
+ public void testDeclarationInPrimaryConstructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("delegateProperties.kt")
+ public void testDelegateProperties() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.kt");
+ }
+
+ @Test
+ @TestMetadata("funtionType.kt")
+ public void testFuntionType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/funtionType.kt");
+ }
+
+ @Test
+ @TestMetadata("localDeclarations.kt")
+ public void testLocalDeclarations() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/localDeclarations.kt");
+ }
+
+ @Test
+ @TestMetadata("overriddenMember.kt")
+ public void testOverriddenMember() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/overriddenMember.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyAccessor.kt")
+ public void testPropertyAccessor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.kt");
+ }
+
+ @Test
+ @TestMetadata("simpleDeclaration.kt")
+ public void testSimpleDeclaration() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/simpleDeclaration.kt");
+ }
+
+ @Test
+ @TestMetadata("typeParameters.kt")
+ public void testTypeParameters() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.kt");
+ }
+}
diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/expressionTypeProvider/AbstractFirDeclarationReturnTypeTest.kt b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/expressionTypeProvider/AbstractFirDeclarationReturnTypeTest.kt
new file mode 100644
index 00000000000..ff230ca9862
--- /dev/null
+++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/expressionTypeProvider/AbstractFirDeclarationReturnTypeTest.kt
@@ -0,0 +1,11 @@
+/*
+ * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.fir.components.expressionTypeProvider
+
+import org.jetbrains.kotlin.analysis.api.fir.FirFrontendApiTestConfiguratorService
+import org.jetbrains.kotlin.analysis.api.impl.base.test.components.expressionTypeProvider.AbstractDeclarationReturnTypeTest
+
+abstract class AbstractFirDeclarationReturnTypeTest : AbstractDeclarationReturnTypeTest(FirFrontendApiTestConfiguratorService)
\ No newline at end of file
diff --git a/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/expressionTypeProvider/FirDeclarationReturnTypeTestGenerated.java b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/expressionTypeProvider/FirDeclarationReturnTypeTestGenerated.java
new file mode 100644
index 00000000000..f8df78e9695
--- /dev/null
+++ b/analysis/analysis-api-fir/tests/org/jetbrains/kotlin/analysis/api/fir/components/expressionTypeProvider/FirDeclarationReturnTypeTestGenerated.java
@@ -0,0 +1,74 @@
+/*
+ * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.fir.components.expressionTypeProvider;
+
+import com.intellij.testFramework.TestDataPath;
+import org.jetbrains.kotlin.test.util.KtTestUtil;
+import org.jetbrains.kotlin.test.TestMetadata;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+
+import java.io.File;
+import java.util.regex.Pattern;
+
+/** This class is generated by {@link GenerateNewCompilerTests.kt}. DO NOT MODIFY MANUALLY */
+@SuppressWarnings("all")
+@TestMetadata("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType")
+@TestDataPath("$PROJECT_ROOT")
+public class FirDeclarationReturnTypeTestGenerated extends AbstractFirDeclarationReturnTypeTest {
+ @Test
+ public void testAllFilesPresentInDeclarationReturnType() throws Exception {
+ KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType"), Pattern.compile("^(.+)\\.kt$"), null, true);
+ }
+
+ @Test
+ @TestMetadata("declarationInPrimaryConstructor.kt")
+ public void testDeclarationInPrimaryConstructor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.kt");
+ }
+
+ @Test
+ @TestMetadata("delegateProperties.kt")
+ public void testDelegateProperties() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.kt");
+ }
+
+ @Test
+ @TestMetadata("funtionType.kt")
+ public void testFuntionType() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/funtionType.kt");
+ }
+
+ @Test
+ @TestMetadata("localDeclarations.kt")
+ public void testLocalDeclarations() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/localDeclarations.kt");
+ }
+
+ @Test
+ @TestMetadata("overriddenMember.kt")
+ public void testOverriddenMember() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/overriddenMember.kt");
+ }
+
+ @Test
+ @TestMetadata("propertyAccessor.kt")
+ public void testPropertyAccessor() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.kt");
+ }
+
+ @Test
+ @TestMetadata("simpleDeclaration.kt")
+ public void testSimpleDeclaration() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/simpleDeclaration.kt");
+ }
+
+ @Test
+ @TestMetadata("typeParameters.kt")
+ public void testTypeParameters() throws Exception {
+ runTest("analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.kt");
+ }
+}
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/commonTestUtils.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/commonTestUtils.kt
index 5dc01f188f1..ec61d8a6980 100644
--- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/commonTestUtils.kt
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/commonTestUtils.kt
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
import org.jetbrains.kotlin.analysis.api.analyse
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol
import org.jetbrains.kotlin.diagnostics.PsiDiagnosticUtils.offsetToLineAndColumn
+import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.KtDeclarationWithBody
import org.jetbrains.kotlin.psi.KtElement
import org.jetbrains.kotlin.psi.KtNamedDeclaration
@@ -45,4 +46,8 @@ fun KtSymbol.getNameWithPositionString(): String {
fun String.indented(indent: Int): String {
val indentString = " ".repeat(indent)
return indentString + replace("\n", "\n$indentString")
-}
\ No newline at end of file
+}
+
+fun KtDeclaration.getNameWithPositionString(): String {
+ return (presentation?.presentableText ?: name ?: this::class.simpleName) + "@" + position()
+}
diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/expressionTypeProvider/AbstractDeclarationReturnTypeTest.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/expressionTypeProvider/AbstractDeclarationReturnTypeTest.kt
new file mode 100644
index 00000000000..97adf009e81
--- /dev/null
+++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/components/expressionTypeProvider/AbstractDeclarationReturnTypeTest.kt
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2010-2021 JetBrains s.r.o. and Kotlin Programming Language contributors.
+ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
+ */
+
+package org.jetbrains.kotlin.analysis.api.impl.base.test.components.expressionTypeProvider
+
+import org.jetbrains.kotlin.analysis.api.impl.barebone.test.FrontendApiTestConfiguratorService
+import org.jetbrains.kotlin.analysis.api.impl.base.test.getNameWithPositionString
+import org.jetbrains.kotlin.analysis.api.impl.base.test.test.framework.AbstractHLApiSingleFileTest
+import org.jetbrains.kotlin.psi.*
+import org.jetbrains.kotlin.test.model.TestModule
+import org.jetbrains.kotlin.test.services.TestServices
+import org.jetbrains.kotlin.test.services.assertions
+
+abstract class AbstractDeclarationReturnTypeTest(
+ configurator: FrontendApiTestConfiguratorService
+) : AbstractHLApiSingleFileTest(configurator) {
+ override fun doTestByFileStructure(ktFile: KtFile, module: TestModule, testServices: TestServices) {
+ val actual = buildString {
+ ktFile.accept(object : KtTreeVisitor() {
+ override fun visitDeclaration(dcl: KtDeclaration, data: Int): Void? {
+ if (dcl is KtTypeParameter) return null
+ append(" ".repeat(data))
+ if (dcl is KtClassLikeDeclaration) {
+ appendLine(dcl.getNameWithPositionString())
+ } else {
+ analyseForTest(dcl) {
+ val returnType = dcl.getReturnKtType()
+ append(dcl.getNameWithPositionString())
+ append(" : ")
+ appendLine(returnType.render())
+ }
+ }
+ return super.visitDeclaration(dcl, data + 2)
+ }
+ }, 0)
+ }
+ testServices.assertions.assertEqualsToTestDataFileSibling(actual)
+ }
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.descriptors.txt
new file mode 100644
index 00000000000..e5ab048d694
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.descriptors.txt
@@ -0,0 +1,4 @@
+Foo@(1,1)
+ Foo@(1,13) : kotlin.Unit
+ t@(1,14) : T
+ i@(1,24) : kotlin.Int
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.kt
new file mode 100644
index 00000000000..7849ee83a2c
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.kt
@@ -0,0 +1 @@
+class Foo(val t: T, val i: Int)
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.txt
new file mode 100644
index 00000000000..5e77ec82dbf
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/declarationInPrimaryConstructor.txt
@@ -0,0 +1,4 @@
+Foo@(1,1)
+ Foo@(1,13) : Foo
+ t@(1,14) : T
+ i@(1,24) : kotlin.Int
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.descriptors.txt
new file mode 100644
index 00000000000..aa20b734ab0
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.descriptors.txt
@@ -0,0 +1,10 @@
+lazy@(3,1) : Lazy
+ initializer@(3,14) : () -> T
+Lazy@(5,1)
+ Lazy@(5,14) : kotlin.Unit
+ value@(5,15) : T
+getValue@(7,1) : T
+ thisRef@(7,42) : kotlin.Any?
+ property@(7,57) : kotlin.reflect.KProperty<*>
+A@(9,1)
+ i@(10,5) : kotlin.Int
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.kt
new file mode 100644
index 00000000000..08bb409f7d9
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.kt
@@ -0,0 +1,13 @@
+import kotlin.reflect.KProperty
+
+fun lazy(initializer: () -> T): Lazy = Lazy(initializer())
+
+class Lazy(val value: T)
+
+inline operator fun Lazy.getValue(thisRef: Any?, property: KProperty<*>): T = value
+
+class A {
+ val i by lazy {
+ 1
+ }
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.txt
new file mode 100644
index 00000000000..2f215e4e391
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/delegateProperties.txt
@@ -0,0 +1,10 @@
+lazy@(3,1) : Lazy
+ initializer@(3,14) : () -> T
+Lazy@(5,1)
+ Lazy@(5,14) : Lazy
+ value@(5,15) : T
+getValue@(7,1) : T
+ thisRef@(7,42) : kotlin.Any?
+ property@(7,57) : kotlin.reflect.KProperty<*>
+A@(9,1)
+ i@(10,5) : kotlin.Int
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/funtionType.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/funtionType.kt
new file mode 100644
index 00000000000..24615f5d318
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/funtionType.kt
@@ -0,0 +1,4 @@
+val f1: () -> Unit = {}
+val f2 = {}
+val f3: String.() -> String = { this }
+fun f4(): Int.(T) -> String = { "" }
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/funtionType.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/funtionType.txt
new file mode 100644
index 00000000000..25194d56768
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/funtionType.txt
@@ -0,0 +1,5 @@
+f1@(1,1) : () -> kotlin.Unit
+f2@(2,1) : () -> kotlin.Unit
+f3@(3,1) : kotlin.String.() -> kotlin.String
+f4@(4,1) : kotlin.Int.(T) -> kotlin.String
+ KtParameter@(4,20) : T
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/localDeclarations.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/localDeclarations.kt
new file mode 100644
index 00000000000..f08fd04a186
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/localDeclarations.kt
@@ -0,0 +1,20 @@
+fun test1() {
+ val i = 1
+ fun foo() = ""
+ val f1 = {}
+ val f2: String.(Int) -> String = { this + it }
+}
+
+fun test2(t1: T) {
+ val t2 = t1
+ fun foo() = t1
+ val f = { t1 }
+}
+
+fun test3(
+ val i: Int = run {
+ val j = 1
+ j
+ }
+) {
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/localDeclarations.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/localDeclarations.txt
new file mode 100644
index 00000000000..c9f494cf134
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/localDeclarations.txt
@@ -0,0 +1,14 @@
+test1@(1,1) : kotlin.Unit
+ i@(2,5) : kotlin.Int
+ foo@(3,5) : kotlin.String
+ f1@(4,5) : () -> kotlin.Unit
+ f2@(5,5) : kotlin.String.(kotlin.Int) -> kotlin.String
+ KtParameter@(5,21) : kotlin.Int
+test2@(8,1) : kotlin.Unit
+ t1@(8,15) : T
+ t2@(9,5) : T
+ foo@(10,5) : T
+ f@(11,5) : () -> T
+test3@(14,1) : kotlin.Unit
+ i@(15,5) : kotlin.Int
+ j@(16,9) : kotlin.Int
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/overriddenMember.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/overriddenMember.kt
new file mode 100644
index 00000000000..1cd76684230
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/overriddenMember.kt
@@ -0,0 +1,17 @@
+interface A
+
+class B: A
+
+abstract class Super {
+ abstract val a: A
+ abstract val b: B
+ abstract fun getA(): A
+ abstract fun getB(): B
+}
+
+class Sub: {
+ override val a = B()
+ override val b = B()
+ override fun getA() = B()
+ override fun getB() = B()
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/overriddenMember.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/overriddenMember.txt
new file mode 100644
index 00000000000..caca7b58aab
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/overriddenMember.txt
@@ -0,0 +1,12 @@
+A@(1,1)
+B@(3,1)
+Super@(5,1)
+ a@(6,5) : A
+ b@(7,5) : B
+ getA@(8,5) : A
+ getB@(9,5) : B
+Sub@(12,1)
+ a@(13,5) : B
+ b@(14,5) : B
+ getA@(15,5) : B
+ getB@(16,5) : B
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.descriptors.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.descriptors.txt
new file mode 100644
index 00000000000..3c6b5cd65a4
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.descriptors.txt
@@ -0,0 +1,9 @@
+i@(1,1) : kotlin.Int
+ KtPropertyAccessor@(2,5) : kotlin.Int
+ KtPropertyAccessor@(3,5) : kotlin.Unit
+ value@(3,9) : kotlin.Unit
+A@(5,1)
+ j@(6,5) : kotlin.Int
+ KtPropertyAccessor@(7,9) : kotlin.Int
+ KtPropertyAccessor@(8,9) : kotlin.Unit
+ value@(8,13) : kotlin.Unit
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.kt
new file mode 100644
index 00000000000..234b600c54e
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.kt
@@ -0,0 +1,9 @@
+var i: Int
+ get() = 1
+ set(value) {}
+
+class A {
+ val j: Int
+ get() = 2
+ set(value) {}
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.txt
new file mode 100644
index 00000000000..39aea790d57
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/propertyAccessor.txt
@@ -0,0 +1,9 @@
+i@(1,1) : kotlin.Int
+ KtPropertyAccessor@(2,5) : kotlin.Int
+ KtPropertyAccessor@(3,5) : kotlin.Unit
+ value@(3,9) : kotlin.Int
+A@(5,1)
+ j@(6,5) : kotlin.Int
+ KtPropertyAccessor@(7,9) : kotlin.Int
+ KtPropertyAccessor@(8,9) : kotlin.Unit
+ value@(8,13) : kotlin.Int
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/simpleDeclaration.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/simpleDeclaration.kt
new file mode 100644
index 00000000000..0140e3fd255
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/simpleDeclaration.kt
@@ -0,0 +1,8 @@
+val i: Int
+val j = 1
+val s = ""
+fun procedure() {}
+fun procedure(i: Int) {}
+fun returnIntOne() = 1
+fun id(i: Int) = i
+fun throwException() = throw Exception()
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/simpleDeclaration.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/simpleDeclaration.txt
new file mode 100644
index 00000000000..b715fd8c785
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/simpleDeclaration.txt
@@ -0,0 +1,10 @@
+i@(1,1) : kotlin.Int
+j@(2,1) : kotlin.Int
+s@(3,1) : kotlin.String
+procedure@(4,1) : kotlin.Unit
+procedure@(5,1) : kotlin.Unit
+ i@(5,15) : kotlin.Int
+returnIntOne@(6,1) : kotlin.Int
+id@(7,1) : kotlin.Int
+ i@(7,8) : kotlin.Int
+throwException@(8,1) : kotlin.Nothing
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.kt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.kt
new file mode 100644
index 00000000000..754d24aa499
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.kt
@@ -0,0 +1,8 @@
+fun id(t: T) = t
+fun > C.mySize = size
+fun foo(): Foo = Foo()
+class Foo {
+ val t: T
+ fun getT(): T
+ fun getR(): R
+}
\ No newline at end of file
diff --git a/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.txt b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.txt
new file mode 100644
index 00000000000..666b1dee3ee
--- /dev/null
+++ b/analysis/analysis-api/testData/components/expressionTypeProvider/declarationReturnType/typeParameters.txt
@@ -0,0 +1,8 @@
+id@(1,1) : T
+ t@(1,12) : T
+mySize@(2,1) : kotlin.Int
+foo@(3,1) : Foo
+Foo@(4,1)
+ t@(5,5) : T
+ getT@(6,5) : T
+ getR@(7,5) : R
diff --git a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt
index e9f074b9f94..e05c705936e 100644
--- a/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt
+++ b/generators/analysis-api-generator/tests/org/jetbrains/kotlin/generators/tests/analysis/api/analysisApi.kt
@@ -19,6 +19,7 @@ import org.jetbrains.kotlin.analysis.api.descriptors.test.components.symbolDecla
import org.jetbrains.kotlin.analysis.api.descriptors.test.components.symbolDeclarationRenderer.AbstractKtFe10RendererTest
import org.jetbrains.kotlin.analysis.api.descriptors.test.components.typeCreator.AbstractKtFe10TypeParameterTypeTest
import org.jetbrains.kotlin.analysis.api.descriptors.test.components.typeProvider.AbstractKtFe10HasCommonSubtypeTest
+import org.jetbrains.kotlin.analysis.api.descriptors.test.components.expressionTypeProvider.AbstractKtFe10DeclarationReturnTypeTest
import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10SymbolByFqNameTest
import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10SymbolByPsiTest
import org.jetbrains.kotlin.analysis.api.descriptors.test.symbols.AbstractKtFe10SymbolByReferenceTest
@@ -30,6 +31,7 @@ import org.jetbrains.kotlin.analysis.api.fir.components.callResolver.AbstractFir
import org.jetbrains.kotlin.analysis.api.fir.components.compileTimeConstantProvider.AbstractFirCompileTimeConstantEvaluatorTest
import org.jetbrains.kotlin.analysis.api.fir.components.expressionInfoProvider.AbstractFirReturnTargetSymbolTest
import org.jetbrains.kotlin.analysis.api.fir.components.expressionInfoProvider.AbstractFirWhenMissingCasesTest
+import org.jetbrains.kotlin.analysis.api.fir.components.expressionTypeProvider.AbstractFirDeclarationReturnTypeTest
import org.jetbrains.kotlin.analysis.api.fir.components.expressionTypeProvider.AbstractFirExpectedExpressionTypeTest
import org.jetbrains.kotlin.analysis.api.fir.components.expressionTypeProvider.AbstractFirHLExpressionTypeTest
import org.jetbrains.kotlin.analysis.api.fir.components.importOptimizer.AbstractHLImportOptimizerTest
@@ -186,6 +188,12 @@ private fun TestGroupSuite.generateAnalysisApiComponentsTests() {
) {
model("expressionType")
}
+
+ test(
+ fir = AbstractFirDeclarationReturnTypeTest::class, fe10 = AbstractKtFe10DeclarationReturnTypeTest::class
+ ) {
+ model("declarationReturnType")
+ }
}
component("importOptimizer") {