From 34abe24817e6aa098f011f3cce1a6b53f8489275 Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Thu, 1 Jun 2023 10:19:14 +0200 Subject: [PATCH 1/3] Adjust to new OpenRewrite 8.0 `JavaTemplate` API --- .../AddSerialVersionUidToSerializable.java | 4 +- .../AtomicPrimitiveEqualsUsesGet.java | 5 +-- .../AvoidBoxedBooleanExpressions.java | 14 +----- .../BigDecimalRoundingConstantsToEnums.java | 15 +++---- .../CompareEnumsWithEqualityOperator.java | 13 ++---- .../CovariantEqualsVisitor.java | 24 +++++----- .../staticanalysis/EmptyBlockVisitor.java | 8 ++-- .../ExplicitCharsetOnStringGetBytes.java | 5 +-- .../ExternalizableHasNoArgsConstructor.java | 2 +- .../HideUtilityClassConstructorVisitor.java | 6 +-- .../IndexOfChecksShouldUseAStartPosition.java | 11 ++--- .../IndexOfReplaceableByContains.java | 6 ++- .../IsEmptyCallOnCollections.java | 8 ++-- .../staticanalysis/MinimumSwitchCases.java | 45 ++++++++----------- .../MissingOverrideAnnotation.java | 5 +-- ...ewStringBuilderBufferWithCharArgument.java | 8 ++-- .../NoDoubleBraceInitialization.java | 2 +- .../staticanalysis/NoValueOfOnStringType.java | 2 +- .../ObjectFinalizeCallsSuper.java | 13 +++--- ...itiveWrapperClassConstructorToValueOf.java | 2 +- .../RemoveInstanceOfPatternMatch.java | 24 +++++----- .../ReplaceDeprecatedRuntimeExecMethods.java | 13 +++--- .../ReplaceDuplicateStringLiterals.java | 6 +-- .../ReplaceLambdaWithMethodReference.java | 27 +++++------ .../ReplaceRedundantFormatWithPrintf.java | 9 +--- .../ReplaceStreamToListWithCollect.java | 2 +- ...avingVarargsWithObjectsRequireNonNull.java | 12 ++--- .../SimplifyConsecutiveAssignments.java | 19 ++++---- .../SimplifyDurationCreationUnits.java | 11 ++--- ...UseForEachRemoveInsteadOfSetRemoveAll.java | 5 +-- .../UseLambdaForFunctionalInterface.java | 10 ++--- .../staticanalysis/UseListSort.java | 10 ++--- .../staticanalysis/UseStandardCharset.java | 6 +-- .../UseSystemLineSeparator.java | 11 ++--- .../staticanalysis/WhileInsteadOfFor.java | 5 +-- 35 files changed, 142 insertions(+), 226 deletions(-) diff --git a/src/main/java/org/openrewrite/staticanalysis/AddSerialVersionUidToSerializable.java b/src/main/java/org/openrewrite/staticanalysis/AddSerialVersionUidToSerializable.java index c518717e3..fad6d107a 100644 --- a/src/main/java/org/openrewrite/staticanalysis/AddSerialVersionUidToSerializable.java +++ b/src/main/java/org/openrewrite/staticanalysis/AddSerialVersionUidToSerializable.java @@ -54,7 +54,7 @@ public Set getTags() { @Override public TreeVisitor getVisitor() { return new JavaIsoVisitor() { - final JavaTemplate template = JavaTemplate.builder("private static final long serialVersionUID = 1;").context(this::getCursor).build(); + final JavaTemplate template = JavaTemplate.builder("private static final long serialVersionUID = 1;").contextSensitive().build(); @Override public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, ExecutionContext executionContext) { @@ -90,7 +90,7 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex return s; }))); if (needsSerialVersionId.get()) { - c = c.withTemplate(template, getCursor(), c.getBody().getCoordinates().firstStatement()); + c = template.apply(getCursor(), c.getBody().getCoordinates().firstStatement()); } return c; } diff --git a/src/main/java/org/openrewrite/staticanalysis/AtomicPrimitiveEqualsUsesGet.java b/src/main/java/org/openrewrite/staticanalysis/AtomicPrimitiveEqualsUsesGet.java index d6336ffb8..03d6d3e20 100644 --- a/src/main/java/org/openrewrite/staticanalysis/AtomicPrimitiveEqualsUsesGet.java +++ b/src/main/java/org/openrewrite/staticanalysis/AtomicPrimitiveEqualsUsesGet.java @@ -65,9 +65,8 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext execu JavaType.FullyQualified fqt = TypeUtils.asFullyQualified(mi.getSelect().getType()); if (fqt != null) { String templateString = "#{any(" + fqt.getFullyQualifiedName() + ")}.get() == #{any(" + fqt.getFullyQualifiedName() + ")}.get()"; - return mi.withTemplate(JavaTemplate.builder(templateString) - .imports(fqt.getFullyQualifiedName()).build(), - getCursor(), mi.getCoordinates().replace(), mi.getSelect(), mi.getArguments().get(0)); + return JavaTemplate.builder(templateString) + .imports(fqt.getFullyQualifiedName()).build().apply(getCursor(), mi.getCoordinates().replace(), mi.getSelect(), mi.getArguments().get(0)); } } return mi; diff --git a/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java b/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java index b56c1b707..511d2dad9 100644 --- a/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java +++ b/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java @@ -59,12 +59,7 @@ public Expression visitExpression(Expression expression, ExecutionContext ctx) { Expression e = (Expression) super.visitExpression(expression, ctx); if (TypeUtils.isOfClassType(e.getType(), "java.lang.Boolean")) { if (isControlExpression(expression)) { - return e.withTemplate( - JavaTemplate.builder("Boolean.TRUE.equals(#{any(java.lang.Boolean)})").build(), - getCursor(), - e.getCoordinates().replace(), - e - ); + return JavaTemplate.builder("Boolean.TRUE.equals(#{any(java.lang.Boolean)})").build().apply(getCursor(), e.getCoordinates().replace(), e); } } return e; @@ -74,12 +69,7 @@ public Expression visitExpression(Expression expression, ExecutionContext ctx) { public J visitUnary(J.Unary unary, ExecutionContext executionContext) { J.Unary un = (J.Unary) super.visitUnary(unary, executionContext); if (J.Unary.Type.Not == un.getOperator() && TypeUtils.isOfClassType(un.getExpression().getType(), "java.lang.Boolean")) { - return un.withTemplate( - JavaTemplate.builder("Boolean.FALSE.equals(#{any(java.lang.Boolean)})").build(), - getCursor(), - un.getCoordinates().replace(), - un.getExpression() - ); + return JavaTemplate.builder("Boolean.FALSE.equals(#{any(java.lang.Boolean)})").build().apply(getCursor(), un.getCoordinates().replace(), un.getExpression()); } return un; } diff --git a/src/main/java/org/openrewrite/staticanalysis/BigDecimalRoundingConstantsToEnums.java b/src/main/java/org/openrewrite/staticanalysis/BigDecimalRoundingConstantsToEnums.java index 9f598c241..3c858a7e6 100644 --- a/src/main/java/org/openrewrite/staticanalysis/BigDecimalRoundingConstantsToEnums.java +++ b/src/main/java/org/openrewrite/staticanalysis/BigDecimalRoundingConstantsToEnums.java @@ -61,17 +61,17 @@ public Duration getEstimatedEffortPerOccurrence() { public TreeVisitor getVisitor() { return Preconditions.check(new UsesType<>("java.math.BigDecimal", false), new JavaIsoVisitor() { private final JavaTemplate twoArgDivide = JavaTemplate.builder("#{any(java.math.BigDecimal)}, #{}") - .context(this::getCursor) + .contextSensitive() .imports("java.math.RoundingMode") .build(); private final JavaTemplate twoArgScale = JavaTemplate.builder("#{any(int)}, #{}") - .context(this::getCursor) + .contextSensitive() .imports("java.math.RoundingMode") .build(); private final JavaTemplate threeArg = JavaTemplate.builder("#{any(java.math.BigDecimal)}, #{any(int)}, #{}") - .context(this::getCursor) + .contextSensitive() .imports("java.math.RoundingMode").build(); @Override @@ -83,16 +83,14 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu if (roundingModeEnum == null) { return m; } - m = m.withTemplate(twoArgDivide, getCursor(), m.getCoordinates().replaceArguments(), - m.getArguments().get(0), roundingModeEnum); + m = twoArgDivide.apply(getCursor(), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum); maybeAddImport("java.math.RoundingMode"); } else if (BIG_DECIMAL_SET_SCALE.matches(m) && isConvertibleBigDecimalConstant(m.getArguments().get(1))) { String roundingModeEnum = getTemplateText(m.getArguments().get(1)); if (roundingModeEnum == null) { return m; } - m = m.withTemplate(twoArgScale, getCursor(), m.getCoordinates().replaceArguments(), - m.getArguments().get(0), roundingModeEnum); + m = twoArgScale.apply(getCursor(), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum); maybeAddImport("java.math.RoundingMode"); } else if (BIG_DECIMAL_DIVIDE_WITH_SCALE.matches(m) && isConvertibleBigDecimalConstant(m.getArguments().get(2))) { @@ -100,8 +98,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu if (roundingModeEnum == null) { return m; } - m = m.withTemplate(threeArg, getCursor(), m.getCoordinates().replaceArguments(), - m.getArguments().get(0), m.getArguments().get(1), roundingModeEnum); + m = threeArg.apply(getCursor(), m.getCoordinates().replaceArguments(), m.getArguments().get(0), m.getArguments().get(1), roundingModeEnum); maybeAddImport("java.math.RoundingMode"); } return m; diff --git a/src/main/java/org/openrewrite/staticanalysis/CompareEnumsWithEqualityOperator.java b/src/main/java/org/openrewrite/staticanalysis/CompareEnumsWithEqualityOperator.java index 27bc728bd..3d4b5550e 100644 --- a/src/main/java/org/openrewrite/staticanalysis/CompareEnumsWithEqualityOperator.java +++ b/src/main/java/org/openrewrite/staticanalysis/CompareEnumsWithEqualityOperator.java @@ -62,15 +62,10 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext execu executionContext.putMessage("REMOVE_UNARY_NOT", parent.getValue()); } String code = "#{any()} " + (isNot ? "!=" : "==") + " #{any()}"; - return autoFormat(m.withTemplate( - JavaTemplate - .builder(code) - .context(getCursor()) - .build(), - getCursor(), - m.getCoordinates().replace(), - m.getSelect(), m.getArguments().get(0) - ), executionContext); + return autoFormat(JavaTemplate + .builder(code) + .contextSensitive() + .build().apply(getCursor(), m.getCoordinates().replace(), m.getSelect(), m.getArguments().get(0)), executionContext); } return m; } diff --git a/src/main/java/org/openrewrite/staticanalysis/CovariantEqualsVisitor.java b/src/main/java/org/openrewrite/staticanalysis/CovariantEqualsVisitor.java index 76a99f380..a66f4f5a8 100644 --- a/src/main/java/org/openrewrite/staticanalysis/CovariantEqualsVisitor.java +++ b/src/main/java/org/openrewrite/staticanalysis/CovariantEqualsVisitor.java @@ -15,6 +15,7 @@ */ package org.openrewrite.staticanalysis; +import org.openrewrite.Cursor; import org.openrewrite.Incubating; import org.openrewrite.java.AnnotationMatcher; import org.openrewrite.java.JavaIsoVisitor; @@ -74,11 +75,9 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, P JavaType.Primitive.Boolean.equals(m.getReturnTypeExpression().getType())) { if (m.getAllAnnotations().stream().noneMatch(OVERRIDE_ANNOTATION::matches)) { - m = m.withTemplate( - JavaTemplate.builder("@Override").build(), - getCursor(), - m.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName)) - ); + m = JavaTemplate.builder("@Override").build() + .apply(new Cursor(getCursor().getParent(), m), + m.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); } /* @@ -88,18 +87,17 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, P */ J.VariableDeclarations.NamedVariable oldParamName = ((J.VariableDeclarations) m.getParameters().iterator().next()).getVariables().iterator().next(); String paramName = "obj".equals(oldParamName.getSimpleName()) ? "other" : "obj"; - m = m.withTemplate( - JavaTemplate.builder("Object #{}").context(() -> getCursor().getParentOrThrow()).build(), - getCursor(), - m.getCoordinates().replaceParameters(), - paramName); + m = JavaTemplate.builder("Object #{}").contextSensitive().build() + .apply(new Cursor(getCursor().getParent(), m), + m.getCoordinates().replaceParameters(), + paramName); /* * We'll prepend this type-check and type-cast to the beginning of the existing * equals(..) method body statements, and let the existing equals(..) method definition continue * with the logic doing what it was doing. */ - JavaTemplate equalsBodySnippet = JavaTemplate.builder(EQUALS_BODY_PREFIX_TEMPLATE).context(this::getCursor).build(); + JavaTemplate equalsBodySnippet = JavaTemplate.builder(EQUALS_BODY_PREFIX_TEMPLATE).contextSensitive().build(); assert m.getBody() != null; Object[] params = new Object[]{ @@ -112,9 +110,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, P paramName }; - m = m.withTemplate( - equalsBodySnippet, - getCursor(), + m = equalsBodySnippet.apply(new Cursor(getCursor().getParent(), m), m.getBody().getStatements().get(0).getCoordinates().before(), params); } diff --git a/src/main/java/org/openrewrite/staticanalysis/EmptyBlockVisitor.java b/src/main/java/org/openrewrite/staticanalysis/EmptyBlockVisitor.java index f91d7c80e..f2748dcf8 100644 --- a/src/main/java/org/openrewrite/staticanalysis/EmptyBlockVisitor.java +++ b/src/main/java/org/openrewrite/staticanalysis/EmptyBlockVisitor.java @@ -42,10 +42,10 @@ public class EmptyBlockVisitor

extends JavaIsoVisitor

{ EmptyBlockStyle emptyBlockStyle; JavaTemplate throwException = JavaTemplate.builder("throw new #{}(#{any(String)});") - .context(this::getCursor) + .contextSensitive() .imports("java.io.UncheckedIOException") .build(); - JavaTemplate continueStatement = JavaTemplate.builder("continue;").context(this::getCursor).build(); + JavaTemplate continueStatement = JavaTemplate.builder("continue;").contextSensitive().build(); @Override public J.WhileLoop visitWhileLoop(J.WhileLoop whileLoop, P p) { @@ -53,7 +53,7 @@ public J.WhileLoop visitWhileLoop(J.WhileLoop whileLoop, P p) { if (Boolean.TRUE.equals(emptyBlockStyle.getLiteralWhile()) && isEmptyBlock(w.getBody())) { J.Block body = (J.Block) w.getBody(); - w = w.withTemplate(continueStatement, getCursor(), body.getCoordinates().lastStatement()); + w = continueStatement.apply(getCursor(), body.getCoordinates().lastStatement()); } return w; @@ -65,7 +65,7 @@ public J.DoWhileLoop visitDoWhileLoop(J.DoWhileLoop doWhileLoop, P p) { if (Boolean.TRUE.equals(emptyBlockStyle.getLiteralWhile()) && isEmptyBlock(w.getBody())) { J.Block body = (J.Block) w.getBody(); - w = w.withTemplate(continueStatement, getCursor(), body.getCoordinates().lastStatement()); + w = continueStatement.apply(getCursor(), body.getCoordinates().lastStatement()); } return w; diff --git a/src/main/java/org/openrewrite/staticanalysis/ExplicitCharsetOnStringGetBytes.java b/src/main/java/org/openrewrite/staticanalysis/ExplicitCharsetOnStringGetBytes.java index 0ec303bec..d08ba5755 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ExplicitCharsetOnStringGetBytes.java +++ b/src/main/java/org/openrewrite/staticanalysis/ExplicitCharsetOnStringGetBytes.java @@ -53,7 +53,7 @@ public TreeVisitor getVisitor() { return Preconditions.check(new UsesMethod<>(GET_BYTES), new JavaIsoVisitor() { final JavaTemplate WITH_ENCODING = JavaTemplate .builder("getBytes(StandardCharsets.#{})") - .context(this::getCursor) + .contextSensitive() .imports("java.nio.charset.StandardCharsets") .build(); @@ -62,8 +62,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu J.MethodInvocation m = super.visitMethodInvocation(method, ctx); if (GET_BYTES.matches(method)) { maybeAddImport("java.nio.charset.StandardCharsets"); - m = m.withTemplate(WITH_ENCODING, getCursor(), method.getCoordinates().replaceMethod(), - encoding == null ? "UTF_8" : encoding); + m = WITH_ENCODING.apply(getCursor(), method.getCoordinates().replaceMethod(), encoding == null ? "UTF_8" : encoding); } return m; } diff --git a/src/main/java/org/openrewrite/staticanalysis/ExternalizableHasNoArgsConstructor.java b/src/main/java/org/openrewrite/staticanalysis/ExternalizableHasNoArgsConstructor.java index 677078f53..af6abeb70 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ExternalizableHasNoArgsConstructor.java +++ b/src/main/java/org/openrewrite/staticanalysis/ExternalizableHasNoArgsConstructor.java @@ -87,7 +87,7 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex } } if (!hasFinalUninitializedFieldVar && !hasNoArgsConstructor(cd) && parentClassHasNoArgsConstructor(cd)) { - cd = cd.withTemplate(JavaTemplate.builder("public " + cd.getSimpleName() + "() {}").context(getCursor()).build(), getCursor(), cd.getBody().getCoordinates().lastStatement()); + cd = JavaTemplate.builder("public " + cd.getSimpleName() + "() {}").contextSensitive().build().apply(getCursor(), cd.getBody().getCoordinates().lastStatement()); if (firstMethodDeclarationIndex != null) { statements.add(firstMethodDeclarationIndex, cd.getBody().getStatements().remove(cd.getBody().getStatements().size() - 1)); cd = cd.withBody(cd.getBody().withStatements(statements)); diff --git a/src/main/java/org/openrewrite/staticanalysis/HideUtilityClassConstructorVisitor.java b/src/main/java/org/openrewrite/staticanalysis/HideUtilityClassConstructorVisitor.java index 25086f3f6..04b426586 100644 --- a/src/main/java/org/openrewrite/staticanalysis/HideUtilityClassConstructorVisitor.java +++ b/src/main/java/org/openrewrite/staticanalysis/HideUtilityClassConstructorVisitor.java @@ -94,11 +94,7 @@ private static class UtilityClassWithImplicitDefaultConstructorVisitor

extend public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, P p) { if (UtilityClassMatcher.hasImplicitDefaultConstructor(classDecl) && !J.ClassDeclaration.Kind.Type.Enum.equals(classDecl.getKind())) { - classDecl = classDecl.withTemplate(JavaTemplate.builder("private #{}() {}").context(getCursor()).build(), - getCursor(), - classDecl.getBody().getCoordinates().lastStatement(), - classDecl.getSimpleName() - ); + classDecl = JavaTemplate.builder("private #{}() {}").contextSensitive().build().apply(getCursor(), classDecl.getBody().getCoordinates().lastStatement(), classDecl.getSimpleName()); } return classDecl; } diff --git a/src/main/java/org/openrewrite/staticanalysis/IndexOfChecksShouldUseAStartPosition.java b/src/main/java/org/openrewrite/staticanalysis/IndexOfChecksShouldUseAStartPosition.java index 6bffd75a8..3d3a6d077 100644 --- a/src/main/java/org/openrewrite/staticanalysis/IndexOfChecksShouldUseAStartPosition.java +++ b/src/main/java/org/openrewrite/staticanalysis/IndexOfChecksShouldUseAStartPosition.java @@ -67,11 +67,12 @@ public J.Binary visitBinary(J.Binary binary, ExecutionContext ctx) { b.getRight() instanceof J.Literal && isValueNotCompliant((J.Literal) b.getRight())) { J.MethodInvocation m = (J.MethodInvocation) b.getLeft(); - b = b.withLeft(m.withTemplate(JavaTemplate.builder("#{any(java.lang.String)}, #{any(int)}").build(), - getCursor(), - m.getCoordinates().replaceArguments(), - m.getArguments().get(0), - b.getRight())); + Cursor cursor = new Cursor(getCursor(), b.getLeft()); + b = b.withLeft(JavaTemplate.builder("#{any(java.lang.String)}, #{any(int)}").build() + .apply(cursor, + m.getCoordinates().replaceArguments(), + m.getArguments().get(0), + b.getRight())); b = b.withRight(new J.Literal( Tree.randomId(), diff --git a/src/main/java/org/openrewrite/staticanalysis/IndexOfReplaceableByContains.java b/src/main/java/org/openrewrite/staticanalysis/IndexOfReplaceableByContains.java index 29e93fd1e..1361c79ea 100644 --- a/src/main/java/org/openrewrite/staticanalysis/IndexOfReplaceableByContains.java +++ b/src/main/java/org/openrewrite/staticanalysis/IndexOfReplaceableByContains.java @@ -78,8 +78,10 @@ public J visitBinary(J.Binary binary, ExecutionContext ctx) { boolean isGreaterThanNegativeOne = asBinary.getOperator() == J.Binary.Type.GreaterThan && "-1".equals(valueSource); boolean isGreaterThanOrEqualToZero = asBinary.getOperator() == J.Binary.Type.GreaterThanOrEqual && "0".equals(valueSource); if (isGreaterThanNegativeOne || isGreaterThanOrEqualToZero) { - j = mi.withTemplate(STRING_INDEX_MATCHER.matches(mi) ? stringContains : listContains, - getCursor(), mi.getCoordinates().replace(), mi.getSelect(), mi.getArguments().get(0)).withPrefix(asBinary.getPrefix()); + Cursor cursor = new Cursor(new Cursor(getCursor().getParent(), asBinary), asBinary.getLeft()); + j = (STRING_INDEX_MATCHER.matches(mi) ? stringContains : listContains) + .apply(cursor, mi.getCoordinates().replace(), mi.getSelect(), mi.getArguments().get(0)) + .withPrefix(asBinary.getPrefix()); } } } diff --git a/src/main/java/org/openrewrite/staticanalysis/IsEmptyCallOnCollections.java b/src/main/java/org/openrewrite/staticanalysis/IsEmptyCallOnCollections.java index 4172f62d0..bbb0d1f23 100755 --- a/src/main/java/org/openrewrite/staticanalysis/IsEmptyCallOnCollections.java +++ b/src/main/java/org/openrewrite/staticanalysis/IsEmptyCallOnCollections.java @@ -58,10 +58,10 @@ public Duration getEstimatedEffortPerOccurrence() { public TreeVisitor getVisitor() { return Preconditions.check(new UsesMethod<>(COLLECTION_SIZE), new JavaVisitor() { final JavaTemplate isEmpty = JavaTemplate.builder("#{}#{any(java.util.Collection)}.isEmpty()") - .context(this::getCursor) + .contextSensitive() .build(); final JavaTemplate isEmptyNoReceiver = JavaTemplate.builder("#{}isEmpty()") - .context(this::getCursor) + .contextSensitive() .build(); @Override @@ -77,8 +77,8 @@ public J visitBinary(J.Binary binary, ExecutionContext ctx) { if (COLLECTION_SIZE.matches(maybeSizeCallMethod)) { String op = binary.getOperator() == J.Binary.Type.Equal ? "" : "!"; return (maybeSizeCallMethod.getSelect() == null ? - binary.withTemplate(isEmptyNoReceiver, getCursor(), binary.getCoordinates().replace(), op) : - binary.withTemplate(isEmpty, getCursor(), binary.getCoordinates().replace(), op, maybeSizeCallMethod.getSelect()) + isEmptyNoReceiver.apply(getCursor(), binary.getCoordinates().replace(), op) : + isEmpty.apply(getCursor(), binary.getCoordinates().replace(), op, maybeSizeCallMethod.getSelect()) ).withPrefix(binary.getPrefix()); } } diff --git a/src/main/java/org/openrewrite/staticanalysis/MinimumSwitchCases.java b/src/main/java/org/openrewrite/staticanalysis/MinimumSwitchCases.java index c853c9d23..b0965b5f6 100644 --- a/src/main/java/org/openrewrite/staticanalysis/MinimumSwitchCases.java +++ b/src/main/java/org/openrewrite/staticanalysis/MinimumSwitchCases.java @@ -66,44 +66,44 @@ public JavaVisitor getVisitor() { final JavaTemplate ifElseIfPrimitive = JavaTemplate.builder("" + "if(#{any()} == #{any()}) {\n" + "} else if(#{any()} == #{any()}) {\n" + - "}").context(this::getCursor).build(); + "}").contextSensitive().build(); final JavaTemplate ifElseIfString = JavaTemplate.builder("" + "if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" + "} else if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" + - "}").context(this::getCursor).build(); + "}").contextSensitive().build(); final JavaTemplate ifElseIfEnum = JavaTemplate.builder("" + "if(#{any()} == #{}) {\n" + "} else if(#{any()} == #{}) {\n" + - "}").context(this::getCursor).build(); + "}").contextSensitive().build(); final JavaTemplate ifElsePrimitive = JavaTemplate.builder("" + "if(#{any()} == #{any()}) {\n" + "} else {\n" + - "}").context(this::getCursor).build(); + "}").contextSensitive().build(); final JavaTemplate ifElseString = JavaTemplate.builder("" + "if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" + "} else {\n" + - "}").context(this::getCursor).build(); + "}").contextSensitive().build(); final JavaTemplate ifElseEnum = JavaTemplate.builder("" + "if(#{any()} == #{}) {\n" + "} else {\n" + - "}").context(this::getCursor).build(); + "}").contextSensitive().build(); final JavaTemplate ifPrimitive = JavaTemplate.builder("" + "if(#{any()} == #{any()}) {\n" + - "}").context(this::getCursor).build(); + "}").contextSensitive().build(); final JavaTemplate ifString = JavaTemplate.builder("" + "if(#{any(java.lang.String)}.equals(#{any(java.lang.String)})) {\n" + - "}").context(this::getCursor).build(); + "}").contextSensitive().build(); final JavaTemplate ifEnum = JavaTemplate.builder("" + "if(#{any()} == #{}) {\n" + - "}").context(this::getCursor).build(); + "}").contextSensitive().build(); @Override public J visitBlock(J.Block block, ExecutionContext executionContext) { @@ -164,45 +164,36 @@ public J visitSwitch(J.Switch switch_, ExecutionContext ctx) { if (isDefault(cases[0])) { return switch_.withMarkers(switch_.getMarkers().add(new DefaultOnly())); } else { - generatedIf = switch_.withTemplate(ifString, getCursor(), switch_.getCoordinates().replace(), - cases[0].getPattern(), tree); + generatedIf = ifString.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree); } } else if (isDefault(cases[1])) { - generatedIf = switch_.withTemplate(ifElseString, getCursor(), switch_.getCoordinates().replace(), - cases[0].getPattern(), tree); + generatedIf = ifElseString.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree); } else { - generatedIf = switch_.withTemplate(ifElseIfString, getCursor(), switch_.getCoordinates().replace(), - cases[0].getPattern(), tree, cases[1].getPattern(), tree); + generatedIf = ifElseIfString.apply(getCursor(), switch_.getCoordinates().replace(), cases[0].getPattern(), tree, cases[1].getPattern(), tree); } } else if (switchesOnEnum(switch_)) { if (cases[1] == null) { if (isDefault(cases[0])) { return switch_.withMarkers(switch_.getMarkers().add(new DefaultOnly())); } else { - generatedIf = switch_.withTemplate(ifEnum, getCursor(), switch_.getCoordinates().replace(), - tree, enumIdentToFieldAccessString(cases[0].getPattern())); + generatedIf = ifEnum.apply(getCursor(), switch_.getCoordinates().replace(), tree, enumIdentToFieldAccessString(cases[0].getPattern())); } } else if (isDefault(cases[1])) { - generatedIf = switch_.withTemplate(ifElseEnum, getCursor(), switch_.getCoordinates().replace(), - tree, enumIdentToFieldAccessString(cases[0].getPattern())); + generatedIf = ifElseEnum.apply(getCursor(), switch_.getCoordinates().replace(), tree, enumIdentToFieldAccessString(cases[0].getPattern())); } else { - generatedIf = switch_.withTemplate(ifElseIfEnum, getCursor(), switch_.getCoordinates().replace(), - tree, enumIdentToFieldAccessString(cases[0].getPattern()), tree, enumIdentToFieldAccessString(cases[1].getPattern())); + generatedIf = ifElseIfEnum.apply(getCursor(), switch_.getCoordinates().replace(), tree, enumIdentToFieldAccessString(cases[0].getPattern()), tree, enumIdentToFieldAccessString(cases[1].getPattern())); } } else { if (cases[1] == null) { if (isDefault(cases[0])) { return switch_.withMarkers(switch_.getMarkers().add(new DefaultOnly())); } else { - generatedIf = switch_.withTemplate(ifPrimitive, getCursor(), switch_.getCoordinates().replace(), - tree, cases[0].getPattern()); + generatedIf = ifPrimitive.apply(getCursor(), switch_.getCoordinates().replace(), tree, cases[0].getPattern()); } } else if (isDefault(cases[1])) { - generatedIf = switch_.withTemplate(ifElsePrimitive, getCursor(), switch_.getCoordinates().replace(), - tree, cases[0].getPattern()); + generatedIf = ifElsePrimitive.apply(getCursor(), switch_.getCoordinates().replace(), tree, cases[0].getPattern()); } else { - generatedIf = switch_.withTemplate(ifElseIfPrimitive, getCursor(), switch_.getCoordinates().replace(), - tree, cases[0].getPattern(), tree, cases[1].getPattern()); + generatedIf = ifElseIfPrimitive.apply(getCursor(), switch_.getCoordinates().replace(), tree, cases[0].getPattern(), tree, cases[1].getPattern()); } } diff --git a/src/main/java/org/openrewrite/staticanalysis/MissingOverrideAnnotation.java b/src/main/java/org/openrewrite/staticanalysis/MissingOverrideAnnotation.java index dd80a14a6..0f8f22dc4 100644 --- a/src/main/java/org/openrewrite/staticanalysis/MissingOverrideAnnotation.java +++ b/src/main/java/org/openrewrite/staticanalysis/MissingOverrideAnnotation.java @@ -82,10 +82,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex && !(Boolean.TRUE.equals(ignoreAnonymousClassMethods) && getCursorToParentScope(getCursor()).getValue() instanceof J.NewClass)) { - method = method.withTemplate( - JavaTemplate.builder("@Override").build(), - getCursor(), - method.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + method = JavaTemplate.builder("@Override").build().apply(getCursor(), method.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); } return super.visitMethodDeclaration(method, ctx); } diff --git a/src/main/java/org/openrewrite/staticanalysis/NewStringBuilderBufferWithCharArgument.java b/src/main/java/org/openrewrite/staticanalysis/NewStringBuilderBufferWithCharArgument.java index a892f6ef8..21c0feedb 100644 --- a/src/main/java/org/openrewrite/staticanalysis/NewStringBuilderBufferWithCharArgument.java +++ b/src/main/java/org/openrewrite/staticanalysis/NewStringBuilderBufferWithCharArgument.java @@ -15,10 +15,7 @@ */ package org.openrewrite.staticanalysis; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Preconditions; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; +import org.openrewrite.*; import org.openrewrite.internal.ListUtils; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaTemplate; @@ -75,7 +72,8 @@ public J.NewClass visitNewClass(J.NewClass newClass, ExecutionContext executionC } return l; } else { - return arg.withTemplate(toString, getCursor(), arg.getCoordinates().replace(), arg); + Cursor cursor = new Cursor(getCursor(), arg); + return toString.apply(cursor, arg.getCoordinates().replace(), arg); } })); } diff --git a/src/main/java/org/openrewrite/staticanalysis/NoDoubleBraceInitialization.java b/src/main/java/org/openrewrite/staticanalysis/NoDoubleBraceInitialization.java index 0bc91ea2e..3f3896939 100644 --- a/src/main/java/org/openrewrite/staticanalysis/NoDoubleBraceInitialization.java +++ b/src/main/java/org/openrewrite/staticanalysis/NoDoubleBraceInitialization.java @@ -121,7 +121,7 @@ public J.NewClass visitNewClass(J.NewClass newClass, ExecutionContext executionC fq = fq.getSupertype(); String newInitializer = " new " + fq.getClassName() + "<>();"; JavaTemplate template = JavaTemplate.builder(newInitializer).imports(fq.getFullyQualifiedName()).build(); - nc = nc.withTemplate(template, getCursor(), nc.getCoordinates().replace()); + nc = template.apply(getCursor(), nc.getCoordinates().replace()); initStatements = addSelectToInitStatements(initStatements, var.getName(), executionContext); initStatements.add(0, new J.Assignment(UUID.randomUUID(), Space.EMPTY, Markers.EMPTY, var.getName().withId(UUID.randomUUID()), JLeftPadded.build(nc), fq)); parentBlockCursor.computeMessageIfAbsent("INIT_STATEMENTS", v -> new HashMap>()).put(varDeclsCursor.getValue(), initStatements); diff --git a/src/main/java/org/openrewrite/staticanalysis/NoValueOfOnStringType.java b/src/main/java/org/openrewrite/staticanalysis/NoValueOfOnStringType.java index 147fef088..f8d9c9d74 100644 --- a/src/main/java/org/openrewrite/staticanalysis/NoValueOfOnStringType.java +++ b/src/main/java/org/openrewrite/staticanalysis/NoValueOfOnStringType.java @@ -73,7 +73,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) Expression argument = mi.getArguments().get(0); if (TypeUtils.isString(argument.getType()) || removeValueOfFromBinaryExpression(argument)) { - return mi.withTemplate(t, getCursor(), mi.getCoordinates().replace(), argument); + return t.apply(getCursor(), mi.getCoordinates().replace(), argument); } } return mi; diff --git a/src/main/java/org/openrewrite/staticanalysis/ObjectFinalizeCallsSuper.java b/src/main/java/org/openrewrite/staticanalysis/ObjectFinalizeCallsSuper.java index af6ce76e4..096b4d22c 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ObjectFinalizeCallsSuper.java +++ b/src/main/java/org/openrewrite/staticanalysis/ObjectFinalizeCallsSuper.java @@ -15,10 +15,7 @@ */ package org.openrewrite.staticanalysis; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Preconditions; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; +import org.openrewrite.*; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaTemplate; import org.openrewrite.java.MethodMatcher; @@ -61,9 +58,11 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex J.MethodDeclaration md = super.visitMethodDeclaration(method, executionContext); if (FINALIZE_METHOD_MATCHER.matches(md.getMethodType()) && !hasSuperFinalizeMethodInvocation(md)) { //noinspection ConstantConditions - md = md.withTemplate(JavaTemplate.builder("super.finalize()") - .context(getCursor()).build(), - getCursor(), md.getBody().getCoordinates().lastStatement()); + md = JavaTemplate.builder("super.finalize()") + .contextSensitive() + .build() + .apply(new Cursor(getCursor().getParent(), md), + md.getBody().getCoordinates().lastStatement()); } return md; } diff --git a/src/main/java/org/openrewrite/staticanalysis/PrimitiveWrapperClassConstructorToValueOf.java b/src/main/java/org/openrewrite/staticanalysis/PrimitiveWrapperClassConstructorToValueOf.java index 6dd59b6be..397f3939d 100644 --- a/src/main/java/org/openrewrite/staticanalysis/PrimitiveWrapperClassConstructorToValueOf.java +++ b/src/main/java/org/openrewrite/staticanalysis/PrimitiveWrapperClassConstructorToValueOf.java @@ -111,7 +111,7 @@ public J visitNewClass(J.NewClass newClass, ExecutionContext executionContext) { default: return nc; } - return nc.withTemplate(valueOf.build(), getCursor(), nc.getCoordinates().replace(), arg); + return valueOf.build().apply(getCursor(), nc.getCoordinates().replace(), arg); } return nc; } diff --git a/src/main/java/org/openrewrite/staticanalysis/RemoveInstanceOfPatternMatch.java b/src/main/java/org/openrewrite/staticanalysis/RemoveInstanceOfPatternMatch.java index e335010b4..e9a813361 100644 --- a/src/main/java/org/openrewrite/staticanalysis/RemoveInstanceOfPatternMatch.java +++ b/src/main/java/org/openrewrite/staticanalysis/RemoveInstanceOfPatternMatch.java @@ -125,8 +125,8 @@ public J.If visitIf(J.If iff, ExecutionContext ctx) { while (iter.hasNext()) { J.InstanceOf instanceOf = iter.next(); if (thenInstanceOfs.contains(instanceOf)) { - result = result.withThenPart(addVariableDeclaration( - (J.Block) result.getThenPart(), instanceOf, ctx)); + Cursor blockCursor = new Cursor(new Cursor(getCursor().getParent(), result), result.getThenPart()); + result = result.withThenPart(addVariableDeclaration(blockCursor, instanceOf, ctx)); } } } @@ -151,9 +151,9 @@ public J.If visitIf(J.If iff, ExecutionContext ctx) { while (iter.hasNext()) { J.InstanceOf instanceOf = iter.next(); if (elseInstanceOfs.contains(instanceOf)) { + Cursor blockCursor = new Cursor(new Cursor(new Cursor(getCursor().getParent(), result), elsePart), elsePart.getBody()); result = result.withElsePart(elsePart.withBody( - addVariableDeclaration( - (J.Block) elsePart.getBody(), instanceOf, ctx))); + addVariableDeclaration(blockCursor, instanceOf, ctx))); } } } @@ -166,20 +166,18 @@ public J.If visitIf(J.If iff, ExecutionContext ctx) { * declaration is based on a pattern variable declared in an instanceof * expression. * - * @param block the statement block - * @param instanceOf the instanceof expression - * @param ctx the execution context + * @param blockCursor the cursor to the statement block + * @param instanceOf the instanceof expression + * @param ctx the execution context * @return the updated block */ - private J.Block addVariableDeclaration(J.Block block, J.InstanceOf instanceOf, ExecutionContext ctx) { + private J.Block addVariableDeclaration(Cursor blockCursor, J.InstanceOf instanceOf, ExecutionContext ctx) { + J.Block block = blockCursor.getValue(); JavaTemplate template = JavaTemplate .builder("#{} #{} = (#{}) #{any()};") - .context(() -> new Cursor(getCursor(), block)) + .contextSensitive() .build(); - return block.withTemplate(template, - getCursor(), - block.getCoordinates().firstStatement(), - instanceOf.getClazz().toString(), + return template.apply(blockCursor, block.getCoordinates().firstStatement(), instanceOf.getClazz().toString(), ((J.Identifier) Objects.requireNonNull(instanceOf.getPattern())).getSimpleName(), instanceOf.getClazz().toString(), visit(instanceOf.getExpression(), ctx)); diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceDeprecatedRuntimeExecMethods.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceDeprecatedRuntimeExecMethods.java index 77f239a10..16e9297a2 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceDeprecatedRuntimeExecMethods.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceDeprecatedRuntimeExecMethods.java @@ -15,10 +15,7 @@ */ package org.openrewrite.staticanalysis; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Preconditions; -import org.openrewrite.Recipe; -import org.openrewrite.TreeVisitor; +import org.openrewrite.*; import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; import org.openrewrite.java.JavaTemplate; @@ -83,7 +80,8 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu JavaTemplate template = JavaTemplate.builder(templateCode).build(); List args = m.getArguments(); - args.set(0, args.get(0).withTemplate(template, getCursor(), args.get(0).getCoordinates().replace())); + Cursor cursor = new Cursor(new Cursor(getCursor().getParent(), m), args.get(0)); + args.set(0, template.apply(cursor, args.get(0).getCoordinates().replace())); if (m.getMethodType() != null) { List parameterTypes = m.getMethodType().getParameterTypes(); @@ -104,8 +102,9 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu } String code = needWrap ? "(#{any()}).split(\" \")" : "#{any()}.split(\" \")"; - JavaTemplate template = JavaTemplate.builder(code).context(getCursor()).build(); - arg0 = args.get(0).withTemplate(template, getCursor(), args.get(0).getCoordinates().replace(), args.get(0)); + JavaTemplate template = JavaTemplate.builder(code).contextSensitive().build(); + Cursor cursor = new Cursor(new Cursor(getCursor().getParent(), m), args.get(0)); + arg0 = template.apply(cursor, args.get(0).getCoordinates().replace(), args.get(0)); args.set(0, arg0); if (m.getMethodType() != null) { diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiterals.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiterals.java index 24bb52734..7361a4d4a 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiterals.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceDuplicateStringLiterals.java @@ -172,10 +172,8 @@ public J visitClassDeclaration(J.ClassDeclaration classDecl, ExecutionContext ct } } else { classDecl = classDecl.withBody( - classDecl.getBody().withTemplate( - JavaTemplate.builder(insertStatement).context(getCursor()).build(), - getCursor(), - classDecl.getBody().getCoordinates().firstStatement(), replaceLiteral)); + JavaTemplate.builder(insertStatement).contextSensitive().build() + .apply(new Cursor(getCursor(), classDecl.getBody()), classDecl.getBody().getCoordinates().firstStatement(), replaceLiteral)); } } variableNames.add(variableName); diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java index d6c4f1753..9b58e98e3 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java @@ -103,10 +103,10 @@ public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { "package " + fullyQualified.getPackageName() + "; public class " + fullyQualified.getClassName(); JavaTemplate template = JavaTemplate.builder(code) - .context(this::getCursor) + .contextSensitive() .javaParser(JavaParser.fromJavaVersion().dependsOn(stub)) .imports(fullyQualified == null ? "" : fullyQualified.getFullyQualifiedName()).build(); - return l.withTemplate(template, getCursor(), l.getCoordinates().replace(), identifier.getSimpleName()); + return template.apply(getCursor(), l.getCoordinates().replace(), identifier.getSimpleName()); } else if (body instanceof J.Binary) { J.Binary binary = (J.Binary) body; if (isNullCheck(binary.getLeft(), binary.getRight()) || @@ -114,10 +114,7 @@ public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { maybeAddImport("java.util.Objects"); code = J.Binary.Type.Equal.equals(binary.getOperator()) ? "Objects::isNull" : "Objects::nonNull"; - return l.withTemplate( - JavaTemplate.builder(code).context(getCursor()).imports("java.util.Objects").build(), - getCursor(), - l.getCoordinates().replace()); + return JavaTemplate.builder(code).contextSensitive().imports("java.util.Objects").build().apply(getCursor(), l.getCoordinates().replace()); } } else if (body instanceof MethodCall) { MethodCall method = (MethodCall) body; @@ -149,21 +146,17 @@ public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { if (methodType.hasFlags(Flag.Static) || methodSelectMatchesFirstLambdaParameter(method, lambda)) { maybeAddImport(declaringType); - return l.withTemplate(JavaTemplate.builder("#{}::#{}") - .context(getCursor()) - .imports(declaringType.getFullyQualifiedName()) - .build(), - getCursor(), - l.getCoordinates().replace(), declaringType.getClassName(), - method.getMethodType().getName()); + return JavaTemplate.builder("#{}::#{}") + .contextSensitive() + .imports(declaringType.getFullyQualifiedName()) + .build().apply(getCursor(), l.getCoordinates().replace(), declaringType.getClassName(), + method.getMethodType().getName()); } else if (method instanceof J.NewClass) { - return l.withTemplate(JavaTemplate.builder("#{}::new").context(getCursor()).build(), - getCursor(), l.getCoordinates().replace(), className((J.NewClass) method)); + return JavaTemplate.builder("#{}::new").contextSensitive().build().apply(getCursor(), l.getCoordinates().replace(), className((J.NewClass) method)); } else { String templ = select == null ? "#{}::#{}" : "#{any(" + declaringType.getFullyQualifiedName() + ")}::#{}"; - return l.withTemplate(JavaTemplate.builder(templ).context(getCursor()).build(), - getCursor(), l.getCoordinates().replace(), select == null ? "this" : select, + return JavaTemplate.builder(templ).contextSensitive().build().apply(getCursor(), l.getCoordinates().replace(), select == null ? "this" : select, method.getMethodType().getName()); } } diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceRedundantFormatWithPrintf.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceRedundantFormatWithPrintf.java index f0c087782..7e567b631 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceRedundantFormatWithPrintf.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceRedundantFormatWithPrintf.java @@ -137,15 +137,10 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu } code.append(")"); - JavaTemplate template = JavaTemplate.builder(code.toString()).context(getCursor()).build(); + JavaTemplate template = JavaTemplate.builder(code.toString()).contextSensitive().build(); return maybeAutoFormat( method, - method.withTemplate( - template, - getCursor(), - method.getCoordinates().replaceMethod(), - printfArgs.toArray() - ), + template.apply(getCursor(), method.getCoordinates().replaceMethod(), printfArgs.toArray()), ctx ); } diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceStreamToListWithCollect.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceStreamToListWithCollect.java index b7783e1ca..a4d7ee388 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceStreamToListWithCollect.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceStreamToListWithCollect.java @@ -64,7 +64,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) J.MethodInvocation result = (J.MethodInvocation) super.visitMethodInvocation(method, ctx); if (STREAM_TO_LIST.matches(method)) { JRightPadded select = result.getPadding().getSelect(); - result = result.withTemplate(template, getCursor(), result.getCoordinates().replace(), result.getSelect()); + result = template.apply(getCursor(), result.getCoordinates().replace(), result.getSelect()); result = result.getPadding().withSelect(select); maybeAddImport("java.util.stream.Collectors"); } diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceValidateNotNullHavingVarargsWithObjectsRequireNonNull.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceValidateNotNullHavingVarargsWithObjectsRequireNonNull.java index 1bd8e8699..b2b5a64fe 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceValidateNotNullHavingVarargsWithObjectsRequireNonNull.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceValidateNotNullHavingVarargsWithObjectsRequireNonNull.java @@ -65,14 +65,10 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext p) { maybeRemoveImport("org.apache.commons.lang3.Validate"); maybeAddImport("java.util.Objects"); - mi = mi.withTemplate( - JavaTemplate.builder(template) - .context(getCursor()) - .imports("java.util.Objects") - .build(), - getCursor(), - mi.getCoordinates().replace(), - arguments.toArray()); + mi = JavaTemplate.builder(template) + .contextSensitive() + .imports("java.util.Objects") + .build().apply(getCursor(), mi.getCoordinates().replace(), arguments.toArray()); if (arguments.size() == 2) { return maybeAutoFormat(mi, mi.withArguments( diff --git a/src/main/java/org/openrewrite/staticanalysis/SimplifyConsecutiveAssignments.java b/src/main/java/org/openrewrite/staticanalysis/SimplifyConsecutiveAssignments.java index 6858cfd1a..94b71b507 100644 --- a/src/main/java/org/openrewrite/staticanalysis/SimplifyConsecutiveAssignments.java +++ b/src/main/java/org/openrewrite/staticanalysis/SimplifyConsecutiveAssignments.java @@ -15,10 +15,7 @@ */ package org.openrewrite.staticanalysis; -import org.openrewrite.ExecutionContext; -import org.openrewrite.Recipe; -import org.openrewrite.Tree; -import org.openrewrite.TreeVisitor; +import org.openrewrite.*; import org.openrewrite.internal.ListUtils; import org.openrewrite.internal.lang.Nullable; import org.openrewrite.java.JavaIsoVisitor; @@ -52,7 +49,7 @@ public TreeVisitor getVisitor() { // TODO if we had a `replace()` coordinate on every `Expression`, we wouldn't need the left side of this final JavaTemplate combinedAssignment = JavaTemplate .builder("o = (#{any()} #{} #{any()});") - .context(this::getCursor) + .contextSensitive() // ok to ignore invalid type info on left-hand side of assignment. .build(); @@ -64,6 +61,7 @@ public J.Block visitBlock(J.Block block, ExecutionContext ctx) { b = combined; J.Block b2 = b; AtomicInteger skip = new AtomicInteger(-1); + Cursor blockCursor = new Cursor(getCursor().getParent(), b); combined = b.withStatements(ListUtils.map(b.getStatements(), (i, stat) -> { if (skip.get() == i) { @@ -82,7 +80,7 @@ public J.Block visitBlock(J.Block block, ExecutionContext ctx) { if (acc != null && op != null) { skip.set(i + 1); // combine this statement with the following statement into one binary expression - return combine(stat, op, acc); + return combine(new Cursor(blockCursor, stat), op, acc); } } @@ -185,16 +183,15 @@ private String singleVariableName(Expression e) { null; } - private Statement combine(Statement s, String op, Expression right) { + private Statement combine(Cursor cursor, String op, Expression right) { + Statement s = cursor.getValue(); if (s instanceof J.Assignment) { J.Assignment assign = (J.Assignment) s; - J.Assignment after = s.withTemplate(combinedAssignment, getCursor(), s.getCoordinates().replace(), - assign.getAssignment(), op, right); + J.Assignment after = combinedAssignment.apply(cursor, s.getCoordinates().replace(), assign.getAssignment(), op, right); return assign.withAssignment(after.getAssignment()); } else if (s instanceof J.VariableDeclarations) { J.VariableDeclarations variables = (J.VariableDeclarations) s; - J.Assignment after = s.withTemplate(combinedAssignment, getCursor(), s.getCoordinates().replace(), - variables.getVariables().get(0).getInitializer(), op, right); + J.Assignment after = combinedAssignment.apply(cursor, s.getCoordinates().replace(), variables.getVariables().get(0).getInitializer(), op, right); return variables.withVariables(ListUtils.map(variables.getVariables(), (i, namedVar) -> i == 0 ? namedVar.withInitializer(after.getAssignment()) : namedVar)); } diff --git a/src/main/java/org/openrewrite/staticanalysis/SimplifyDurationCreationUnits.java b/src/main/java/org/openrewrite/staticanalysis/SimplifyDurationCreationUnits.java index af1515c0a..c9aa9667a 100644 --- a/src/main/java/org/openrewrite/staticanalysis/SimplifyDurationCreationUnits.java +++ b/src/main/java/org/openrewrite/staticanalysis/SimplifyDurationCreationUnits.java @@ -101,16 +101,11 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu return method; } - JavaTemplate template = JavaTemplate.builder("#{}(#{})").context(this::getCursor).build(); + JavaTemplate template = JavaTemplate.builder("#{}(#{})").contextSensitive().build(); return maybeAutoFormat( method, - method.withTemplate( - template, - getCursor(), - method.getCoordinates().replaceMethod(), - simplifiedUnits.methodName, - millis / simplifiedUnits.millisFactor - ), + template.apply(getCursor(), method.getCoordinates().replaceMethod(), simplifiedUnits.methodName, + millis / simplifiedUnits.millisFactor), ctx ); } diff --git a/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java b/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java index a8d3969ea..e847bebdc 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java @@ -43,9 +43,8 @@ public TreeVisitor getVisitor() { public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext executionContext) { J.MethodInvocation mi = super.visitMethodInvocation(method, executionContext); if (removeAll.matches(mi) && !returnValueIsUsed()) { - mi = mi.withTemplate(JavaTemplate.builder("#{any(java.util.Collection)}.forEach(#{any(java.util.Set)}::remove)") - .build(), - getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getSelect()); + mi = JavaTemplate.builder("#{any(java.util.Collection)}.forEach(#{any(java.util.Set)}::remove)") + .build().apply(getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getSelect()); } return mi; } diff --git a/src/main/java/org/openrewrite/staticanalysis/UseLambdaForFunctionalInterface.java b/src/main/java/org/openrewrite/staticanalysis/UseLambdaForFunctionalInterface.java index ee58bdb9d..e7e03ec64 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseLambdaForFunctionalInterface.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseLambdaForFunctionalInterface.java @@ -117,13 +117,9 @@ public J visitNewClass(J.NewClass newClass, ExecutionContext ctx) { } templateBuilder.append('}'); - J.Lambda lambda = n.withTemplate( - JavaTemplate.builder(templateBuilder.toString()) - .context(getCursor()) - .build(), - getCursor(), - n.getCoordinates().replace() - ); + J.Lambda lambda = JavaTemplate.builder(templateBuilder.toString()) + .contextSensitive() + .build().apply(getCursor(), n.getCoordinates().replace()); lambda = lambda.withType(typedInterface); lambda = (J.Lambda) new UnnecessaryParentheses().getVisitor() .visitNonNull(lambda, ctx, getCursor().getParentOrThrow()); diff --git a/src/main/java/org/openrewrite/staticanalysis/UseListSort.java b/src/main/java/org/openrewrite/staticanalysis/UseListSort.java index 47b15328e..ad5b45d6e 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseListSort.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseListSort.java @@ -47,13 +47,11 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu if (collectionsSort.matches(mi)) { maybeRemoveImport("java.util.Collections"); if (mi.getArguments().size() == 1) { - return mi.withTemplate(JavaTemplate.builder("#{any(java.util.List)}.sort(null)") - .imports("java.util.List").build(), - getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0)); + return JavaTemplate.builder("#{any(java.util.List)}.sort(null)") + .imports("java.util.List").build().apply(getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0)); } else { - return mi.withTemplate(JavaTemplate.builder("#{any(java.util.List)}.sort(#{any(java.util.Comparator)})") - .imports("java.util.List", "java.util.Comparator").build(), - getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getArguments().get(1)); + return JavaTemplate.builder("#{any(java.util.List)}.sort(#{any(java.util.Comparator)})") + .imports("java.util.List", "java.util.Comparator").build().apply(getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getArguments().get(1)); } } return mi; diff --git a/src/main/java/org/openrewrite/staticanalysis/UseStandardCharset.java b/src/main/java/org/openrewrite/staticanalysis/UseStandardCharset.java index 1439d2b25..87877084d 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseStandardCharset.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseStandardCharset.java @@ -90,10 +90,8 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext execu } if (!StringUtils.isBlank(standardName)) { - return m.withTemplate(JavaTemplate.builder("StandardCharsets." + standardName) - .imports("java.nio.charset.StandardCharsets").build(), - getCursor(), - m.getCoordinates().replace()); + return JavaTemplate.builder("StandardCharsets." + standardName) + .imports("java.nio.charset.StandardCharsets").build().apply(getCursor(), m.getCoordinates().replace()); } } } diff --git a/src/main/java/org/openrewrite/staticanalysis/UseSystemLineSeparator.java b/src/main/java/org/openrewrite/staticanalysis/UseSystemLineSeparator.java index 9aa341422..7aac17895 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseSystemLineSeparator.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseSystemLineSeparator.java @@ -70,10 +70,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) .builder("#{any(java.lang.System)}.lineSeparator()") .build(); - return method.withTemplate(template, - getCursor(), - method.getCoordinates().replace(), - method.getSelect()); + return template.apply(getCursor(), method.getCoordinates().replace(), method.getSelect()); } else { // static import scenario maybeRemoveImport("java.lang.System.getProperty"); @@ -84,10 +81,8 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) .staticImports("java.lang.System.lineSeparator") .build(); - return method.withTemplate(template, - getCursor(), - method.getCoordinates() - .replace()); + return template.apply(getCursor(), method.getCoordinates() + .replace()); } } diff --git a/src/main/java/org/openrewrite/staticanalysis/WhileInsteadOfFor.java b/src/main/java/org/openrewrite/staticanalysis/WhileInsteadOfFor.java index 6f5e73a55..12077e0ed 100644 --- a/src/main/java/org/openrewrite/staticanalysis/WhileInsteadOfFor.java +++ b/src/main/java/org/openrewrite/staticanalysis/WhileInsteadOfFor.java @@ -52,7 +52,7 @@ public Duration getEstimatedEffortPerOccurrence() { public TreeVisitor getVisitor() { return new JavaVisitor() { final JavaTemplate whileLoop = JavaTemplate.builder("while(#{any(boolean)}) {}") - .context(this::getCursor) + .contextSensitive() .build(); @Override @@ -61,8 +61,7 @@ public J visitForLoop(J.ForLoop forLoop, ExecutionContext ctx) { forLoop.getControl().getUpdate().get(0) instanceof J.Empty && !(forLoop.getControl().getCondition() instanceof J.Empty) ) { - J.WhileLoop w = forLoop.withTemplate(whileLoop, getCursor(), forLoop.getCoordinates().replace(), - forLoop.getControl().getCondition()); + J.WhileLoop w = whileLoop.apply(getCursor(), forLoop.getCoordinates().replace(), forLoop.getControl().getCondition()); w = w.withBody(forLoop.getBody()); return w; } From 29cc68915f2d136e15b7d8e882fbd0d5dacf61fb Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Thu, 1 Jun 2023 20:47:03 +0200 Subject: [PATCH 2/3] Use new `TreeVisitor#updateCursor(Object)` --- build.gradle.kts | 1 + .../AddSerialVersionUidToSerializable.java | 2 +- .../AtomicPrimitiveEqualsUsesGet.java | 3 +- .../AvoidBoxedBooleanExpressions.java | 6 ++- .../BigDecimalRoundingConstantsToEnums.java | 6 +-- .../CompareEnumsWithEqualityOperator.java | 3 +- .../CovariantEqualsVisitor.java | 14 +++--- .../staticanalysis/EmptyBlockVisitor.java | 4 +- .../ExplicitCharsetOnStringGetBytes.java | 2 +- .../ExternalizableHasNoArgsConstructor.java | 5 ++- .../HideUtilityClassConstructorVisitor.java | 5 ++- .../IndexOfReplaceableByContains.java | 2 +- .../MissingOverrideAnnotation.java | 2 +- ...ewStringBuilderBufferWithCharArgument.java | 4 +- .../NoDoubleBraceInitialization.java | 1 + .../staticanalysis/NoValueOfOnStringType.java | 2 +- .../ObjectFinalizeCallsSuper.java | 2 +- ...itiveWrapperClassConstructorToValueOf.java | 2 +- .../RemoveInstanceOfPatternMatch.java | 8 +++- .../ReplaceDeprecatedRuntimeExecMethods.java | 5 ++- .../ReplaceLambdaWithMethodReference.java | 44 ++++++++++++------- .../ReplaceRedundantFormatWithPrintf.java | 2 +- .../ReplaceStreamToListWithCollect.java | 2 +- ...avingVarargsWithObjectsRequireNonNull.java | 2 +- .../SimplifyConsecutiveAssignments.java | 4 +- .../SimplifyDurationCreationUnits.java | 2 +- ...UseForEachRemoveInsteadOfSetRemoveAll.java | 2 +- .../UseLambdaForFunctionalInterface.java | 4 +- .../staticanalysis/UseListSort.java | 9 +++- .../staticanalysis/UseStandardCharset.java | 4 +- .../UseSystemLineSeparator.java | 3 +- 31 files changed, 97 insertions(+), 60 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 4823fa54d..79731cc71 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { testImplementation("org.openrewrite:rewrite-groovy") testImplementation("org.junit-pioneer:junit-pioneer:2.0.0") + testImplementation("junit:junit:4.13.2") testRuntimeOnly("org.openrewrite:rewrite-java-17") testRuntimeOnly("com.google.code.findbugs:jsr305:latest.release") diff --git a/src/main/java/org/openrewrite/staticanalysis/AddSerialVersionUidToSerializable.java b/src/main/java/org/openrewrite/staticanalysis/AddSerialVersionUidToSerializable.java index fad6d107a..40f000b45 100644 --- a/src/main/java/org/openrewrite/staticanalysis/AddSerialVersionUidToSerializable.java +++ b/src/main/java/org/openrewrite/staticanalysis/AddSerialVersionUidToSerializable.java @@ -90,7 +90,7 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex return s; }))); if (needsSerialVersionId.get()) { - c = template.apply(getCursor(), c.getBody().getCoordinates().firstStatement()); + c = template.apply(updateCursor(c), c.getBody().getCoordinates().firstStatement()); } return c; } diff --git a/src/main/java/org/openrewrite/staticanalysis/AtomicPrimitiveEqualsUsesGet.java b/src/main/java/org/openrewrite/staticanalysis/AtomicPrimitiveEqualsUsesGet.java index 03d6d3e20..50bab7ce3 100644 --- a/src/main/java/org/openrewrite/staticanalysis/AtomicPrimitiveEqualsUsesGet.java +++ b/src/main/java/org/openrewrite/staticanalysis/AtomicPrimitiveEqualsUsesGet.java @@ -66,7 +66,8 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext execu if (fqt != null) { String templateString = "#{any(" + fqt.getFullyQualifiedName() + ")}.get() == #{any(" + fqt.getFullyQualifiedName() + ")}.get()"; return JavaTemplate.builder(templateString) - .imports(fqt.getFullyQualifiedName()).build().apply(getCursor(), mi.getCoordinates().replace(), mi.getSelect(), mi.getArguments().get(0)); + .imports(fqt.getFullyQualifiedName()).build() + .apply(updateCursor(mi), mi.getCoordinates().replace(), mi.getSelect(), mi.getArguments().get(0)); } } return mi; diff --git a/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java b/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java index 511d2dad9..190b86a39 100644 --- a/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java +++ b/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java @@ -59,7 +59,8 @@ public Expression visitExpression(Expression expression, ExecutionContext ctx) { Expression e = (Expression) super.visitExpression(expression, ctx); if (TypeUtils.isOfClassType(e.getType(), "java.lang.Boolean")) { if (isControlExpression(expression)) { - return JavaTemplate.builder("Boolean.TRUE.equals(#{any(java.lang.Boolean)})").build().apply(getCursor(), e.getCoordinates().replace(), e); + return JavaTemplate.builder("Boolean.TRUE.equals(#{any(java.lang.Boolean)})").build() + .apply(updateCursor(e), e.getCoordinates().replace(), e); } } return e; @@ -69,7 +70,8 @@ public Expression visitExpression(Expression expression, ExecutionContext ctx) { public J visitUnary(J.Unary unary, ExecutionContext executionContext) { J.Unary un = (J.Unary) super.visitUnary(unary, executionContext); if (J.Unary.Type.Not == un.getOperator() && TypeUtils.isOfClassType(un.getExpression().getType(), "java.lang.Boolean")) { - return JavaTemplate.builder("Boolean.FALSE.equals(#{any(java.lang.Boolean)})").build().apply(getCursor(), un.getCoordinates().replace(), un.getExpression()); + return JavaTemplate.builder("Boolean.FALSE.equals(#{any(java.lang.Boolean)})").build() + .apply(updateCursor(un), un.getCoordinates().replace(), un.getExpression()); } return un; } diff --git a/src/main/java/org/openrewrite/staticanalysis/BigDecimalRoundingConstantsToEnums.java b/src/main/java/org/openrewrite/staticanalysis/BigDecimalRoundingConstantsToEnums.java index 3c858a7e6..94d24d1df 100644 --- a/src/main/java/org/openrewrite/staticanalysis/BigDecimalRoundingConstantsToEnums.java +++ b/src/main/java/org/openrewrite/staticanalysis/BigDecimalRoundingConstantsToEnums.java @@ -83,14 +83,14 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu if (roundingModeEnum == null) { return m; } - m = twoArgDivide.apply(getCursor(), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum); + m = twoArgDivide.apply(updateCursor(m), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum); maybeAddImport("java.math.RoundingMode"); } else if (BIG_DECIMAL_SET_SCALE.matches(m) && isConvertibleBigDecimalConstant(m.getArguments().get(1))) { String roundingModeEnum = getTemplateText(m.getArguments().get(1)); if (roundingModeEnum == null) { return m; } - m = twoArgScale.apply(getCursor(), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum); + m = twoArgScale.apply(updateCursor(m), m.getCoordinates().replaceArguments(), m.getArguments().get(0), roundingModeEnum); maybeAddImport("java.math.RoundingMode"); } else if (BIG_DECIMAL_DIVIDE_WITH_SCALE.matches(m) && isConvertibleBigDecimalConstant(m.getArguments().get(2))) { @@ -98,7 +98,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu if (roundingModeEnum == null) { return m; } - m = threeArg.apply(getCursor(), m.getCoordinates().replaceArguments(), m.getArguments().get(0), m.getArguments().get(1), roundingModeEnum); + m = threeArg.apply(updateCursor(m), m.getCoordinates().replaceArguments(), m.getArguments().get(0), m.getArguments().get(1), roundingModeEnum); maybeAddImport("java.math.RoundingMode"); } return m; diff --git a/src/main/java/org/openrewrite/staticanalysis/CompareEnumsWithEqualityOperator.java b/src/main/java/org/openrewrite/staticanalysis/CompareEnumsWithEqualityOperator.java index 3d4b5550e..2a7053698 100644 --- a/src/main/java/org/openrewrite/staticanalysis/CompareEnumsWithEqualityOperator.java +++ b/src/main/java/org/openrewrite/staticanalysis/CompareEnumsWithEqualityOperator.java @@ -65,7 +65,8 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext execu return autoFormat(JavaTemplate .builder(code) .contextSensitive() - .build().apply(getCursor(), m.getCoordinates().replace(), m.getSelect(), m.getArguments().get(0)), executionContext); + .build() + .apply(updateCursor(m), m.getCoordinates().replace(), m.getSelect(), m.getArguments().get(0)), executionContext); } return m; } diff --git a/src/main/java/org/openrewrite/staticanalysis/CovariantEqualsVisitor.java b/src/main/java/org/openrewrite/staticanalysis/CovariantEqualsVisitor.java index a66f4f5a8..89d4fafbc 100644 --- a/src/main/java/org/openrewrite/staticanalysis/CovariantEqualsVisitor.java +++ b/src/main/java/org/openrewrite/staticanalysis/CovariantEqualsVisitor.java @@ -46,8 +46,8 @@ private static class ChangeCovariantEqualsMethodVisitor

extends JavaIsoVisito private static final AnnotationMatcher OVERRIDE_ANNOTATION = new AnnotationMatcher("@java.lang.Override"); private static final String EQUALS_BODY_PREFIX_TEMPLATE = "if (#{} == this) return true;\n" + - "if (#{} == null || getClass() != #{}.getClass()) return false;\n" + - "#{} #{} = (#{}) #{};\n"; + "if (#{} == null || getClass() != #{}.getClass()) return false;\n" + + "#{} #{} = (#{}) #{};\n"; private final J.ClassDeclaration enclosingClass; @@ -70,13 +70,13 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, P String ecfqn = type.getFullyQualifiedName(); if (new MethodMatcher(ecfqn + " equals(" + ecfqn + ")").matches(m, enclosingClass) && - m.hasModifier(J.Modifier.Type.Public) && - m.getReturnTypeExpression() != null && - JavaType.Primitive.Boolean.equals(m.getReturnTypeExpression().getType())) { + m.hasModifier(J.Modifier.Type.Public) && + m.getReturnTypeExpression() != null && + JavaType.Primitive.Boolean.equals(m.getReturnTypeExpression().getType())) { if (m.getAllAnnotations().stream().noneMatch(OVERRIDE_ANNOTATION::matches)) { m = JavaTemplate.builder("@Override").build() - .apply(new Cursor(getCursor().getParent(), m), + .apply(updateCursor(m), m.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); } @@ -88,7 +88,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, P J.VariableDeclarations.NamedVariable oldParamName = ((J.VariableDeclarations) m.getParameters().iterator().next()).getVariables().iterator().next(); String paramName = "obj".equals(oldParamName.getSimpleName()) ? "other" : "obj"; m = JavaTemplate.builder("Object #{}").contextSensitive().build() - .apply(new Cursor(getCursor().getParent(), m), + .apply(updateCursor(m), m.getCoordinates().replaceParameters(), paramName); diff --git a/src/main/java/org/openrewrite/staticanalysis/EmptyBlockVisitor.java b/src/main/java/org/openrewrite/staticanalysis/EmptyBlockVisitor.java index f2748dcf8..e121d6815 100644 --- a/src/main/java/org/openrewrite/staticanalysis/EmptyBlockVisitor.java +++ b/src/main/java/org/openrewrite/staticanalysis/EmptyBlockVisitor.java @@ -53,7 +53,7 @@ public J.WhileLoop visitWhileLoop(J.WhileLoop whileLoop, P p) { if (Boolean.TRUE.equals(emptyBlockStyle.getLiteralWhile()) && isEmptyBlock(w.getBody())) { J.Block body = (J.Block) w.getBody(); - w = continueStatement.apply(getCursor(), body.getCoordinates().lastStatement()); + w = continueStatement.apply(updateCursor(w), body.getCoordinates().lastStatement()); } return w; @@ -65,7 +65,7 @@ public J.DoWhileLoop visitDoWhileLoop(J.DoWhileLoop doWhileLoop, P p) { if (Boolean.TRUE.equals(emptyBlockStyle.getLiteralWhile()) && isEmptyBlock(w.getBody())) { J.Block body = (J.Block) w.getBody(); - w = continueStatement.apply(getCursor(), body.getCoordinates().lastStatement()); + w = continueStatement.apply(updateCursor(w), body.getCoordinates().lastStatement()); } return w; diff --git a/src/main/java/org/openrewrite/staticanalysis/ExplicitCharsetOnStringGetBytes.java b/src/main/java/org/openrewrite/staticanalysis/ExplicitCharsetOnStringGetBytes.java index d08ba5755..0e24c4ade 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ExplicitCharsetOnStringGetBytes.java +++ b/src/main/java/org/openrewrite/staticanalysis/ExplicitCharsetOnStringGetBytes.java @@ -62,7 +62,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu J.MethodInvocation m = super.visitMethodInvocation(method, ctx); if (GET_BYTES.matches(method)) { maybeAddImport("java.nio.charset.StandardCharsets"); - m = WITH_ENCODING.apply(getCursor(), method.getCoordinates().replaceMethod(), encoding == null ? "UTF_8" : encoding); + m = WITH_ENCODING.apply(updateCursor(m), m.getCoordinates().replaceMethod(), encoding == null ? "UTF_8" : encoding); } return m; } diff --git a/src/main/java/org/openrewrite/staticanalysis/ExternalizableHasNoArgsConstructor.java b/src/main/java/org/openrewrite/staticanalysis/ExternalizableHasNoArgsConstructor.java index af6abeb70..88cb7128f 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ExternalizableHasNoArgsConstructor.java +++ b/src/main/java/org/openrewrite/staticanalysis/ExternalizableHasNoArgsConstructor.java @@ -87,7 +87,10 @@ public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, Ex } } if (!hasFinalUninitializedFieldVar && !hasNoArgsConstructor(cd) && parentClassHasNoArgsConstructor(cd)) { - cd = JavaTemplate.builder("public " + cd.getSimpleName() + "() {}").contextSensitive().build().apply(getCursor(), cd.getBody().getCoordinates().lastStatement()); + cd = JavaTemplate.builder("public " + cd.getSimpleName() + "() {}") + .contextSensitive() + .build() + .apply(updateCursor(cd), cd.getBody().getCoordinates().lastStatement()); if (firstMethodDeclarationIndex != null) { statements.add(firstMethodDeclarationIndex, cd.getBody().getStatements().remove(cd.getBody().getStatements().size() - 1)); cd = cd.withBody(cd.getBody().withStatements(statements)); diff --git a/src/main/java/org/openrewrite/staticanalysis/HideUtilityClassConstructorVisitor.java b/src/main/java/org/openrewrite/staticanalysis/HideUtilityClassConstructorVisitor.java index 04b426586..3689de0f3 100644 --- a/src/main/java/org/openrewrite/staticanalysis/HideUtilityClassConstructorVisitor.java +++ b/src/main/java/org/openrewrite/staticanalysis/HideUtilityClassConstructorVisitor.java @@ -94,7 +94,10 @@ private static class UtilityClassWithImplicitDefaultConstructorVisitor

extend public J.ClassDeclaration visitClassDeclaration(J.ClassDeclaration classDecl, P p) { if (UtilityClassMatcher.hasImplicitDefaultConstructor(classDecl) && !J.ClassDeclaration.Kind.Type.Enum.equals(classDecl.getKind())) { - classDecl = JavaTemplate.builder("private #{}() {}").contextSensitive().build().apply(getCursor(), classDecl.getBody().getCoordinates().lastStatement(), classDecl.getSimpleName()); + classDecl = JavaTemplate.builder("private #{}() {}") + .contextSensitive() + .build() + .apply(getCursor(), classDecl.getBody().getCoordinates().lastStatement(), classDecl.getSimpleName()); } return classDecl; } diff --git a/src/main/java/org/openrewrite/staticanalysis/IndexOfReplaceableByContains.java b/src/main/java/org/openrewrite/staticanalysis/IndexOfReplaceableByContains.java index 1361c79ea..c8be5cde7 100644 --- a/src/main/java/org/openrewrite/staticanalysis/IndexOfReplaceableByContains.java +++ b/src/main/java/org/openrewrite/staticanalysis/IndexOfReplaceableByContains.java @@ -78,7 +78,7 @@ public J visitBinary(J.Binary binary, ExecutionContext ctx) { boolean isGreaterThanNegativeOne = asBinary.getOperator() == J.Binary.Type.GreaterThan && "-1".equals(valueSource); boolean isGreaterThanOrEqualToZero = asBinary.getOperator() == J.Binary.Type.GreaterThanOrEqual && "0".equals(valueSource); if (isGreaterThanNegativeOne || isGreaterThanOrEqualToZero) { - Cursor cursor = new Cursor(new Cursor(getCursor().getParent(), asBinary), asBinary.getLeft()); + Cursor cursor = new Cursor(updateCursor(asBinary), asBinary.getLeft()); j = (STRING_INDEX_MATCHER.matches(mi) ? stringContains : listContains) .apply(cursor, mi.getCoordinates().replace(), mi.getSelect(), mi.getArguments().get(0)) .withPrefix(asBinary.getPrefix()); diff --git a/src/main/java/org/openrewrite/staticanalysis/MissingOverrideAnnotation.java b/src/main/java/org/openrewrite/staticanalysis/MissingOverrideAnnotation.java index 0f8f22dc4..65645fd9c 100644 --- a/src/main/java/org/openrewrite/staticanalysis/MissingOverrideAnnotation.java +++ b/src/main/java/org/openrewrite/staticanalysis/MissingOverrideAnnotation.java @@ -82,7 +82,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex && !(Boolean.TRUE.equals(ignoreAnonymousClassMethods) && getCursorToParentScope(getCursor()).getValue() instanceof J.NewClass)) { - method = JavaTemplate.builder("@Override").build().apply(getCursor(), method.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); + method = JavaTemplate.apply("@Override", getCursor(), method.getCoordinates().addAnnotation(Comparator.comparing(J.Annotation::getSimpleName))); } return super.visitMethodDeclaration(method, ctx); } diff --git a/src/main/java/org/openrewrite/staticanalysis/NewStringBuilderBufferWithCharArgument.java b/src/main/java/org/openrewrite/staticanalysis/NewStringBuilderBufferWithCharArgument.java index 21c0feedb..62bfa57ba 100644 --- a/src/main/java/org/openrewrite/staticanalysis/NewStringBuilderBufferWithCharArgument.java +++ b/src/main/java/org/openrewrite/staticanalysis/NewStringBuilderBufferWithCharArgument.java @@ -72,8 +72,8 @@ public J.NewClass visitNewClass(J.NewClass newClass, ExecutionContext executionC } return l; } else { - Cursor cursor = new Cursor(getCursor(), arg); - return toString.apply(cursor, arg.getCoordinates().replace(), arg); + Cursor argCursor = new Cursor(getCursor(), arg); + return toString.apply(argCursor, arg.getCoordinates().replace(), arg); } })); } diff --git a/src/main/java/org/openrewrite/staticanalysis/NoDoubleBraceInitialization.java b/src/main/java/org/openrewrite/staticanalysis/NoDoubleBraceInitialization.java index 3f3896939..496074a55 100644 --- a/src/main/java/org/openrewrite/staticanalysis/NoDoubleBraceInitialization.java +++ b/src/main/java/org/openrewrite/staticanalysis/NoDoubleBraceInitialization.java @@ -88,6 +88,7 @@ && getCursor().getParent(3) != null) { @Override public J.NewClass visitNewClass(J.NewClass newClass, ExecutionContext executionContext) { J.NewClass nc = super.visitNewClass(newClass, executionContext); + updateCursor(nc); if (isSupportedDoubleBraceInitialization(newClass)) { Cursor parentBlockCursor = getCursor().dropParentUntil(J.Block.class::isInstance); J.VariableDeclarations.NamedVariable var = getCursor().firstEnclosing(J.VariableDeclarations.NamedVariable.class); diff --git a/src/main/java/org/openrewrite/staticanalysis/NoValueOfOnStringType.java b/src/main/java/org/openrewrite/staticanalysis/NoValueOfOnStringType.java index f8d9c9d74..0e922a16a 100644 --- a/src/main/java/org/openrewrite/staticanalysis/NoValueOfOnStringType.java +++ b/src/main/java/org/openrewrite/staticanalysis/NoValueOfOnStringType.java @@ -73,7 +73,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) Expression argument = mi.getArguments().get(0); if (TypeUtils.isString(argument.getType()) || removeValueOfFromBinaryExpression(argument)) { - return t.apply(getCursor(), mi.getCoordinates().replace(), argument); + return t.apply(updateCursor(mi), mi.getCoordinates().replace(), argument); } } return mi; diff --git a/src/main/java/org/openrewrite/staticanalysis/ObjectFinalizeCallsSuper.java b/src/main/java/org/openrewrite/staticanalysis/ObjectFinalizeCallsSuper.java index 096b4d22c..04319ec4e 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ObjectFinalizeCallsSuper.java +++ b/src/main/java/org/openrewrite/staticanalysis/ObjectFinalizeCallsSuper.java @@ -61,7 +61,7 @@ public J.MethodDeclaration visitMethodDeclaration(J.MethodDeclaration method, Ex md = JavaTemplate.builder("super.finalize()") .contextSensitive() .build() - .apply(new Cursor(getCursor().getParent(), md), + .apply(updateCursor(md), md.getBody().getCoordinates().lastStatement()); } return md; diff --git a/src/main/java/org/openrewrite/staticanalysis/PrimitiveWrapperClassConstructorToValueOf.java b/src/main/java/org/openrewrite/staticanalysis/PrimitiveWrapperClassConstructorToValueOf.java index 397f3939d..4f18e74b8 100644 --- a/src/main/java/org/openrewrite/staticanalysis/PrimitiveWrapperClassConstructorToValueOf.java +++ b/src/main/java/org/openrewrite/staticanalysis/PrimitiveWrapperClassConstructorToValueOf.java @@ -111,7 +111,7 @@ public J visitNewClass(J.NewClass newClass, ExecutionContext executionContext) { default: return nc; } - return valueOf.build().apply(getCursor(), nc.getCoordinates().replace(), arg); + return valueOf.build().apply(updateCursor(nc), nc.getCoordinates().replace(), arg); } return nc; } diff --git a/src/main/java/org/openrewrite/staticanalysis/RemoveInstanceOfPatternMatch.java b/src/main/java/org/openrewrite/staticanalysis/RemoveInstanceOfPatternMatch.java index e9a813361..3945d2129 100644 --- a/src/main/java/org/openrewrite/staticanalysis/RemoveInstanceOfPatternMatch.java +++ b/src/main/java/org/openrewrite/staticanalysis/RemoveInstanceOfPatternMatch.java @@ -109,6 +109,7 @@ public J visitIdentifier(J.Identifier identifier, ExecutionContext ctx) { @Override public J.If visitIf(J.If iff, ExecutionContext ctx) { J.If result = (J.If) super.visitIf(iff, ctx); + updateCursor(result); // If the "then" part of the "if" statement uses variables declared in // an "instanceof" expression, then add a variable declaration at @@ -119,14 +120,16 @@ public J.If visitIf(J.If iff, ExecutionContext ctx) { if (!(result.getThenPart() instanceof J.Block)) { result = autoFormat(result.withThenPart(J.Block.createEmptyBlock() .withStatements(Collections.singletonList(result.getThenPart()))), ctx); + updateCursor(result); } // Add variable declarations in the order of "instanceof" expressions Iterator iter = variableUsage.declarations.get(iff).descendingIterator(); while (iter.hasNext()) { J.InstanceOf instanceOf = iter.next(); if (thenInstanceOfs.contains(instanceOf)) { - Cursor blockCursor = new Cursor(new Cursor(getCursor().getParent(), result), result.getThenPart()); + Cursor blockCursor = new Cursor(getCursor(), result.getThenPart()); result = result.withThenPart(addVariableDeclaration(blockCursor, instanceOf, ctx)); + updateCursor(result); } } } @@ -143,6 +146,7 @@ public J.If visitIf(J.If iff, ExecutionContext ctx) { J.Block.createEmptyBlock().withStatements( Collections.singletonList(elsePart.getBody())))), ctx); + updateCursor(result); elsePart = result.getElsePart(); } if (elsePart != null) { @@ -151,7 +155,7 @@ public J.If visitIf(J.If iff, ExecutionContext ctx) { while (iter.hasNext()) { J.InstanceOf instanceOf = iter.next(); if (elseInstanceOfs.contains(instanceOf)) { - Cursor blockCursor = new Cursor(new Cursor(new Cursor(getCursor().getParent(), result), elsePart), elsePart.getBody()); + Cursor blockCursor = new Cursor(new Cursor(getCursor(), elsePart), elsePart.getBody()); result = result.withElsePart(elsePart.withBody( addVariableDeclaration(blockCursor, instanceOf, ctx))); } diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceDeprecatedRuntimeExecMethods.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceDeprecatedRuntimeExecMethods.java index 16e9297a2..9a90e2fd4 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceDeprecatedRuntimeExecMethods.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceDeprecatedRuntimeExecMethods.java @@ -74,13 +74,14 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu } } + updateCursor(m); if (flattenAble) { String[] cmds = sb.toString().split(" "); String templateCode = String.format("new String[] {%s}", toStringArguments(cmds)); JavaTemplate template = JavaTemplate.builder(templateCode).build(); List args = m.getArguments(); - Cursor cursor = new Cursor(new Cursor(getCursor().getParent(), m), args.get(0)); + Cursor cursor = new Cursor(getCursor(), args.get(0)); args.set(0, template.apply(cursor, args.get(0).getCoordinates().replace())); if (m.getMethodType() != null) { @@ -103,7 +104,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu String code = needWrap ? "(#{any()}).split(\" \")" : "#{any()}.split(\" \")"; JavaTemplate template = JavaTemplate.builder(code).contextSensitive().build(); - Cursor cursor = new Cursor(new Cursor(getCursor().getParent(), m), args.get(0)); + Cursor cursor = new Cursor(getCursor(), args.get(0)); arg0 = template.apply(cursor, args.get(0).getCoordinates().replace(), args.get(0)); args.set(0, arg0); diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java index 9b58e98e3..d72e68b70 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceLambdaWithMethodReference.java @@ -60,6 +60,7 @@ public TreeVisitor getVisitor() { @Override public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { J.Lambda l = (J.Lambda) super.visitLambda(lambda, executionContext); + updateCursor(l); if (TypeUtils.isOfClassType(lambda.getType(), "groovy.lang.Closure")) { return l; @@ -72,7 +73,7 @@ public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { if (statement instanceof J.MethodInvocation) { body = statement; } else if (statement instanceof J.Return && - (((J.Return) statement).getExpression()) instanceof MethodCall) { + (((J.Return) statement).getExpression()) instanceof MethodCall) { body = ((J.Return) statement).getExpression(); } } else if (body instanceof J.InstanceOf) { @@ -88,7 +89,7 @@ public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { if (j != null) { @SuppressWarnings("rawtypes") J tree = ((J.ControlParentheses) j).getTree(); if (tree instanceof J.Identifier && - !(j.getType() instanceof JavaType.GenericTypeVariable)) { + !(j.getType() instanceof JavaType.GenericTypeVariable)) { body = tree; code = "#{}.class::cast"; } @@ -101,7 +102,7 @@ public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { JavaType.FullyQualified fullyQualified = TypeUtils.asFullyQualified(identifier.getType()); @Language("java") String stub = fullyQualified == null ? "" : "package " + fullyQualified.getPackageName() + "; public class " + - fullyQualified.getClassName(); + fullyQualified.getClassName(); JavaTemplate template = JavaTemplate.builder(code) .contextSensitive() .javaParser(JavaParser.fromJavaVersion().dependsOn(stub)) @@ -110,11 +111,15 @@ public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { } else if (body instanceof J.Binary) { J.Binary binary = (J.Binary) body; if (isNullCheck(binary.getLeft(), binary.getRight()) || - isNullCheck(binary.getRight(), binary.getLeft())) { + isNullCheck(binary.getRight(), binary.getLeft())) { maybeAddImport("java.util.Objects"); code = J.Binary.Type.Equal.equals(binary.getOperator()) ? "Objects::isNull" : "Objects::nonNull"; - return JavaTemplate.builder(code).contextSensitive().imports("java.util.Objects").build().apply(getCursor(), l.getCoordinates().replace()); + return JavaTemplate.builder(code) + .contextSensitive() + .imports("java.util.Objects") + .build() + .apply(getCursor(), l.getCoordinates().replace()); } } else if (body instanceof MethodCall) { MethodCall method = (MethodCall) body; @@ -134,7 +139,7 @@ public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { } if (multipleMethodInvocations(method) || - !methodArgumentsMatchLambdaParameters(method, lambda)) { + !methodArgumentsMatchLambdaParameters(method, lambda)) { return l; } @@ -144,19 +149,26 @@ public J visitLambda(J.Lambda lambda, ExecutionContext executionContext) { if (methodType != null) { JavaType.FullyQualified declaringType = methodType.getDeclaringType(); if (methodType.hasFlags(Flag.Static) || - methodSelectMatchesFirstLambdaParameter(method, lambda)) { + methodSelectMatchesFirstLambdaParameter(method, lambda)) { maybeAddImport(declaringType); return JavaTemplate.builder("#{}::#{}") .contextSensitive() .imports(declaringType.getFullyQualifiedName()) - .build().apply(getCursor(), l.getCoordinates().replace(), declaringType.getClassName(), + .build() + .apply(getCursor(), l.getCoordinates().replace(), declaringType.getClassName(), method.getMethodType().getName()); } else if (method instanceof J.NewClass) { - return JavaTemplate.builder("#{}::new").contextSensitive().build().apply(getCursor(), l.getCoordinates().replace(), className((J.NewClass) method)); + return JavaTemplate.builder("#{}::new") + .contextSensitive() + .build() + .apply(getCursor(), l.getCoordinates().replace(), className((J.NewClass) method)); } else { String templ = select == null ? "#{}::#{}" : "#{any(" + declaringType.getFullyQualifiedName() + ")}::#{}"; - return JavaTemplate.builder(templ).contextSensitive().build().apply(getCursor(), l.getCoordinates().replace(), select == null ? "this" : select, + return JavaTemplate.builder(templ) + .contextSensitive() + .build() + .apply(getCursor(), l.getCoordinates().replace(), select == null ? "this" : select, method.getMethodType().getName()); } } @@ -174,7 +186,7 @@ private String className(J.NewClass method) { private boolean multipleMethodInvocations(MethodCall method) { return method instanceof J.MethodInvocation && - ((J.MethodInvocation) method).getSelect() instanceof J.MethodInvocation; + ((J.MethodInvocation) method).getSelect() instanceof J.MethodInvocation; } private boolean methodArgumentsMatchLambdaParameters(MethodCall method, J.Lambda lambda) { @@ -213,20 +225,20 @@ private boolean methodArgumentsMatchLambdaParameters(MethodCall method, J.Lambda private boolean methodSelectMatchesFirstLambdaParameter(MethodCall method, J.Lambda lambda) { if (!(method instanceof J.MethodInvocation) || - !(((J.MethodInvocation) method).getSelect() instanceof J.Identifier) || - lambda.getParameters().getParameters().isEmpty() || - !(lambda.getParameters().getParameters().get(0) instanceof J.VariableDeclarations)) { + !(((J.MethodInvocation) method).getSelect() instanceof J.Identifier) || + lambda.getParameters().getParameters().isEmpty() || + !(lambda.getParameters().getParameters().get(0) instanceof J.VariableDeclarations)) { return false; } J.VariableDeclarations firstLambdaParameter = (J.VariableDeclarations) lambda.getParameters() .getParameters().get(0); return ((J.Identifier) ((J.MethodInvocation) method).getSelect()).getFieldType() == - firstLambdaParameter.getVariables().get(0).getVariableType(); + firstLambdaParameter.getVariables().get(0).getVariableType(); } private boolean isNullCheck(J j1, J j2) { return j1 instanceof J.Identifier && j2 instanceof J.Literal && - "null".equals(((J.Literal) j2).getValueSource()); + "null".equals(((J.Literal) j2).getValueSource()); } }; diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceRedundantFormatWithPrintf.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceRedundantFormatWithPrintf.java index 7e567b631..d6a041192 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceRedundantFormatWithPrintf.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceRedundantFormatWithPrintf.java @@ -140,7 +140,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu JavaTemplate template = JavaTemplate.builder(code.toString()).contextSensitive().build(); return maybeAutoFormat( method, - template.apply(getCursor(), method.getCoordinates().replaceMethod(), printfArgs.toArray()), + template.apply(updateCursor(method), method.getCoordinates().replaceMethod(), printfArgs.toArray()), ctx ); } diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceStreamToListWithCollect.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceStreamToListWithCollect.java index a4d7ee388..6083821c5 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceStreamToListWithCollect.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceStreamToListWithCollect.java @@ -64,7 +64,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) J.MethodInvocation result = (J.MethodInvocation) super.visitMethodInvocation(method, ctx); if (STREAM_TO_LIST.matches(method)) { JRightPadded select = result.getPadding().getSelect(); - result = template.apply(getCursor(), result.getCoordinates().replace(), result.getSelect()); + result = template.apply(updateCursor(result), result.getCoordinates().replace(), result.getSelect()); result = result.getPadding().withSelect(select); maybeAddImport("java.util.stream.Collectors"); } diff --git a/src/main/java/org/openrewrite/staticanalysis/ReplaceValidateNotNullHavingVarargsWithObjectsRequireNonNull.java b/src/main/java/org/openrewrite/staticanalysis/ReplaceValidateNotNullHavingVarargsWithObjectsRequireNonNull.java index b2b5a64fe..2aa35f169 100644 --- a/src/main/java/org/openrewrite/staticanalysis/ReplaceValidateNotNullHavingVarargsWithObjectsRequireNonNull.java +++ b/src/main/java/org/openrewrite/staticanalysis/ReplaceValidateNotNullHavingVarargsWithObjectsRequireNonNull.java @@ -68,7 +68,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext p) { mi = JavaTemplate.builder(template) .contextSensitive() .imports("java.util.Objects") - .build().apply(getCursor(), mi.getCoordinates().replace(), arguments.toArray()); + .build().apply(updateCursor(mi), mi.getCoordinates().replace(), arguments.toArray()); if (arguments.size() == 2) { return maybeAutoFormat(mi, mi.withArguments( diff --git a/src/main/java/org/openrewrite/staticanalysis/SimplifyConsecutiveAssignments.java b/src/main/java/org/openrewrite/staticanalysis/SimplifyConsecutiveAssignments.java index 94b71b507..c7f7d7c62 100644 --- a/src/main/java/org/openrewrite/staticanalysis/SimplifyConsecutiveAssignments.java +++ b/src/main/java/org/openrewrite/staticanalysis/SimplifyConsecutiveAssignments.java @@ -59,9 +59,9 @@ public J.Block visitBlock(J.Block block, ExecutionContext ctx) { J.Block combined = b; do { b = combined; + updateCursor(b); J.Block b2 = b; AtomicInteger skip = new AtomicInteger(-1); - Cursor blockCursor = new Cursor(getCursor().getParent(), b); combined = b.withStatements(ListUtils.map(b.getStatements(), (i, stat) -> { if (skip.get() == i) { @@ -80,7 +80,7 @@ public J.Block visitBlock(J.Block block, ExecutionContext ctx) { if (acc != null && op != null) { skip.set(i + 1); // combine this statement with the following statement into one binary expression - return combine(new Cursor(blockCursor, stat), op, acc); + return combine(new Cursor(getCursor(), stat), op, acc); } } diff --git a/src/main/java/org/openrewrite/staticanalysis/SimplifyDurationCreationUnits.java b/src/main/java/org/openrewrite/staticanalysis/SimplifyDurationCreationUnits.java index c9aa9667a..3a1d251c6 100644 --- a/src/main/java/org/openrewrite/staticanalysis/SimplifyDurationCreationUnits.java +++ b/src/main/java/org/openrewrite/staticanalysis/SimplifyDurationCreationUnits.java @@ -104,7 +104,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu JavaTemplate template = JavaTemplate.builder("#{}(#{})").contextSensitive().build(); return maybeAutoFormat( method, - template.apply(getCursor(), method.getCoordinates().replaceMethod(), simplifiedUnits.methodName, + template.apply(updateCursor(method), method.getCoordinates().replaceMethod(), simplifiedUnits.methodName, millis / simplifiedUnits.millisFactor), ctx ); diff --git a/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java b/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java index e847bebdc..89c81ed1e 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java @@ -44,7 +44,7 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu J.MethodInvocation mi = super.visitMethodInvocation(method, executionContext); if (removeAll.matches(mi) && !returnValueIsUsed()) { mi = JavaTemplate.builder("#{any(java.util.Collection)}.forEach(#{any(java.util.Set)}::remove)") - .build().apply(getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getSelect()); + .build().apply(updateCursor(mi), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getSelect()); } return mi; } diff --git a/src/main/java/org/openrewrite/staticanalysis/UseLambdaForFunctionalInterface.java b/src/main/java/org/openrewrite/staticanalysis/UseLambdaForFunctionalInterface.java index e7e03ec64..708d66b56 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseLambdaForFunctionalInterface.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseLambdaForFunctionalInterface.java @@ -63,6 +63,7 @@ public TreeVisitor getVisitor() { @Override public J visitNewClass(J.NewClass newClass, ExecutionContext ctx) { J.NewClass n = (J.NewClass) super.visitNewClass(newClass, ctx); + updateCursor(n); if (n.getBody() != null && n.getBody().getStatements().size() == 1 && n.getBody().getStatements().get(0) instanceof J.MethodDeclaration && @@ -119,7 +120,8 @@ public J visitNewClass(J.NewClass newClass, ExecutionContext ctx) { J.Lambda lambda = JavaTemplate.builder(templateBuilder.toString()) .contextSensitive() - .build().apply(getCursor(), n.getCoordinates().replace()); + .build() + .apply(getCursor(), n.getCoordinates().replace()); lambda = lambda.withType(typedInterface); lambda = (J.Lambda) new UnnecessaryParentheses().getVisitor() .visitNonNull(lambda, ctx, getCursor().getParentOrThrow()); diff --git a/src/main/java/org/openrewrite/staticanalysis/UseListSort.java b/src/main/java/org/openrewrite/staticanalysis/UseListSort.java index ad5b45d6e..9c02df9b2 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseListSort.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseListSort.java @@ -45,13 +45,18 @@ public TreeVisitor getVisitor() { public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, ExecutionContext executionContext) { J.MethodInvocation mi = super.visitMethodInvocation(method, executionContext); if (collectionsSort.matches(mi)) { + updateCursor(mi); maybeRemoveImport("java.util.Collections"); if (mi.getArguments().size() == 1) { return JavaTemplate.builder("#{any(java.util.List)}.sort(null)") - .imports("java.util.List").build().apply(getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0)); + .imports("java.util.List") + .build() + .apply(getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0)); } else { return JavaTemplate.builder("#{any(java.util.List)}.sort(#{any(java.util.Comparator)})") - .imports("java.util.List", "java.util.Comparator").build().apply(getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getArguments().get(1)); + .imports("java.util.List", "java.util.Comparator") + .build() + .apply(getCursor(), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getArguments().get(1)); } } return mi; diff --git a/src/main/java/org/openrewrite/staticanalysis/UseStandardCharset.java b/src/main/java/org/openrewrite/staticanalysis/UseStandardCharset.java index 87877084d..82662cd4e 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseStandardCharset.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseStandardCharset.java @@ -91,7 +91,9 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext execu if (!StringUtils.isBlank(standardName)) { return JavaTemplate.builder("StandardCharsets." + standardName) - .imports("java.nio.charset.StandardCharsets").build().apply(getCursor(), m.getCoordinates().replace()); + .imports("java.nio.charset.StandardCharsets") + .build() + .apply(updateCursor(m), m.getCoordinates().replace()); } } } diff --git a/src/main/java/org/openrewrite/staticanalysis/UseSystemLineSeparator.java b/src/main/java/org/openrewrite/staticanalysis/UseSystemLineSeparator.java index 7aac17895..7d478a306 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseSystemLineSeparator.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseSystemLineSeparator.java @@ -81,8 +81,7 @@ public J visitMethodInvocation(J.MethodInvocation method, ExecutionContext ctx) .staticImports("java.lang.System.lineSeparator") .build(); - return template.apply(getCursor(), method.getCoordinates() - .replace()); + return template.apply(getCursor(), method.getCoordinates().replace()); } } From 0f1da8fbeb3565dc7b9280617119613ebacf9f12 Mon Sep 17 00:00:00 2001 From: Knut Wannheden Date: Thu, 1 Jun 2023 20:53:34 +0200 Subject: [PATCH 3/3] Minor touch-ups --- .../staticanalysis/AvoidBoxedBooleanExpressions.java | 8 ++++---- .../UseForEachRemoveInsteadOfSetRemoveAll.java | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java b/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java index 190b86a39..bf6e1896b 100644 --- a/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java +++ b/src/main/java/org/openrewrite/staticanalysis/AvoidBoxedBooleanExpressions.java @@ -59,8 +59,8 @@ public Expression visitExpression(Expression expression, ExecutionContext ctx) { Expression e = (Expression) super.visitExpression(expression, ctx); if (TypeUtils.isOfClassType(e.getType(), "java.lang.Boolean")) { if (isControlExpression(expression)) { - return JavaTemplate.builder("Boolean.TRUE.equals(#{any(java.lang.Boolean)})").build() - .apply(updateCursor(e), e.getCoordinates().replace(), e); + return JavaTemplate.apply("Boolean.TRUE.equals(#{any(java.lang.Boolean)})", + updateCursor(e), e.getCoordinates().replace(), e); } } return e; @@ -70,8 +70,8 @@ public Expression visitExpression(Expression expression, ExecutionContext ctx) { public J visitUnary(J.Unary unary, ExecutionContext executionContext) { J.Unary un = (J.Unary) super.visitUnary(unary, executionContext); if (J.Unary.Type.Not == un.getOperator() && TypeUtils.isOfClassType(un.getExpression().getType(), "java.lang.Boolean")) { - return JavaTemplate.builder("Boolean.FALSE.equals(#{any(java.lang.Boolean)})").build() - .apply(updateCursor(un), un.getCoordinates().replace(), un.getExpression()); + return JavaTemplate.apply("Boolean.FALSE.equals(#{any(java.lang.Boolean)})", + updateCursor(un), un.getCoordinates().replace(), un.getExpression()); } return un; } diff --git a/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java b/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java index 89c81ed1e..23d36ce23 100644 --- a/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java +++ b/src/main/java/org/openrewrite/staticanalysis/UseForEachRemoveInsteadOfSetRemoveAll.java @@ -44,7 +44,8 @@ public J.MethodInvocation visitMethodInvocation(J.MethodInvocation method, Execu J.MethodInvocation mi = super.visitMethodInvocation(method, executionContext); if (removeAll.matches(mi) && !returnValueIsUsed()) { mi = JavaTemplate.builder("#{any(java.util.Collection)}.forEach(#{any(java.util.Set)}::remove)") - .build().apply(updateCursor(mi), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getSelect()); + .build() + .apply(updateCursor(mi), mi.getCoordinates().replace(), mi.getArguments().get(0), mi.getSelect()); } return mi; }