package org.xpect.parameter;
import org.xpect.XpectInvocation;
import org.xpect.text.CharSequences;
import org.xpect.text.IRegion;
public class OffsetRegion extends DerivedRegion {
private final int matchedOffset;
private final DerivedRegion matchedRegion;
public OffsetRegion(IStatementRelatedRegion origin, int matchedOffset) {
super(origin, -1, -1);
this.matchedRegion = null;
this.matchedOffset = matchedOffset;
}
public OffsetRegion(IStatementRelatedRegion origin, int offset, int length) {
super(origin, offset, length);
String val = getRegionText();
int add = val.indexOf('|');
if (add >= 0)
val = val.substring(0, add) + val.substring(add + 1);
else
add = 0;
XpectInvocation statement = getStatement();
IStatementRelatedRegion extendedRegion = statement.getExtendedRegion();
int nodeOffset = extendedRegion.getOffset() + extendedRegion.getLength();
String text = statement.getFile().getDocument();
int result = -1;
do {
result = text.indexOf(val, nodeOffset);
nodeOffset = result + 1;
} while (statement.getFile().getInvocationAt(result) != null);
if (result >= 0) {
this.matchedOffset = result + add;
if (add > 0)
this.matchedRegion = createMatchedRegion(result, length - 1);
else
this.matchedRegion = createMatchedRegion(result, length);
} else
throw new RuntimeException("OFFSET '" + val + "' not found.");
}
private DerivedRegion createMatchedRegion(int offset, int length) {
return new DerivedRegion(this, offset, length);
}
public int getMatchedOffset() {
return matchedOffset;
}
public IRegion getMatchedRegion() {
return matchedRegion;
}
@Override
public String toString() {
if (matchedOffset < 0 || matchedRegion == null) {
return "(not available)";
} else {
int offset = matchedRegion.getOffset();
int end = offset + matchedRegion.getLength();
CharSequence document = getDocument();
String prefix = CharSequences.getPrefix(document, offset, 24);
String postfix = CharSequences.getPostfix(document, end, 24);
String before = document.subSequence(offset, matchedOffset).toString();
String after = document.subSequence(matchedOffset, end).toString();
return prefix + ">>>" + before + "|" + after + "<<<" + postfix;
}
}
}