diff --git a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java index 59ffc987304..08d31797eba 100644 --- a/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java +++ b/analysis/analysis-api-fe10/tests-gen/org/jetbrains/kotlin/analysis/api/fe10/test/cases/generated/cases/symbols/Fe10IdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java @@ -106,6 +106,12 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated extend runTest("analysis/analysis-api/testData/symbols/symbolByFqName/nestedClass.kt"); } + @Test + @TestMetadata("typealias.kt") + public void testTypealias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByFqName/typealias.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/symbols/symbolByFqName/withTestCompilerPluginEnabled") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java index 49a561389ed..fa53c40cba4 100644 --- a/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java +++ b/analysis/analysis-api-fir/tests-gen/org/jetbrains/kotlin/analysis/api/fir/test/cases/generated/cases/symbols/FirIdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java @@ -106,6 +106,12 @@ public class FirIdeNormalAnalysisSourceModuleSymbolByFqNameTestGenerated extends runTest("analysis/analysis-api/testData/symbols/symbolByFqName/nestedClass.kt"); } + @Test + @TestMetadata("typealias.kt") + public void testTypealias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByFqName/typealias.kt"); + } + @Nested @TestMetadata("analysis/analysis-api/testData/symbols/symbolByFqName/withTestCompilerPluginEnabled") @TestDataPath("$PROJECT_ROOT") diff --git a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt index 3a5887a9381..bf450cce05c 100644 --- a/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt +++ b/analysis/analysis-api-impl-base/tests/org/jetbrains/kotlin/analysis/api/impl/base/test/SymbolByFqName.kt @@ -50,6 +50,13 @@ sealed class SymbolData { } } + data class TypeAliasData(val classId: ClassId) : SymbolData() { + override fun KtAnalysisSession.toSymbols(): List { + val symbol = getTypeAliasByClassId(classId) ?: error("Type alias $classId is not found") + return listOf(symbol) + } + } + data class CallableData(val callableId: CallableId) : SymbolData() { override fun KtAnalysisSession.toSymbols(): List { val classId = callableId.classId @@ -71,10 +78,11 @@ sealed class SymbolData { } companion object { - val identifiers = arrayOf("callable:", "class:") + val identifiers = arrayOf("callable:", "class:", "typealias:") fun create(data: String): SymbolData = when { data.startsWith("class:") -> ClassData(ClassId.fromString(data.removePrefix("class:").trim())) + data.startsWith("typealias:") -> TypeAliasData(ClassId.fromString(data.removePrefix("typealias:").trim())) data.startsWith("callable:") -> { val fullName = data.removePrefix("callable:").trim() val name = if ('.' in fullName) fullName.substringAfterLast(".") else fullName.substringAfterLast('/') diff --git a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java index e329ec6b329..0e664932fe4 100644 --- a/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java +++ b/analysis/analysis-api-standalone/tests-gen/org/jetbrains/kotlin/analysis/api/standalone/fir/test/cases/generated/cases/symbols/FirStandaloneNormalAnalysisSourceModuleSymbolByFqNameTestGenerated.java @@ -105,4 +105,10 @@ public class FirStandaloneNormalAnalysisSourceModuleSymbolByFqNameTestGenerated public void testNestedClass() throws Exception { runTest("analysis/analysis-api/testData/symbols/symbolByFqName/nestedClass.kt"); } + + @Test + @TestMetadata("typealias.kt") + public void testTypealias() throws Exception { + runTest("analysis/analysis-api/testData/symbols/symbolByFqName/typealias.kt"); + } } diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.descriptors.txt new file mode 100644 index 00000000000..06f7159ebdf --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.descriptors.txt @@ -0,0 +1,11 @@ +KtTypeAliasSymbol: + annotationsList: [] + classIdIfNonLocal: kotlin/DeepRecursiveFunctionBlock + expandedType: kotlin/coroutines/SuspendFunction2, kotlin/Any?, kotlin/Any?> + name: DeepRecursiveFunctionBlock + origin: LIBRARY + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Private + getContainingModule: KtLibraryModule "Library kotlin-stdlib" + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.kt b/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.kt new file mode 100644 index 00000000000..8fde0d665f7 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.kt @@ -0,0 +1,4 @@ +// See: KTIJ-24156 +// DO_NOT_CHECK_SYMBOL_RESTORE_K1 + +// typealias: kotlin/DeepRecursiveFunctionBlock \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.pretty.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.pretty.txt new file mode 100644 index 00000000000..c852cc3fb71 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.pretty.txt @@ -0,0 +1 @@ +private typealias DeepRecursiveFunctionBlock = suspend kotlin.DeepRecursiveScope<*, *>.(kotlin.Any?) -> kotlin.Any? diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.txt new file mode 100644 index 00000000000..3b661305a06 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/typealias.txt @@ -0,0 +1,11 @@ +KtTypeAliasSymbol: + annotationsList: [] + classIdIfNonLocal: kotlin/DeepRecursiveFunctionBlock + expandedType: @ExtensionFunctionType kotlin/coroutines/SuspendFunction2, kotlin/Any?, kotlin/Any?> + name: DeepRecursiveFunctionBlock + origin: LIBRARY + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Private + getContainingModule: KtLibraryModule "Library kotlin-stdlib" + deprecationStatus: null diff --git a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCache.kt b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCache.kt index f0bc9ead96c..94df2ac2c50 100644 --- a/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCache.kt +++ b/analysis/low-level-api-fir/src/org/jetbrains/kotlin/analysis/low/level/api/fir/caches/FirThreadSafeCache.kt @@ -13,8 +13,18 @@ internal class FirThreadSafeCache( private val createValue: (K, CONTEXT) -> V ) : FirCache() { + private val updating: ThreadLocal = ThreadLocal.withInitial { false } + override fun getValue(key: K, context: CONTEXT): V = - map.getOrPutWithNullableValue(key) { createValue(it, context) } + map.getOrPutWithNullableValue(key) { + if (updating.get()) error("Recursive update") + try { + updating.set(true) + createValue(it, context) + } finally { + updating.set(false) + } + } override fun getValueIfComputed(key: K): V? = map[key]?.nullValueToNull()