aboutsummaryrefslogtreecommitdiff
path: root/kotlin-analysis-api
diff options
context:
space:
mode:
authorJiaxiang Chen <jiaxiang@google.com>2022-03-04 23:29:51 -0800
committerJiaxiang Chen <roaringacw@gmail.com>2022-03-10 15:09:18 -0800
commit4699a93e8fb32d740bc76e8c731f3c630575bcfd (patch)
tree2c8f260da77d38d2c8abec4966bb11f6dbbdb3dd /kotlin-analysis-api
parent3150c1c154507c08ff220546dd76d72121cd04e1 (diff)
downloadksp-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')
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/KSPCoreEnvironment.kt1
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSAnnotationImpl.kt35
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSClassDeclarationImpl.kt92
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFileImpl.kt (renamed from kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFileSymbolImpl.kt)7
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSFunctionDeclarationImpl.kt67
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyAccessorImpl.kt54
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationImpl.kt96
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeArgumentImpl.kt11
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeParameterImpl.kt94
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSTypeReferenceImpl.kt2
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueArgumentImpl.kt13
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSValueParameterImpl.kt26
-rw-r--r--kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/util.kt39
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()