use of org.spoofax.jsglr.client.imploder.IToken in project spoofax by metaborg.
the class JSGLRParseErrorHandler method gatherNonFatalErrors.
/*
* Non-fatal (recoverable) errors
*/
public void gatherNonFatalErrors(IStrategoTerm top) {
final ITokens tokenizer = getTokenizer(top);
if (tokenizer != null) {
for (int i = 0, max = tokenizer.getTokenCount(); i < max; i++) {
final IToken token = tokenizer.getTokenAt(i);
final String error = token.getError();
if (error != null) {
if (error == ITokens.ERROR_SKIPPED_REGION) {
i = findRightMostWithSameError(token, null);
reportSkippedRegion(token, tokenizer.getTokenAt(i));
} else if (error.startsWith(ITokens.ERROR_WARNING_PREFIX)) {
i = findRightMostWithSameError(token, null);
reportWarningAtTokens(token, tokenizer.getTokenAt(i), error);
} else if (error.startsWith(ITokens.ERROR_WATER_PREFIX)) {
i = findRightMostWithSameError(token, ITokens.ERROR_WATER_PREFIX);
reportErrorAtTokens(token, tokenizer.getTokenAt(i), error);
} else {
i = findRightMostWithSameError(token, null);
// UNDONE: won't work for multi-token errors (as seen in
// SugarJ)
reportErrorAtTokens(token, tokenizer.getTokenAt(i), error);
}
}
}
}
}
use of org.spoofax.jsglr.client.imploder.IToken in project spoofax by metaborg.
the class JSGLRParseErrorHandler method findNextNonEmptyToken.
private static IToken findNextNonEmptyToken(IToken token) {
final ITokens tokenizer = token.getTokenizer();
IToken result = null;
for (int i = token.getIndex(), max = tokenizer.getTokenCount(); i < max; i++) {
result = tokenizer.getTokenAt(i);
if (result.getLength() != 0 && !Token.isWhiteSpace(result))
break;
}
return result;
}
use of org.spoofax.jsglr.client.imploder.IToken in project spoofax by metaborg.
the class JSGLRParseErrorHandler method reportBadToken.
private void reportBadToken(ITokens tokenizer, BadTokenException exception) {
final String message;
if (exception.isEOFToken() || tokenizer.getTokenCount() <= 1) {
message = exception.getShortMessage();
} else {
IToken token = tokenizer.getTokenAtOffset(exception.getOffset());
token = findNextNonEmptyToken(token);
message = ITokens.ERROR_WATER_PREFIX + ": " + token.toString().trim();
}
reportErrorNearOffset(tokenizer, exception.getOffset(), message);
}
use of org.spoofax.jsglr.client.imploder.IToken in project spoofax by metaborg.
the class TracingService method tokenLocation.
private ISourceLocation tokenLocation(IStrategoTerm fragment) {
final IToken left = ImploderAttachment.getLeftToken(fragment);
final IToken right = ImploderAttachment.getRightToken(fragment);
if (left == null || right == null) {
return null;
}
final ISourceRegion region = JSGLRSourceRegionFactory.fromTokens(left, right);
final FileObject resource = SourceAttachment.getResource(fragment, resourceService);
return new SourceLocation(region, resource);
}
use of org.spoofax.jsglr.client.imploder.IToken in project spoofax by metaborg.
the class JSGLRCompletionService method createCompletionInsertAtEnd.
private ICompletion createCompletionInsertAtEnd(String name, String text, String additionalInfo, StrategoAppl change, boolean blankLineCompletion) {
final StrategoTerm oldNode = (StrategoTerm) change.getSubterm(0);
final StrategoTerm newNode = (StrategoTerm) change.getSubterm(1);
// expected two lists
if (change.getSubtermCount() != 2 || !(oldNode instanceof IStrategoList) || !(newNode instanceof IStrategoList)) {
return null;
}
final String sort = ImploderAttachment.getElementSort(oldNode);
int insertionPoint, suffixPoint;
ITokens tokenizer = ImploderAttachment.getTokenizer(oldNode);
final ImploderAttachment oldListIA = oldNode.getAttachment(ImploderAttachment.TYPE);
int tokenPosition;
// node
if (oldNode.getSubtermCount() == 0) {
tokenPosition = oldListIA.getLeftToken().getIndex() - 1 > 0 ? oldListIA.getLeftToken().getIndex() - 1 : 0;
while ((tokenizer.getTokenAt(tokenPosition).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(tokenPosition).getKind() == IToken.TK_ERROR) && tokenPosition > 0) tokenPosition--;
insertionPoint = tokenizer.getTokenAt(tokenPosition).getEndOffset();
} else {
// if list is not empty
// insert after at end offset of the rightmost token of the element before the
// completion
StrategoTerm elementBefore = (StrategoTerm) oldNode.getSubterm(oldNode.getAllSubterms().length - 1);
int leftIdx = elementBefore.getAttachment(ImploderAttachment.TYPE).getLeftToken().getIndex();
int rightIdx = elementBefore.getAttachment(ImploderAttachment.TYPE).getRightToken().getIndex();
while ((tokenizer.getTokenAt(rightIdx).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(rightIdx).getLength() == 0) && rightIdx > leftIdx) {
rightIdx--;
}
insertionPoint = tokenizer.getTokenAt(rightIdx).getEndOffset();
tokenPosition = rightIdx;
}
suffixPoint = insertionPoint + 1;
// if completion is triggered in an empty line, consume that line
IToken checkToken;
boolean blankLine = false;
if (blankLineCompletion) {
for (; tokenPosition < tokenizer.getTokenCount(); tokenPosition++) {
checkToken = tokenizer.getTokenAt(tokenPosition);
if (tokenizer.toString(checkToken, checkToken).contains("\n")) {
suffixPoint = checkToken.getEndOffset();
if (!blankLine) {
blankLine = true;
} else {
break;
}
}
}
}
return new Completion(name, sort, text, additionalInfo, insertionPoint + 1, suffixPoint, CompletionKind.expansion);
}
Aggregations