Skip to content

Commit

Permalink
Use String[] instead of Array as lambda type
Browse files Browse the repository at this point in the history
  • Loading branch information
timtebeek committed Dec 24, 2023
1 parent 1e403a1 commit eb6f602
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -675,7 +675,7 @@ private String toLambda(JCTree.JCMethodDecl method) {

StringJoiner joiner = new StringJoiner(", ", "(", ")");
for (JCTree.JCVariableDecl parameter : method.getParameters()) {
String paramType = parameter.getType().type.tsym.getQualifiedName().toString();
String paramType = parameter.getType().type.toString();
if (!getBoxedPrimitive(paramType).equals(paramType)) {
paramType = "@Primitive " + getBoxedPrimitive(paramType);
} else if (paramType.startsWith("java.lang.")) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ public void visitIdent(JCTree.JCIdent ident) {
for (JCTree.JCVariableDecl parameter : parameters) {
if (parameter.type.tsym instanceof Symbol.ClassSymbol) {
String paramType = parameter.type.tsym.getQualifiedName().toString();
if (!paramType.startsWith("java.lang")) {
if (!paramType.startsWith("java.lang") && !"Array".equals(paramType)) {
out.write("import " + paramType + ";\n");
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
class RefasterTemplateProcessorTest {
@ParameterizedTest
@ValueSource(strings = {
"Arrays",
"MethodThrows",
"NestedPreconditions",
"ParameterReuse",
Expand Down
31 changes: 31 additions & 0 deletions src/test/resources/refaster/Arrays.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* Copyright 2023 the original author or authors.
* <p>
* 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
* <p>
* https://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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 foo;

import com.google.errorprone.refaster.annotation.AfterTemplate;
import com.google.errorprone.refaster.annotation.BeforeTemplate;

public class Arrays {
@BeforeTemplate
String before(String[] strings) {
return String.join(", ", strings);
}

@AfterTemplate
String after(String[] strings) {
return String.join(":", strings);
}
}
79 changes: 79 additions & 0 deletions src/test/resources/refaster/ArraysRecipe.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,79 @@
/*
* Copyright 2023 the original author or authors.
* <p>
* 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
* <p>
* https://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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 foo;

import org.openrewrite.ExecutionContext;
import org.openrewrite.Preconditions;
import org.openrewrite.Recipe;
import org.openrewrite.TreeVisitor;
import org.openrewrite.internal.lang.NonNullApi;
import org.openrewrite.java.JavaTemplate;
import org.openrewrite.java.JavaVisitor;
import org.openrewrite.java.search.*;
import org.openrewrite.java.template.Primitive;
import org.openrewrite.java.template.Semantics;
import org.openrewrite.java.template.function.*;
import org.openrewrite.java.template.internal.AbstractRefasterJavaVisitor;
import org.openrewrite.java.tree.*;

import java.util.*;

import static org.openrewrite.java.template.internal.AbstractRefasterJavaVisitor.EmbeddingOption.*;

@SuppressWarnings("all")
@NonNullApi
public class ArraysRecipe extends Recipe {

public ArraysRecipe() {
}

@Override
public String getDisplayName() {
return "Refaster template `Arrays`";
}

@Override
public String getDescription() {
return "Recipe created for the following Refaster template:\n```java\npublic class Arrays {\n \n @BeforeTemplate()\n String before(String[] strings) {\n return String.join(\", \", strings);\n }\n \n @AfterTemplate()\n String after(String[] strings) {\n return String.join(\":\", strings);\n }\n}\n```\n.";
}

@Override
public TreeVisitor<?, ExecutionContext> getVisitor() {
JavaVisitor<ExecutionContext> javaVisitor = new AbstractRefasterJavaVisitor() {
final JavaTemplate before = Semantics.expression(this, "before", (String[] strings) -> String.join(", ", strings)).build();
final JavaTemplate after = Semantics.expression(this, "after", (String[] strings) -> String.join(":", strings)).build();

@Override
public J visitMethodInvocation(J.MethodInvocation elem, ExecutionContext ctx) {
JavaTemplate.Matcher matcher;
if ((matcher = before.matcher(getCursor())).find()) {
return embed(
after.apply(getCursor(), elem.getCoordinates().replace(), matcher.parameter(0)),
getCursor(),
ctx,
SHORTEN_NAMES
);
}
return super.visitMethodInvocation(elem, ctx);
}

};
return Preconditions.check(
new UsesMethod<>("java.lang.String join(..)"),
javaVisitor
);
}
}

0 comments on commit eb6f602

Please sign in to comment.