[Lombok] Constructor can have only non-final or not initialized fields

When using the AllArgsConstructor annotation (directly or via
meta-annotation), only fields that are not final or not initialized
should be added as arguments. Previously, all fields were being included
regardless of modality or initialization, which is not consistent with
the behavior of Lombok.

^KT-54054 Fixed
This commit is contained in:
Brian Norman
2024-01-11 13:30:00 -06:00
committed by Space Team
parent cf4c55e02d
commit 2ab1e712f8
4 changed files with 36 additions and 5 deletions
@@ -5,11 +5,13 @@
package org.jetbrains.kotlin.lombok.k2.generators
import com.intellij.psi.PsiField
import org.jetbrains.kotlin.fir.FirSession
import org.jetbrains.kotlin.fir.java.declarations.FirJavaField
import org.jetbrains.kotlin.fir.symbols.SymbolInternals
import org.jetbrains.kotlin.fir.symbols.impl.FirClassSymbol
import org.jetbrains.kotlin.lombok.k2.config.ConeLombokAnnotations.AllArgsConstructor
import org.jetbrains.kotlin.psi
class AllArgsConstructorGeneratorPart(session: FirSession) : AbstractConstructorGeneratorPart<AllArgsConstructor>(session) {
override fun getConstructorInfo(classSymbol: FirClassSymbol<*>): AllArgsConstructor? {
@@ -19,6 +21,14 @@ class AllArgsConstructorGeneratorPart(session: FirSession) : AbstractConstructor
@OptIn(SymbolInternals::class)
override fun getFieldsForParameters(classSymbol: FirClassSymbol<*>): List<FirJavaField> {
return classSymbol.fir.declarations.filterIsInstance<FirJavaField>()
return classSymbol.fir.declarations
.filterIsInstance<FirJavaField>()
.filter { it.isFieldAllowed() }
}
private fun FirJavaField.isFieldAllowed(): Boolean {
// TODO: consider adding `hasInitializer` property directly to java model
val hasInitializer = (source?.psi as? PsiField)?.hasInitializer() ?: false
return isVar || !hasInitializer
}
}