[analysis api fe10] provide a dummy implementation for KtFe10SymbolContainingDeclarationProvider.getContainingModule

to satisfy some tests
This commit is contained in:
Ilya Kirillov
2022-04-07 13:33:48 +02:00
parent 2cd0792e98
commit 3bd892fe82
14 changed files with 333 additions and 1 deletions
@@ -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<Path> = listOf(libraryPath)
override val directRegularDependencies: List<KtModule> = emptyList()
override val directRefinementDependencies: List<KtModule> = emptyList()
override val directFriendDependencies: List<KtModule> = 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())
}
}
}
@@ -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)
@@ -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<PsiFile>, module: TestModule, testServices: TestServices) {
@@ -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
@@ -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<ft<kotlin/String, kotlin/String?>>
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
@@ -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
@@ -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
@@ -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<kotlin/io/FileWalkDirection>
]
symbolKind: TOP_LEVEL
typeParameters: []
visibility: Public
getContainingModule: Could not render due to kotlin.NotImplementedError: An operation is not implemented: deserialized class FileWalkDirection
deprecationStatus: null
@@ -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<E>
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
@@ -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<E>
symbolKind: CLASS_MEMBER
typeParameters: []
valueParameters: []
visibility: Public
getDispatchReceiver(): kotlin/collections/List<E>
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<E>
symbolKind: CLASS_MEMBER
typeParameters: []
valueParameters: [
KtValueParameterSymbol(index)
]
visibility: Public
getDispatchReceiver(): kotlin/collections/List<E>
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
@@ -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<K, V>
]
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
@@ -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
@@ -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<E>
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
@@ -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