From ee739f7aa730fbfde2e8a7f223cdf0c0a386b913 Mon Sep 17 00:00:00 2001 From: Vincent Potucek Date: Mon, 20 Oct 2025 12:55:22 +0200 Subject: [PATCH] [prone] Add `error-prone.picnic.tech` featuring `RedundantStringConversion` --- build.gradle | 1 + gradle/error-prone.gradle | 21 +++++++++++++++++++ .../MethodInvocationProceedingJoinPoint.java | 2 +- .../beans/factory/config/YamlProcessor.java | 2 +- .../context/index/processor/TypeHelper.java | 2 +- .../mail/MailSendException.java | 2 +- .../SpringCacheAnnotationParser.java | 4 ++-- .../cache/config/CacheAdviceParser.java | 2 +- .../InstrumentationLoadTimeWeaver.java | 2 +- .../proxy/MethodInterceptorGenerator.java | 2 +- .../transform/ClassTransformerChain.java | 2 +- .../spel/ast/ConstructorReference.java | 2 +- .../simp/stomp/StompHeaderAccessor.java | 2 +- .../support/MessageHeaderAccessor.java | 4 ++-- .../OpenEntityManagerInViewInterceptor.java | 2 +- .../binding/BindMarkersFactoryResolver.java | 2 +- .../AbstractRequestExpectationManager.java | 2 +- .../http/server/ServletServerHttpRequest.java | 2 +- .../reactive/ServletServerHttpRequest.java | 2 +- .../web/util/HierarchicalUriComponents.java | 2 +- .../web/util/WhatWgUrlParser.java | 4 ++-- .../UnsupportedMediaTypeException.java | 2 +- .../function/server/RequestPredicates.java | 2 +- .../view/ContentNegotiatingViewResolver.java | 2 +- 24 files changed, 47 insertions(+), 25 deletions(-) create mode 100644 gradle/error-prone.gradle diff --git a/build.gradle b/build.gradle index 7c0749468492..76049372496c 100644 --- a/build.gradle +++ b/build.gradle @@ -17,6 +17,7 @@ ext { description = "Spring Framework" configure(allprojects) { project -> + apply from: rootProject.file('gradle/error-prone.gradle') apply plugin: "org.springframework.build.localdev" group = "org.springframework" repositories { diff --git a/gradle/error-prone.gradle b/gradle/error-prone.gradle new file mode 100644 index 000000000000..5530d845928e --- /dev/null +++ b/gradle/error-prone.gradle @@ -0,0 +1,21 @@ +import static java.lang.System.getenv + +apply plugin: 'net.ltgt.errorprone' + +dependencies { + errorprone('com.google.errorprone:error_prone_core:2.42.0') + errorprone('tech.picnic.error-prone-support:error-prone-contrib:0.25.0') +} + +tasks.withType(JavaCompile).configureEach { + options.errorprone { + disableAllChecks = true // remove once applied error-prone. # https://github.com/google/error-prone/issues/5280 + error('RedundantStringConversion') + if (!getenv().containsKey('CI') && getenv('IN_PLACE')?.toBoolean()) { + errorproneArgs.addAll( + '-XepPatchLocation:IN_PLACE', + '-XepPatchChecks:RedundantStringConversion' + ) + } + } +} diff --git a/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java b/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java index 921592d15b80..5facf6675380 100644 --- a/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java +++ b/spring-aop/src/main/java/org/springframework/aop/aspectj/MethodInvocationProceedingJoinPoint.java @@ -166,7 +166,7 @@ public String toLongString() { @Override public String toString() { - return "execution(" + getSignature().toString() + ")"; + return "execution(" + getSignature() + ")"; } diff --git a/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java b/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java index 99c0d87ef9dc..b9e468e68e82 100644 --- a/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java +++ b/spring-beans/src/main/java/org/springframework/beans/factory/config/YamlProcessor.java @@ -249,7 +249,7 @@ private Map asMap(Object object) { } else { // It has to be a map key in this case - result.put("[" + key.toString() + "]", value); + result.put("[" + key + "]", value); } }); return result; diff --git a/spring-context-indexer/src/main/java/org/springframework/context/index/processor/TypeHelper.java b/spring-context-indexer/src/main/java/org/springframework/context/index/processor/TypeHelper.java index 7fc5603b9d62..c2d2aca84978 100644 --- a/spring-context-indexer/src/main/java/org/springframework/context/index/processor/TypeHelper.java +++ b/spring-context-indexer/src/main/java/org/springframework/context/index/processor/TypeHelper.java @@ -63,7 +63,7 @@ public String getType(TypeMirror type) { if (type instanceof DeclaredType declaredType) { Element enclosingElement = declaredType.asElement().getEnclosingElement(); if (enclosingElement instanceof TypeElement) { - return getQualifiedName(enclosingElement) + "$" + declaredType.asElement().getSimpleName().toString(); + return getQualifiedName(enclosingElement) + "$" + declaredType.asElement().getSimpleName(); } else { return getQualifiedName(declaredType.asElement()); diff --git a/spring-context-support/src/main/java/org/springframework/mail/MailSendException.java b/spring-context-support/src/main/java/org/springframework/mail/MailSendException.java index 81932a847c8a..52ee6667ccc2 100644 --- a/spring-context-support/src/main/java/org/springframework/mail/MailSendException.java +++ b/spring-context-support/src/main/java/org/springframework/mail/MailSendException.java @@ -137,7 +137,7 @@ public final Exception[] getMessageExceptions() { sb.append("Failed messages: "); for (int i = 0; i < this.messageExceptions.length; i++) { Exception subEx = this.messageExceptions[i]; - sb.append(subEx.toString()); + sb.append(subEx); if (i < this.messageExceptions.length - 1) { sb.append("; "); } diff --git a/spring-context/src/main/java/org/springframework/cache/annotation/SpringCacheAnnotationParser.java b/spring-context/src/main/java/org/springframework/cache/annotation/SpringCacheAnnotationParser.java index b048c08f2048..0078c045ddf1 100644 --- a/spring-context/src/main/java/org/springframework/cache/annotation/SpringCacheAnnotationParser.java +++ b/spring-context/src/main/java/org/springframework/cache/annotation/SpringCacheAnnotationParser.java @@ -198,13 +198,13 @@ private void parseCachingAnnotation( private void validateCacheOperation(AnnotatedElement ae, CacheOperation operation) { if (StringUtils.hasText(operation.getKey()) && StringUtils.hasText(operation.getKeyGenerator())) { throw new IllegalStateException("Invalid cache annotation configuration on '" + - ae.toString() + "'. Both 'key' and 'keyGenerator' attributes have been set. " + + ae + "'. Both 'key' and 'keyGenerator' attributes have been set. " + "These attributes are mutually exclusive: either set the SpEL expression used to" + "compute the key at runtime or set the name of the KeyGenerator bean to use."); } if (StringUtils.hasText(operation.getCacheManager()) && StringUtils.hasText(operation.getCacheResolver())) { throw new IllegalStateException("Invalid cache annotation configuration on '" + - ae.toString() + "'. Both 'cacheManager' and 'cacheResolver' attributes have been set. " + + ae + "'. Both 'cacheManager' and 'cacheResolver' attributes have been set. " + "These attributes are mutually exclusive: the cache manager is used to configure a" + "default cache resolver if none is set. If a cache resolver is set, the cache manager" + "won't be used."); diff --git a/spring-context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java b/spring-context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java index 5640dd7c932b..bcb94b7edbc4 100644 --- a/spring-context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java +++ b/spring-context/src/main/java/org/springframework/cache/config/CacheAdviceParser.java @@ -222,7 +222,7 @@ T merge(Element element, ReaderContext reader if (StringUtils.hasText(builder.getKey()) && StringUtils.hasText(builder.getKeyGenerator())) { throw new IllegalStateException("Invalid cache advice configuration on '" + - element.toString() + "'. Both 'key' and 'keyGenerator' attributes have been set. " + + element + "'. Both 'key' and 'keyGenerator' attributes have been set. " + "These attributes are mutually exclusive: either set the SpEL expression used to" + "compute the key at runtime or set the name of the KeyGenerator bean to use."); } diff --git a/spring-context/src/main/java/org/springframework/instrument/classloading/InstrumentationLoadTimeWeaver.java b/spring-context/src/main/java/org/springframework/instrument/classloading/InstrumentationLoadTimeWeaver.java index 1f749bd6d65e..044c9b75159c 100644 --- a/spring-context/src/main/java/org/springframework/instrument/classloading/InstrumentationLoadTimeWeaver.java +++ b/spring-context/src/main/java/org/springframework/instrument/classloading/InstrumentationLoadTimeWeaver.java @@ -191,7 +191,7 @@ public FilteringClassFileTransformer( @Override public String toString() { - return "FilteringClassFileTransformer for: " + this.targetTransformer.toString(); + return "FilteringClassFileTransformer for: " + this.targetTransformer; } } diff --git a/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptorGenerator.java b/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptorGenerator.java index 9a8b008a0305..fee103305fcc 100644 --- a/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptorGenerator.java +++ b/spring-core/src/main/java/org/springframework/cglib/proxy/MethodInterceptorGenerator.java @@ -145,7 +145,7 @@ public void generate(ClassEmitter ce, Context context, List methods) { private static void superHelper(CodeEmitter e, MethodInfo method, Context context) { if (TypeUtils.isAbstract(method.getModifiers())) { - e.throw_exception(ABSTRACT_METHOD_ERROR, method.toString() + " is abstract" ); + e.throw_exception(ABSTRACT_METHOD_ERROR, method + " is abstract" ); } else { e.load_this(); context.emitLoadArgsAndInvoke(e, method); diff --git a/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerChain.java b/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerChain.java index 3a466c0fc958..e7acdbf35499 100644 --- a/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerChain.java +++ b/spring-core/src/main/java/org/springframework/cglib/transform/ClassTransformerChain.java @@ -53,7 +53,7 @@ public String toString() { if (i > 0) { sb.append(", "); } - sb.append(chain[i].toString()); + sb.append(chain[i]); } sb.append("}"); return sb.toString(); diff --git a/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java b/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java index 3e5cafcfe61c..76b4350646cb 100644 --- a/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java +++ b/spring-expression/src/main/java/org/springframework/expression/spel/ast/ConstructorReference.java @@ -246,7 +246,7 @@ else if (this.dimensions != null) { for (int i = 1; i < count; i++) { sj.add(getChild(i).toStringAST()); } - sb.append(sj.toString()); + sb.append(sj); } return sb.toString(); diff --git a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java index 97839a678c62..cfba217b4193 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/simp/stomp/StompHeaderAccessor.java @@ -468,7 +468,7 @@ private String appendPayload(Object payload) { } byte[] bytes = (byte[]) payload; MimeType mimeType = getContentType(); - String contentType = (mimeType != null ? " " + mimeType.toString() : ""); + String contentType = (mimeType != null ? " " + mimeType : ""); if (bytes.length == 0 || mimeType == null || !isReadableContentType()) { return contentType; } diff --git a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java index 049dd16b0c5b..c36277d50f9f 100644 --- a/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java +++ b/spring-messaging/src/main/java/org/springframework/messaging/support/MessageHeaderAccessor.java @@ -480,7 +480,7 @@ public void setErrorChannel(MessageChannel errorChannel) { * @return the message */ public String getShortLogMessage(Object payload) { - return "headers=" + this.headers.toString() + getShortPayloadLogMessage(payload); + return "headers=" + this.headers + getShortPayloadLogMessage(payload); } /** @@ -489,7 +489,7 @@ public String getShortLogMessage(Object payload) { * @return the message */ public String getDetailedLogMessage(@Nullable Object payload) { - return "headers=" + this.headers.toString() + getDetailedPayloadLogMessage(payload); + return "headers=" + this.headers + getDetailedPayloadLogMessage(payload); } protected String getShortPayloadLogMessage(Object payload) { diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewInterceptor.java b/spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewInterceptor.java index 80893f83039a..2f9ffa00f03d 100644 --- a/spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewInterceptor.java +++ b/spring-orm/src/main/java/org/springframework/orm/jpa/support/OpenEntityManagerInViewInterceptor.java @@ -143,7 +143,7 @@ public void afterConcurrentHandlingStarted(WebRequest request) { * @see #PARTICIPATE_SUFFIX */ protected String getParticipateAttributeName() { - return obtainEntityManagerFactory().toString() + PARTICIPATE_SUFFIX; + return obtainEntityManagerFactory() + PARTICIPATE_SUFFIX; } diff --git a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/binding/BindMarkersFactoryResolver.java b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/binding/BindMarkersFactoryResolver.java index 374c769e484e..9f4a408a828a 100644 --- a/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/binding/BindMarkersFactoryResolver.java +++ b/spring-r2dbc/src/main/java/org/springframework/r2dbc/core/binding/BindMarkersFactoryResolver.java @@ -160,7 +160,7 @@ private static String filterBindMarker(CharSequence input) { if (builder.isEmpty()) { return ""; } - return "_" + builder.toString(); + return "_" + builder; } } diff --git a/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java b/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java index f644d496c5a0..dd9714931c8e 100644 --- a/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java +++ b/spring-test/src/main/java/org/springframework/test/web/client/AbstractRequestExpectationManager.java @@ -174,7 +174,7 @@ protected String getRequestDetails() { if (!this.requests.isEmpty()) { sb.append(":\n"); for (ClientHttpRequest request : this.requests) { - sb.append(request.toString()).append('\n'); + sb.append(request).append('\n'); } } else { diff --git a/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java index 13df46d2a734..ef0830dc3f93 100644 --- a/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/ServletServerHttpRequest.java @@ -133,7 +133,7 @@ public static URI initURI(HttpServletRequest servletRequest) { try { // Maybe malformed query, try to parse and encode it query = UriComponentsBuilder.fromUriString("?" + query).build().toUri().getRawQuery(); - return new URI(servletRequest.getRequestURL().toString() + "?" + query); + return new URI(servletRequest.getRequestURL() + "?" + query); } catch (URISyntaxException ex2) { try { diff --git a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java index 30a9953df15c..75df26cc0803 100644 --- a/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/server/reactive/ServletServerHttpRequest.java @@ -142,7 +142,7 @@ private static URI initUri(HttpServletRequest servletRequest) { try { // Maybe malformed query, try to parse and encode it query = UriComponentsBuilder.fromUriString("?" + query).build().toUri().getRawQuery(); - return new URI(servletRequest.getRequestURL().toString() + "?" + query); + return new URI(servletRequest.getRequestURL() + "?" + query); } catch (URISyntaxException ex2) { try { diff --git a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java index 83a564638052..03473863b433 100644 --- a/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java +++ b/spring-web/src/main/java/org/springframework/web/util/HierarchicalUriComponents.java @@ -223,7 +223,7 @@ public List getPathSegments() { } queryBuilder.append(name); if (value != null) { - queryBuilder.append('=').append(value.toString()); + queryBuilder.append('=').append(value); } } } diff --git a/spring-web/src/main/java/org/springframework/web/util/WhatWgUrlParser.java b/spring-web/src/main/java/org/springframework/web/util/WhatWgUrlParser.java index fd4a4d44dd19..d36093a4ed86 100644 --- a/spring-web/src/main/java/org/springframework/web/util/WhatWgUrlParser.java +++ b/spring-web/src/main/java/org/springframework/web/util/WhatWgUrlParser.java @@ -1278,7 +1278,7 @@ else if (p.processCurlyBrackets(c)) { } // Otherwise, port-invalid validation error, return failure. else { - p.failure("Invalid port: \"" + Character.toString(c) + "\""); + p.failure("Invalid port: \"" + c + "\""); } } }, @@ -2703,7 +2703,7 @@ else if (c == ':') { // IPv6-invalid-code-point validation error, return failure. else if (c != EOF) { throw new InvalidUrlException( - "IPv6 address contains \"" + Character.toString(c) + "\", which is " + + "IPv6 address contains \"" + c + "\", which is " + "neither an ASCII hex digit nor a ':'."); } // Set address[pieceIndex] to value. diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/UnsupportedMediaTypeException.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/UnsupportedMediaTypeException.java index 21d5442a599f..91ed67503b66 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/UnsupportedMediaTypeException.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/UnsupportedMediaTypeException.java @@ -73,7 +73,7 @@ public UnsupportedMediaTypeException(@Nullable MediaType contentType, List