From 10657b63f9107f19fbd55bbf1770a6533941645b Mon Sep 17 00:00:00 2001 From: Ting-Yuan Huang Date: Thu, 3 Oct 2024 11:02:58 -0700 Subject: [PATCH] Filter default arguments by name, not by index KSAnnotation.defaultArguments doesn't have arguments without defaults. Therefore it can be shorter than KSAnnotation.arguments. Their indexes may not match. --- .../devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt | 8 +++++--- .../symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt | 7 +++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt index ea954608f2..7ab721e0a1 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/java/KSAnnotationJavaImpl.kt @@ -90,9 +90,11 @@ class KSAnnotationJavaImpl private constructor(private val psi: PsiAnnotation, o ) } val presentValueArgumentNames = presentArgs.map { it.name?.asString() ?: "" } - presentArgs + defaultArguments.filterIndexed { idx, ksValueArgument -> - ksValueArgument.name?.asString() !in presentValueArgumentNames && - annotationConstructor?.valueParameters?.get(idx)?.hasDefaultValue == true + presentArgs + defaultArguments.filter { ksValueArgument -> + val name = ksValueArgument.name?.asString() ?: return@filter false + if (name in presentValueArgumentNames) + return@filter false + annotationConstructor?.valueParameters?.any { it.name.asString() == name && it.hasDefaultValue } == true } } } diff --git a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt index 37db532c21..d540b23c62 100644 --- a/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt +++ b/kotlin-analysis-api/src/main/kotlin/com/google/devtools/ksp/impl/symbol/kotlin/resolved/KSAnnotationResolvedImpl.kt @@ -60,8 +60,11 @@ class KSAnnotationResolvedImpl private constructor( val annotationClass = annotationApplication.classId?.toKtClassSymbol() val annotationConstructor = annotationClass?.memberScope?.constructors?.singleOrNull() val params = annotationConstructor?.valueParameters - defaultArguments.filterIndexed { idx, arg -> - arg.name?.asString() !in presentNames && params?.get(idx)?.hasDefaultValue == true + defaultArguments.filter { arg -> + val name = arg.name?.asString() ?: return@filter false + if (name in presentNames) + return@filter false + params?.any { it.name.asString() == name && it.hasDefaultValue } == true } } presentArgs + absentArgs