Search in sources :

Example 16 with IToken

use of org.spoofax.jsglr.client.imploder.IToken in project spoofax by metaborg.

the class JSGLRCompletionService method calculatePrefix.

private String calculatePrefix(int cursorPosition, IStrategoTerm proposalTerm) {
    String prefix = "";
    ITokens tokenizer = proposalTerm.getAttachment(ImploderAttachment.TYPE).getLeftToken().getTokenizer();
    IToken leftToken = proposalTerm.getAttachment(ImploderAttachment.TYPE).getLeftToken();
    IToken rightToken = proposalTerm.getAttachment(ImploderAttachment.TYPE).getRightToken();
    IToken current = leftToken;
    int endOffsetPrefix = Integer.MIN_VALUE;
    while (current.getEndOffset() < cursorPosition && current != rightToken) {
        if (endOffsetPrefix < current.getEndOffset()) {
            prefix += current.toString();
            endOffsetPrefix = current.getEndOffset();
        }
        current = tokenizer.getTokenAt(current.getIndex() + 1);
    }
    return prefix;
}
Also used : IToken(org.spoofax.jsglr.client.imploder.IToken) IStrategoString(org.spoofax.interpreter.terms.IStrategoString) ITokens(org.spoofax.jsglr.client.imploder.ITokens)

Example 17 with IToken

use of org.spoofax.jsglr.client.imploder.IToken in project spoofax by metaborg.

the class CategorizerService method categorize.

@Override
public Iterable<IRegionCategory<IStrategoTerm>> categorize(ILanguageImpl language, ISpoofaxParseUnit parseResult) {
    final List<IRegionCategory<IStrategoTerm>> regionCategories = Lists.newLinkedList();
    if (!parseResult.valid()) {
        return regionCategories;
    }
    final StylerFacet facet = language.facet(StylerFacet.class);
    if (facet == null) {
        logger.error("Cannot categorize input of {}, it does not have a styler facet", language);
        // GTODO: throw exception instead
        return regionCategories;
    }
    final ImploderAttachment rootImploderAttachment = ImploderAttachment.get(parseResult.ast());
    if (rootImploderAttachment == null) {
        logger.error("Cannot categorize input {} of {}, it does not have an imploder attachment", parseResult, language);
        // GTODO: throw exception instead
        return regionCategories;
    }
    final ITokens tokenizer = rootImploderAttachment.getLeftToken().getTokenizer();
    if (tokenizer == null) {
        logger.error("Cannot categorize input {} of {}, it does not have a tokenizer", parseResult, language);
        // GTODO: throw exception instead
        return regionCategories;
    }
    final int tokenCount = tokenizer.getTokenCount();
    int offset = -1;
    for (int i = 0; i < tokenCount; ++i) {
        final IToken token = tokenizer.getTokenAt(i);
        if (tokenizer.isAmbigous() && token.getStartOffset() < offset) {
            // In case of ambiguities, tokens inside the ambiguity are duplicated, ignore.
            continue;
        }
        if (token.getStartOffset() > token.getEndOffset()) {
            // Indicates an invalid region. Empty lists have regions like this.
            continue;
        }
        if (offset >= token.getStartOffset()) {
            // Duplicate region, skip.
            continue;
        }
        offset = token.getEndOffset();
        final ICategory category = category(facet, token);
        if (category != null) {
            final ISourceRegion region = JSGLRSourceRegionFactory.fromToken(token);
            final IStrategoTerm term = (IStrategoTerm) token.getAstNode();
            regionCategories.add(new RegionCategory<>(region, category, term));
        }
    }
    return regionCategories;
}
Also used : IStrategoTerm(org.spoofax.interpreter.terms.IStrategoTerm) IToken(org.spoofax.jsglr.client.imploder.IToken) ICategory(org.metaborg.core.style.ICategory) ISourceRegion(org.metaborg.core.source.ISourceRegion) IRegionCategory(org.metaborg.core.style.IRegionCategory) ImploderAttachment(org.spoofax.jsglr.client.imploder.ImploderAttachment) ITokens(org.spoofax.jsglr.client.imploder.ITokens)

Example 18 with IToken

use of org.spoofax.jsglr.client.imploder.IToken in project spoofax by metaborg.

the class JSGLRParseErrorHandler method reportErrorNearOffset.

private void reportErrorNearOffset(ITokens tokenizer, int offset, String message) {
    final IToken errorToken = ((AbstractTokenizer) tokenizer).getErrorTokenOrAdjunct(offset);
    final ISourceRegion region = JSGLRSourceRegionFactory.fromTokens(errorToken, errorToken);
    reportErrorAtRegion(region, message);
}
Also used : AbstractTokenizer(org.spoofax.jsglr.client.imploder.AbstractTokenizer) IToken(org.spoofax.jsglr.client.imploder.IToken) ISourceRegion(org.metaborg.core.source.ISourceRegion)

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