diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/base/KtFe10Type.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/base/KtFe10Type.kt index 3a9e7d85cc3..200dff250a4 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/base/KtFe10Type.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/types/base/KtFe10Type.kt @@ -28,7 +28,10 @@ interface KtFe10Type : KtLifetimeOwner, KtAnnotated { KtFe10AnnotationsList.create( type.annotations, token, - ignoreAnnotations = setOf(StandardClassIds.Annotations.ExtensionFunctionType) + ignoreAnnotations = setOf( + StandardClassIds.Annotations.ExtensionFunctionType, + StandardClassIds.Annotations.ContextFunctionTypeParams, + ) ) } diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/symbolDeclarationRenderer/Fe10IdeNormalAnalysisSourceModuleRendererTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/symbolDeclarationRenderer/Fe10IdeNormalAnalysisSourceModuleRendererTestGenerated.java index 062ff7f11d6..4d2116cde9d 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/symbolDeclarationRenderer/Fe10IdeNormalAnalysisSourceModuleRendererTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/components/symbolDeclarationRenderer/Fe10IdeNormalAnalysisSourceModuleRendererTestGenerated.java @@ -70,6 +70,12 @@ public class Fe10IdeNormalAnalysisSourceModuleRendererTestGenerated extends Abst runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/constructorOfAnonymousObject.kt"); } + @Test + @TestMetadata("contextReceiver.kt") + public void testContextReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.kt"); + } + @Test @TestMetadata("delegates.kt") public void testDelegates() throws Exception { @@ -228,5 +234,11 @@ public class Fe10IdeNormalAnalysisSourceModuleRendererTestGenerated extends Abst public void testAnnotationOnTypesWithComplexExpression() throws Exception { runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/annotationOnTypesWithComplexExpression.kt"); } + + @Test + @TestMetadata("contextFunctionTypes.kt") + public void testContextFunctionTypes() throws Exception { + runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.kt"); + } } } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirIdeDependentAnalysisSourceModuleRendererTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirIdeDependentAnalysisSourceModuleRendererTestGenerated.java index 558774a9a6e..ef50ff324ea 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirIdeDependentAnalysisSourceModuleRendererTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirIdeDependentAnalysisSourceModuleRendererTestGenerated.java @@ -70,6 +70,12 @@ public class FirIdeDependentAnalysisSourceModuleRendererTestGenerated extends Ab runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/constructorOfAnonymousObject.kt"); } + @Test + @TestMetadata("contextReceiver.kt") + public void testContextReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.kt"); + } + @Test @TestMetadata("delegates.kt") public void testDelegates() throws Exception { @@ -228,5 +234,11 @@ public class FirIdeDependentAnalysisSourceModuleRendererTestGenerated extends Ab public void testAnnotationOnTypesWithComplexExpression() throws Exception { runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/annotationOnTypesWithComplexExpression.kt"); } + + @Test + @TestMetadata("contextFunctionTypes.kt") + public void testContextFunctionTypes() throws Exception { + runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.kt"); + } } } diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirIdeNormalAnalysisSourceModuleRendererTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirIdeNormalAnalysisSourceModuleRendererTestGenerated.java index 8727f13c551..44ed45d0c7b 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirIdeNormalAnalysisSourceModuleRendererTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirIdeNormalAnalysisSourceModuleRendererTestGenerated.java @@ -70,6 +70,12 @@ public class FirIdeNormalAnalysisSourceModuleRendererTestGenerated extends Abstr runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/constructorOfAnonymousObject.kt"); } + @Test + @TestMetadata("contextReceiver.kt") + public void testContextReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.kt"); + } + @Test @TestMetadata("delegates.kt") public void testDelegates() throws Exception { @@ -228,5 +234,11 @@ public class FirIdeNormalAnalysisSourceModuleRendererTestGenerated extends Abstr public void testAnnotationOnTypesWithComplexExpression() throws Exception { runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/annotationOnTypesWithComplexExpression.kt"); } + + @Test + @TestMetadata("contextFunctionTypes.kt") + public void testContextFunctionTypes() throws Exception { + runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.kt"); + } } } diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirStandaloneNormalAnalysisSourceModuleRendererTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirStandaloneNormalAnalysisSourceModuleRendererTestGenerated.java index e38bb48835d..1f753fe2206 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirStandaloneNormalAnalysisSourceModuleRendererTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/components/symbolDeclarationRenderer/FirStandaloneNormalAnalysisSourceModuleRendererTestGenerated.java @@ -70,6 +70,12 @@ public class FirStandaloneNormalAnalysisSourceModuleRendererTestGenerated extend runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/constructorOfAnonymousObject.kt"); } + @Test + @TestMetadata("contextReceiver.kt") + public void testContextReceiver() throws Exception { + runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.kt"); + } + @Test @TestMetadata("delegates.kt") public void testDelegates() throws Exception { @@ -228,5 +234,11 @@ public class FirStandaloneNormalAnalysisSourceModuleRendererTestGenerated extend public void testAnnotationOnTypesWithComplexExpression() throws Exception { runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/annotationOnTypesWithComplexExpression.kt"); } + + @Test + @TestMetadata("contextFunctionTypes.kt") + public void testContextFunctionTypes() throws Exception { + runTest("analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.kt"); + } } } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/KtContextReceiversRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/KtContextReceiversRenderer.kt new file mode 100644 index 00000000000..c5e6757cd19 --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/KtContextReceiversRenderer.kt @@ -0,0 +1,48 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.base.KtContextReceiversOwner +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.renderers.KtContextReceiverLabelRenderer +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.renderers.KtContextReceiverListRenderer +import org.jetbrains.kotlin.analysis.api.renderer.types.KtTypeRenderer +import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter + +public class KtContextReceiversRenderer( + public val contextReceiverListRenderer: KtContextReceiverListRenderer, + public val contextReceiverLabelRenderer: KtContextReceiverLabelRenderer, +) { + context(KtAnalysisSession, KtTypeRenderer) + public fun renderContextReceivers(owner: KtContextReceiversOwner, printer: PrettyPrinter) { + contextReceiverListRenderer.renderContextReceivers(owner, printer) + } + + public inline fun with(action: Builder.() -> Unit): KtContextReceiversRenderer { + val renderer = this + return KtContextReceiversRenderer { + this.contextReceiverListRenderer = renderer.contextReceiverListRenderer + this.contextReceiverLabelRenderer = renderer.contextReceiverLabelRenderer + + action() + } + } + + public class Builder { + public lateinit var contextReceiverListRenderer: KtContextReceiverListRenderer + public lateinit var contextReceiverLabelRenderer: KtContextReceiverLabelRenderer + + public fun build(): KtContextReceiversRenderer = KtContextReceiversRenderer( + contextReceiverListRenderer, + contextReceiverLabelRenderer, + ) + } + + public companion object { + public inline operator fun invoke(action: Builder.() -> Unit): KtContextReceiversRenderer = + Builder().apply(action).build() + } +} \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/KtContextReceiversRendererForSource.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/KtContextReceiversRendererForSource.kt new file mode 100644 index 00000000000..dc85304be7a --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/KtContextReceiversRendererForSource.kt @@ -0,0 +1,16 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers + +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.renderers.KtContextReceiverLabelRenderer +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.renderers.KtContextReceiverListRenderer + +public object KtContextReceiversRendererForSource { + public val WITH_LABELS: KtContextReceiversRenderer = KtContextReceiversRenderer { + contextReceiverListRenderer = KtContextReceiverListRenderer.AS_SOURCE + contextReceiverLabelRenderer = KtContextReceiverLabelRenderer.WITH_LABEL + } +} diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/renderers/KtContextReceiverLabelRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/renderers/KtContextReceiverLabelRenderer.kt new file mode 100644 index 00000000000..f56ac1587c3 --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/renderers/KtContextReceiverLabelRenderer.kt @@ -0,0 +1,26 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.renderers + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.KtContextReceiversRenderer +import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter +import org.jetbrains.kotlin.renderer.render + +public interface KtContextReceiverLabelRenderer { + context(KtAnalysisSession, KtContextReceiversRenderer) + public fun renderLabel(contextReceiver: KtContextReceiver, printer: PrettyPrinter) + + public object WITH_LABEL : KtContextReceiverLabelRenderer { + context(KtAnalysisSession, KtContextReceiversRenderer) + override fun renderLabel(contextReceiver: KtContextReceiver, printer: PrettyPrinter): Unit = printer { + val label = contextReceiver.label ?: return@printer + append(label.render()) + append('@') + } + } +} diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/renderers/KtContextReceiverListRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/renderers/KtContextReceiverListRenderer.kt new file mode 100644 index 00000000000..ba5c282c007 --- /dev/null +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/base/contextReceivers/renderers/KtContextReceiverListRenderer.kt @@ -0,0 +1,34 @@ +/* + * Copyright 2010-2022 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.renderers + +import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.base.KtContextReceiversOwner +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.KtContextReceiversRenderer +import org.jetbrains.kotlin.analysis.api.renderer.types.KtTypeRenderer +import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter + +public interface KtContextReceiverListRenderer { + context(KtAnalysisSession, KtContextReceiversRenderer, KtTypeRenderer) + public fun renderContextReceivers(owner: KtContextReceiversOwner, printer: PrettyPrinter) + + public object AS_SOURCE : KtContextReceiverListRenderer { + context(KtAnalysisSession, KtContextReceiversRenderer, KtTypeRenderer) + override fun renderContextReceivers(owner: KtContextReceiversOwner, printer: PrettyPrinter) { + val contextReceivers = owner.contextReceivers + if (contextReceivers.isEmpty()) return + + printer { + append("context(") + printCollection(contextReceivers) { contextReceiver -> + contextReceiverLabelRenderer.renderLabel(contextReceiver, printer) + renderType(contextReceiver.type, printer) + } + append(")") + } + } + } +} \ No newline at end of file diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtDeclarationRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtDeclarationRenderer.kt index 61f0040883a..ea245890204 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtDeclarationRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtDeclarationRenderer.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.renderer.base.KtKeywordRenderer import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KtAnnotationRenderer +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.KtContextReceiversRenderer import org.jetbrains.kotlin.analysis.api.renderer.declarations.bodies.* import org.jetbrains.kotlin.analysis.api.renderer.declarations.modifiers.KtDeclarationModifiersRenderer import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.* @@ -27,6 +28,7 @@ import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter public class KtDeclarationRenderer private constructor( public val nameRenderer: KtDeclarationNameRenderer, public val keywordRenderer: KtKeywordRenderer, + public val contextReceiversRenderer: KtContextReceiversRenderer, public val codeStyle: KtRendererCodeStyle, public val typeRenderer: KtTypeRenderer, public val annotationRenderer: KtAnnotationRenderer, @@ -110,6 +112,7 @@ public class KtDeclarationRenderer private constructor( return KtDeclarationRenderer { this.nameRenderer = renderer.nameRenderer this.keywordRender = renderer.keywordRenderer + this.contextReceiversRenderer = renderer.contextReceiversRenderer this.codeStyle = renderer.codeStyle this.typeRenderer = renderer.typeRenderer this.annotationRenderer = renderer.annotationRenderer @@ -174,6 +177,7 @@ public class KtDeclarationRenderer private constructor( public open class Builder { public lateinit var returnTypeFilter: KtCallableReturnTypeFilter public lateinit var nameRenderer: KtDeclarationNameRenderer + public lateinit var contextReceiversRenderer: KtContextReceiversRenderer public lateinit var keywordRender: KtKeywordRenderer public lateinit var codeStyle: KtRendererCodeStyle public lateinit var typeRenderer: KtTypeRenderer @@ -229,6 +233,7 @@ public class KtDeclarationRenderer private constructor( public fun build(): KtDeclarationRenderer = KtDeclarationRenderer( nameRenderer, keywordRender, + contextReceiversRenderer, codeStyle, typeRenderer, annotationRenderer, diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtRendererCodeStyle.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtRendererCodeStyle.kt index de50f5a6125..8fce42fffdb 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtRendererCodeStyle.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/KtRendererCodeStyle.kt @@ -17,6 +17,9 @@ public interface KtRendererCodeStyle { context(KtAnalysisSession) public fun getIndentSize(): Int + context(KtAnalysisSession) + public fun getSeparatorAfterContextReceivers(): String + context(KtAnalysisSession) public fun getSeparatorBetweenAnnotationAndOwner(symbol: KtAnnotated): String @@ -31,9 +34,11 @@ public interface KtRendererCodeStyle { } public object KtRecommendedRendererCodeStyle : KtRendererCodeStyle { - context(KtAnalysisSession) override fun getIndentSize(): Int { - return 4 - } + context(KtAnalysisSession) + override fun getIndentSize(): Int = 4 + + context(KtAnalysisSession) + override fun getSeparatorAfterContextReceivers(): String = "\n" context(KtAnalysisSession) override fun getSeparatorBetweenAnnotationAndOwner(symbol: KtAnnotated): String { @@ -55,9 +60,8 @@ public object KtRecommendedRendererCodeStyle : KtRendererCodeStyle { } } - context(KtAnalysisSession) override fun getSeparatorBetweenModifiers(): String { - return " " - } + context(KtAnalysisSession) + override fun getSeparatorBetweenModifiers(): String = " " context(KtAnalysisSession) override fun getSeparatorBetweenMembers(first: KtDeclarationSymbol, second: KtDeclarationSymbol): String { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/impl/KtDeclarationRendererForSource.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/impl/KtDeclarationRendererForSource.kt index 96549f59ca0..8c210882dcd 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/impl/KtDeclarationRendererForSource.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/impl/KtDeclarationRendererForSource.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations.impl import org.jetbrains.kotlin.analysis.api.renderer.base.KtKeywordRenderer import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KtAnnotationRendererForSource +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.KtContextReceiversRendererForSource import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtCallableReturnTypeFilter import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtRecommendedRendererCodeStyle @@ -29,6 +30,7 @@ public object KtDeclarationRendererForSource { public val WITH_QUALIFIED_NAMES: KtDeclarationRenderer = KtDeclarationRenderer { nameRenderer = KtDeclarationNameRenderer.QUOTED keywordRender = KtKeywordRenderer.AS_WORD + contextReceiversRenderer = KtContextReceiversRendererForSource.WITH_LABELS codeStyle = KtRecommendedRendererCodeStyle modifiersRenderer = KtDeclarationModifiersRendererForSource.NO_IMPLICIT_MODIFIERS classifierBodyRenderer = KtClassifierBodyRenderer.NO_BODY @@ -87,4 +89,3 @@ public object KtDeclarationRendererForSource { typeRenderer = KtTypeRendererForSource.WITH_SHORT_NAMES } } - diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/ktRendererUtils.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/ktRendererUtils.kt index a4acc8d440f..22c27ccfe50 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/ktRendererUtils.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/ktRendererUtils.kt @@ -7,25 +7,28 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotated +import org.jetbrains.kotlin.analysis.api.base.KtContextReceiversOwner import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter import org.jetbrains.kotlin.lexer.KtKeywordToken context(KtAnalysisSession, KtDeclarationRenderer) -public fun renderAnnotationsAndModifiers( +public fun renderAnnotationsModifiersAndContextReceivers( symbol: S, printer: PrettyPrinter, keyword: KtKeywordToken, ): Unit where S : KtAnnotated, S : KtDeclarationSymbol = printer { - renderAnnotationsAndModifiers(symbol, printer, listOf(keyword)) + renderAnnotationsModifiersAndContextReceivers(symbol, printer, listOf(keyword)) } context(KtAnalysisSession, KtDeclarationRenderer) -public fun renderAnnotationsAndModifiers( +public fun renderAnnotationsModifiersAndContextReceivers( symbol: S, printer: PrettyPrinter, keywords: List, ): Unit where S : KtAnnotated, S : KtDeclarationSymbol = printer { + renderContextReceivers(symbol, printer) + val annotationsRendered: Boolean val modifiersRendered: Boolean codeStyle.getSeparatorBetweenAnnotationAndOwner(symbol).separated( @@ -43,14 +46,25 @@ public fun renderAnnotationsAndModifiers( } } - context(KtAnalysisSession, KtDeclarationRenderer) -public fun renderAnnotationsAndModifiers( +public fun renderAnnotationsModifiersAndContextReceivers( symbol: S, printer: PrettyPrinter, ): Unit where S : KtAnnotated, S : KtDeclarationSymbol = printer { + renderContextReceivers(symbol, printer) codeStyle.getSeparatorBetweenAnnotationAndOwner(symbol).separated( { annotationRenderer.renderAnnotations(symbol, printer) }, { modifiersRenderer.renderDeclarationModifiers(symbol, printer) } ) -} \ No newline at end of file +} + +context(KtAnalysisSession, KtDeclarationRenderer) +private fun renderContextReceivers(symbol: KtDeclarationSymbol, printer: PrettyPrinter): Unit = printer { + if (symbol !is KtContextReceiversOwner) return + + with(typeRenderer) { + withSuffix(codeStyle.getSeparatorAfterContextReceivers()) { + contextReceiversRenderer.renderContextReceivers(symbol, printer) + } + } +} diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtCallableSignatureRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtCallableSignatureRenderer.kt index 1e2174c62aa..3f904ad78d2 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtCallableSignatureRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtCallableSignatureRenderer.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.callab import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer -import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsAndModifiers +import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsModifiersAndContextReceivers import org.jetbrains.kotlin.analysis.api.symbols.KtCallableSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedSymbol import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter @@ -22,8 +22,8 @@ public interface KtCallableSignatureRenderer { override fun renderCallableSignature(symbol: KtCallableSymbol, keyword: KtKeywordToken?, printer: PrettyPrinter): Unit = printer { " ".separated( { - if (keyword != null) renderAnnotationsAndModifiers(symbol, printer, keyword) - else renderAnnotationsAndModifiers(symbol, printer) + if (keyword != null) renderAnnotationsModifiersAndContextReceivers(symbol, printer, keyword) + else renderAnnotationsModifiersAndContextReceivers(symbol, printer) }, { typeParametersRenderer.renderTypeParameters(symbol, printer) }, { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtEnumEntrySymbolRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtEnumEntrySymbolRenderer.kt index b08922cef40..3beb20702f4 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtEnumEntrySymbolRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtEnumEntrySymbolRenderer.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.callab import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer -import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsAndModifiers +import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsModifiersAndContextReceivers import org.jetbrains.kotlin.analysis.api.symbols.KtEnumEntrySymbol import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter @@ -19,7 +19,7 @@ public interface KtEnumEntrySymbolRenderer { context(KtAnalysisSession, KtDeclarationRenderer) override fun renderSymbol(symbol: KtEnumEntrySymbol, printer: PrettyPrinter): Unit = printer { " ".separated( - { renderAnnotationsAndModifiers(symbol, printer) }, + { renderAnnotationsModifiersAndContextReceivers(symbol, printer) }, { nameRenderer.renderName(symbol, printer) }, { classifierBodyRenderer.renderBody(symbol, printer) }, ) diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtPropertyGetterSymbolRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtPropertyGetterSymbolRenderer.kt index 4595c2739a8..71742e8d9e8 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtPropertyGetterSymbolRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtPropertyGetterSymbolRenderer.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.callab import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer -import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsAndModifiers +import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsModifiersAndContextReceivers import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter import org.jetbrains.kotlin.lexer.KtTokens @@ -21,7 +21,7 @@ public interface KtPropertyGetterSymbolRenderer { override fun renderSymbol(symbol: KtPropertyGetterSymbol, printer: PrettyPrinter): Unit = printer { " ".separated( { - renderAnnotationsAndModifiers(symbol, printer, KtTokens.GET_KEYWORD) + renderAnnotationsModifiersAndContextReceivers(symbol, printer, KtTokens.GET_KEYWORD) valueParametersRenderer.renderValueParameters(symbol, printer) }, { accessorBodyRenderer.renderBody(symbol, printer) }, diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtPropertySetterSymbolRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtPropertySetterSymbolRenderer.kt index 08e8405c8e3..2fe9dc36dad 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtPropertySetterSymbolRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/callables/KtPropertySetterSymbolRenderer.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.callab import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer -import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsAndModifiers +import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsModifiersAndContextReceivers import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter import org.jetbrains.kotlin.lexer.KtTokens @@ -21,7 +21,7 @@ public interface KtPropertySetterSymbolRenderer { override fun renderSymbol(symbol: KtPropertySetterSymbol, printer: PrettyPrinter): Unit = printer { " ".separated( { - renderAnnotationsAndModifiers(symbol, printer, KtTokens.SET_KEYWORD) + renderAnnotationsModifiersAndContextReceivers(symbol, printer, KtTokens.SET_KEYWORD) valueParametersRenderer.renderValueParameters(symbol, printer) }, { accessorBodyRenderer.renderBody(symbol, printer) }, diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtAnonymousObjectSymbolRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtAnonymousObjectSymbolRenderer.kt index 389482fb05c..c9ec1cf2daf 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtAnonymousObjectSymbolRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtAnonymousObjectSymbolRenderer.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.classi import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer -import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsAndModifiers +import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsModifiersAndContextReceivers import org.jetbrains.kotlin.analysis.api.symbols.KtAnonymousObjectSymbol import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter import org.jetbrains.kotlin.lexer.KtTokens @@ -22,7 +22,7 @@ public interface KtAnonymousObjectSymbolRenderer { " ".separated( { " : ".separated( - { renderAnnotationsAndModifiers(symbol, printer, KtTokens.OBJECT_KEYWORD) }, + { renderAnnotationsModifiersAndContextReceivers(symbol, printer, KtTokens.OBJECT_KEYWORD) }, { superTypeListRenderer.renderSuperTypes(symbol, printer) } ) }, diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtNamedClassOrObjectSymbolRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtNamedClassOrObjectSymbolRenderer.kt index 7949288ffe8..25146ddb077 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtNamedClassOrObjectSymbolRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtNamedClassOrObjectSymbolRenderer.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.classi import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer -import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsAndModifiers +import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsModifiersAndContextReceivers import org.jetbrains.kotlin.analysis.api.symbols.KtClassKind import org.jetbrains.kotlin.analysis.api.symbols.KtConstructorSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol @@ -32,7 +32,7 @@ public interface KtNamedClassOrObjectSymbolRenderer { } " ".separated( - { renderAnnotationsAndModifiers(symbol, printer, keywords) }, + { renderAnnotationsModifiersAndContextReceivers(symbol, printer, keywords) }, { val primaryConstructor = bodyMemberScopeProvider.getMemberScope(symbol).filterIsInstance() @@ -41,7 +41,7 @@ public interface KtNamedClassOrObjectSymbolRenderer { nameRenderer.renderName(symbol, printer) typeParametersRenderer.renderTypeParameters(symbol, printer) if (primaryConstructor != null) { - val annotationsPrinted = checkIfPrinted { renderAnnotationsAndModifiers(primaryConstructor, printer) } + val annotationsPrinted = checkIfPrinted { renderAnnotationsModifiersAndContextReceivers(primaryConstructor, printer) } if (annotationsPrinted) { withPrefix(" ") { keywordRenderer.renderKeyword(KtTokens.CONSTRUCTOR_KEYWORD, primaryConstructor, printer) diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtTypeAliasSymbolRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtTypeAliasSymbolRenderer.kt index 200db0eb9bc..184866d4faa 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtTypeAliasSymbolRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/declarations/renderers/classifiers/KtTypeAliasSymbolRenderer.kt @@ -7,7 +7,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.declarations.renderers.classi import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtDeclarationRenderer -import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsAndModifiers +import org.jetbrains.kotlin.analysis.api.renderer.declarations.renderAnnotationsModifiersAndContextReceivers import org.jetbrains.kotlin.analysis.api.symbols.KtTypeAliasSymbol import org.jetbrains.kotlin.analysis.utils.printer.PrettyPrinter import org.jetbrains.kotlin.lexer.KtTokens @@ -20,7 +20,7 @@ public interface KtTypeAliasSymbolRenderer { context(KtAnalysisSession, KtDeclarationRenderer) override fun renderSymbol(symbol: KtTypeAliasSymbol, printer: PrettyPrinter): Unit = printer { " ".separated( - { renderAnnotationsAndModifiers(symbol, printer, KtTokens.TYPE_ALIAS_KEYWORD) }, + { renderAnnotationsModifiersAndContextReceivers(symbol, printer, KtTokens.TYPE_ALIAS_KEYWORD) }, { " = ".separated( { diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/KtTypeRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/KtTypeRenderer.kt index 6cd31456b29..077fd16bcda 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/KtTypeRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/KtTypeRenderer.kt @@ -6,6 +6,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.types import org.jetbrains.kotlin.analysis.api.KtAnalysisSession +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.KtContextReceiversRenderer import org.jetbrains.kotlin.analysis.api.renderer.base.KtKeywordRenderer import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KtAnnotationRenderer import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtRendererTypeApproximator @@ -31,6 +32,7 @@ public class KtTypeRenderer private constructor( public val typeApproximator: KtRendererTypeApproximator, public val typeProjectionRenderer: KtTypeProjectionRenderer, public val annotationsRenderer: KtAnnotationRenderer, + public val contextReceiversRenderer: KtContextReceiversRenderer, public val keywordRenderer: KtKeywordRenderer, ) { context(KtAnalysisSession) @@ -69,6 +71,7 @@ public class KtTypeRenderer private constructor( this.typeApproximator = renderer.typeApproximator this.typeProjectionRenderer = renderer.typeProjectionRenderer this.annotationsRenderer = renderer.annotationsRenderer + this.contextReceiversRenderer = renderer.contextReceiversRenderer this.keywordRenderer = renderer.keywordRenderer action() } @@ -96,6 +99,7 @@ public class KtTypeRenderer private constructor( public lateinit var typeApproximator: KtRendererTypeApproximator public lateinit var typeProjectionRenderer: KtTypeProjectionRenderer public lateinit var annotationsRenderer: KtAnnotationRenderer + public lateinit var contextReceiversRenderer: KtContextReceiversRenderer public lateinit var keywordRenderer: KtKeywordRenderer public fun build(): KtTypeRenderer = KtTypeRenderer( @@ -115,6 +119,7 @@ public class KtTypeRenderer private constructor( typeApproximator, typeProjectionRenderer, annotationsRenderer, + contextReceiversRenderer, keywordRenderer, ) } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/impl/KtTypeRendererForSource.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/impl/KtTypeRendererForSource.kt index 8c512797d6d..9b823e173a9 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/impl/KtTypeRendererForSource.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/impl/KtTypeRendererForSource.kt @@ -7,6 +7,7 @@ package org.jetbrains.kotlin.analysis.api.renderer.types.impl import org.jetbrains.kotlin.analysis.api.renderer.base.KtKeywordRenderer import org.jetbrains.kotlin.analysis.api.renderer.base.annotations.KtAnnotationRendererForSource +import org.jetbrains.kotlin.analysis.api.renderer.base.contextReceivers.KtContextReceiversRendererForSource import org.jetbrains.kotlin.analysis.api.renderer.declarations.KtRendererTypeApproximator import org.jetbrains.kotlin.analysis.api.renderer.types.KtTypeRenderer import org.jetbrains.kotlin.analysis.api.renderer.types.renderers.* @@ -29,6 +30,7 @@ public object KtTypeRendererForSource { typeApproximator = KtRendererTypeApproximator.TO_DENNOTABLE typeProjectionRenderer = KtTypeProjectionRenderer.WITH_VARIANCE annotationsRenderer = KtAnnotationRendererForSource.WITH_QUALIFIED_NAMES + contextReceiversRenderer = KtContextReceiversRendererForSource.WITH_LABELS keywordRenderer = KtKeywordRenderer.AS_WORD } diff --git a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt index 624d972eecc..4be5dc9d43b 100644 --- a/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt +++ b/analysis/analysis-api/src/org/jetbrains/kotlin/analysis/api/renderer/types/renderers/KtFunctionalTypeRenderer.kt @@ -24,6 +24,11 @@ public interface KtFunctionalTypeRenderer { if (annotationsRendered) printer.append(" ") if (annotationsRendered || type.nullability == KtTypeNullability.NULLABLE) append("(") " ".separated( + { + if (type.hasContextReceivers) { + contextReceiversRenderer.renderContextReceivers(type, printer) + } + }, { if (type.isSuspend) { keywordRenderer.renderKeyword(KtTokens.SUSPEND_KEYWORD, type, printer) diff --git a/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.descriptors.rendered b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.descriptors.rendered new file mode 100644 index 00000000000..46a7825af31 --- /dev/null +++ b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.descriptors.rendered @@ -0,0 +1,37 @@ +interface Context1 + +interface Context2 { + fun getContextElement(): A +} + +class Context2Impl(value: A) : Context2 { + override fun getContextElement(): A + + val value: A +} + +context(Int, String) +class A { + constructor(int: Int) +} + +context(Context1, c2@Context2) +class B { + override fun toString(): String +} + +context(Context2) +class C { + val a: A + get() +} + +context(Context1) +@Deprecated(message = "Use `B` instead.") +class D + +context(b@B, `fun`@A) +fun foo() + +context(Context2>) +fun bar(): ERROR diff --git a/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.kt b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.kt new file mode 100644 index 00000000000..ef71325d75c --- /dev/null +++ b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.kt @@ -0,0 +1,36 @@ +interface Context1 + +interface Context2 { + fun getContextElement(): A +} + +class Context2Impl(val value: A) : Context2 { + override fun getContextElement(): A = value +} + +context(Int, String) +class A { + context(Double) + constructor(int: Int) {} +} + +context(Context1, c2@Context2) +class B { + override fun toString(): String = getContextElement() +} + +context(Context2) +class C { + val a: A + get() = getContextElement() +} + +context(Context1) +@Deprecated("Use `B` instead.") +class D + +context(b@B, `fun`@A) +fun foo() = Unit + +context(Context2>) +fun bar() = with (Context2Impl(getContextElement().a)) { C() } diff --git a/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.rendered b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.rendered new file mode 100644 index 00000000000..adb18bbf349 --- /dev/null +++ b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/contextReceiver.rendered @@ -0,0 +1,37 @@ +interface Context1 + +interface Context2 { + fun getContextElement(): A +} + +class Context2Impl(value: A) : Context2 { + override fun getContextElement(): A + + val value: A +} + +context(Int, String) +class A { + constructor(int: Int) +} + +context(Context1, c2@Context2) +class B { + override fun toString(): String +} + +context(Context2) +class C { + val a: A + get() +} + +context(Context1) +@Deprecated(message = "Use `B` instead.") +class D + +context(b@B, `fun`@A) +fun foo() + +context(Context2>) +fun bar(): C diff --git a/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.kt b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.kt new file mode 100644 index 00000000000..e0be0697aa4 --- /dev/null +++ b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.kt @@ -0,0 +1,10 @@ +interface A +interface B + +val f1: context(A) () -> Unit = { } + +val f2: context(B, A) Int.() -> Unit = { } + +val f3: (Int) -> (context(A) (String) -> String) = { { "" } } + +val f4: (context(A) B.(Int) -> Unit) -> (context(B) (Int) -> Unit) = { { } } diff --git a/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.rendered b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.rendered new file mode 100644 index 00000000000..80eee0c4729 --- /dev/null +++ b/analysis/analysis-api/testData/components/symbolDeclarationRenderer/renderDeclaration/types/contextFunctionTypes.rendered @@ -0,0 +1,11 @@ +interface A + +interface B + +val f1: context(A) () -> Unit + +val f2: context(B, A) Int.() -> Unit + +val f3: (Int) -> context(A) (String) -> String + +val f4: (context(A) B.(Int) -> Unit) -> context(B) (Int) -> Unit diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnClass.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnClass.pretty.txt index 8e2fd89909a..2b07695e4d8 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnClass.pretty.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnClass.pretty.txt @@ -1,3 +1,4 @@ +context(kotlin.Int, s@kotlin.String) class A { constructor(int: kotlin.Int) } diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnFunction.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnFunction.pretty.txt index 039d2832bfd..03eaf209766 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnFunction.pretty.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnFunction.pretty.txt @@ -1 +1,2 @@ +context(kotlin.Int, s@kotlin.String) fun y() diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.pretty.txt index d506a21631a..57db2200180 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.pretty.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/contextReceiversOnProperty.pretty.txt @@ -1,2 +1,3 @@ +context(kotlin.Int, s@kotlin.String) val y: kotlin.Int get() \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.pretty.txt index 284829da84f..4790c28b81e 100644 --- a/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.pretty.txt +++ b/analysis/analysis-api/testData/symbols/symbolByPsi/contextReceivers/similarSignatures.pretty.txt @@ -1,9 +1,13 @@ +context(A) fun tooo() +context(B) fun tooo() +context(A, B) fun tooo() +context(B, A) fun tooo() class A diff --git a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt index 87f053a9ef6..585891e572e 100644 --- a/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt +++ b/core/compiler.common/src/org/jetbrains/kotlin/name/StandardClassIds.kt @@ -142,6 +142,7 @@ object StandardClassIds { val PublishedApi = "PublishedApi".baseId() val SinceKotlin = "SinceKotlin".baseId() val ExtensionFunctionType = "ExtensionFunctionType".baseId() + val ContextFunctionTypeParams = "ContextFunctionTypeParams".baseId() val Deprecated = "Deprecated".baseId() val DeprecatedSinceKotlin = "DeprecatedSinceKotlin".baseId()