Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

final Java fields should not be mutable. #1162

Merged
merged 1 commit into from Nov 1, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -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
Expand Down
Expand Up @@ -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
Expand All @@ -47,7 +48,11 @@ abstract class AbstractKSDeclarationImpl(val ktDeclarationSymbol: KtDeclarationS
}

override val modifiers: Set<Modifier> 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 {
Expand Down
@@ -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) :
Expand All @@ -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
Expand Down
Expand Up @@ -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
Expand Down Expand Up @@ -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()
}

Expand Down
10 changes: 10 additions & 0 deletions test-utils/testData/api/interfaceWithDefault.kt
Expand Up @@ -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<String> {
Expand Down Expand Up @@ -66,3 +68,11 @@ interface C {

int bar()
}

// FILE: D.java

class D {
int normalField;

final int finalField;
}