diff --git a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/java/KSPropertyDeclarationJavaImpl.kt b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/java/KSPropertyDeclarationJavaImpl.kt index 80b8acf4bd..4748e369b9 100644 --- a/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/java/KSPropertyDeclarationJavaImpl.kt +++ b/compiler-plugin/src/main/kotlin/com/google/devtools/ksp/symbol/impl/java/KSPropertyDeclarationJavaImpl.kt @@ -42,7 +42,8 @@ class KSPropertyDeclarationJavaImpl private constructor(val psi: PsiField) : psi.toLocation() } - override val isMutable: Boolean = true + override val isMutable: Boolean + get() = !modifiers.contains(Modifier.FINAL) override val hasBackingField: Boolean get() = true diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/AbstractKSDeclarationImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/AbstractKSDeclarationImpl.kt index 9fcff38379..0617203134 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/AbstractKSDeclarationImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/AbstractKSDeclarationImpl.kt @@ -26,6 +26,7 @@ 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.toKSModifiers +import com.intellij.psi.PsiModifierListOwner import org.jetbrains.kotlin.analysis.api.symbols.KtDeclarationSymbol import org.jetbrains.kotlin.analysis.api.symbols.KtNamedClassOrObjectSymbol import org.jetbrains.kotlin.analysis.api.symbols.markers.KtNamedSymbol @@ -47,7 +48,11 @@ abstract class AbstractKSDeclarationImpl(val ktDeclarationSymbol: KtDeclarationS } override val modifiers: Set by lazy { - (ktDeclarationSymbol.psi as? KtModifierListOwner)?.toKSModifiers() ?: emptySet() + when (val psi = ktDeclarationSymbol.psi) { + is KtModifierListOwner -> psi.toKSModifiers() + is PsiModifierListOwner -> psi.toKSModifiers() + else -> emptySet() + } } override val containingFile: KSFile? by lazy { diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationJavaImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationJavaImpl.kt index 316d6c58f8..cb79decf3b 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationJavaImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/KSPropertyDeclarationJavaImpl.kt @@ -1,16 +1,7 @@ package com.google.devtools.ksp.impl.symbol.kotlin import com.google.devtools.ksp.KSObjectCache -import com.google.devtools.ksp.symbol.KSExpectActual -import com.google.devtools.ksp.symbol.KSName -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.Origin +import com.google.devtools.ksp.symbol.* import org.jetbrains.kotlin.analysis.api.symbols.KtJavaFieldSymbol class KSPropertyDeclarationJavaImpl private constructor(private val ktJavaFieldSymbol: KtJavaFieldSymbol) : @@ -35,7 +26,7 @@ class KSPropertyDeclarationJavaImpl private constructor(private val ktJavaFieldS } override val isMutable: Boolean - get() = true + get() = !modifiers.contains(Modifier.FINAL) override val hasBackingField: Boolean get() = true diff --git a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/DefaultFunctionProcessor.kt b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/DefaultFunctionProcessor.kt index aa30d2802f..7f3a6a9713 100644 --- a/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/DefaultFunctionProcessor.kt +++ b/test-utils/src/main/kotlin/com/google/devtools/ksp/processor/DefaultFunctionProcessor.kt @@ -17,6 +17,7 @@ package com.google.devtools.ksp.processor +import com.google.devtools.ksp.getClassDeclarationByName import com.google.devtools.ksp.getDeclaredFunctions import com.google.devtools.ksp.isAbstract import com.google.devtools.ksp.processing.Resolver @@ -97,6 +98,8 @@ class DefaultFunctionProcessor : AbstractTestProcessor() { ) val aProperty = abstractClass.declarations.single { it.simpleName.asString() == "a" } as KSPropertyDeclaration result.add("${aProperty.simpleName.asString()}: ${aProperty.isAbstract()}") + val D = resolver.getClassDeclarationByName("D")!! + D.getAllProperties().forEach { result.add("${it.simpleName.asString()}: isMutable: ${it.isMutable}") } return emptyList() } diff --git a/test-utils/testData/api/interfaceWithDefault.kt b/test-utils/testData/api/interfaceWithDefault.kt index f20d919c09..75a005f1a6 100644 --- a/test-utils/testData/api/interfaceWithDefault.kt +++ b/test-utils/testData/api/interfaceWithDefault.kt @@ -33,6 +33,8 @@ // abstractVar: isAbstract: true: isMutable: true // abstractProperty: isAbstract: true: isMutable: false // a: false +// normalField: isMutable: true +// finalField: isMutable: false // END // FILE: a.kt interface KTInterface: Sequence { @@ -66,3 +68,11 @@ interface C { int bar() } + +// FILE: D.java + +class D { + int normalField; + + final int finalField; +}