diff --git a/build.gradle.kts b/build.gradle.kts index cb84409..754ebaf 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -29,7 +29,7 @@ dependencies { runtimeOnly("ai.timefold.solver:timefold-solver-migration:latest.release") { exclude(module = "jakarta.xml.bind-api") } - runtimeOnly("com.oracle.weblogic.rewrite:rewrite-weblogic:latest.release") {isTransitive = false} + runtimeOnly("com.oracle.weblogic.rewrite:rewrite-weblogic:latest.release") { isTransitive = false } runtimeOnly("io.quarkus:quarkus-update-recipes:latest.release") { isTransitive = false } runtimeOnly("org.apache.camel.upgrade:camel-upgrade-recipes:latest.release") { isTransitive = false } runtimeOnly("org.apache.wicket:wicket-migration:latest.release") { isTransitive = false } @@ -70,6 +70,9 @@ recipeDependencies { parserClasspath("io.projectreactor.addons:reactor-adapter:3.+") parserClasspath("io.projectreactor.addons:reactor-extra:3.+") parserClasspath("io.reactivex.rxjava2:rxjava:2.+") + + // `@InlineMe` methods defined in log4j-api + parserClasspath("org.apache.logging.log4j:log4j-api:2.+") } // ./gradlew shadowJar diff --git a/src/main/resources/META-INF/rewrite/classpath.tsv.gz b/src/main/resources/META-INF/rewrite/classpath.tsv.gz index 9cf3d3d..b8538f0 100644 Binary files a/src/main/resources/META-INF/rewrite/classpath.tsv.gz and b/src/main/resources/META-INF/rewrite/classpath.tsv.gz differ diff --git a/src/main/resources/META-INF/rewrite/inline-guava-methods.yml b/src/main/resources/META-INF/rewrite/inline-guava-methods.yml new file mode 100644 index 0000000..3a0cb12 --- /dev/null +++ b/src/main/resources/META-INF/rewrite/inline-guava-methods.yml @@ -0,0 +1,401 @@ +# Copyright 2025 the original author or authors. +#

+# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +#

+# https://www.apache.org/licenses/LICENSE-2.0 +#

+# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated InlineMe recipes from TypeTable +# + +type: specs.openrewrite.org/v1beta/recipe +name: com.google.guava.InlineGuavaMethods +displayName: Inline `guava` methods annotated with `@InlineMe` +description: >- + Automatically generated recipes to inline method calls based on `@InlineMe` annotations + discovered in the type table. +recipeList: + # From com.google.guava:guava:33.5.0-jre + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Booleans hashCode(boolean)' + replacement: 'Boolean.hashCode(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Booleans compare(boolean, boolean)' + replacement: 'Boolean.compare(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Longs hashCode(long)' + replacement: 'Long.hashCode(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Longs compare(long, long)' + replacement: 'Long.compare(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Ints hashCode(int)' + replacement: 'Integer.hashCode(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Ints compare(int, int)' + replacement: 'Integer.compare(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.graph.ImmutableValueGraph copyOf(com.google.common.graph.ImmutableValueGraph)' + replacement: 'checkNotNull(graph)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Doubles hashCode(double)' + replacement: 'Double.hashCode(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Doubles compare(double, double)' + replacement: 'Double.compare(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Doubles isFinite(double)' + replacement: 'Double.isFinite(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Streams stream(java.util.Collection)' + replacement: 'collection.stream()' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Streams stream(java.util.Optional)' + replacement: 'optional.stream()' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Streams stream(java.util.OptionalInt)' + replacement: 'optional.stream()' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Streams stream(java.util.OptionalLong)' + replacement: 'optional.stream()' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Streams stream(java.util.OptionalDouble)' + replacement: 'optional.stream()' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Range apply(java.lang.Comparable)' + replacement: 'this.contains(input)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Range test(java.lang.Comparable)' + replacement: 'this.contains(input)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.FluentIterable from(com.google.common.collect.FluentIterable)' + replacement: 'checkNotNull(iterable)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.ImmutableList asList()' + replacement: 'this' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Chars hashCode(char)' + replacement: 'Character.hashCode(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Chars compare(char, char)' + replacement: 'Character.compare(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.TreeBasedTable rowComparator()' + replacement: 'requireNonNull(this.rowKeySet().comparator())' + staticImports: + - 'java.util.Objects.requireNonNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Multisets unmodifiableMultiset(com.google.common.collect.ImmutableMultiset)' + replacement: 'checkNotNull(multiset)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Iterators unmodifiableIterator(com.google.common.collect.UnmodifiableIterator)' + replacement: 'checkNotNull(iterator)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Iterators peekingIterator(com.google.common.collect.PeekingIterator)' + replacement: 'checkNotNull(iterator)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Ordering from(com.google.common.collect.Ordering)' + replacement: 'checkNotNull(ordering)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Ordering binarySearch(java.util.List, java.lang.Object)' + replacement: 'Collections.binarySearch(sortedList, key, this)' + imports: + - 'java.util.Collections' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Bytes hashCode(byte)' + replacement: 'Byte.hashCode(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Multimaps unmodifiableMultimap(com.google.common.collect.ImmutableMultimap)' + replacement: 'checkNotNull(delegate)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Multimaps unmodifiableSetMultimap(com.google.common.collect.ImmutableSetMultimap)' + replacement: 'checkNotNull(delegate)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Multimaps unmodifiableListMultimap(com.google.common.collect.ImmutableListMultimap)' + replacement: 'checkNotNull(delegate)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.base.Equivalence test(java.lang.Object, java.lang.Object)' + replacement: 'this.equivalent(t, u)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Sets newSetFromMap(java.util.Map)' + replacement: 'Collections.newSetFromMap(map)' + imports: + - 'java.util.Collections' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Lists newCopyOnWriteArrayList()' + replacement: 'new CopyOnWriteArrayList<>()' + imports: + - 'java.util.concurrent.CopyOnWriteArrayList' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.base.Strings repeat(java.lang.String, int)' + replacement: 'string.repeat(count)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.hash.BloomFilter apply(java.lang.Object)' + replacement: 'this.mightContain(input)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.hash.BloomFilter test(java.lang.Object)' + replacement: 'this.mightContain(input)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.base.CharMatcher apply(java.lang.Character)' + replacement: 'this.matches(character)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.base.CharMatcher test(java.lang.Character)' + replacement: 'this.matches(character)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.ComparisonChain compare(java.lang.Boolean, java.lang.Boolean)' + replacement: 'this.compareFalseFirst(left, right)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.io.Files toString(java.io.File, java.nio.charset.Charset)' + replacement: 'Files.asCharSource(file, charset).read()' + imports: + - 'com.google.common.io.Files' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.io.Files write(java.lang.CharSequence, java.io.File, java.nio.charset.Charset)' + replacement: 'Files.asCharSink(to, charset).write(from)' + imports: + - 'com.google.common.io.Files' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.io.Files copy(java.io.File, java.nio.charset.Charset, java.lang.Appendable)' + replacement: 'Files.asCharSource(from, charset).copyTo(to)' + imports: + - 'com.google.common.io.Files' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.io.Files append(java.lang.CharSequence, java.io.File, java.nio.charset.Charset)' + replacement: 'Files.asCharSink(to, charset, FileWriteMode.APPEND).write(from)' + imports: + - 'com.google.common.io.FileWriteMode' + - 'com.google.common.io.Files' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.io.Files readFirstLine(java.io.File, java.nio.charset.Charset)' + replacement: 'Files.asCharSource(file, charset).readFirstLine()' + imports: + - 'com.google.common.io.Files' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.io.Files readLines(java.io.File, java.nio.charset.Charset, com.google.common.io.LineProcessor)' + replacement: 'Files.asCharSource(file, charset).readLines(callback)' + imports: + - 'com.google.common.io.Files' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.io.Files readBytes(java.io.File, com.google.common.io.ByteProcessor)' + replacement: 'Files.asByteSource(file).read(processor)' + imports: + - 'com.google.common.io.Files' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.io.Files hash(java.io.File, com.google.common.hash.HashFunction)' + replacement: 'Files.asByteSource(file).hash(hashFunction)' + imports: + - 'com.google.common.io.Files' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.util.concurrent.FluentFuture from(com.google.common.util.concurrent.FluentFuture)' + replacement: 'checkNotNull(future)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.base.Converter apply(java.lang.Object)' + replacement: 'this.convert(a)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Shorts hashCode(short)' + replacement: 'Short.hashCode(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Shorts compare(short, short)' + replacement: 'Short.compare(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.graph.ImmutableGraph copyOf(com.google.common.graph.ImmutableGraph)' + replacement: 'checkNotNull(graph)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Floats hashCode(float)' + replacement: 'Float.hashCode(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Floats compare(float, float)' + replacement: 'Float.compare(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.Floats isFinite(float)' + replacement: 'Float.isFinite(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.collect.Iterables unmodifiableIterable(com.google.common.collect.ImmutableCollection)' + replacement: 'checkNotNull(iterable)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.primitives.UnsignedBytes toInt(byte)' + replacement: 'Byte.toUnsignedInt(value)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.graph.ImmutableNetwork copyOf(com.google.common.graph.ImmutableNetwork)' + replacement: 'checkNotNull(network)' + staticImports: + - 'com.google.common.base.Preconditions.checkNotNull' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.math.LongMath checkedAdd(long, long)' + replacement: 'Math.addExact(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.math.LongMath checkedSubtract(long, long)' + replacement: 'Math.subtractExact(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.math.LongMath checkedMultiply(long, long)' + replacement: 'Math.multiplyExact(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.math.IntMath checkedAdd(int, int)' + replacement: 'Math.addExact(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.math.IntMath checkedSubtract(int, int)' + replacement: 'Math.subtractExact(a, b)' + classpathFromResources: + - 'guava-33' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'com.google.common.math.IntMath checkedMultiply(int, int)' + replacement: 'Math.multiplyExact(a, b)' + classpathFromResources: + - 'guava-33' diff --git a/src/main/resources/META-INF/rewrite/inline-log4j-api-methods.yml b/src/main/resources/META-INF/rewrite/inline-log4j-api-methods.yml new file mode 100644 index 0000000..3f5bd3d --- /dev/null +++ b/src/main/resources/META-INF/rewrite/inline-log4j-api-methods.yml @@ -0,0 +1,54 @@ +# Copyright 2025 the original author or authors. +#

+# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +#

+# https://www.apache.org/licenses/LICENSE-2.0 +#

+# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# Generated InlineMe recipes from TypeTable +# + +type: specs.openrewrite.org/v1beta/recipe +name: org.apache.logging.log4j.InlineLog4jApiMethods +displayName: Inline `log4j-api-2` methods annotated with `@InlineMe` +description: >- + Automatically generated recipes to inline method calls based on `@InlineMe` annotations + discovered in the type table. +recipeList: + # From org.apache.logging.log4j:log4j-api:2.25.2 + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'org.apache.logging.log4j.message.ParameterizedMessage ParameterizedMessage(java.lang.String, java.lang.String[], java.lang.Throwable)' + replacement: 'this(pattern, Arrays.stream(args).toArray(Object[]::new), throwable)' + imports: + - 'java.util.Arrays' + classpathFromResources: + - 'log4j-api-2' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'org.apache.logging.log4j.message.StructuredDataId StructuredDataId(java.lang.String, int, java.lang.String[], java.lang.String[])' + replacement: 'this(name, String.valueOf(enterpriseNumber), required, optional)' + classpathFromResources: + - 'log4j-api-2' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'org.apache.logging.log4j.message.StructuredDataId StructuredDataId(java.lang.String, int, java.lang.String[], java.lang.String[], int)' + replacement: 'this(name, String.valueOf(enterpriseNumber), required, optional, maxLength)' + classpathFromResources: + - 'log4j-api-2' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'org.apache.logging.log4j.message.StructuredDataId makeId(java.lang.String, int)' + replacement: 'this.makeId(defaultId, String.valueOf(anEnterpriseNumber))' + classpathFromResources: + - 'log4j-api-2' + - org.openrewrite.java.InlineMethodCalls: + methodPattern: 'org.apache.logging.log4j.MarkerManager getMarker(java.lang.String, org.apache.logging.log4j.Marker)' + replacement: 'MarkerManager.getMarker(name).addParents(parent)' + imports: + - 'org.apache.logging.log4j.MarkerManager' + classpathFromResources: + - 'log4j-api-2' diff --git a/src/test/java/com/google/guava/InlineGuavaMethodsTest.java b/src/test/java/com/google/guava/InlineGuavaMethodsTest.java new file mode 100644 index 0000000..65167f7 --- /dev/null +++ b/src/test/java/com/google/guava/InlineGuavaMethodsTest.java @@ -0,0 +1,80 @@ +/* + * Copyright 2025 the original author or authors. + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * https://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.google.guava; + +import org.junit.jupiter.api.Test; +import org.openrewrite.DocumentExample; +import org.openrewrite.test.RecipeSpec; +import org.openrewrite.test.RewriteTest; + +import static org.openrewrite.java.Assertions.java; + +class InlineGuavaMethodsTest implements RewriteTest { + + @Override + public void defaults(RecipeSpec spec) { + spec.recipeFromResource( + "/META-INF/rewrite/inline-guava-methods.yml", + "com.google.guava.InlineGuavaMethods"); + } + + @DocumentExample + @Test + void stringsRegular() { + rewriteRun( + java( + """ + import com.google.common.base.Strings; + class Regular { + String repeatString(String s, int n) { + return Strings.repeat(s, n); + } + } + """, + """ + class Regular { + String repeatString(String s, int n) { + return s.repeat(n); + } + } + """ + ) + ); + } + + @Test + void stringsStaticImport() { + rewriteRun( + java( + """ + import static com.google.common.base.Strings.repeat; + class StaticImport { + String repeatString(String s, int n) { + return repeat(s, n); + } + } + """, + """ + class StaticImport { + String repeatString(String s, int n) { + return s.repeat(n); + } + } + """ + ) + ); + } +}