Skip to content

Commit

Permalink
feature: add #getSourceDetails to debug source code positions (#1950)
Browse files Browse the repository at this point in the history
  • Loading branch information
pvojtechovsky authored and monperrus committed Apr 16, 2018
1 parent 3a1ea6c commit 5885431
Show file tree
Hide file tree
Showing 5 changed files with 78 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ SourcePosition buildPositionCtElement(CtElement e, ASTNode node) {
if (variableDeclaration.type != null) {
modifiersSourceEnd = variableDeclaration.type.sourceStart() - 2;
} else if (variableDeclaration instanceof Initializer) {
modifiersSourceEnd = ((Initializer) variableDeclaration).block.sourceStart;
modifiersSourceEnd = ((Initializer) variableDeclaration).block.sourceStart - 1;
} else {
// variable that has no type such as TypeParameter
modifiersSourceEnd = declarationSourceStart - 1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ public BodyHolderSourcePositionImpl(
modifierSourceStart, modifierSourceEnd,
declarationSourceStart, declarationSourceEnd,
lineSeparatorPositions);
checkArgsAreAscending(declarationSourceStart, modifierSourceStart, modifierSourceEnd + 1, sourceStart, sourceEnd + 1, bodyStart, bodyEnd + 1, declarationSourceEnd + 1);
this.bodyStart = bodyStart;
this.bodyEnd = bodyEnd;
}
Expand All @@ -58,4 +59,10 @@ public int getBodyStart() {
public int getBodyEnd() {
return bodyEnd;
}

@Override
public String getSourceDetails() {
return super.getSourceDetails()
+ "\nbody = " + getFragment(getBodyStart(), getBodyEnd());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public DeclarationSourcePositionImpl(CompilationUnit compilationUnit, int source
super(compilationUnit,
sourceStart, sourceEnd,
lineSeparatorPositions);
checkArgsAreAscending(declarationSourceStart, modifierSourceStart, modifierSourceEnd + 1, sourceStart, sourceEnd + 1, declarationSourceEnd + 1);
this.modifierSourceStart = modifierSourceStart;
this.declarationSourceStart = declarationSourceStart;
this.declarationSourceEnd = declarationSourceEnd;
Expand Down Expand Up @@ -86,4 +87,12 @@ public int getModifierSourceEnd() {
public int getEndLine() {
return searchLineNumber(declarationSourceEnd);
}

@Override
public String getSourceDetails() {
return super.getSourceDetails()
+ "\nmodifier = " + getFragment(getModifierSourceStart(), getModifierSourceEnd())
+ "\nname = " + getFragment(getNameStart(), getNameEnd());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,11 @@
*/
package spoon.support.reflect.cu.position;

import spoon.SpoonException;
import spoon.reflect.cu.CompilationUnit;
import spoon.reflect.cu.SourcePosition;
import spoon.reflect.cu.position.BodyHolderSourcePosition;
import spoon.reflect.cu.position.DeclarationSourcePosition;

import java.io.File;
import java.io.Serializable;
Expand Down Expand Up @@ -112,6 +115,7 @@ private int searchColumnNumber(int position) {

public SourcePositionImpl(CompilationUnit compilationUnit, int sourceStart, int sourceEnd, int[] lineSeparatorPositions) {
super();
checkArgsAreAscending(sourceStart, sourceEnd + 1);
this.compilationUnit = compilationUnit;
if (compilationUnit != null) {
this.file = compilationUnit.getFile();
Expand Down Expand Up @@ -193,4 +197,34 @@ public CompilationUnit getCompilationUnit() {
return compilationUnit;
}

/**
* Helper for debugging purposes. Displays |startIndex; endIndex|sourceCode| of this {@link SourcePosition}
* If this instance is {@link DeclarationSourcePosition} or {@link BodyHolderSourcePosition}
* Then details about name, modifiers and body are included in resulting string too
* @return details about source code of this {@link SourcePosition}
*/
public String getSourceDetails() {
return getFragment(getSourceStart(), getSourceEnd());
}

protected String getFragment(int start, int end) {
return "|" + start + ";" + end + "|" + getCompilationUnit().getOriginalSourceCode().substring(start, end + 1) + "|";
}

/**
* fails when `values` are not sorted ascending
* It is used to check whether start/end values of SourcePosition are consistent
*/
protected static void checkArgsAreAscending(int...values) {
int last = -1;
for (int value : values) {
if (value < 0) {
throw new SpoonException("SourcePosition value must not be negative");
}
if (last > value) {
throw new SpoonException("SourcePosition values must be ascending or equal");
}
last = value;
}
}
}
27 changes: 27 additions & 0 deletions src/test/java/spoon/test/sourcePosition/SourcePositionTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import org.junit.Test;

import spoon.reflect.code.CtInvocation;
import spoon.reflect.cu.CompilationUnit;
import spoon.reflect.cu.SourcePosition;
import spoon.reflect.cu.position.NoSourcePosition;
import spoon.reflect.declaration.CtMethod;
Expand All @@ -12,6 +13,10 @@
import spoon.reflect.reference.CtTypeReference;
import spoon.reflect.visitor.Filter;
import spoon.reflect.visitor.filter.TypeFilter;
import spoon.support.reflect.cu.CompilationUnitImpl;
import spoon.support.reflect.cu.position.BodyHolderSourcePositionImpl;
import spoon.support.reflect.cu.position.DeclarationSourcePositionImpl;
import spoon.support.reflect.cu.position.SourcePositionImpl;
import spoon.test.sourcePosition.testclasses.Brambora;
import spoon.testing.utils.ModelUtils;

Expand Down Expand Up @@ -70,4 +75,26 @@ public void testSourcePositionOfSecondPrimitiveType() throws Exception {
}
}

@Test
public void testSourcePositionStringFragment() throws Exception {
CompilationUnit cu = new CompilationUnitImpl() {
@Override
public String getOriginalSourceCode() {
return "0123456789";
}
};
SourcePositionImpl sp = new SourcePositionImpl(cu, 1, 9, null);
assertEquals("|1;9|123456789|", sp.getSourceDetails());

DeclarationSourcePositionImpl dsp = new DeclarationSourcePositionImpl(cu, 4, 7, 2, 2, 1,9, null);
assertEquals("|1;9|123456789|\n" +
"modifier = |2;2|2|\n" +
"name = |4;7|4567|", dsp.getSourceDetails());

BodyHolderSourcePositionImpl bhsp = new BodyHolderSourcePositionImpl(cu, 4, 7, 2, 2, 1,9, 8, 9, null);
assertEquals("|1;9|123456789|\n" +
"modifier = |2;2|2|\n" +
"name = |4;7|4567|\n" +
"body = |8;9|89|", bhsp.getSourceDetails());
}
}

0 comments on commit 5885431

Please sign in to comment.