Skip to content

Commit

Permalink
Refactor how to check if a TextElement matches the contents of a CsmE…
Browse files Browse the repository at this point in the history
…lement
  • Loading branch information
jlerbsc committed Aug 30, 2023
1 parent 05f2597 commit 2c0bdef
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 50 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.observer.ObservableProperty;
import com.github.javaparser.printer.SourcePrinter;
import com.github.javaparser.printer.lexicalpreservation.TextElement;
import com.github.javaparser.utils.LineSeparator;

public interface CsmElement {
Expand Down Expand Up @@ -148,4 +149,11 @@ static CsmElement unindent() {
static CsmElement block(CsmElement content) {
return sequence(token(GeneratedJavaParserConstants.LBRACE), indent(), content, unindent(), token(GeneratedJavaParserConstants.RBRACE));
}

/*
* Verifies if the content of the {@code CsmElement} is the same as the provided {@code TextElement}
*/
default boolean isCorrespondingElement(TextElement textElement) {
return false;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@

import com.github.javaparser.ast.Node;
import com.github.javaparser.printer.SourcePrinter;
import com.github.javaparser.printer.lexicalpreservation.TextElement;
import com.github.javaparser.printer.lexicalpreservation.TokenTextElement;

public class CsmIndent implements CsmElement {

Expand All @@ -30,6 +32,15 @@ public void prettyPrint(Node node, SourcePrinter printer) {
printer.indent();
}

/*
* Verifies if the content of the {@code CsmElement} is the same as the provided {@code TextElement}
*/
@Override
public boolean isCorrespondingElement(TextElement textElement) {
return (textElement instanceof TokenTextElement)
&& ((TokenTextElement)textElement).isSpaceOrTab();
}

@Override
public int hashCode() {
return 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
import com.github.javaparser.TokenTypes;
import com.github.javaparser.ast.Node;
import com.github.javaparser.printer.SourcePrinter;
import com.github.javaparser.printer.lexicalpreservation.TextElement;
import com.github.javaparser.printer.lexicalpreservation.TokenTextElement;
import com.github.javaparser.utils.LineSeparator;

public class CsmToken implements CsmElement {
Expand Down Expand Up @@ -110,4 +112,14 @@ public boolean isWhiteSpaceNotEol() {
public boolean isNewLine() {
return TokenTypes.isEndOfLineToken(tokenType);
}

/*
* Verifies if the content of the {@code CsmElement} is the same as the provided {@code TextElement}
*/
@Override
public boolean isCorrespondingElement(TextElement textElement) {
return (textElement instanceof TokenTextElement)
&& ((TokenTextElement)textElement).getTokenKind() == getTokenType()
&& ((TokenTextElement)textElement).getText().equals(getContent());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,38 +20,39 @@
*/
package com.github.javaparser.printer.lexicalpreservation;

import java.util.Optional;

import com.github.javaparser.Range;
import com.github.javaparser.ast.Node;
import com.github.javaparser.ast.comments.Comment;

import java.util.Optional;

/**
* Represent the position of a child node in the NodeText of its parent.
*/
class ChildTextElement extends TextElement {
public class ChildTextElement extends TextElement {

private final Node child;

ChildTextElement(Node child) {
this.child = child;
}

String expand() {
@Override
public String expand() {
return LexicalPreservingPrinter.print(child);
}

Node getChild() {
public Node getChild() {
return child;
}

@Override
boolean isToken(int tokenKind) {
public boolean isToken(int tokenKind) {
return false;
}

@Override
boolean isNode(Node node) {
public boolean isNode(Node node) {
return node == child;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@
*/
package com.github.javaparser.printer.lexicalpreservation;

import java.util.*;

import com.github.javaparser.GeneratedJavaParserConstants;
import com.github.javaparser.ast.Modifier;
import com.github.javaparser.ast.Node;
Expand All @@ -37,8 +39,6 @@
import com.github.javaparser.printer.lexicalpreservation.changes.*;
import com.github.javaparser.utils.LineSeparator;

import java.util.*;

class LexicalDifferenceCalculator {

/**
Expand Down Expand Up @@ -71,7 +71,7 @@ void removeIndentationElements() {
}
}

static class CsmChild implements CsmElement {
public static class CsmChild implements CsmElement {

private final Node child;

Expand All @@ -88,6 +88,15 @@ public void prettyPrint(Node node, SourcePrinter printer) {
throw new UnsupportedOperationException();
}

/*
* Verifies if the content of the {@code CsmElement} is the same as the provided {@code TextElement}
*/
@Override
public boolean isCorrespondingElement(TextElement textElement) {
return (textElement instanceof ChildTextElement)
&& ((ChildTextElement)textElement).getChild() == getChild();
}

@Override
public String toString() {
return "child(" + child.getClass().getSimpleName() + ")";
Expand Down Expand Up @@ -141,7 +150,7 @@ private void replaceEolTokens(List<DifferenceElement> differenceElements, LineSe
}

/*
* Returns a new line token
* Returns a new line token
*/
private CsmElement getNewLineToken(LineSeparator lineSeparator) {
return CsmElement.newline(lineSeparator);
Expand Down Expand Up @@ -190,7 +199,7 @@ private void calculatedSyntaxModelForNode(CsmElement csm, Node node, List<CsmEle
if (change instanceof PropertyChange && ((PropertyChange) change).getProperty() == csmSingleReference.getProperty()) {
child = (Node) ((PropertyChange) change).getNewValue();
if (node instanceof LambdaExpr && child instanceof ExpressionStmt) {
// Same edge-case as in DefaultPrettyPrinterVisitor.visit(LambdaExpr, Void)
// Same edge-case as in DefaultPrettyPrinterVisitor.visit(LambdaExpr, Void)
child = ((ExpressionStmt) child).getExpression();
}
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,9 @@
import java.util.*;

import com.github.javaparser.printer.concretesyntaxmodel.CsmElement;
import com.github.javaparser.printer.concretesyntaxmodel.CsmIndent;
import com.github.javaparser.printer.concretesyntaxmodel.CsmMix;
import com.github.javaparser.printer.concretesyntaxmodel.CsmToken;
import com.github.javaparser.printer.lexicalpreservation.Difference.ArrayIterator;
import com.github.javaparser.printer.lexicalpreservation.LexicalDifferenceCalculator.CsmChild;

public class ReshuffledDiffElementExtractor {

Expand Down Expand Up @@ -161,25 +159,26 @@ private Map<Integer, Integer> getCorrespondanceBetweenNextOrderAndPreviousOrder(

private List<Integer> findIndexOfCorrespondingNodeTextElement(List<CsmElement> elements, NodeText nodeText) {
List<Integer> correspondingIndices = new ArrayList<>();
for (ListIterator<CsmElement> csmElementListIterator = elements.listIterator(); csmElementListIterator.hasNext(); ) {
ListIterator<CsmElement> csmElementListIterator = elements.listIterator();
while ( csmElementListIterator.hasNext() ) {
int previousCsmElementIndex = csmElementListIterator.previousIndex();
CsmElement csmElement = csmElementListIterator.next();
int nextCsmElementIndex = csmElementListIterator.nextIndex();
Map<MatchClassification, Integer> potentialMatches = new EnumMap<>(MatchClassification.class);
for (int i = 0; i < nodeText.numberOfElements(); i++) {
if (!correspondingIndices.contains(i)) {
TextElement textElement = nodeText.getTextElement(i);
boolean isCorresponding = isCorrespondingElement(textElement, csmElement);
boolean isCorresponding = csmElement.isCorrespondingElement(textElement);
if (isCorresponding) {
boolean hasSamePreviousElement = false;
if (i > 0 && previousCsmElementIndex > -1) {
TextElement previousTextElement = nodeText.getTextElement(i - 1);
hasSamePreviousElement = isCorrespondingElement(previousTextElement, elements.get(previousCsmElementIndex));
hasSamePreviousElement = elements.get(previousCsmElementIndex).isCorrespondingElement(previousTextElement);
}
boolean hasSameNextElement = false;
if (i < nodeText.numberOfElements() - 1 && nextCsmElementIndex < elements.size()) {
TextElement nextTextElement = nodeText.getTextElement(i + 1);
hasSameNextElement = isCorrespondingElement(nextTextElement, elements.get(nextCsmElementIndex));
hasSameNextElement = elements.get(nextCsmElementIndex).isCorrespondingElement(nextTextElement);
}
if (hasSamePreviousElement && hasSameNextElement) {
potentialMatches.putIfAbsent(MatchClassification.ALL, i);
Expand All @@ -206,33 +205,8 @@ private List<Integer> findIndexOfCorrespondingNodeTextElement(List<CsmElement> e
return correspondingIndices;
}

private boolean isCorrespondingElement(TextElement textElement, CsmElement csmElement) {
if (csmElement instanceof CsmToken) {
CsmToken csmToken = (CsmToken) csmElement;
if (textElement instanceof TokenTextElement) {
TokenTextElement tokenTextElement = (TokenTextElement) textElement;
return tokenTextElement.getTokenKind() == csmToken.getTokenType() && tokenTextElement.getText().equals(csmToken.getContent());
}
} else if (csmElement instanceof CsmChild) {
CsmChild csmChild = (CsmChild) csmElement;
if (textElement instanceof ChildTextElement) {
ChildTextElement childTextElement = (ChildTextElement) textElement;
return childTextElement.getChild() == csmChild.getChild();
}
} else if (csmElement instanceof CsmIndent) {
CsmIndent csmIndent = (CsmIndent) csmElement;
if (textElement instanceof TokenTextElement) {
TokenTextElement tokenTextElement = (TokenTextElement) textElement;
return tokenTextElement.isSpaceOrTab();
}
} else {
throw new UnsupportedOperationException();
}
return false;
}

private boolean isAlmostCorrespondingElement(TextElement textElement, CsmElement csmElement) {
if (isCorrespondingElement(textElement, csmElement)) {
if (csmElement.isCorrespondingElement(textElement)) {
return false;
}
return textElement.isWhiteSpace() && csmElement instanceof CsmToken && ((CsmToken) csmElement).isWhiteSpace();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,14 @@
*/
package com.github.javaparser.printer.lexicalpreservation;

import java.util.Optional;

import com.github.javaparser.JavaToken;
import com.github.javaparser.JavaToken.Kind;
import com.github.javaparser.Range;
import com.github.javaparser.ast.Node;

import java.util.Optional;

class TokenTextElement extends TextElement {
public class TokenTextElement extends TextElement {

private final JavaToken token;

Expand All @@ -44,16 +44,16 @@ class TokenTextElement extends TextElement {
}

@Override
String expand() {
public String expand() {
return token.getText();
}

// Visible for testing
String getText() {
public String getText() {
return token.getText();
}

int getTokenKind() {
public int getTokenKind() {
return token.getKind();
}

Expand Down

0 comments on commit 2c0bdef

Please sign in to comment.