Search in sources :

Example 1 with IToken

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);
                }
            }
        }
    }
}
Also used : IToken(org.spoofax.jsglr.client.imploder.IToken) ITokens(org.spoofax.jsglr.client.imploder.ITokens)

Example 2 with IToken

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;
}
Also used : IToken(org.spoofax.jsglr.client.imploder.IToken) ITokens(org.spoofax.jsglr.client.imploder.ITokens)

Example 3 with IToken

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);
}
Also used : IToken(org.spoofax.jsglr.client.imploder.IToken)

Example 4 with IToken

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);
}
Also used : SourceLocation(org.metaborg.core.source.SourceLocation) ISourceLocation(org.metaborg.core.source.ISourceLocation) IToken(org.spoofax.jsglr.client.imploder.IToken) ISourceRegion(org.metaborg.core.source.ISourceRegion) FileObject(org.apache.commons.vfs2.FileObject)

Example 5 with IToken

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);
}
Also used : ICompletion(org.metaborg.core.completion.ICompletion) Completion(org.metaborg.core.completion.Completion) IStrategoTerm(org.spoofax.interpreter.terms.IStrategoTerm) StrategoTerm(org.spoofax.terms.StrategoTerm) IToken(org.spoofax.jsglr.client.imploder.IToken) IStrategoList(org.spoofax.interpreter.terms.IStrategoList) IStrategoString(org.spoofax.interpreter.terms.IStrategoString) ImploderAttachment(org.spoofax.jsglr.client.imploder.ImploderAttachment) ListImploderAttachment(org.spoofax.jsglr.client.imploder.ListImploderAttachment) ITokens(org.spoofax.jsglr.client.imploder.ITokens)

Aggregations

IToken (org.spoofax.jsglr.client.imploder.IToken)18 IStrategoTerm (org.spoofax.interpreter.terms.IStrategoTerm)10 ITokens (org.spoofax.jsglr.client.imploder.ITokens)9 IStrategoList (org.spoofax.interpreter.terms.IStrategoList)7 IStrategoString (org.spoofax.interpreter.terms.IStrategoString)6 Nullable (javax.annotation.Nullable)4 ISourceRegion (org.metaborg.core.source.ISourceRegion)4 IStrategoAppl (org.spoofax.interpreter.terms.IStrategoAppl)4 ImploderAttachment (org.spoofax.jsglr.client.imploder.ImploderAttachment)4 Completion (org.metaborg.core.completion.Completion)3 ICompletion (org.metaborg.core.completion.ICompletion)3 ListImploderAttachment (org.spoofax.jsglr.client.imploder.ListImploderAttachment)3 StrategoTerm (org.spoofax.terms.StrategoTerm)3 FileObject (org.apache.commons.vfs2.FileObject)2 ISourceLocation (org.metaborg.core.source.ISourceLocation)2 SourceLocation (org.metaborg.core.source.SourceLocation)2 MetaborgException (org.metaborg.core.MetaborgException)1 CompletionKind (org.metaborg.core.completion.CompletionKind)1 ICategory (org.metaborg.core.style.ICategory)1 IRegionCategory (org.metaborg.core.style.IRegionCategory)1