[Analysis API FE1.0] fix containing module for some cases

This commit is contained in:
Ilya Kirillov
2022-10-24 22:50:26 +02:00
committed by teamcity
parent 59beeb36be
commit f5432127d1
33 changed files with 362 additions and 115 deletions
@@ -40,9 +40,11 @@ sourceSets {
tasks.withType<org.jetbrains.kotlin.gradle.dsl.KotlinCompile<*>> {
kotlinOptions {
freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
freeCompilerArgs += "-Xcontext-receivers"
}
}
projectTest(jUnitMode = JUnitMode.JUnit5) {
dependsOn(":dist")
workingDir = rootDir
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.analysis.project.structure.getKtModule
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor
import org.jetbrains.kotlin.load.kotlin.JvmPackagePartSource
import org.jetbrains.kotlin.platform.TargetPlatform
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
import org.jetbrains.kotlin.resolve.PlatformDependentAnalyzerServices
import org.jetbrains.kotlin.resolve.descriptorUtil.platform
import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices
@@ -53,19 +54,15 @@ internal class KtFe10SymbolContainingDeclarationProvider(
// TODO this is a dummy and incorrect implementation just to satisfy some tests
override fun getContainingModule(symbol: KtSymbol): KtModule {
// Implicit lambda parameter doesn't have a source PSI.
if ((symbol as? KtValueParameterSymbol)?.isImplicitLambdaParameter == true) {
// Retrieve the module from its containing lambda instead.
getContainingDeclaration(symbol)?.let { parentLambdaSymbol ->
return getContainingModule(parentLambdaSymbol)
}
}
return symbol.psi?.getKtModule(analysisSession.analysisContext.resolveSession.project)
val psiForModule = symbol.getDescriptor()?.let { DescriptorToSourceUtils.getContainingFile(it) }
?: symbol.psi
return psiForModule?.getKtModule(analysisSession.analysisContext.resolveSession.project)
?: symbol.getDescriptor()?.getFakeContainingKtModule()
?: TODO(symbol.toString())
?: TODO(symbol::class.java.name)
}
private fun DeclarationDescriptor.getFakeContainingKtModule(): KtModule {
private fun DeclarationDescriptor.getFakeContainingKtModule(): KtModule? {
return when (this) {
is DescriptorWithContainerSource -> {
val libraryPath = Paths.get((containerSource as JvmPackagePartSource).knownJvmBinaryClass?.containingLibrary!!)
@@ -87,7 +84,7 @@ internal class KtFe10SymbolContainingDeclarationProvider(
}
}
else -> TODO(this.toString())
else -> null
}
}
}
@@ -21,11 +21,12 @@ import org.jetbrains.kotlin.analysis.api.types.KtType
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
import org.jetbrains.kotlin.descriptors.Modality
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor
import org.jetbrains.kotlin.descriptors.Visibility
import org.jetbrains.kotlin.name.CallableId
import org.jetbrains.kotlin.name.Name
class KtFe10DescDefaultPropertySetterSymbol(
internal class KtFe10DescDefaultPropertySetterSymbol(
private val propertyDescriptor: PropertyDescriptor,
override val analysisContext: Fe10AnalysisContext
) : KtPropertySetterSymbol(), KtFe10Symbol {
@@ -81,10 +82,13 @@ class KtFe10DescDefaultPropertySetterSymbol(
}
}
private class DefaultKtValueParameterSymbol(
class DefaultKtValueParameterSymbol(
private val propertyDescriptor: PropertyDescriptor,
override val analysisContext: Fe10AnalysisContext
) : KtValueParameterSymbol(), KtFe10Symbol {
val descriptor: ValueParameterDescriptor?
get() = propertyDescriptor.setter?.valueParameters?.singleOrNull()
override val hasDefaultValue: Boolean
get() = withValidityAssertion { false }
@@ -13,6 +13,7 @@ import org.jetbrains.kotlin.analysis.api.base.KtConstantValue
import org.jetbrains.kotlin.analysis.api.base.KtContextReceiver
import org.jetbrains.kotlin.analysis.api.components.KtDeclarationRendererOptions
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10FileSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.KtFe10PackageSymbol
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.*
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.psiBased.KtFe10PsiDefaultPropertyGetterSymbol
@@ -135,6 +136,9 @@ internal fun KtSymbol.getDescriptor(): DeclarationDescriptor? {
is KtFe10PsiDefaultSetterParameterSymbol -> descriptor
is KtFe10PsiDefaultPropertySetterSymbol -> null
is KtFe10DescDefaultPropertySetterSymbol -> null
is KtFe10FileSymbol -> null
is KtFe10DescDefaultPropertySetterSymbol.DefaultKtValueParameterSymbol -> descriptor
is KtFe10PsiDefaultPropertySetterSymbol.DefaultKtValueParameterSymbol -> descriptor
else -> unexpectedElementError("KtSymbol", this)
}
}
@@ -104,9 +104,9 @@ internal class KtFe10PsiDefaultPropertySetterSymbol(
return KtFe10NeverRestoringSymbolPointer()
}
private class DefaultKtValueParameterSymbol(
class DefaultKtValueParameterSymbol(
private val propertyPsi: KtProperty,
private val descriptor: ValueParameterDescriptor?,
val descriptor: ValueParameterDescriptor?,
override val analysisContext: Fe10AnalysisContext
) : KtValueParameterSymbol(), KtFe10Symbol {
override val hasDefaultValue: Boolean