diff options
author | Jiaxiang Chen <jiaxiang@google.com> | 2021-11-07 23:46:52 -0800 |
---|---|---|
committer | Jiaxiang Chen <roaringacw@gmail.com> | 2022-03-10 15:09:18 -0800 |
commit | a4a578b4965e125b215c906c829905681975fef5 (patch) | |
tree | eff77389f638beeb26cd3d660d2a6d1cdc33abfa /kotlin-analysis-api | |
parent | f56a32cc7cf6f4b1df7a88b8a2478125c2d2d885 (diff) | |
download | ksp-a4a578b4965e125b215c906c829905681975fef5.tar.gz |
* All KSSymbols skeleton.
* use same bootstrap version for compiler and analysis api.
* implemented some no resolution involved KSSymbol functions, many are still missing, e.g. modifiers conversion (this should be able to be reused from current frontend implementation).
* implemented simple resolution logic as analysis api resolution concept proofing.
* Note that analysis API unifies symbols implementation, so there is no need to have 3 implementations for java symbols, kotlin symbols, and descriptor symbols anymore, however, for certain functions, we still need to type check the wrapped element inside a KtSymbol and performance operations accordingly.
Diffstat (limited to 'kotlin-analysis-api')
16 files changed, 747 insertions, 5 deletions
diff --git a/kotlin-analysis-api/build.gradle.kts b/kotlin-analysis-api/build.gradle.kts index c2863a00..20bf18a5 100644 --- a/kotlin-analysis-api/build.gradle.kts +++ b/kotlin-analysis-api/build.gradle.kts @@ -53,7 +53,6 @@ dependencies { } implementation(project(":api")) - } tasks.register<Copy>("CopyLibsForTesting") { diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt index 5e8bfc85..72b465e1 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KotlinSymbolProcessing.kt @@ -29,6 +29,8 @@ import org.jetbrains.kotlin.analysis.api.InvalidWayOfUsingAnalysisSession import org.jetbrains.kotlin.analysis.api.KtAnalysisSessionProvider import org.jetbrains.kotlin.analysis.api.analyseWithReadAction import org.jetbrains.kotlin.analysis.api.fir.KtFirAnalysisSessionProvider +import org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.FirSealedClassInheritorsProcessorFactory import org.jetbrains.kotlin.analysis.low.level.api.fir.api.services.PackagePartProviderFactory import org.jetbrains.kotlin.analysis.project.structure.KtModuleScopeProvider @@ -177,8 +179,8 @@ fun main() { val ktFile = factory.trySetupPsiForFile(virtualFile, KotlinLanguage.INSTANCE, true, false) as KtFile registerComponents(project, env, listOf(ktFile)) analyseWithReadAction(ktFile) { - val mainRef = ktFile.mainReference - val reference = findSomeReference(ktFile) - reference?.resolveToSymbol() + val fileSymbol = ktFile.getFileSymbol() + val members = fileSymbol.getFileScope().getAllSymbols() + members.filterIsInstance<KtFunctionSymbol>() } } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ProjectStructureProviderImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ProjectStructureProviderImpl.kt index a9e072ae..fe6327c9 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ProjectStructureProviderImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/ProjectStructureProviderImpl.kt @@ -16,7 +16,7 @@ import org.jetbrains.kotlin.resolve.jvm.platform.JvmPlatformAnalyzerServices class ProjectStructureProviderImpl : ProjectStructureProvider() { override fun getKtModuleForKtElement(element: PsiElement): KtModule { - return object: KtSourceModule { + return object : KtSourceModule { override val analyzerServices: PlatformDependentAnalyzerServices get() = JvmPlatformAnalyzerServices override val contentScope: GlobalSearchScope 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 new file mode 100644 index 00000000..402dea88 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt @@ -0,0 +1,34 @@ +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 org.jetbrains.kotlin.analysis.api.symbols.markers.KtAnnotationCall + +class KSAnnotationImpl(private val annotationCall: KtAnnotationCall) : KSAnnotation { + override val annotationType: KSTypeReference + get() = TODO("Not yet implemented") + override val arguments: List<KSValueArgument> by lazy { + annotationCall.arguments.map { KSValueArgumentImpl(it) } + } + override val shortName: KSName + get() = TODO("Not yet implemented") + override val useSiteTarget: AnnotationUseSiteTarget? + get() = TODO("Not yet implemented") + override val origin: Origin = Origin.KOTLIN + + override val location: Location + get() = TODO("Not yet implemented") + override val parent: KSNode? + get() = TODO("Not yet implemented") + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitAnnotation(this, data) + } +} 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 new file mode 100644 index 00000000..4b5f23a9 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSClassDeclarationImpl.kt @@ -0,0 +1,123 @@ +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 org.jetbrains.kotlin.analysis.api.symbols.KtFunctionSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol + +class KSClassDeclarationImpl(private val ktNamedClassOrObjectSymbol: KtNamedClassOrObjectSymbol) : KSClassDeclaration { + override val classKind: ClassKind + get() = TODO("Not yet implemented") + override val primaryConstructor: KSFunctionDeclaration? by lazy { + analyzeWithSymbolAsContext(ktNamedClassOrObjectSymbol) { + ktNamedClassOrObjectSymbol.getMemberScope().getConstructors().singleOrNull { it.isPrimary }?.let { + KSFunctionDeclarationImpl(it) + } + } + } + override val superTypes: Sequence<KSTypeReference> by lazy { + analyzeWithSymbolAsContext(ktNamedClassOrObjectSymbol) { + ktNamedClassOrObjectSymbol.superTypes.map { KSTypeReferenceImpl(it) }.asSequence() + } + } + + override val isCompanionObject: Boolean + get() = TODO("Not yet implemented") + + override fun getSealedSubclasses(): Sequence<KSClassDeclaration> { + TODO("Not yet implemented") + } + + override fun getAllFunctions(): Sequence<KSFunctionDeclaration> { + TODO("Not yet implemented") + } + + override fun getAllProperties(): Sequence<KSPropertyDeclaration> { + return analyzeWithSymbolAsContext(ktNamedClassOrObjectSymbol) { + ktNamedClassOrObjectSymbol.getMemberScope().getAllSymbols().filterIsInstance<KtPropertySymbol>() + .map { KSPropertyDeclarationImpl(it) } + } + } + + override fun asType(typeArguments: List<KSTypeArgument>): KSType { + TODO("Not yet implemented") + } + + override fun asStarProjectedType(): KSType { + 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 parent: KSNode? + get() = TODO("Not yet implemented") + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitClassDeclaration(this, data) + } + + override val annotations: Sequence<KSAnnotation> by lazy { + analyzeWithSymbolAsContext(ktNamedClassOrObjectSymbol) { + ktNamedClassOrObjectSymbol.annotations.map { KSAnnotationImpl(it) }.asSequence() + } + } + override val isActual: Boolean + get() = TODO("Not yet implemented") + override val isExpect: Boolean + get() = TODO("Not yet implemented") + + override fun findActuals(): Sequence<KSDeclaration> { + TODO("Not yet implemented") + } + + override fun findExpects(): Sequence<KSDeclaration> { + TODO("Not yet implemented") + } + + override val declarations: Sequence<KSDeclaration> by lazy { + analyzeWithSymbolAsContext(ktNamedClassOrObjectSymbol) { + ktNamedClassOrObjectSymbol.getDeclaredMemberScope().getAllSymbols().map { + when (it) { + is KtNamedClassOrObjectSymbol -> KSClassDeclarationImpl(it) + is KtFunctionSymbol -> KSFunctionDeclarationImpl(it) + is KtPropertySymbol -> KSPropertyDeclarationImpl(it) + else -> throw IllegalStateException() + } + } + } + } +} 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/KSFileSymbolImpl.kt new file mode 100644 index 00000000..1f1656a6 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFileSymbolImpl.kt @@ -0,0 +1,55 @@ +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.KSVisitor +import com.google.devtools.ksp.symbol.Location +import com.google.devtools.ksp.symbol.Origin +import org.jetbrains.kotlin.analysis.api.analyseWithReadAction +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.psi.KtFile + +class KSFileSymbolImpl(private val ktFile: KtFile) : KSFile { + override val packageName: KSName by lazy { + KSNameImpl(ktFile.packageFqName.asString()) + } + override val fileName: String by lazy { + ktFile.name + } + override val filePath: String by lazy { + ktFile.virtualFilePath + } + override val declarations: Sequence<KSDeclaration> by lazy { + analyseWithReadAction(ktFile) { + ktFile.getFileSymbol().getFileScope().getAllSymbols().map { + when (it) { + is KtNamedClassOrObjectSymbol -> KSClassDeclarationImpl(it) + is KtFunctionSymbol -> KSFunctionDeclarationImpl(it) + is KtPropertySymbol -> KSPropertyDeclarationImpl(it) + else -> throw IllegalStateException("Unhandled ") + } + } + } + } + override val origin: Origin = Origin.KOTLIN + + override val location: Location + get() = TODO("Not yet implemented") + + override val parent: KSNode? = null + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitFile(this, data) + } + + override val annotations: Sequence<KSAnnotation> by lazy { + analyseWithReadAction(ktFile) { + ktFile.getFileSymbol().annotations.map { KSAnnotationImpl(it) }.asSequence() + } + } +} 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 new file mode 100644 index 00000000..9d8a3d37 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionDeclarationImpl.kt @@ -0,0 +1,123 @@ +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 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.markers.KtAnnotatedSymbol +import org.jetbrains.kotlin.descriptors.Modality +import org.jetbrains.kotlin.psi.KtFile + +class KSFunctionDeclarationImpl(private val ktFunctionSymbol: KtFunctionLikeSymbol) : KSFunctionDeclaration { + override val functionKind: FunctionKind + get() = TODO("Not yet implemented") + override val isAbstract: Boolean by lazy { + (ktFunctionSymbol as? KtFunctionSymbol)?.modality == Modality.ABSTRACT + } + override val extensionReceiver: KSTypeReference? by lazy { + analyzeWithSymbolAsContext(ktFunctionSymbol) { + if (!ktFunctionSymbol.isExtension) { + null + } else { + ktFunctionSymbol.receiverType?.let { KSTypeReferenceImpl(it) } + } + } + } + override val returnType: KSTypeReference? by lazy { + analyzeWithSymbolAsContext(ktFunctionSymbol) { + KSTypeReferenceImpl(ktFunctionSymbol.annotatedType) + } + } + override val parameters: List<KSValueParameter> by lazy { + ktFunctionSymbol.valueParameters.map { KSValueParameterImpl(it) } + } + + override fun findOverridee(): KSDeclaration? { + TODO("Not yet implemented") + } + + override fun asMemberOf(containing: KSType): KSFunction { + TODO("Not yet implemented") + } + + override val simpleName: KSName by lazy { + if (ktFunctionSymbol is KtFunctionSymbol) { + KSNameImpl(ktFunctionSymbol.name.asString()) + } else { + KSNameImpl("<init>") + } + } + override val qualifiedName: KSName? + get() = TODO("Not yet implemented") + override val typeParameters: List<KSTypeParameter> by lazy { + (ktFunctionSymbol as? KtFunctionSymbol)?.typeParameters?.map { KSTypeParameterImpl(it) } ?: emptyList() + } + override val packageName: KSName by lazy { + containingFile?.packageName ?: KSNameImpl("") + } + override val parentDeclaration: KSDeclaration? + get() = TODO("Not yet implemented") + override val containingFile: KSFile? by lazy { + (ktFunctionSymbol.psi?.containingFile as? KtFile)?.let { KSFileSymbolImpl(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 parent: KSNode? + get() = TODO("Not yet implemented") + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitFunctionDeclaration(this, data) + } + + override val annotations: Sequence<KSAnnotation> by lazy { + (ktFunctionSymbol as KtAnnotatedSymbol).annotations.asSequence().map { KSAnnotationImpl(it) } + } + override val isActual: Boolean + get() = TODO("Not yet implemented") + override val isExpect: Boolean + get() = TODO("Not yet implemented") + + override fun findActuals(): Sequence<KSDeclaration> { + TODO("Not yet implemented") + } + + override fun findExpects(): Sequence<KSDeclaration> { + TODO("Not yet implemented") + } + + override val declarations: Sequence<KSDeclaration> + get() = TODO("Not yet implemented") +} + +@OptIn(InvalidWayOfUsingAnalysisSession::class) +internal inline fun <R> analyzeWithSymbolAsContext( + contextSymbol: KtSymbol, + action: KtAnalysisSession.() -> R +): R { + return KtAnalysisSessionProvider + .getInstance(contextSymbol.psi!!.project).analyzeWithSymbolAsContext(contextSymbol, action) +} diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSNameImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSNameImpl.kt new file mode 100644 index 00000000..53aa4ee6 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSNameImpl.kt @@ -0,0 +1,17 @@ +package com.google.devtools.ksp.impl.symbol.kotlin + +import com.google.devtools.ksp.symbol.KSName + +class KSNameImpl(val name: String) : KSName { + override fun asString(): String { + return name + } + + override fun getQualifier(): String { + return name.split(".").dropLast(1).joinToString(".") + } + + override fun getShortName(): String { + return name.split(".").last() + } +} 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 new file mode 100644 index 00000000..7adf0140 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationImpl.kt @@ -0,0 +1,97 @@ +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 org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol +import org.jetbrains.kotlin.analysis.api.symbols.KtPropertySymbol +import org.jetbrains.kotlin.psi.KtFile + +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 type: KSTypeReference by lazy { + KSTypeReferenceImpl(ktPropertySymbol.annotatedType) + } + override val isMutable: Boolean by lazy { + !ktPropertySymbol.isVal + } + override val hasBackingField: Boolean by lazy { + ktPropertySymbol.hasBackingField + } + + override fun isDelegated(): Boolean { + return ktPropertySymbol.isDelegatedProperty + } + + override fun findOverridee(): KSPropertyDeclaration? { + TODO("Not yet implemented") + } + + override fun asMemberOf(containing: KSType): KSType { + 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> by lazy { + ktPropertySymbol.type + } + 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 parent: KSNode? by lazy { + analyzeWithSymbolAsContext(ktPropertySymbol) { + ktPropertySymbol.getContainingSymbol()?.let{ KSClassDeclarationImpl(it as KtNamedClassOrObjectSymbol)} + ?: KSFileSymbolImpl(ktPropertySymbol.psi!!.containingFile as KtFile) + } + } + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + TODO("Not yet implemented") + } + + override val annotations: Sequence<KSAnnotation> + get() = TODO("Not yet implemented") + override val isActual: Boolean + get() = TODO("Not yet implemented") + override val isExpect: Boolean + get() = TODO("Not yet implemented") + + override fun findActuals(): Sequence<KSDeclaration> { + TODO("Not yet implemented") + } + + override fun findExpects(): Sequence<KSDeclaration> { + TODO("Not yet implemented") + } +} 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 new file mode 100644 index 00000000..ba67304c --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeArgumentImpl.kt @@ -0,0 +1,43 @@ +package com.google.devtools.ksp.impl.symbol.kotlin + +import com.google.devtools.ksp.symbol.KSAnnotation +import com.google.devtools.ksp.symbol.KSNode +import com.google.devtools.ksp.symbol.KSTypeArgument +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.Origin +import com.google.devtools.ksp.symbol.Variance +import org.jetbrains.kotlin.analysis.api.KtStarProjectionTypeArgument +import org.jetbrains.kotlin.analysis.api.KtTypeArgument +import org.jetbrains.kotlin.analysis.api.KtTypeArgumentWithVariance + +class KSTypeArgumentImpl(private val ktTypeArgument: KtTypeArgument) : KSTypeArgument { + override val variance: Variance by lazy { + when (ktTypeArgument) { + is KtStarProjectionTypeArgument -> Variance.STAR + is KtTypeArgumentWithVariance -> { + when (ktTypeArgument.variance) { + org.jetbrains.kotlin.types.Variance.INVARIANT -> Variance.INVARIANT + org.jetbrains.kotlin.types.Variance.IN_VARIANCE -> Variance.COVARIANT + org.jetbrains.kotlin.types.Variance.OUT_VARIANCE -> Variance.CONTRAVARIANT + else -> throw IllegalStateException("Unexpected variance") + } + } + } + } + + override val type: KSTypeReference? + get() = TODO("Not yet implemented") + override val annotations: Sequence<KSAnnotation> + get() = TODO("Not yet implemented") + override val origin: Origin = Origin.KOTLIN + override val location: Location + get() = TODO("Not yet implemented") + override val parent: KSNode? + get() = TODO("Not yet implemented") + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitTypeArgument(this, data) + } +} diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeImpl.kt new file mode 100644 index 00000000..578aa0a6 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeImpl.kt @@ -0,0 +1,62 @@ +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.KSType +import com.google.devtools.ksp.symbol.KSTypeArgument +import com.google.devtools.ksp.symbol.Nullability +import org.jetbrains.kotlin.analysis.api.types.KtType +import org.jetbrains.kotlin.analysis.api.types.KtTypeNullability + +class KSTypeImpl(private val type: KtType) : KSType { + override val declaration: KSDeclaration + get() = TODO("Not yet implemented") + override val nullability: Nullability by lazy { + if (type.nullability == KtTypeNullability.NON_NULLABLE) { + Nullability.NOT_NULL + } else { + Nullability.NULLABLE + } + } + override val arguments: List<KSTypeArgument> + get() = TODO("Not yet implemented") + override val annotations: Sequence<KSAnnotation> + get() = TODO("Not yet implemented") + + override fun isAssignableFrom(that: KSType): Boolean { + TODO("Not yet implemented") + } + + override fun isMutabilityFlexible(): Boolean { + TODO("Not yet implemented") + } + + override fun isCovarianceFlexible(): Boolean { + TODO("Not yet implemented") + } + + override fun replace(arguments: List<KSTypeArgument>): KSType { + TODO("Not yet implemented") + } + + override fun starProjection(): KSType { + TODO("Not yet implemented") + } + + override fun makeNullable(): KSType { + TODO("Not yet implemented") + } + + override fun makeNotNullable(): KSType { + TODO("Not yet implemented") + } + + override val isMarkedNullable: Boolean + get() = TODO("Not yet implemented") + override val isError: Boolean + get() = TODO("Not yet implemented") + override val isFunctionType: Boolean + get() = TODO("Not yet implemented") + override val isSuspendFunctionType: Boolean + 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 new file mode 100644 index 00000000..ce041c54 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeParameterImpl.kt @@ -0,0 +1,67 @@ +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 org.jetbrains.kotlin.analysis.api.symbols.KtTypeParameterSymbol + +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 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 parent: KSNode? + get() = TODO("Not yet implemented") + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + TODO("Not yet implemented") + } + + override val annotations: Sequence<KSAnnotation> + get() = TODO("Not yet implemented") + override val isActual: Boolean + get() = TODO("Not yet implemented") + override val isExpect: Boolean + get() = TODO("Not yet implemented") + + override fun findActuals(): Sequence<KSDeclaration> { + TODO("Not yet implemented") + } + + override fun findExpects(): Sequence<KSDeclaration> { + TODO("Not yet implemented") + } +} 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 new file mode 100644 index 00000000..a2ce52a1 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeReferenceImpl.kt @@ -0,0 +1,38 @@ +package com.google.devtools.ksp.impl.symbol.kotlin + +import com.google.devtools.ksp.symbol.KSAnnotation +import com.google.devtools.ksp.symbol.KSNode +import com.google.devtools.ksp.symbol.KSReferenceElement +import com.google.devtools.ksp.symbol.KSType +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 org.jetbrains.kotlin.analysis.api.symbols.markers.KtTypeAndAnnotations + +class KSTypeReferenceImpl(private val ktTypeAndAnnotations: KtTypeAndAnnotations) : KSTypeReference { + override val element: KSReferenceElement? + get() = TODO("Not yet implemented") + + override fun resolve(): KSType { + return KSTypeImpl(ktTypeAndAnnotations.type) + } + + override val annotations: Sequence<KSAnnotation> by lazy { + ktTypeAndAnnotations.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") + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitTypeReference(this, data) + } + + override val modifiers: Set<Modifier> + 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 new file mode 100644 index 00000000..14f3eae4 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt @@ -0,0 +1,31 @@ +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 org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedConstantValue + +class KSValueArgumentImpl(private val namedConstantValue: KtNamedConstantValue) : KSValueArgument { + override val name: KSName? by lazy { + KSNameImpl(namedConstantValue.name) + } + override val isSpread: Boolean = false + override val value: Any? = namedConstantValue.expression + + override val annotations: Sequence<KSAnnotation> = emptySequence() + + override val origin: Origin = Origin.KOTLIN + + override val location: Location + get() = TODO("Not yet implemented") + override val parent: KSNode? + get() = TODO("Not yet implemented") + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitValueArgument(this, data) + } +} 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 new file mode 100644 index 00000000..166b9936 --- /dev/null +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueParameterImpl.kt @@ -0,0 +1,47 @@ +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 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 type: KSTypeReference by lazy { + KSTypeReferenceImpl(ktValueParameterSymbol.annotatedType) + } + + override val isVararg: Boolean by lazy { + ktValueParameterSymbol.isVararg + } + override val isNoInline: Boolean + get() = TODO("Not yet implemented") + override val isCrossInline: Boolean + get() = TODO("Not yet implemented") + override val isVal: Boolean + get() = TODO("Not yet implemented") + override val isVar: Boolean + get() = TODO("Not yet implemented") + override val hasDefault: Boolean by lazy { + ktValueParameterSymbol.hasDefaultValue + } + 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 parent: KSNode? + get() = TODO("Not yet implemented") + + override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R { + return visitor.visitValueParameter(this, data) + } +} diff --git a/kotlin-analysis-api/testData/api/hello.kt b/kotlin-analysis-api/testData/api/hello.kt index 6a33984c..c237c230 100644 --- a/kotlin-analysis-api/testData/api/hello.kt +++ b/kotlin-analysis-api/testData/api/hello.kt @@ -10,3 +10,7 @@ class Foo() { return 3 } } + +val topProp = 1 + +fun topFun() = "Fun" |