From 3bd892fe8202d79849887cb3512f744a3b5ea914 Mon Sep 17 00:00:00 2001 From: Ilya Kirillov Date: Thu, 7 Apr 2022 13:33:48 +0200 Subject: [PATCH] [analysis api fe10] provide a dummy implementation for KtFe10SymbolContainingDeclarationProvider.getContainingModule to satisfy some tests --- ...Fe10SymbolContainingDeclarationProvider.kt | 51 +++++++++++++++++ .../descriptorBased/base/Kt1DescUtils.kt | 11 ++++ .../AnalysisApiFe10TestConfigurator.kt | 9 ++- .../symbolByFqName/class.descriptors.txt | 24 ++++++++ .../classFromJdk.descriptors.txt | 25 +++++++++ .../symbolByFqName/enumEntry.descriptors.txt | 12 ++++ .../symbolByFqName/iterator.descriptors.txt | 24 ++++++++ .../symbolByFqName/listOf.descriptors.txt | 22 ++++++++ .../memberFunction.descriptors.txt | 28 ++++++++++ ...emberFunctionWithOverloads.descriptors.txt | 55 +++++++++++++++++++ .../nestedClass.descriptors.txt | 25 +++++++++ .../accessorField.descriptors.txt | 12 ++++ .../constructorViaTypeAlias.descriptors.txt | 21 +++++++ .../samConstructor.descriptors.txt | 15 +++++ 14 files changed, 333 insertions(+), 1 deletion(-) create mode 100644 analysis/analysis-api/testData/symbols/symbolByFqName/class.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByFqName/classFromJdk.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByFqName/enumEntry.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByFqName/iterator.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByFqName/listOf.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByFqName/memberFunction.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByFqName/memberFunctionWithOverloads.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByFqName/nestedClass.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/accessorField.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.descriptors.txt create mode 100644 analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.descriptors.txt diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolContainingDeclarationProvider.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolContainingDeclarationProvider.kt index 0d2714cfa32..f249dcd9676 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolContainingDeclarationProvider.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/components/KtFe10SymbolContainingDeclarationProvider.kt @@ -5,10 +5,14 @@ package org.jetbrains.kotlin.analysis.api.descriptors.components +import com.intellij.openapi.project.Project +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.psi.search.ProjectScope import org.jetbrains.kotlin.analysis.api.components.KtSymbolContainingDeclarationProvider 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.KtFe10DescSymbol +import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.getDescriptor import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtSymbol import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.base.KtFe10PsiSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtBackingFieldSymbol @@ -17,7 +21,20 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolWithKind import org.jetbrains.kotlin.analysis.api.tokens.ValidityToken +import org.jetbrains.kotlin.analysis.project.structure.KtLibraryModule +import org.jetbrains.kotlin.analysis.project.structure.KtLibrarySourceModule +import org.jetbrains.kotlin.analysis.project.structure.KtModule +import org.jetbrains.kotlin.analysis.project.structure.getKtModule import org.jetbrains.kotlin.cfg.getElementParentDeclaration +import org.jetbrains.kotlin.descriptors.DeclarationDescriptor +import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource +import org.jetbrains.kotlin.platform.TargetPlatform +import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices +import org.jetbrains.kotlin.resolve.descriptorUtil.platform +import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices +import org.jetbrains.kotlin.serialization.deserialization.descriptors.DescriptorWithContainerSource +import java.nio.file.Path +import java.nio.file.Paths internal class KtFe10SymbolContainingDeclarationProvider( override val analysisSession: KtFe10AnalysisSession @@ -44,7 +61,41 @@ internal class KtFe10SymbolContainingDeclarationProvider( return null } + else -> null } } + + // TODO this is a dummy and incorrect implementation just to satisfy some tests + override fun getContainingModule(symbol: KtSymbol): KtModule { + return symbol.psi?.getKtModule(analysisSession.analysisContext.resolveSession.project) + ?: symbol.getDescriptor()?.getFakeContainingKtModule() + ?: TODO(symbol.toString()) + } + + private fun DeclarationDescriptor.getFakeContainingKtModule(): KtModule { + return when (this) { + is DescriptorWithContainerSource -> { + val libraryPath = Paths.get((containerSource as JvmPackagePartSource).knownJvmBinaryClass?.containingLibrary!!) + object : KtLibraryModule { + override val libraryName: String = libraryPath.fileName.toString().substringBeforeLast(".") + override val librarySources: KtLibrarySourceModule? = null + override fun getBinaryRoots(): Collection = listOf(libraryPath) + override val directRegularDependencies: List = emptyList() + override val directRefinementDependencies: List = emptyList() + override val directFriendDependencies: List = emptyList() + override val contentScope: GlobalSearchScope = ProjectScope.getLibrariesScope(project) + override val platform: TargetPlatform + get() = this@getFakeContainingKtModule.platform!! + override val analyzerServices: PlatformDependentAnalyzerServices + get() = JvmPlatformAnalyzerServices + override val project: Project + get() = analysisSession.analysisContext.resolveSession.project + + } + } + + else -> TODO(this.toString()) + } + } } \ No newline at end of file diff --git a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt index a62fdca0181..216126281c3 100644 --- a/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt +++ b/analysis/analysis-api-fe10/src/org/jetbrains/kotlin/analysis/api/descriptors/symbols/descriptorBased/base/Kt1DescUtils.kt @@ -8,6 +8,7 @@ package org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.ba import org.jetbrains.kotlin.analysis.api.* import org.jetbrains.kotlin.analysis.api.annotations.* import org.jetbrains.kotlin.analysis.api.base.KtConstantValue +import org.jetbrains.kotlin.analysis.api.calls.symbol import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.* @@ -18,6 +19,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.analysis.api.types.KtType import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability +import org.jetbrains.kotlin.analysis.utils.errors.unexpectedElementError import org.jetbrains.kotlin.analysis.utils.printer.prettyPrint import org.jetbrains.kotlin.builtins.functions.FunctionClassDescriptor import org.jetbrains.kotlin.descriptors.* @@ -109,6 +111,15 @@ internal fun ClassDescriptor.toKtClassSymbol(analysisContext: Fe10AnalysisContex } } +internal fun KtSymbol.getDescriptor(): DeclarationDescriptor? { + return when (this) { + is KtFe10PsiSymbol<*, *> -> descriptor + is KtFe10DescSymbol<*> -> descriptor + else -> unexpectedElementError("KtSymbol", this) + } +} + + internal fun ConstructorDescriptor.toKtConstructorSymbol(analysisContext: Fe10AnalysisContext): KtConstructorSymbol { if (this is TypeAliasConstructorDescriptor) { return this.underlyingConstructorDescriptor.toKtConstructorSymbol(analysisContext) diff --git a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/test/configurator/AnalysisApiFe10TestConfigurator.kt b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/test/configurator/AnalysisApiFe10TestConfigurator.kt index ae343dfc784..e8c52076dd0 100644 --- a/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/test/configurator/AnalysisApiFe10TestConfigurator.kt +++ b/analysis/analysis-api-fe10/tests/org/jetbrains/kotlin/analysis/api/fe10/test/configurator/AnalysisApiFe10TestConfigurator.kt @@ -10,6 +10,8 @@ import com.intellij.openapi.project.Project import com.intellij.psi.PsiFile import org.jetbrains.kotlin.analysis.api.impl.base.test.configurators.AnalysisApiBaseTestServiceRegistrar import org.jetbrains.kotlin.analysis.api.standalone.base.project.structure.KtModuleProjectStructure +import org.jetbrains.kotlin.analysis.test.framework.project.structure.KtMainModuleFactoryForSourceModules +import org.jetbrains.kotlin.analysis.test.framework.project.structure.TestModuleStructureFactory import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestConfigurator import org.jetbrains.kotlin.analysis.test.framework.test.configurators.AnalysisApiTestServiceRegistrar import org.jetbrains.kotlin.psi.KtFile @@ -42,7 +44,12 @@ object AnalysisApiFe10TestConfigurator : AnalysisApiTestConfigurator() { testServices: TestServices, project: Project, ): KtModuleProjectStructure { - return moduleStructure.toKtSourceModules(testServices, project) + return TestModuleStructureFactory.createProjectStructureByTestStructure( + moduleStructure, + testServices, + project, + KtMainModuleFactoryForSourceModules, + ) } override fun prepareFilesInModule(files: List, module: TestModule, testServices: TestServices) { diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/class.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/class.descriptors.txt new file mode 100644 index 00000000000..85eb064563d --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/class.descriptors.txt @@ -0,0 +1,24 @@ +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: kotlin/Lazy + classKind: INTERFACE + companionObject: null + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: ABSTRACT + name: Lazy + origin: LIBRARY + superTypes: [ + kotlin/Any + ] + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(T) + ] + visibility: Public + getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: deserialized class Lazy + + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/classFromJdk.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/classFromJdk.descriptors.txt new file mode 100644 index 00000000000..9cac7b2a90b --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/classFromJdk.descriptors.txt @@ -0,0 +1,25 @@ +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: java/lang/String + classKind: CLASS + companionObject: null + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: String + origin: JAVA + superTypes: [ + kotlin/Any + java/io/Serializable + kotlin/Comparable> + kotlin/CharSequence + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: Could not render due to java.util.NoSuchElementException: Collection contains no element matching the predicate. + + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/enumEntry.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/enumEntry.descriptors.txt new file mode 100644 index 00000000000..24c97cab87c --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/enumEntry.descriptors.txt @@ -0,0 +1,12 @@ +KtEnumEntrySymbol: + callableIdIfNonLocal: kotlin/LazyThreadSafetyMode.SYNCHRONIZED + containingEnumClassIdIfNonLocal: kotlin/LazyThreadSafetyMode + isExtension: false + name: SYNCHRONIZED + origin: LIBRARY + receiverType: null + returnType: kotlin/LazyThreadSafetyMode + symbolKind: CLASS_MEMBER + getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: enum entry SYNCHRONIZED + + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/iterator.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/iterator.descriptors.txt new file mode 100644 index 00000000000..9b5589f4796 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/iterator.descriptors.txt @@ -0,0 +1,24 @@ +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: kotlin/collections/Iterator + classKind: INTERFACE + companionObject: null + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: ABSTRACT + name: Iterator + origin: LIBRARY + superTypes: [ + kotlin/Any + ] + symbolKind: TOP_LEVEL + typeParameters: [ + KtTypeParameterSymbol(T) + ] + visibility: Public + getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: deserialized class Iterator + + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/listOf.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/listOf.descriptors.txt new file mode 100644 index 00000000000..0a8b858ea8c --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/listOf.descriptors.txt @@ -0,0 +1,22 @@ +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: kotlin/io/FileWalkDirection + classKind: ENUM_CLASS + companionObject: null + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: FINAL + name: FileWalkDirection + origin: LIBRARY + superTypes: [ + kotlin/Enum + ] + symbolKind: TOP_LEVEL + typeParameters: [] + visibility: Public + getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: deserialized class FileWalkDirection + + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/memberFunction.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/memberFunction.descriptors.txt new file mode 100644 index 00000000000..d32374f6eb7 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/memberFunction.descriptors.txt @@ -0,0 +1,28 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: kotlin/collections/List.get + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: true + isOverride: false + isStatic: false + isSuspend: false + modality: ABSTRACT + name: get + origin: LIBRARY + receiverType: null + returnType: E + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol(index) + ] + visibility: Public + getDispatchReceiver(): kotlin/collections/List + getContainingModule: Could not render due to java.lang.NullPointerException: null cannot be cast to non-null type org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource + + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/memberFunctionWithOverloads.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/memberFunctionWithOverloads.descriptors.txt new file mode 100644 index 00000000000..02ea2cb145b --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/memberFunctionWithOverloads.descriptors.txt @@ -0,0 +1,55 @@ +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: kotlin/collections/List.listIterator + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: ABSTRACT + name: listIterator + origin: LIBRARY + receiverType: null + returnType: kotlin/collections/ListIterator + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [] + visibility: Public + getDispatchReceiver(): kotlin/collections/List + getContainingModule: Could not render due to java.lang.NullPointerException: null cannot be cast to non-null type org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource + + deprecationStatus: null + +KtFunctionSymbol: + annotationsList: [] + callableIdIfNonLocal: kotlin/collections/List.listIterator + hasStableParameterNames: true + isBuiltinFunctionInvoke: false + isExtension: false + isExternal: false + isInfix: false + isInline: false + isOperator: false + isOverride: false + isStatic: false + isSuspend: false + modality: ABSTRACT + name: listIterator + origin: LIBRARY + receiverType: null + returnType: kotlin/collections/ListIterator + symbolKind: CLASS_MEMBER + typeParameters: [] + valueParameters: [ + KtValueParameterSymbol(index) + ] + visibility: Public + getDispatchReceiver(): kotlin/collections/List + getContainingModule: Could not render due to java.lang.NullPointerException: null cannot be cast to non-null type org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource + + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByFqName/nestedClass.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByFqName/nestedClass.descriptors.txt new file mode 100644 index 00000000000..e1ffaa99810 --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByFqName/nestedClass.descriptors.txt @@ -0,0 +1,25 @@ +KtNamedClassOrObjectSymbol: + annotationsList: [] + classIdIfNonLocal: kotlin/collections/MutableMap.MutableEntry + classKind: INTERFACE + companionObject: null + isData: false + isExternal: false + isFun: false + isInline: false + isInner: false + modality: ABSTRACT + name: MutableEntry + origin: LIBRARY + superTypes: [ + kotlin/collections/Map.Entry + ] + symbolKind: CLASS_MEMBER + typeParameters: [ + KtTypeParameterSymbol(K) + KtTypeParameterSymbol(V) + ] + visibility: Public + getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: deserialized class MutableEntry + + deprecationStatus: null \ No newline at end of file diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/accessorField.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByReference/accessorField.descriptors.txt new file mode 100644 index 00000000000..5f8e9f3d3ef --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/accessorField.descriptors.txt @@ -0,0 +1,12 @@ +KtBackingFieldSymbol: + callableIdIfNonLocal: null + isExtension: false + name: field + origin: PROPERTY_BACKING_FIELD + owningProperty: KtKotlinPropertySymbol(/x) + receiverType: null + returnType: kotlin/Int + symbolKind: LOCAL + getContainingModule: Could not render due to java.lang.IllegalStateException: Unexpected KtSymbol KtFe10DescSyntheticFieldSymbol + + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.descriptors.txt new file mode 100644 index 00000000000..d4a0e4a2aed --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/constructorViaTypeAlias.descriptors.txt @@ -0,0 +1,21 @@ +KtConstructorSymbol: + annotationsList: [] + callableIdIfNonLocal: null + containingClassIdIfNonLocal: java/util/ArrayList + hasStableParameterNames: false + isExtension: false + isPrimary: false + origin: JAVA + receiverType: null + returnType: java/util/ArrayList + symbolKind: CLASS_MEMBER + typeParameters: [ + KtTypeParameterSymbol(E) + ] + valueParameters: [ + KtValueParameterSymbol(c) + ] + visibility: Public + getContainingModule: Could not render due to java.util.NoSuchElementException: Collection contains no element matching the predicate. + + deprecationStatus: null diff --git a/analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.descriptors.txt b/analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.descriptors.txt new file mode 100644 index 00000000000..200be5883fa --- /dev/null +++ b/analysis/analysis-api/testData/symbols/symbolByReference/samConstructor.descriptors.txt @@ -0,0 +1,15 @@ +KtSamConstructorSymbol: + callableIdIfNonLocal: java/lang/Runnable + hasStableParameterNames: true + isExtension: false + name: Runnable + origin: SAM_CONSTRUCTOR + receiverType: null + returnType: java/lang/Runnable + symbolKind: SAM_CONSTRUCTOR + valueParameters: [ + KtValueParameterSymbol(function) + ] + getContainingModule: Could not render due to java.util.NoSuchElementException: Collection contains no element matching the predicate. + + deprecationStatus: null