You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/10/20 00:46:31 UTC
(grails-core) 01/04: refactor(databinding-core): idiomatic-Groovy pass on the converted sources
This is an automated email from the ASF dual-hosted git repository.
borinquenkid pushed a commit to branch groovyism/grails-databinding-core
in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 3e44a5e97468ce58b455ddf39bccabd01e0ff9d3
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Fri Oct 16 15:39:13 2026 -0500
refactor(databinding-core): idiomatic-Groovy pass on the converted sources
Applies the groovyisms cleanup to the 23 files converted from Java in
grails-databinding-core. Most of the set (annotations, interfaces,
DataBindingListenerAdapter, FrameworkPropertyNames, the four Spock
specs) was already idiomatic Groovy out of the conversion; only two
classes had real Java-shaped leftovers:
- SimpleBindingError: private final fields + trivial getX() getters
collapsed into Groovy final properties (same generated getter
signatures, verified with javap -p). No subclasses, no reflective
callers of the explicit getter methods.
- BindingFormatASTTransformation: getMembers()/getName()/
getDeclaringClass().getName()/getLineNumber()/getColumnNumber()/
getErrorCollector() calls on AST nodes converted to property syntax
(precedented elsewhere in this repo's AST transforms, e.g.
grails-cache's annotationNode.members, field.declaringClass.name in
ReflectionUtils); members.containsKey('code'/'value') converted to
the 'x in map' idiom; the field/class-name string concatenation
moved to a GString since it lands in a String-typed local. Left the
deliberately literal, non-interpolated '$node.class / $parent.class'
RuntimeException message untouched - it matches the original Java
source's literal text and isn't an idiom issue. Kept the explicit
(T) casts on astNodes[0]/astNodes[1] and the instanceof checks as-is
per the AST-transform caution: no comparison/equality idiom touched.
No behaviour or public API change. No test changes needed; the
existing specs already assert through property syntax and already
cover every path touched.
Verification (grails-databinding-core): compileGroovy +
compileTestGroovy clean; test 108/0 (1 skipped, pre-existing);
codenarcMain 0 violations (codenarcTest/checkstyleMain are
no-source/skipped for this module, unrelated to this change); javap
dynamic-dispatch audit on both changed classes clean (only the
harmless ScriptBytecodeAdapter.isIn/initMetaClass bytecode; every
converted getter/property resolved to a direct invokevirtual).
Co-Authored-By: Claude Sonnet 5 <no...@anthropic.com>
---
.../compiler/BindingFormatASTTransformation.groovy | 16 +++++++--------
.../databinding/errors/SimpleBindingError.groovy | 24 ++++------------------
2 files changed, 11 insertions(+), 29 deletions(-)
diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/compiler/BindingFormatASTTransformation.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/compiler/BindingFormatASTTransformation.groovy
index f817cbd58a..bc2502425f 100644
--- a/grails-databinding-core/src/main/groovy/org/grails/databinding/compiler/BindingFormatASTTransformation.groovy
+++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/compiler/BindingFormatASTTransformation.groovy
@@ -46,22 +46,20 @@ class BindingFormatASTTransformation implements ASTTransformation, TransformWith
final AnnotationNode annotationNode = (AnnotationNode) astNodes[0]
final FieldNode fieldNode = (FieldNode) astNodes[1]
- final Map<String, Expression> members = annotationNode.getMembers()
- if (members == null || (!members.containsKey('code') && !members.containsKey('value'))) {
- final String message = 'The @BindingFormat annotation on the field [' +
- fieldNode.getName() +
- '] in class [' +
- fieldNode.getDeclaringClass().getName() +
- '] must provide a value for either the value() or code() attribute.'
+ final Map<String, Expression> members = annotationNode.members
+ if (members == null || (!('code' in members) && !('value' in members))) {
+ final String message = "The @BindingFormat annotation on the field [${fieldNode.name}] " +
+ "in class [${fieldNode.declaringClass.name}] must provide a value for either the " +
+ 'value() or code() attribute.'
error(source, fieldNode, message)
}
}
protected void error(final SourceUnit sourceUnit, final ASTNode astNode, final String message) {
- final SyntaxException syntaxException = new SyntaxException(message, astNode.getLineNumber(), astNode.getColumnNumber())
+ final SyntaxException syntaxException = new SyntaxException(message, astNode.lineNumber, astNode.columnNumber)
final SyntaxErrorMessage syntaxErrorMessage = new SyntaxErrorMessage(syntaxException, sourceUnit)
- sourceUnit.getErrorCollector().addError(syntaxErrorMessage, false)
+ sourceUnit.errorCollector.addError(syntaxErrorMessage, false)
}
@Override
diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/errors/SimpleBindingError.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/errors/SimpleBindingError.groovy
index 8cb7ea6219..fc94d8e96a 100755
--- a/grails-databinding-core/src/main/groovy/org/grails/databinding/errors/SimpleBindingError.groovy
+++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/errors/SimpleBindingError.groovy
@@ -29,10 +29,10 @@ import grails.databinding.errors.BindingError
@CompileStatic
class SimpleBindingError implements BindingError {
- private final Object object
- private final String propertyName
- private final Object rejectedValue
- private final Throwable cause
+ final Object object
+ final String propertyName
+ final Object rejectedValue
+ final Throwable cause
SimpleBindingError(Object object, String propertyName,
Object rejectedValue, Throwable cause) {
@@ -42,20 +42,4 @@ class SimpleBindingError implements BindingError {
this.cause = cause
}
- Object getObject() {
- return object
- }
-
- String getPropertyName() {
- return propertyName
- }
-
- Object getRejectedValue() {
- return rejectedValue
- }
-
- Throwable getCause() {
- return cause
- }
-
}