Skip to content

Commit

Permalink
move overrides() to Resolver
Browse files Browse the repository at this point in the history
  • Loading branch information
neetopia committed Oct 9, 2020
1 parent 172f7cc commit a7085af
Show file tree
Hide file tree
Showing 13 changed files with 50 additions and 112 deletions.
Expand Up @@ -75,4 +75,12 @@ interface Resolver {
* map a declaration to jvm signature.
*/
fun mapToJvmSignature(declaration: KSDeclaration): String

/**
* @param overrider the candidate overriding declaration being checked.
* @param overridee the candidate overridden declaration being checked.
* @return boolean value indicating whether [overrider] overrides [overridee]
* Calling [overrides] is expensive and should be avoided if possible.
*/
fun overrides(overrider: KSDeclaration, overridee: KSDeclaration): Boolean
}
Expand Up @@ -51,14 +51,6 @@ interface KSFunctionDeclaration : KSDeclaration, KSDeclarationContainer {
*/
val parameters: List<KSValueParameter>

/**
* Checks if this function overrides another function.
* @param overridee the candidate overridden function being checked.
* @return boolean value indicating whether this function overrides [overridee]
* Calling [overrides] is expensive and should be avoided if possible.
*/
fun overrides(overridee: KSFunctionDeclaration): Boolean

/**
* Find the original overridee of this function, if overriding.
* @return [KSFunctionDeclaration] for the original function, if overriding, otherwise null.
Expand Down
Expand Up @@ -57,14 +57,6 @@ interface KSPropertyDeclaration : KSDeclaration {
*/
fun isDelegated(): Boolean

/**
* Checks if this property overrides another property.
* @param overridee the candidate overridden property being checked.
* @return boolean value indicating whether this function overrides [overridee]
* Calling [overrides] is expensive and should be avoided if possible.
*/
fun overrides(overridee: KSPropertyDeclaration): Boolean

/**
* Find the original overridee of this property, if overriding.
* @return [KSPropertyDeclaration] for the original property, if overriding, otherwise null.
Expand Down
Expand Up @@ -18,6 +18,8 @@

package com.google.devtools.ksp.processing.impl

import com.google.devtools.ksp.isOpen
import com.google.devtools.ksp.isVisibleFrom
import com.intellij.openapi.project.Project
import com.intellij.psi.*
import com.intellij.psi.impl.source.PsiClassReferenceType
Expand Down Expand Up @@ -230,6 +232,38 @@ class ResolverImpl(
}
}

override fun overrides(overrider: KSDeclaration, overridee: KSDeclaration): Boolean {
if (!overridee.isOpen())
return false
if (!overridee.isVisibleFrom(overrider))
return false

if (!((overridee is KSFunctionDeclaration && overrider is KSFunctionDeclaration) || (overridee is KSPropertyDeclaration && overrider is KSPropertyDeclaration)))
return false

return when (overridee) {
is KSFunctionDeclaration -> {
val superDescriptor = resolveFunctionDeclaration(overridee) ?: return false
val subDescriptor = resolveFunctionDeclaration(overrider as KSFunctionDeclaration) ?: return false
OverridingUtil.DEFAULT.isOverridableBy(
superDescriptor, subDescriptor, null
).result == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE
}
is KSPropertyDeclaration -> {
if (overrider.origin == Origin.JAVA || overridee.origin == Origin.JAVA) {
false
} else {
val superDescriptor = resolvePropertyDeclaration(overridee) ?: return false
val subDescriptor = resolvePropertyDeclaration(overrider as KSPropertyDeclaration) ?: return false
OverridingUtil.DEFAULT.isOverridableBy(
superDescriptor, subDescriptor, null
).result == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE
}
}
else -> false
}
}

fun evaluateConstant(expression: KtExpression?, expectedType: KotlinType): ConstantValue<*>? {
return expression?.let { constantExpressionEvaluator.evaluateToConstantValue(it, bindingTrace, expectedType) }
}
Expand Down
Expand Up @@ -45,13 +45,13 @@ class CheckOverrideProcessor : AbstractTestProcessor() {
val baz2PropKt = resolver.getSymbolsWithAnnotation("Baz2Anno").single() as KSPropertyDeclaration
val bazzPropKt = resolver.getSymbolsWithAnnotation("BazzAnno").single() as KSPropertyDeclaration
val bazz2PropKt = resolver.getSymbolsWithAnnotation("Bazz2Anno").single() as KSPropertyDeclaration
results.add("${getFunKt.qualifiedName?.asString()} overrides ${getFunJava.qualifiedName?.asString()}: ${getFunKt.overrides(getFunJava)}")
results.add("${fooFunKt.qualifiedName?.asString()} overrides ${fooFunJava.qualifiedName?.asString()}: ${fooFunKt.overrides(fooFunJava)}")
results.add("${foooFunKt.qualifiedName?.asString()} overrides ${fooFunJava.qualifiedName?.asString()}: ${foooFunKt.overrides(fooFunJava)}")
results.add("${equalFunKt.qualifiedName?.asString()} overrides ${equalFunJava.qualifiedName?.asString()}: ${equalFunKt.overrides(equalFunJava)}")
results.add("${bazPropKt.qualifiedName?.asString()} overrides ${baz2PropKt.qualifiedName?.asString()}: ${bazPropKt.overrides(baz2PropKt)}")
results.add("${bazPropKt.qualifiedName?.asString()} overrides ${bazz2PropKt.qualifiedName?.asString()}: ${bazPropKt.overrides(bazz2PropKt)}")
results.add("${bazzPropKt.qualifiedName?.asString()} overrides ${bazz2PropKt.qualifiedName?.asString()}: ${bazzPropKt.overrides(bazz2PropKt)}")
results.add("${bazzPropKt.qualifiedName?.asString()} overrides ${baz2PropKt.qualifiedName?.asString()}: ${bazzPropKt.overrides(baz2PropKt)}")
results.add("${getFunKt.qualifiedName?.asString()} overrides ${getFunJava.qualifiedName?.asString()}: ${resolver.overrides(getFunKt,getFunJava)}")
results.add("${fooFunKt.qualifiedName?.asString()} overrides ${fooFunJava.qualifiedName?.asString()}: ${resolver.overrides(fooFunKt,fooFunJava)}")
results.add("${foooFunKt.qualifiedName?.asString()} overrides ${fooFunJava.qualifiedName?.asString()}: ${resolver.overrides(foooFunKt,fooFunJava)}")
results.add("${equalFunKt.qualifiedName?.asString()} overrides ${equalFunJava.qualifiedName?.asString()}: ${resolver.overrides(equalFunKt,equalFunJava)}")
results.add("${bazPropKt.qualifiedName?.asString()} overrides ${baz2PropKt.qualifiedName?.asString()}: ${resolver.overrides(bazPropKt,baz2PropKt)}")
results.add("${bazPropKt.qualifiedName?.asString()} overrides ${bazz2PropKt.qualifiedName?.asString()}: ${resolver.overrides(bazPropKt,bazz2PropKt)}")
results.add("${bazzPropKt.qualifiedName?.asString()} overrides ${bazz2PropKt.qualifiedName?.asString()}: ${resolver.overrides(bazzPropKt,bazz2PropKt)}")
results.add("${bazzPropKt.qualifiedName?.asString()} overrides ${baz2PropKt.qualifiedName?.asString()}: ${resolver.overrides(bazzPropKt,baz2PropKt)}")
}
}
Expand Up @@ -43,17 +43,6 @@ class KSFunctionDeclarationDescriptorImpl private constructor(val descriptor: Fu
?.toKSFunctionDeclaration()
}

override fun overrides(overridee: KSFunctionDeclaration): Boolean {
if (!overridee.isOpen())
return false
if (!overridee.isVisibleFrom(this))
return false
val superDescriptor = ResolverImpl.instance.resolveFunctionDeclaration(overridee) ?: return false
return OverridingUtil.DEFAULT.isOverridableBy(
superDescriptor, descriptor, null
).result == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE
}

override val typeParameters: List<KSTypeParameter> by lazy {
descriptor.typeParameters.map { KSTypeParameterDescriptorImpl.getCached(it) }
}
Expand Down
Expand Up @@ -82,19 +82,6 @@ class KSPropertyDeclarationDescriptorImpl private constructor(val descriptor: Pr
KSTypeReferenceDescriptorImpl.getCached(descriptor.type)
}

override fun overrides(overridee: KSPropertyDeclaration): Boolean {
if (!overridee.isOpen())
return false
if (!overridee.isVisibleFrom(this))
return false
if (overridee.origin == Origin.JAVA)
return false
val superDescriptor = ResolverImpl.instance.resolvePropertyDeclaration(overridee) ?: return false
return OverridingUtil.DEFAULT.isOverridableBy(
superDescriptor, descriptor, null
).result == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE
}

override fun findOverridee(): KSPropertyDeclaration? {
return ResolverImpl.instance.resolvePropertyDeclaration(this)?.original?.overriddenDescriptors?.single { it.overriddenDescriptors.isEmpty() }
?.toKSPropertyDeclaration()
Expand Down
Expand Up @@ -56,18 +56,6 @@ class KSFunctionDeclarationJavaImpl private constructor(val psi: PsiMethod) : KS
?.toKSFunctionDeclaration()
}

override fun overrides(overridee: KSFunctionDeclaration): Boolean {
if (!overridee.isOpen())
return false
if (!overridee.isVisibleFrom(this))
return false
val superDescriptor = ResolverImpl.instance.resolveFunctionDeclaration(overridee) ?: return false
val subDescriptor = ResolverImpl.instance.resolveJavaDeclaration(psi) as? FunctionDescriptor ?: return false
return OverridingUtil.DEFAULT.isOverridableBy(
superDescriptor, subDescriptor, null
).result == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE
}

override val declarations: List<KSDeclaration> = emptyList()

override val extensionReceiver: KSTypeReference? = null
Expand Down
Expand Up @@ -75,10 +75,6 @@ class KSPropertyDeclarationJavaImpl private constructor(val psi: PsiField) : KSP
KSTypeReferenceJavaImpl.getCached(psi.type)
}

override fun overrides(overridee: KSPropertyDeclaration): Boolean {
return false
}

override fun findOverridee(): KSPropertyDeclaration? {
return null
}
Expand Down
Expand Up @@ -41,20 +41,6 @@ class KSFunctionDeclarationImpl private constructor(val ktFunction: KtFunction)
?.toKSFunctionDeclaration()
}

override fun overrides(overridee: KSFunctionDeclaration): Boolean {
if (!this.modifiers.contains(Modifier.OVERRIDE))
return false
if (!overridee.isOpen())
return false
if (!overridee.isVisibleFrom(this))
return false
val superDescriptor = ResolverImpl.instance.resolveFunctionDeclaration(overridee) ?: return false
val subDescriptor = ResolverImpl.instance.resolveDeclaration(ktFunction) as FunctionDescriptor
return OverridingUtil.DEFAULT.isOverridableBy(
superDescriptor, subDescriptor, null
).result == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE
}

override val declarations: List<KSDeclaration> by lazy {
if (!ktFunction.hasBlockBody()) {
emptyList()
Expand Down
Expand Up @@ -103,22 +103,6 @@ class KSPropertyDeclarationImpl private constructor(val ktProperty: KtProperty)

override fun isDelegated(): Boolean = ktProperty.hasDelegate()

override fun overrides(overridee: KSPropertyDeclaration): Boolean {
if (!this.modifiers.contains(Modifier.OVERRIDE))
return false
if (!overridee.isOpen())
return false
if (!overridee.isVisibleFrom(this))
return false
if (overridee.origin == Origin.JAVA)
return false
val superDescriptor = ResolverImpl.instance.resolvePropertyDeclaration(overridee) ?: return false
val subDescriptor = ResolverImpl.instance.resolveDeclaration(ktProperty) as PropertyDescriptor
return OverridingUtil.DEFAULT.isOverridableBy(
superDescriptor, subDescriptor, null
).result == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE
}

override fun findOverridee(): KSPropertyDeclaration? {
return ResolverImpl.instance.resolvePropertyDeclaration(this)?.original?.overriddenDescriptors?.single { it.overriddenDescriptors.isEmpty() }
?.toKSPropertyDeclaration()
Expand Down
Expand Up @@ -82,22 +82,6 @@ class KSPropertyDeclarationParameterImpl private constructor(val ktParameter: Kt
?.toKSPropertyDeclaration()
}

override fun overrides(overridee: KSPropertyDeclaration): Boolean {
if (!this.modifiers.contains(Modifier.OVERRIDE))
return false
if (!overridee.isOpen())
return false
if (!overridee.isVisibleFrom(this))
return false
if (overridee.origin == Origin.JAVA)
return false
val superDescriptor = ResolverImpl.instance.resolvePropertyDeclaration(overridee) ?: return false
val subDescriptor = ResolverImpl.instance.resolveDeclaration(ktParameter) as PropertyDescriptor
return OverridingUtil.DEFAULT.isOverridableBy(
superDescriptor, subDescriptor, null
).result == OverridingUtil.OverrideCompatibilityInfo.Result.OVERRIDABLE
}

override fun <D, R> accept(visitor: KSVisitor<D, R>, data: D): R {
return visitor.visitPropertyDeclaration(this, data)
}
Expand Down
Expand Up @@ -72,8 +72,6 @@ class KSConstructorSyntheticImpl(val ksClassDeclaration: KSClassDeclaration) : K

override val origin: Origin = Origin.SYNTHETIC

override fun overrides(overridee: KSFunctionDeclaration): Boolean = false

override fun findOverridee(): KSFunctionDeclaration? = null

override fun findActuals(): List<KSDeclaration> {
Expand Down

0 comments on commit a7085af

Please sign in to comment.