Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix indenting #121

Merged
merged 5 commits into from
Dec 19, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.openrewrite.java.template.internal;
jevanlingen marked this conversation as resolved.
Show resolved Hide resolved

public class StringUtils {
public static String indent(String text, int indent) {
String whitespace = String.format("%" + indent + "s", " ");
return whitespace + text.replaceAll("\\R", "\n" + whitespace);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,14 @@
*/
package org.openrewrite.java.template.processor;

import lombok.AllArgsConstructor;
import lombok.EqualsAndHashCode;
timtebeek marked this conversation as resolved.
Show resolved Hide resolved
import lombok.Value;

import java.util.*;

import static java.util.stream.Collectors.toCollection;
import static java.util.stream.Collectors.joining;
import static org.openrewrite.java.template.internal.StringUtils.indent;

public abstract class Precondition {
private static final Comparator<String> BY_USES_TYPE_FIRST = Comparator
Expand Down Expand Up @@ -57,10 +59,14 @@ public String toString() {
}

@Value
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false, of = "preconditions")
timtebeek marked this conversation as resolved.
Show resolved Hide resolved
public static class Or extends Precondition {
Set<Precondition> preconditions;
int indent;

public Or(Precondition... preconditions) {
this.preconditions = new HashSet<>(Arrays.asList(preconditions));
}

@Override
boolean fitsInto(Precondition p) {
Expand Down Expand Up @@ -142,24 +148,28 @@ private Precondition extractCommonElements() {

if (!commons.isEmpty()) {
preconditions.forEach(it -> ((And) it).preconditions.removeAll(commons));
commons.add(new Or(preconditions, indent));
return new And(commons, indent);
commons.add(new Or(preconditions));
return new And(commons);
}

return this;
}

@Override
public String toString() {
return joinPreconditions(preconditions, "or", indent);
return joinPreconditions(preconditions, "or");
}
}

@Value
@AllArgsConstructor
@EqualsAndHashCode(callSuper = false, of = "preconditions")
timtebeek marked this conversation as resolved.
Show resolved Hide resolved
public static class And extends Precondition {
Set<Precondition> preconditions;
int indent;

public And(Precondition... preconditions) {
this.preconditions = new HashSet<>(Arrays.asList(preconditions));
}

@Override
boolean fitsInto(Precondition p) {
Expand All @@ -174,20 +184,19 @@ boolean fitsInto(Precondition p) {

@Override
public String toString() {
return joinPreconditions(preconditions, "and", indent);
return joinPreconditions(preconditions, "and");
}
}

private static String joinPreconditions(Collection<Precondition> rules, String op, int indent) {
private static String joinPreconditions(Collection<Precondition> rules, String op) {
if (rules.isEmpty()) {
return "";
} else if (rules.size() == 1) {
return rules.iterator().next().toString();
}
String whitespace = String.format("%" + indent + "s", " ");
Set<String> preconditions = rules.stream().map(Object::toString).sorted(BY_USES_TYPE_FIRST).collect(toCollection(LinkedHashSet::new));
String preconditions = rules.stream().map(Object::toString).sorted(BY_USES_TYPE_FIRST).collect(joining(",\n"));
return "Preconditions." + op + "(\n" +
whitespace + String.join(",\n" + whitespace, preconditions) + "\n" +
whitespace.substring(0, indent - 4) + ')';
indent(preconditions, 4) + "\n" +
")";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
import static java.util.Collections.singletonList;
import static java.util.Objects.requireNonNull;
import static java.util.stream.Collectors.*;
import static org.openrewrite.java.template.internal.StringUtils.indent;
import static org.openrewrite.java.template.processor.RefasterTemplateProcessor.AFTER_TEMPLATE;
import static org.openrewrite.java.template.processor.RefasterTemplateProcessor.BEFORE_TEMPLATE;

Expand Down Expand Up @@ -232,7 +233,7 @@ public void visitClassDef(JCTree.JCClassDecl classDecl) {
} else {
recipe.append(String.format(" JavaVisitor<ExecutionContext> javaVisitor = %s;\n", javaVisitor));
recipe.append(" return Preconditions.check(\n");
recipe.append(" ").append(preconditions).append(",\n");
recipe.append(indent(preconditions.toString(), 16)).append(",\n");
recipe.append(" javaVisitor\n");
recipe.append(" );\n");
}
Expand Down Expand Up @@ -622,12 +623,12 @@ private Set<String> getImportsAsStrings(Map<TemplateDescriptor, Set<String>> imp
return null;
}

return new Precondition.Or(
preconditions.values().stream()
.map(it -> new Precondition.And(it, indent + 4))
.collect(toSet())
, indent + 4)
.prune();
return
new Precondition.Or(
timtebeek marked this conversation as resolved.
Show resolved Hide resolved
preconditions.values().stream()
.map(Precondition.And::new)
.collect(toSet())
).prune();
}
}.scan(cu);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,34 +30,29 @@ class PreconditionTest {
@Test
void toStringWithInden() {
String result = new Or(
setOf(
new And(
setOf(
new Rule("A"),
new Rule("B"),
new Rule("C")),
4
),
new And(
setOf(
new Rule("X"),
new Rule("Y"),
new Rule("Z")),
4
)
), 4).toString();
new And(
new Or(new Rule("A"), new Rule("B")),
new Or(new Rule("C"), new Rule("D"))
),
new And(new Rule("X"), new Rule("Y"), new Rule("Z"))
).toString();

assertThat(result).isEqualTo("Preconditions.or(\n" +
" Preconditions.and(\n" +
" A,\n" +
" B,\n" +
" C\n" +
"),\n" +
" Preconditions.or(\n" +
" A,\n" +
" B\n" +
" ),\n" +
" Preconditions.or(\n" +
" C,\n" +
" D\n" +
" )\n" +
" ),\n" +
" Preconditions.and(\n" +
" X,\n" +
" Y,\n" +
" Z\n" +
")\n" +
" X,\n" +
" Y,\n" +
" Z\n" +
" )\n" +
")");
}

Expand All @@ -68,52 +63,32 @@ void ruleFitsInRule() {

@Test
void orFitsInOr() {
boolean result = new Or(
setOf(new Rule("A"), new Rule("B")),
4
).fitsInto(new Or(
setOf(new Rule("B"), new Rule("A")),
4
));
boolean result = new Or(new Rule("A"), new Rule("B"))
.fitsInto(new Or(new Rule("B"), new Rule("A")));

assertThat(result).isTrue();
}

@Test
void ardFitsNotInAndWithDifferentRules() {
boolean result = new Or(
setOf(new Rule("A"), new Rule("C")),
4
).fitsInto(new Or(
setOf(new Rule("B"), new Rule("A")),
4
));
boolean result = new Or(new Rule("A"), new Rule("C"))
.fitsInto(new Or(new Rule("B"), new Rule("A")));

assertThat(result).isFalse();
}

@Test
void andFitsInAnd() {
boolean result = new And(
setOf(new Rule("A")),
4
).fitsInto(new And(
setOf(new Rule("B"), new Rule("A")),
4
));
boolean result = new And(new Rule("A"))
.fitsInto(new And(new Rule("B"), new Rule("A")));

assertThat(result).isTrue();
}

@Test
void andFitsNotInAndWithDifferentRules() {
boolean result = new And(
setOf(new Rule("A"), new Rule("C")),
4
).fitsInto(new And(
setOf(new Rule("B"), new Rule("A")),
4
));
boolean result = new And(new Rule("A"), new Rule("C"))
.fitsInto(new And(new Rule("B"), new Rule("A")));

assertThat(result).isFalse();
}
Expand All @@ -127,75 +102,47 @@ void sameRulesArePrunedAutomatically() {

@Test
void sameRulesArePrunedAutomaticallyInAnOr() {
Precondition result = new Or(
setOf(new Rule("A"), new Rule("A")),
4
);
Precondition result = new Or(new Rule("A"), new Rule("A"));

assertThat(result).isEqualTo(new Or(
setOf(new Rule("A")),
4
));
assertThat(result).isEqualTo(new Or(new Rule("A")));
}

@Test
void pruneOrWithAnds() {
Precondition result = new Or(
setOf(
new And(
setOf(new Rule("A"), new Rule("B")),
4
),
new And(
setOf(new Rule("A"), new Rule("B"), new Rule("C")),
4
)
), 4).prune();
new And(new Rule("A"), new Rule("B")),
new And(new Rule("A"), new Rule("B"), new Rule("C"))
).prune();

assertThat(result).isEqualTo(new And(
setOf(new Rule("A"), new Rule("B")),
4
));
assertThat(result).isEqualTo(new And(new Rule("A"), new Rule("B")));
}

@Test
void pruneOrWithAndAndRule() {
Precondition result = new Or(
setOf(
new And(
setOf(new Rule("A"), new Rule("B")),
4
),
new Rule("B")
), 4).prune();
new And(new Rule("A"), new Rule("B")),
new Rule("B")
).prune();

assertThat(result).isEqualTo(new Rule("B"));
}

@Test
void pruneOrWithTypeChange() {
Precondition result = new Or(
setOf(
new And(
setOf(new Rule("A"), new Rule("B"), new Rule("C")),
4
),
new And(
setOf(new Rule("D"), new Rule("B"), new Rule("E")),
4
)
), 4).prune();
new And(new Rule("A"), new Rule("B"), new Rule("C")),
new And(new Rule("D"), new Rule("B"), new Rule("E"))
).prune();

assertThat(result).isEqualTo(new And(
setOf(
assertThat(result).isEqualTo(
new And(
new Rule("B"),
new Or(
setOf(
new And(setOf(new Rule("A"), new Rule("C")), 4),
new And(setOf(new Rule("D"), new Rule("E")), 4)
), 4
new And(new Rule("A"), new Rule("C")),
new And(new Rule("D"), new Rule("E"))
)
), 4));
)
);
}

@SafeVarargs
Expand Down
Loading