diff options
author | Jiaxiang Chen <jiaxiang@google.com> | 2022-03-04 23:29:51 -0800 |
---|---|---|
committer | Jiaxiang Chen <roaringacw@gmail.com> | 2022-03-10 15:09:18 -0800 |
commit | 4699a93e8fb32d740bc76e8c731f3c630575bcfd (patch) | |
tree | 2c8f260da77d38d2c8abec4966bb11f6dbbdb3dd /kotlin-analysis-api | |
parent | 3150c1c154507c08ff220546dd76d72121cd04e1 (diff) | |
download | ksp-4699a93e8fb32d740bc76e8c731f3c630575bcfd.tar.gz |
implement PSI based API logics for kotlin source, with the exception of the following:
* necesssary API not available in analysis API as of 1.7.0-dev-1984
* type ralated logics
* parent look up
Diffstat (limited to 'kotlin-analysis-api')
13 files changed, 338 insertions, 199 deletions
diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KSPCoreEnvironment.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KSPCoreEnvironment.kt index fb40fd74..d4842921 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KSPCoreEnvironment.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KSPCoreEnvironment.kt @@ -5,6 +5,7 @@ import com.intellij.psi.PsiDocumentManager class KSPCoreEnvironment(private val project: MockProject) { companion object { + //TODO: get rid of singleton. lateinit var instance: KSPCoreEnvironment } init { diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt index ba93a8ff..f688857b 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt @@ -1,15 +1,8 @@ package com.google.devtools.ksp.impl.symbol.kotlin -import com.google.devtools.ksp.symbol.AnnotationUseSiteTarget -import com.google.devtools.ksp.symbol.KSAnnotation -import com.google.devtools.ksp.symbol.KSName -import com.google.devtools.ksp.symbol.KSNode -import com.google.devtools.ksp.symbol.KSTypeReference -import com.google.devtools.ksp.symbol.KSValueArgument -import com.google.devtools.ksp.symbol.KSVisitor -import com.google.devtools.ksp.symbol.Location -import com.google.devtools.ksp.symbol.Origin +import com.google.devtools.ksp.symbol.* import org.jetbrains.kotlin.analysis.api.annotations.KtAnnotationApplication +import org.jetbrains.kotlin.descriptors.annotations.AnnotationUseSiteTarget.* class KSAnnotationImpl(private val annotationApplication: KtAnnotationApplication) : KSAnnotation { override val annotationType: KSTypeReference @@ -19,12 +12,28 @@ class KSAnnotationImpl(private val annotationApplication: KtAnnotationApplicatio } override val shortName: KSName get() = TODO("Not yet implemented") - override val useSiteTarget: AnnotationUseSiteTarget? - get() = TODO("Not yet implemented") + override val useSiteTarget: AnnotationUseSiteTarget? by lazy { + when (annotationApplication.useSiteTarget) { + null -> null + FILE -> AnnotationUseSiteTarget.FILE + PROPERTY -> AnnotationUseSiteTarget.PROPERTY + FIELD -> AnnotationUseSiteTarget.FIELD + PROPERTY_GETTER -> AnnotationUseSiteTarget.GET + PROPERTY_SETTER -> AnnotationUseSiteTarget.SET + RECEIVER -> AnnotationUseSiteTarget.RECEIVER + CONSTRUCTOR_PARAMETER -> AnnotationUseSiteTarget.PARAM + SETTER_PARAMETER -> AnnotationUseSiteTarget.SETPARAM + PROPERTY_DELEGATE_FIELD -> AnnotationUseSiteTarget.DELEGATE + + } + } + override val origin: Origin = Origin.KOTLIN - override val location: Location - get() = TODO("Not yet implemented") + override val location: Location by lazy { + annotationApplication.psi?.toLocation() ?: NonExistLocation + } + override val parent: KSNode? get() = TODO("Not yet implemented") diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSClassDeclarationImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSClassDeclarationImpl.kt index f9e2dbdb..b3dd204d 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSClassDeclarationImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSClassDeclarationImpl.kt @@ -1,26 +1,12 @@ package com.google.devtools.ksp.impl.symbol.kotlin -import com.google.devtools.ksp.symbol.ClassKind -import com.google.devtools.ksp.symbol.KSAnnotation -import com.google.devtools.ksp.symbol.KSClassDeclaration -import com.google.devtools.ksp.symbol.KSDeclaration -import com.google.devtools.ksp.symbol.KSFile -import com.google.devtools.ksp.symbol.KSFunctionDeclaration -import com.google.devtools.ksp.symbol.KSName -import com.google.devtools.ksp.symbol.KSNode -import com.google.devtools.ksp.symbol.KSPropertyDeclaration -import com.google.devtools.ksp.symbol.KSType -import com.google.devtools.ksp.symbol.KSTypeArgument -import com.google.devtools.ksp.symbol.KSTypeParameter -import com.google.devtools.ksp.symbol.KSTypeReference -import com.google.devtools.ksp.symbol.KSVisitor -import com.google.devtools.ksp.symbol.Location -import com.google.devtools.ksp.symbol.Modifier -import com.google.devtools.ksp.symbol.Origin +import com.google.devtools.ksp.getDocString +import com.google.devtools.ksp.symbol.* +import com.google.devtools.ksp.toKSModifiers import org.jetbrains.kotlin.analysis.api.annotations.annotations -import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol +import org.jetbrains.kotlin.analysis.api.symbols.* +import org.jetbrains.kotlin.psi.KtClassOrObject +import org.jetbrains.kotlin.psi.KtObjectDeclaration class KSClassDeclarationImpl(private val ktNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol) : KSClassDeclaration { override val classKind: ClassKind @@ -38,15 +24,19 @@ class KSClassDeclarationImpl(private val ktNamedClassOrObjectSymbol: KtNamedClas } } - override val isCompanionObject: Boolean - get() = TODO("Not yet implemented") + override val isCompanionObject: Boolean by lazy { + (ktNamedClassOrObjectSymbol.psi as? KtObjectDeclaration)?.isCompanion() ?: false + } override fun getSealedSubclasses(): Sequence<KSClassDeclaration> { TODO("Not yet implemented") } override fun getAllFunctions(): Sequence<KSFunctionDeclaration> { - TODO("Not yet implemented") + return analyzeWithSymbolAsContext(ktNamedClassOrObjectSymbol) { + ktNamedClassOrObjectSymbol.getMemberScope().getCallableSymbols().filterIsInstance<KtFunctionLikeSymbol>() + .map { KSFunctionDeclarationImpl(it) } + } } override fun getAllProperties(): Sequence<KSPropertyDeclaration> { @@ -64,26 +54,42 @@ class KSClassDeclarationImpl(private val ktNamedClassOrObjectSymbol: KtNamedClas TODO("Not yet implemented") } - override val simpleName: KSName - get() = TODO("Not yet implemented") - override val qualifiedName: KSName? - get() = TODO("Not yet implemented") - override val typeParameters: List<KSTypeParameter> - get() = TODO("Not yet implemented") - override val packageName: KSName - get() = TODO("Not yet implemented") - override val parentDeclaration: KSDeclaration? - get() = TODO("Not yet implemented") - override val containingFile: KSFile? - get() = TODO("Not yet implemented") - override val docString: String? - get() = TODO("Not yet implemented") - override val modifiers: Set<Modifier> - get() = TODO("Not yet implemented") - override val origin: Origin - get() = TODO("Not yet implemented") - override val location: Location - get() = TODO("Not yet implemented") + override val simpleName: KSName by lazy { + KSNameImpl(ktNamedClassOrObjectSymbol.name.asString()) + } + + override val qualifiedName: KSName? by lazy { + (ktNamedClassOrObjectSymbol.psi as? KtClassOrObject)?.fqName?.asString()?.let { KSNameImpl(it) } + } + + override val typeParameters: List<KSTypeParameter> by lazy { + ktNamedClassOrObjectSymbol.typeParameters.map { KSTypeParameterImpl(it) } + } + + override val packageName: KSName by lazy { + this.containingFile?.packageName ?: KSNameImpl("") + } + + override val parentDeclaration: KSDeclaration? by lazy { + TODO() + } + override val containingFile: KSFile? by lazy { + ktNamedClassOrObjectSymbol.toContainingFile() + } + override val docString: String? by lazy { + ktNamedClassOrObjectSymbol.psi?.getDocString() + } + + override val modifiers: Set<Modifier> by lazy { + (ktNamedClassOrObjectSymbol.psi as? KtClassOrObject)?.toKSModifiers() ?: emptySet() + } + override val origin: Origin by lazy { + mapAAOrigin(ktNamedClassOrObjectSymbol.origin) + } + + override val location: Location by lazy { + ktNamedClassOrObjectSymbol.psi?.toLocation() ?: NonExistLocation + } override val parent: KSNode? get() = TODO("Not yet implemented") diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFileSymbolImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFileImpl.kt index 19cf7a2e..4b290d1b 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFileSymbolImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFileImpl.kt @@ -15,7 +15,7 @@ import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.psi.KtFile -class KSFileSymbolImpl(private val ktFile: KtFile) : KSFile { +class KSFileImpl(private val ktFile: KtFile) : KSFile { override val packageName: KSName by lazy { KSNameImpl(ktFile.packageFqName.asString()) } @@ -39,8 +39,9 @@ class KSFileSymbolImpl(private val ktFile: KtFile) : KSFile { } override val origin: Origin = Origin.KOTLIN - override val location: Location - get() = TODO("Not yet implemented") + override val location: Location by lazy { + ktFile.toLocation() + } override val parent: KSNode? = null diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionDeclarationImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionDeclarationImpl.kt index cd3ef8ae..9b943503 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionDeclarationImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionDeclarationImpl.kt @@ -1,35 +1,28 @@ package com.google.devtools.ksp.impl.symbol.kotlin -import com.google.devtools.ksp.symbol.FunctionKind -import com.google.devtools.ksp.symbol.KSAnnotation -import com.google.devtools.ksp.symbol.KSDeclaration -import com.google.devtools.ksp.symbol.KSFile -import com.google.devtools.ksp.symbol.KSFunction -import com.google.devtools.ksp.symbol.KSFunctionDeclaration -import com.google.devtools.ksp.symbol.KSName -import com.google.devtools.ksp.symbol.KSNode -import com.google.devtools.ksp.symbol.KSType -import com.google.devtools.ksp.symbol.KSTypeParameter -import com.google.devtools.ksp.symbol.KSTypeReference -import com.google.devtools.ksp.symbol.KSValueParameter -import com.google.devtools.ksp.symbol.KSVisitor -import com.google.devtools.ksp.symbol.Location -import com.google.devtools.ksp.symbol.Modifier -import com.google.devtools.ksp.symbol.Origin +import com.google.devtools.ksp.symbol.* +import com.google.devtools.ksp.toKSModifiers import org.jetbrains.kotlin.analysis.api.annotations.annotations import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider -import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionLikeSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol -import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.* import org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotatedSymbol +import org.jetbrains.kotlin.analysis.api.symbols.markers.KtSymbolKind import org.jetbrains.kotlin.descriptors.Modality import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtFunction +import org.jetbrains.kotlin.utils.addToStdlib.safeAs class KSFunctionDeclarationImpl(private val ktFunctionSymbol: KtFunctionLikeSymbol) : KSFunctionDeclaration { - override val functionKind: FunctionKind - get() = TODO("Not yet implemented") + override val functionKind: FunctionKind by lazy { + when (ktFunctionSymbol.symbolKind) { + KtSymbolKind.CLASS_MEMBER -> FunctionKind.MEMBER + KtSymbolKind.TOP_LEVEL -> FunctionKind.TOP_LEVEL + KtSymbolKind.SAM_CONSTRUCTOR -> FunctionKind.LAMBDA + else -> throw IllegalStateException("Unexpected symbol kind ${ktFunctionSymbol.symbolKind}") + } + } override val isAbstract: Boolean by lazy { (ktFunctionSymbol as? KtFunctionSymbol)?.modality == Modality.ABSTRACT } @@ -66,8 +59,9 @@ class KSFunctionDeclarationImpl(private val ktFunctionSymbol: KtFunctionLikeSymb KSNameImpl("<init>") } } - override val qualifiedName: KSName? - get() = TODO("Not yet implemented") + override val qualifiedName: KSName? by lazy { + (ktFunctionSymbol.psi as? KtFunction)?.fqName?.asString()?.let { KSNameImpl(it) } + } override val typeParameters: List<KSTypeParameter> by lazy { (ktFunctionSymbol as? KtFunctionSymbol)?.typeParameters?.map { KSTypeParameterImpl(it) } ?: emptyList() } @@ -77,16 +71,25 @@ class KSFunctionDeclarationImpl(private val ktFunctionSymbol: KtFunctionLikeSymb override val parentDeclaration: KSDeclaration? get() = TODO("Not yet implemented") override val containingFile: KSFile? by lazy { - (ktFunctionSymbol.psi?.containingFile as? KtFile)?.let { KSFileSymbolImpl(it) } + (ktFunctionSymbol.psi?.containingFile as? KtFile)?.let { KSFileImpl(it) } } - override val docString: String? - get() = TODO("Not yet implemented") - override val modifiers: Set<Modifier> - get() = TODO("Not yet implemented") - override val origin: Origin - get() = TODO("Not yet implemented") - override val location: Location - get() = TODO("Not yet implemented") + + override val docString: String? by lazy { + ktFunctionSymbol.toDocString() + } + + override val modifiers: Set<Modifier> by lazy { + ktFunctionSymbol.psi?.safeAs<KtFunction>()?.toKSModifiers() ?: emptySet() + } + + override val origin: Origin by lazy { + mapAAOrigin(ktFunctionSymbol.origin) + } + + override val location: Location by lazy { + ktFunctionSymbol.psi?.toLocation() ?: NonExistLocation + } + override val parent: KSNode? get() = TODO("Not yet implemented") diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyAccessorImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyAccessorImpl.kt new file mode 100644 index 00000000..a4cdccb2 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyAccessorImpl.kt @@ -0,0 +1,54 @@ +package com.google.devtools.ksp.impl.symbol.kotlin + +import com.google.devtools.ksp.symbol.* +import com.google.devtools.ksp.toKSModifiers +import org.jetbrains.kotlin.analysis.api.annotations.annotations +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyAccessorSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertyGetterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySetterSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol +import org.jetbrains.kotlin.psi.KtModifierListOwner +import org.jetbrains.kotlin.utils.addToStdlib.safeAs + +abstract class KSPropertyAccessorImpl(private val ktPropertyAccessorSymbol: KtPropertyAccessorSymbol, override val receiver: KSPropertyDeclaration) : KSPropertyAccessor { + override val annotations: Sequence<KSAnnotation> by lazy { + ktPropertyAccessorSymbol.annotations.asSequence().map { KSAnnotationImpl(it) } + } + + override val location: Location by lazy { + ktPropertyAccessorSymbol.psi?.toLocation() ?: NonExistLocation + } + + override val modifiers: Set<Modifier> by lazy { + ktPropertyAccessorSymbol.psi?.safeAs<KtModifierListOwner>()?.toKSModifiers() ?: emptySet() + } + + override val origin: Origin by lazy { + mapAAOrigin(ktPropertyAccessorSymbol.origin) + } + + override val parent: KSNode? + get() = TODO("Not yet implemented") +} + +class KSPropertySetterImpl(owner: KSPropertyDeclaration, private val setter: KtPropertySetterSymbol +): KSPropertySetter, KSPropertyAccessorImpl(setter, owner) { + override val parameter: KSValueParameter by lazy { + KSValueParameterImpl(setter.parameter) + } + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitPropertySetter(this, data) + } +} + +class KSPropertyGetterImpl(owner: KSPropertyDeclaration, getter: KtPropertyGetterSymbol +): KSPropertyGetter, KSPropertyAccessorImpl(getter, owner) { + override val returnType: KSTypeReference? by lazy { + KSTypeReferenceImpl(getter.returnType) + } + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitPropertyGetter(this, data) + } +} diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationImpl.kt index a8210e8f..49a23c75 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationImpl.kt @@ -1,31 +1,27 @@ package com.google.devtools.ksp.impl.symbol.kotlin -import com.google.devtools.ksp.symbol.KSAnnotation -import com.google.devtools.ksp.symbol.KSDeclaration -import com.google.devtools.ksp.symbol.KSFile -import com.google.devtools.ksp.symbol.KSName -import com.google.devtools.ksp.symbol.KSNode -import com.google.devtools.ksp.symbol.KSPropertyDeclaration -import com.google.devtools.ksp.symbol.KSPropertyGetter -import com.google.devtools.ksp.symbol.KSPropertySetter -import com.google.devtools.ksp.symbol.KSType -import com.google.devtools.ksp.symbol.KSTypeParameter -import com.google.devtools.ksp.symbol.KSTypeReference -import com.google.devtools.ksp.symbol.KSVisitor -import com.google.devtools.ksp.symbol.Location -import com.google.devtools.ksp.symbol.Modifier -import com.google.devtools.ksp.symbol.Origin +import com.google.devtools.ksp.getDocString +import com.google.devtools.ksp.symbol.* +import com.google.devtools.ksp.toKSModifiers +import org.jetbrains.kotlin.analysis.api.annotations.annotations import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol import org.jetbrains.kotlin.psi.KtFile +import org.jetbrains.kotlin.psi.KtFunction +import org.jetbrains.kotlin.psi.KtProperty +import org.jetbrains.kotlin.utils.addToStdlib.safeAs class KSPropertyDeclarationImpl(private val ktPropertySymbol: KtPropertySymbol) : KSPropertyDeclaration { - override val getter: KSPropertyGetter? - get() = TODO("Not yet implemented") - override val setter: KSPropertySetter? - get() = TODO("Not yet implemented") - override val extensionReceiver: KSTypeReference? - get() = TODO("Not yet implemented") + override val getter: KSPropertyGetter? by lazy { + ktPropertySymbol.getter?.let { KSPropertyGetterImpl(this, it) } + } + override val setter: KSPropertySetter? by lazy { + ktPropertySymbol.setter?.let { KSPropertySetterImpl(this, it) } + } + + override val extensionReceiver: KSTypeReference? by lazy { + ktPropertySymbol.receiverType?.let { KSTypeReferenceImpl(it) } + } override val type: KSTypeReference by lazy { KSTypeReferenceImpl(ktPropertySymbol.returnType) } @@ -48,40 +44,56 @@ class KSPropertyDeclarationImpl(private val ktPropertySymbol: KtPropertySymbol) TODO("Not yet implemented") } - override val simpleName: KSName - get() = TODO("Not yet implemented") - override val qualifiedName: KSName? - get() = TODO("Not yet implemented") + override val simpleName: KSName by lazy { + KSNameImpl(ktPropertySymbol.name.asString()) + } + + override val qualifiedName: KSName? by lazy { + (ktPropertySymbol.psi as? KtProperty)?.fqName?.asString()?.let { KSNameImpl(it) } + } override val typeParameters: List<KSTypeParameter> by lazy { ktPropertySymbol.typeParameters.map { KSTypeParameterImpl(it) } } - override val packageName: KSName - get() = TODO("Not yet implemented") + override val packageName: KSName by lazy { + KSNameImpl(this.containingFile?.packageName?.asString() ?: "") + } override val parentDeclaration: KSDeclaration? get() = TODO("Not yet implemented") - override val containingFile: KSFile? - get() = TODO("Not yet implemented") - override val docString: String? - get() = TODO("Not yet implemented") - override val modifiers: Set<Modifier> - get() = TODO("Not yet implemented") - override val origin: Origin - get() = TODO("Not yet implemented") - override val location: Location - get() = TODO("Not yet implemented") + + override val containingFile: KSFile? by lazy { + (ktPropertySymbol.psi?.containingFile as? KtFile)?.let { KSFileImpl(it) } + } + override val docString: String? by lazy { + ktPropertySymbol.psi?.getDocString() + } + + override val modifiers: Set<Modifier> by lazy { + ktPropertySymbol.psi?.safeAs<KtProperty>()?.toKSModifiers() ?: emptySet() + } + + override val origin: Origin by lazy { + mapAAOrigin(ktPropertySymbol.origin) + } + + override val location: Location by lazy { + ktPropertySymbol.psi?.toLocation() ?: NonExistLocation + } + override val parent: KSNode? by lazy { analyzeWithSymbolAsContext(ktPropertySymbol) { - ktPropertySymbol.getContainingSymbol()?.let{ KSClassDeclarationImpl(it as KtNamedClassOrObjectSymbol)} - ?: KSFileSymbolImpl(ktPropertySymbol.psi!!.containingFile as KtFile) + ktPropertySymbol.getContainingSymbol()?.let { KSClassDeclarationImpl(it as KtNamedClassOrObjectSymbol) } + ?: KSFileImpl(ktPropertySymbol.psi!!.containingFile as KtFile) } } override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { - TODO("Not yet implemented") + return visitor.visitPropertyDeclaration(this, data) + } + + override val annotations: Sequence<KSAnnotation> by lazy { + ktPropertySymbol.annotations.asSequence().map { KSAnnotationImpl(it) } } - override val annotations: Sequence<KSAnnotation> - get() = TODO("Not yet implemented") override val isActual: Boolean get() = TODO("Not yet implemented") override val isExpect: Boolean diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeArgumentImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeArgumentImpl.kt index ba67304c..06c68846 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeArgumentImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeArgumentImpl.kt @@ -27,10 +27,13 @@ class KSTypeArgumentImpl(private val ktTypeArgument: KtTypeArgument) : KSTypeArg } } - override val type: KSTypeReference? - get() = TODO("Not yet implemented") - override val annotations: Sequence<KSAnnotation> - get() = TODO("Not yet implemented") + override val type: KSTypeReference? by lazy { + ktTypeArgument.type?.let { KSTypeReferenceImpl(it) } + } + + override val annotations: Sequence<KSAnnotation> by lazy { + TODO() + } override val origin: Origin = Origin.KOTLIN override val location: Location get() = TODO("Not yet implemented") diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeParameterImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeParameterImpl.kt index ce041c54..b6f6fb4b 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeParameterImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeParameterImpl.kt @@ -1,53 +1,69 @@ package com.google.devtools.ksp.impl.symbol.kotlin -import com.google.devtools.ksp.symbol.KSAnnotation -import com.google.devtools.ksp.symbol.KSDeclaration -import com.google.devtools.ksp.symbol.KSFile -import com.google.devtools.ksp.symbol.KSName -import com.google.devtools.ksp.symbol.KSNode -import com.google.devtools.ksp.symbol.KSTypeParameter -import com.google.devtools.ksp.symbol.KSTypeReference -import com.google.devtools.ksp.symbol.KSVisitor -import com.google.devtools.ksp.symbol.Location -import com.google.devtools.ksp.symbol.Modifier -import com.google.devtools.ksp.symbol.Origin -import com.google.devtools.ksp.symbol.Variance +import com.google.devtools.ksp.symbol.* +import com.google.devtools.ksp.toKSModifiers import org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol +import org.jetbrains.kotlin.psi.KtTypeParameter +import org.jetbrains.kotlin.utils.addToStdlib.safeAs class KSTypeParameterImpl(private val ktTypeParameterSymbol: KtTypeParameterSymbol) : KSTypeParameter { - override val name: KSName - get() = TODO("Not yet implemented") - override val variance: Variance - get() = TODO("Not yet implemented") - override val isReified: Boolean - get() = TODO("Not yet implemented") - override val bounds: Sequence<KSTypeReference> - get() = TODO("Not yet implemented") - override val simpleName: KSName - get() = TODO("Not yet implemented") - override val qualifiedName: KSName? - get() = TODO("Not yet implemented") - override val typeParameters: List<KSTypeParameter> - get() = TODO("Not yet implemented") - override val packageName: KSName - get() = TODO("Not yet implemented") + override val name: KSName by lazy { + KSNameImpl(ktTypeParameterSymbol.name.asString()) + } + + override val variance: Variance by lazy { + when (ktTypeParameterSymbol.variance) { + org.jetbrains.kotlin.types.Variance.IN_VARIANCE -> Variance.COVARIANT + org.jetbrains.kotlin.types.Variance.OUT_VARIANCE -> Variance.CONTRAVARIANT + org.jetbrains.kotlin.types.Variance.INVARIANT -> Variance.INVARIANT + } + + } + + override val isReified: Boolean = ktTypeParameterSymbol.isReified + + override val bounds: Sequence<KSTypeReference> by lazy { + ktTypeParameterSymbol.upperBounds.asSequence().map { KSTypeReferenceImpl(it) } + } + + override val simpleName: KSName by lazy { + KSNameImpl(ktTypeParameterSymbol.name.asString()) + } + override val qualifiedName: KSName? by lazy { + KSNameImpl(ktTypeParameterSymbol.psi?.safeAs<KtTypeParameter>()?.fqName?.asString() ?: "") + } + override val typeParameters: List<KSTypeParameter> = emptyList() + + override val packageName: KSName by lazy { + KSNameImpl(this.containingFile?.packageName?.asString() ?: "") + } override val parentDeclaration: KSDeclaration? get() = TODO("Not yet implemented") - override val containingFile: KSFile? - get() = TODO("Not yet implemented") - override val docString: String? - get() = TODO("Not yet implemented") - override val modifiers: Set<Modifier> - get() = TODO("Not yet implemented") - override val origin: Origin - get() = TODO("Not yet implemented") - override val location: Location - get() = TODO("Not yet implemented") + + override val containingFile: KSFile? by lazy { + ktTypeParameterSymbol.toContainingFile() + } + + override val docString: String? by lazy { + ktTypeParameterSymbol.toDocString() + } + + override val modifiers: Set<Modifier> by lazy { + ktTypeParameterSymbol.psi?.safeAs<KtTypeParameter>()?.toKSModifiers() ?: emptySet() + } + override val origin: Origin by lazy { + mapAAOrigin(ktTypeParameterSymbol.origin) + } + + override val location: Location by lazy { + ktTypeParameterSymbol.psi?.toLocation() ?: NonExistLocation + } + override val parent: KSNode? get() = TODO("Not yet implemented") override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { - TODO("Not yet implemented") + return visitor.visitTypeParameter(this, data) } override val annotations: Sequence<KSAnnotation> diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeReferenceImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeReferenceImpl.kt index cc5d2d53..b09d4046 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeReferenceImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeReferenceImpl.kt @@ -23,10 +23,12 @@ class KSTypeReferenceImpl(private val ktType: KtType) : KSTypeReference { override val annotations: Sequence<KSAnnotation> by lazy { ktType.annotations.map { KSAnnotationImpl(it) }.asSequence() } + override val origin: Origin = Origin.KOTLIN override val location: Location get() = TODO("Not yet implemented") + override val parent: KSNode? get() = TODO("Not yet implemented") diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt index b1d68751..51e0c291 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt @@ -1,12 +1,6 @@ package com.google.devtools.ksp.impl.symbol.kotlin -import com.google.devtools.ksp.symbol.KSAnnotation -import com.google.devtools.ksp.symbol.KSName -import com.google.devtools.ksp.symbol.KSNode -import com.google.devtools.ksp.symbol.KSValueArgument -import com.google.devtools.ksp.symbol.KSVisitor -import com.google.devtools.ksp.symbol.Location -import com.google.devtools.ksp.symbol.Origin +import com.google.devtools.ksp.symbol.* import org.jetbrains.kotlin.analysis.api.annotations.KtNamedAnnotationValue class KSValueArgumentImpl(private val namedAnnotationValue: KtNamedAnnotationValue) : KSValueArgument { @@ -20,8 +14,9 @@ class KSValueArgumentImpl(private val namedAnnotationValue: KtNamedAnnotationVal override val origin: Origin = Origin.KOTLIN - override val location: Location - get() = TODO("Not yet implemented") + override val location: Location by lazy { + namedAnnotationValue.expression.sourcePsi?.toLocation() ?: NonExistLocation + } override val parent: KSNode? get() = TODO("Not yet implemented") diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueParameterImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueParameterImpl.kt index 1638cdee..3a8fbe76 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueParameterImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueParameterImpl.kt @@ -1,19 +1,14 @@ package com.google.devtools.ksp.impl.symbol.kotlin -import com.google.devtools.ksp.symbol.KSAnnotation -import com.google.devtools.ksp.symbol.KSName -import com.google.devtools.ksp.symbol.KSNode -import com.google.devtools.ksp.symbol.KSTypeReference -import com.google.devtools.ksp.symbol.KSValueParameter -import com.google.devtools.ksp.symbol.KSVisitor -import com.google.devtools.ksp.symbol.Location -import com.google.devtools.ksp.symbol.Origin +import com.google.devtools.ksp.symbol.* import org.jetbrains.kotlin.analysis.api.annotations.annotations import org.jetbrains.kotlin.analysis.api.symbols.KtValueParameterSymbol class KSValueParameterImpl(private val ktValueParameterSymbol: KtValueParameterSymbol) : KSValueParameter { - override val name: KSName? - get() = TODO("Not yet implemented") + override val name: KSName? by lazy { + KSNameImpl(ktValueParameterSymbol.name.asString()) + } + override val type: KSTypeReference by lazy { KSTypeReferenceImpl(ktValueParameterSymbol.returnType) } @@ -35,10 +30,13 @@ class KSValueParameterImpl(private val ktValueParameterSymbol: KtValueParameterS override val annotations: Sequence<KSAnnotation> by lazy { ktValueParameterSymbol.annotations.asSequence().map { KSAnnotationImpl(it) } } - override val origin: Origin - get() = TODO("Not yet implemented") - override val location: Location - get() = TODO("Not yet implemented") + override val origin: Origin by lazy { + mapAAOrigin(ktValueParameterSymbol.origin) + } + + override val location: Location by lazy { + ktValueParameterSymbol.psi?.toLocation() ?: NonExistLocation + } override val parent: KSNode? get() = TODO("Not yet implemented") diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt new file mode 100644 index 00000000..5c9d3fea --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt @@ -0,0 +1,39 @@ +package com.google.devtools.ksp.impl.symbol.kotlin + +import com.google.devtools.ksp.getDocString +import com.google.devtools.ksp.impl.KSPCoreEnvironment +import com.google.devtools.ksp.symbol.* +import com.intellij.psi.PsiElement +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtSymbolOrigin +import org.jetbrains.kotlin.psi.KtElement + +internal val ktSymbolOriginToOrigin = mapOf( + KtSymbolOrigin.JAVA to Origin.JAVA, + KtSymbolOrigin.SOURCE to Origin.KOTLIN, + KtSymbolOrigin.SAM_CONSTRUCTOR to Origin.SYNTHETIC, + KtSymbolOrigin.SOURCE_MEMBER_GENERATED to Origin.SYNTHETIC, + KtSymbolOrigin.DELEGATED to Origin.SYNTHETIC, + KtSymbolOrigin.PROPERTY_BACKING_FIELD to Origin.KOTLIN, + KtSymbolOrigin.JAVA_SYNTHETIC_PROPERTY to Origin.SYNTHETIC, + KtSymbolOrigin.INTERSECTION_OVERRIDE to Origin.KOTLIN +) + +internal fun mapAAOrigin(ktSymbolOrigin: KtSymbolOrigin): Origin { + return ktSymbolOriginToOrigin[ktSymbolOrigin] ?: throw IllegalStateException("unhandled origin ${ktSymbolOrigin.name}") +} + +internal fun PsiElement.toLocation(): Location { + val file = this.containingFile + val document = KSPCoreEnvironment.instance.psiDocumentManager.getDocument(file) ?: return NonExistLocation + return FileLocation(file.virtualFile.path, document.getLineNumber(this.textOffset) + 1) +} + +internal fun KtSymbol.toContainingFile(): KSFile? { + return when (val psi = this.psi) { + is KtElement -> KSFileImpl(psi.containingKtFile) + else -> null + } +} + +internal fun KtSymbol.toDocString(): String? = this.psi?.getDocString() |