[Analysis API] support creating KtSymbol by K/JS dynamic scope
^KT-61257 fixed
This commit is contained in:
committed by
Space Team
parent
91edbeb747
commit
a90562c0da
+5
@@ -12,6 +12,7 @@ import org.jetbrains.kotlin.analysis.api.components.KtSymbolContainingDeclaratio
|
||||
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.KtFe10DescDefaultBackingFieldSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.KtFe10DynamicFunctionDescValueParameterSymbol
|
||||
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.getModule
|
||||
@@ -66,6 +67,10 @@ internal class KtFe10SymbolContainingDeclarationProvider(
|
||||
return getContainingModule(symbol.owningProperty)
|
||||
}
|
||||
|
||||
if (symbol is KtFe10DynamicFunctionDescValueParameterSymbol) {
|
||||
return getContainingModule(symbol.owner)
|
||||
}
|
||||
|
||||
TODO(symbol::class.java.name)
|
||||
}
|
||||
|
||||
|
||||
+28
-4
@@ -33,6 +33,7 @@ import org.jetbrains.kotlin.name.CallableId
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.returnTypeOrNothing
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
|
||||
internal class KtFe10DescFunctionSymbol private constructor(
|
||||
@@ -49,13 +50,24 @@ internal class KtFe10DescFunctionSymbol private constructor(
|
||||
}
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { descriptor.ktSymbolKind }
|
||||
get() = withValidityAssertion {
|
||||
if (descriptor.isDynamic()) {
|
||||
return@withValidityAssertion KtSymbolKind.CLASS_MEMBER
|
||||
}
|
||||
descriptor.ktSymbolKind
|
||||
}
|
||||
|
||||
override val isSuspend: Boolean
|
||||
get() = withValidityAssertion { descriptor.isSuspend }
|
||||
|
||||
override val isOperator: Boolean
|
||||
get() = withValidityAssertion { descriptor.isOperator }
|
||||
get() = withValidityAssertion {
|
||||
if (descriptor.isDynamic()) {
|
||||
// For consistency with the K2 implementation, see `FirDynamicMembersStorage`
|
||||
return@withValidityAssertion true
|
||||
}
|
||||
descriptor.isOperator
|
||||
}
|
||||
|
||||
override val isExternal: Boolean
|
||||
get() = withValidityAssertion { descriptor.isExternal }
|
||||
@@ -67,7 +79,13 @@ internal class KtFe10DescFunctionSymbol private constructor(
|
||||
get() = withValidityAssertion { descriptor.isExplicitOverride }
|
||||
|
||||
override val isInfix: Boolean
|
||||
get() = withValidityAssertion { descriptor.isInfix }
|
||||
get() = withValidityAssertion {
|
||||
if (descriptor.isDynamic()) {
|
||||
// For consistency with the K2 implementation, see `FirDynamicMembersStorage`
|
||||
return@withValidityAssertion true
|
||||
}
|
||||
descriptor.isInfix
|
||||
}
|
||||
|
||||
override val isStatic: Boolean
|
||||
get() = withValidityAssertion { descriptor is JavaCallableMemberDescriptor && DescriptorUtils.isStaticDeclaration(descriptor) }
|
||||
@@ -82,7 +100,13 @@ internal class KtFe10DescFunctionSymbol private constructor(
|
||||
get() = withValidityAssertion { descriptor.isExpect }
|
||||
|
||||
override val valueParameters: List<KtValueParameterSymbol>
|
||||
get() = withValidityAssertion { descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisContext) } }
|
||||
get() = withValidityAssertion {
|
||||
if (descriptor.isDynamic()) {
|
||||
// For consistency with the K2 implementation, see `FirDynamicMembersStorage`
|
||||
return@withValidityAssertion listOf(KtFe10DynamicFunctionDescValueParameterSymbol(this))
|
||||
}
|
||||
descriptor.valueParameters.map { KtFe10DescValueParameterSymbol(it, analysisContext) }
|
||||
}
|
||||
|
||||
override val hasStableParameterNames: Boolean
|
||||
get() = withValidityAssertion { descriptor.ktHasStableParameterNames }
|
||||
|
||||
+12
-4
@@ -27,6 +27,7 @@ import org.jetbrains.kotlin.psi.KtParameter
|
||||
import org.jetbrains.kotlin.psi.KtProperty
|
||||
import org.jetbrains.kotlin.resolve.BindingContext
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.isExtension
|
||||
|
||||
internal class KtFe10DescKotlinPropertySymbol(
|
||||
@@ -37,7 +38,12 @@ internal class KtFe10DescKotlinPropertySymbol(
|
||||
get() = withValidityAssertion { descriptor.name }
|
||||
|
||||
override val symbolKind: KtSymbolKind
|
||||
get() = withValidityAssertion { descriptor.ktSymbolKind }
|
||||
get() = withValidityAssertion {
|
||||
if (descriptor.isDynamic()) {
|
||||
return@withValidityAssertion KtSymbolKind.CLASS_MEMBER
|
||||
}
|
||||
descriptor.ktSymbolKind
|
||||
}
|
||||
|
||||
override val isLateInit: Boolean
|
||||
get() = withValidityAssertion { descriptor.isLateInit }
|
||||
@@ -67,10 +73,10 @@ internal class KtFe10DescKotlinPropertySymbol(
|
||||
get() = withValidityAssertion { descriptor.isExpect }
|
||||
|
||||
override val hasGetter: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
get() = withValidityAssertion { !descriptor.isDynamic() }
|
||||
|
||||
override val hasSetter: Boolean
|
||||
get() = withValidityAssertion { descriptor.isVar }
|
||||
get() = withValidityAssertion { !descriptor.isDynamic() && !isVal }
|
||||
|
||||
override val callableIdIfNonLocal: CallableId?
|
||||
get() = withValidityAssertion { descriptor.callableIdIfNotLocal }
|
||||
@@ -86,14 +92,16 @@ internal class KtFe10DescKotlinPropertySymbol(
|
||||
createKtInitializerValue(initializer, descriptor, analysisContext)
|
||||
}
|
||||
|
||||
override val getter: KtPropertyGetterSymbol
|
||||
override val getter: KtPropertyGetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
if (descriptor.isDynamic()) return null
|
||||
val getter = descriptor.getter ?: return KtFe10DescDefaultPropertyGetterSymbol(descriptor, analysisContext)
|
||||
return KtFe10DescPropertyGetterSymbol(getter, analysisContext)
|
||||
}
|
||||
|
||||
override val setter: KtPropertySetterSymbol?
|
||||
get() = withValidityAssertion {
|
||||
if (descriptor.isDynamic()) return null
|
||||
if (!descriptor.isVar) {
|
||||
return null
|
||||
}
|
||||
|
||||
+81
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
* 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.descriptors.symbols.descriptorBased
|
||||
|
||||
import com.intellij.psi.PsiElement
|
||||
import org.jetbrains.kotlin.analysis.api.KtAnalysisSession
|
||||
import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.Fe10AnalysisContext
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.base.KtFe10Symbol
|
||||
import org.jetbrains.kotlin.analysis.api.descriptors.symbols.descriptorBased.base.toKtType
|
||||
import org.jetbrains.kotlin.analysis.api.impl.base.annotations.KtEmptyAnnotationsList
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.KtLifetimeToken
|
||||
import org.jetbrains.kotlin.analysis.api.lifetime.withValidityAssertion
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol
|
||||
import org.jetbrains.kotlin.analysis.api.symbols.pointers.KtSymbolPointer
|
||||
import org.jetbrains.kotlin.analysis.api.types.KtType
|
||||
import org.jetbrains.kotlin.name.Name
|
||||
import org.jetbrains.kotlin.types.createDynamicType
|
||||
|
||||
internal class KtFe10DynamicFunctionDescValueParameterSymbol(
|
||||
val owner: KtFe10DescFunctionSymbol,
|
||||
) : KtValueParameterSymbol(), KtFe10Symbol {
|
||||
override val analysisContext: Fe10AnalysisContext
|
||||
get() = owner.analysisContext
|
||||
|
||||
override val token: KtLifetimeToken
|
||||
get() = owner.token
|
||||
|
||||
override val origin: KtSymbolOrigin
|
||||
get() = withValidityAssertion { KtSymbolOrigin.JS_DYNAMIC }
|
||||
|
||||
override val psi: PsiElement?
|
||||
get() = withValidityAssertion { null }
|
||||
|
||||
override val annotationsList: KtAnnotationsList
|
||||
get() = withValidityAssertion { KtEmptyAnnotationsList(token) }
|
||||
|
||||
override val name: Name
|
||||
get() = withValidityAssertion { Name.identifier("args") }
|
||||
|
||||
override val hasDefaultValue: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isVararg: Boolean
|
||||
get() = withValidityAssertion { true }
|
||||
|
||||
override val isCrossinline: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isNoinline: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val isImplicitLambdaParameter: Boolean
|
||||
get() = withValidityAssertion { false }
|
||||
|
||||
override val returnType: KtType
|
||||
get() = withValidityAssertion { createDynamicType(analysisContext.builtIns).toKtType(analysisContext) }
|
||||
|
||||
context(KtAnalysisSession)
|
||||
override fun createPointer(): KtSymbolPointer<KtValueParameterSymbol> = withValidityAssertion {
|
||||
Pointer(owner.createPointer())
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean = other is KtFe10DynamicFunctionDescValueParameterSymbol && other.owner == this.owner
|
||||
override fun hashCode(): Int = owner.hashCode()
|
||||
|
||||
|
||||
private class Pointer(val ownerPointer: KtSymbolPointer<KtFunctionSymbol>) : KtSymbolPointer<KtValueParameterSymbol>() {
|
||||
@Deprecated("Consider using org.jetbrains.kotlin.analysis.api.KtAnalysisSession.restoreSymbol")
|
||||
override fun restoreSymbol(analysisSession: KtAnalysisSession): KtValueParameterSymbol? {
|
||||
@Suppress("DEPRECATION")
|
||||
val owner = ownerPointer.restoreSymbol(analysisSession) as? KtFe10DescFunctionSymbol ?: return null
|
||||
return KtFe10DynamicFunctionDescValueParameterSymbol(owner)
|
||||
}
|
||||
}
|
||||
}
|
||||
+7
-1
@@ -50,6 +50,7 @@ import org.jetbrains.kotlin.psi.KtExpression
|
||||
import org.jetbrains.kotlin.renderer.DescriptorRenderer
|
||||
import org.jetbrains.kotlin.resolve.DescriptorUtils
|
||||
import org.jetbrains.kotlin.resolve.calls.inference.CapturedType
|
||||
import org.jetbrains.kotlin.resolve.calls.tasks.isDynamic
|
||||
import org.jetbrains.kotlin.resolve.constants.*
|
||||
import org.jetbrains.kotlin.resolve.constants.evaluate.ConstantExpressionEvaluator
|
||||
import org.jetbrains.kotlin.resolve.descriptorUtil.annotationClass
|
||||
@@ -141,6 +142,7 @@ internal fun KtSymbol.getDescriptor(): DeclarationDescriptor? {
|
||||
is KtFe10PsiDefaultSetterParameterSymbol -> descriptor
|
||||
is KtFe10PsiDefaultPropertySetterSymbol -> null
|
||||
is KtFe10DescDefaultPropertySetterSymbol -> null
|
||||
is KtFe10DynamicFunctionDescValueParameterSymbol -> null
|
||||
is KtFe10FileSymbol -> null
|
||||
is KtFe10DescDefaultPropertySetterSymbol.DefaultKtValueParameterSymbol -> descriptor
|
||||
is KtFe10PsiDefaultPropertySetterSymbol.DefaultKtValueParameterSymbol -> descriptor
|
||||
@@ -331,7 +333,11 @@ internal fun DeclarationDescriptor.getSymbolOrigin(analysisContext: Fe10Analysis
|
||||
is CallableMemberDescriptor -> when (kind) {
|
||||
CallableMemberDescriptor.Kind.DELEGATION -> return KtSymbolOrigin.DELEGATED
|
||||
CallableMemberDescriptor.Kind.SYNTHESIZED -> return KtSymbolOrigin.SOURCE_MEMBER_GENERATED
|
||||
else -> {}
|
||||
else -> {
|
||||
if (isDynamic()) {
|
||||
return KtSymbolOrigin.JS_DYNAMIC
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+28
@@ -220,6 +220,34 @@ public class Fe10IdeNormalAnalysisSourceModuleSymbolByReferenceTestGenerated ext
|
||||
runTest("analysis/analysis-api/testData/symbols/symbolByReference/valueParameter.kt");
|
||||
}
|
||||
|
||||
@Nested
|
||||
@TestMetadata("analysis/analysis-api/testData/symbols/symbolByReference/js")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
public class Js {
|
||||
@Test
|
||||
public void testAllFilesPresentInJs() throws Exception {
|
||||
KtTestUtil.assertAllTestsPresentByMetadataWithExcluded(this.getClass(), new File("analysis/analysis-api/testData/symbols/symbolByReference/js"), Pattern.compile("^(.+)\\.kt$"), null, true);
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("functionFromJsDynamicScopeNoArguments.kt")
|
||||
public void testFunctionFromJsDynamicScopeNoArguments() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/symbols/symbolByReference/js/functionFromJsDynamicScopeNoArguments.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("functionFromJsDynamicScopeWithArguments.kt")
|
||||
public void testFunctionFromJsDynamicScopeWithArguments() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/symbols/symbolByReference/js/functionFromJsDynamicScopeWithArguments.kt");
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestMetadata("propertyFromJsDynamicScope.kt")
|
||||
public void testPropertyFromJsDynamicScope() throws Exception {
|
||||
runTest("analysis/analysis-api/testData/symbols/symbolByReference/js/propertyFromJsDynamicScope.kt");
|
||||
}
|
||||
}
|
||||
|
||||
@Nested
|
||||
@TestMetadata("analysis/analysis-api/testData/symbols/symbolByReference/withTestCompilerPluginEnabled")
|
||||
@TestDataPath("$PROJECT_ROOT")
|
||||
|
||||
Reference in New Issue
Block a user