Skip to content

Commit

Permalink
initial handling of indent/unindent in Difference
Browse files Browse the repository at this point in the history
  • Loading branch information
ftomassetti committed May 21, 2017
1 parent 488ccb1 commit a31908d
Show file tree
Hide file tree
Showing 4 changed files with 108 additions and 18 deletions.
Expand Up @@ -30,4 +30,14 @@ public class CsmIndent implements CsmElement {
public void prettyPrint(Node node, SourcePrinter printer) {
printer.indent();
}

@Override
public int hashCode() {
return 1;
}

@Override
public boolean equals(Object obj) {
return obj instanceof CsmIndent;
}
}
Expand Up @@ -30,4 +30,14 @@ public class CsmUnindent implements CsmElement {
public void prettyPrint(Node node, SourcePrinter printer) {
printer.unindent();
}

@Override
public int hashCode() {
return 2;
}

@Override
public boolean equals(Object obj) {
return obj instanceof CsmUnindent;
}
}
Expand Up @@ -46,6 +46,8 @@ static DifferenceElement kept(CsmElement element) {
}

CsmElement getElement();

boolean isAdded();
}

private static class Added implements DifferenceElement {
Expand Down Expand Up @@ -79,6 +81,11 @@ public int hashCode() {
public CsmElement getElement() {
return element;
}

@Override
public boolean isAdded() {
return true;
}
}

private static class Kept implements DifferenceElement {
Expand Down Expand Up @@ -112,6 +119,11 @@ public int hashCode() {
public CsmElement getElement() {
return element;
}

@Override
public boolean isAdded() {
return false;
}
}

private static class Removed implements DifferenceElement {
Expand Down Expand Up @@ -145,6 +157,11 @@ public int hashCode() {
public CsmElement getElement() {
return element;
}

@Override
public boolean isAdded() {
return false;
}
}

private static boolean matching(CsmElement a, CsmElement b) {
Expand All @@ -155,6 +172,10 @@ private static boolean matching(CsmElement a, CsmElement b) {
return childA.getChild().equals(childB.getChild());
} else if (b instanceof CsmToken) {
return false;
} else if (b instanceof CsmIndent) {
return false;
} else if (b instanceof CsmUnindent) {
return false;
} else {
throw new UnsupportedOperationException(a.getClass().getSimpleName()+ " "+b.getClass().getSimpleName());
}
Expand All @@ -165,14 +186,25 @@ private static boolean matching(CsmElement a, CsmElement b) {
return childA.getTokenType() == childB.getTokenType();
} else if (b instanceof LexicalDifferenceCalculator.CsmChild) {
return false;
} else if (b instanceof CsmIndent) {
return false;
} else if (b instanceof CsmUnindent) {
return false;
} else {
throw new UnsupportedOperationException(a.getClass().getSimpleName()+ " "+b.getClass().getSimpleName());
}
} else if (a instanceof CsmIndent) {
return b instanceof CsmIndent;
} else if (a instanceof CsmUnindent) {
return b instanceof CsmUnindent;
}
throw new UnsupportedOperationException(a.getClass().getSimpleName()+ " "+b.getClass().getSimpleName());
}

private static boolean replacement(CsmElement a, CsmElement b) {
if (a instanceof CsmIndent || b instanceof CsmIndent || a instanceof CsmUnindent || b instanceof CsmUnindent) {
return false;
}
if (a instanceof LexicalDifferenceCalculator.CsmChild) {
if (b instanceof LexicalDifferenceCalculator.CsmChild) {
LexicalDifferenceCalculator.CsmChild childA = (LexicalDifferenceCalculator.CsmChild) a;
Expand Down Expand Up @@ -277,14 +309,20 @@ private static Difference calculateImpl(LexicalDifferenceCalculator.CalculatedSy
CsmElement nextAfter = after.elements.get(afterIndex);

// FIXME
if (nextOriginal instanceof CsmIndent || nextOriginal instanceof CsmUnindent) {
originalIndex++;
continue;
}
if (nextAfter instanceof CsmIndent || nextAfter instanceof CsmUnindent) {
afterIndex++;
continue;
}
// if (nextOriginal instanceof CsmIndent || nextOriginal instanceof CsmUnindent) {
// originalIndex++;
// continue;
// }
// if (nextAfter instanceof CsmIndent) {
// for (int i=0;i<STANDARD_INDENTATION_SIZE;i++) {
// elements.add(new Added(CsmElement.space()));
// }
// continue;
// }
// if (nextAfter instanceof CsmUnindent) {
// afterIndex++;
// continue;
// }

if (matching(nextOriginal, nextAfter)) {
elements.add(new Kept(nextOriginal));
Expand Down Expand Up @@ -520,6 +558,12 @@ void apply(NodeText nodeText, Node node) {
}
} else if ((kept.element instanceof CsmToken) && ((CsmToken) kept.element).isWhiteSpace()) {
diffIndex++;
} else if (kept.element instanceof CsmIndent) {
// FIXME
diffIndex++;
} else if (kept.element instanceof CsmUnindent) {
// FIXME
diffIndex++;
} else {
throw new UnsupportedOperationException("kept " + kept.element + " vs " + nodeTextEl);
}
Expand Down
Expand Up @@ -227,7 +227,7 @@ public void simpleEnumConstantDeclaration() throws IOException {
}

@Test
public void addingStatementToEmptyBlock() throws IOException {
public void csmModelAfterAddingStatementToEmptyBlock() throws IOException {
LexicalDifferenceCalculator ldc = new LexicalDifferenceCalculator();
considerExample("ASimpleClassWithMoreFormatting_step3");

Expand All @@ -246,24 +246,50 @@ public void addingStatementToEmptyBlock() throws IOException {
setter.getBody().get().getStatements(),
0,
assignStatement);
calculatedSyntaxModel.removeIndentationElements();
int index = 0;
assertEquals(CsmElement.token(GeneratedJavaParserConstants.LBRACE), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.newline(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.space(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.space(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.space(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.space(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.space(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.space(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.space(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.space(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.indent(), calculatedSyntaxModel.elements.get(index++));
assertTrue(isChild(calculatedSyntaxModel.elements.get(index++), ExpressionStmt.class));
assertEquals(CsmElement.newline(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.unindent(), calculatedSyntaxModel.elements.get(index++));
assertEquals(CsmElement.token(GeneratedJavaParserConstants.RBRACE), calculatedSyntaxModel.elements.get(index++));
assertEquals(index, calculatedSyntaxModel.elements.size());
}

@Test
public void differenceAfterddingStatementToEmptyBlock() throws IOException {
LexicalDifferenceCalculator ldc = new LexicalDifferenceCalculator();
considerExample("ASimpleClassWithMoreFormatting_step3");

MethodDeclaration setter = cu.getClassByName("MyRenamedClass").get()
.getMethodsByName("setAField").get(0);
Statement assignStatement = new ExpressionStmt(
new AssignExpr(
new FieldAccessExpr(new ThisExpr(),"aField"),
new NameExpr("aField"),
AssignExpr.Operator.ASSIGN
));
Difference diff = ldc.calculateListAdditionDifference(
ObservableProperty.STATEMENTS,
setter.getBody().get().getStatements(),
0,
assignStatement);
int index = 0;
assertEquals(Difference.DifferenceElement.kept(CsmElement.token(GeneratedJavaParserConstants.LBRACE)), diff.getElements().get(index++));
assertEquals(Difference.DifferenceElement.kept(CsmElement.newline()), diff.getElements().get(index++));
assertEquals(Difference.DifferenceElement.added(CsmElement.indent()), diff.getElements().get(index++));
assertTrue(isAddedChild(diff.getElements().get(index++), ExpressionStmt.class));
assertEquals(Difference.DifferenceElement.added(CsmElement.newline()), diff.getElements().get(index++));
assertEquals(Difference.DifferenceElement.added(CsmElement.unindent()), diff.getElements().get(index++));
assertEquals(Difference.DifferenceElement.kept(CsmElement.token(GeneratedJavaParserConstants.RBRACE)), diff.getElements().get(index++));
assertEquals(index, diff.getElements().size());
}

private boolean isAddedChild(Difference.DifferenceElement element, Class<? extends Node> childClass) {
return element.isAdded() && isChild(element.getElement(), childClass);
}

private boolean isChild(CsmElement element, Class<? extends Node> childClass) {
return element instanceof LexicalDifferenceCalculator.CsmChild && childClass.isInstance(((LexicalDifferenceCalculator.CsmChild)element).getChild());
}
Expand Down

0 comments on commit a31908d

Please sign in to comment.