Search in sources :

Example 11 with IToken

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

the class JSGLRCompletionService method getPlaceholder.

@Nullable
private IStrategoAppl getPlaceholder(int position, final Iterable<IStrategoTerm> terms) {
    for (IStrategoTerm term : terms) {
        if (term instanceof IStrategoAppl) {
            IToken left = ImploderAttachment.getLeftToken(term);
            IToken right = ImploderAttachment.getRightToken(term);
            final IStrategoAppl appl = (IStrategoAppl) term;
            if (appl.getConstructor().getName().endsWith("-Plhdr") && position > left.getStartOffset() && position <= right.getEndOffset()) {
                return appl;
            }
        }
    }
    return null;
}
Also used : IStrategoTerm(org.spoofax.interpreter.terms.IStrategoTerm) IToken(org.spoofax.jsglr.client.imploder.IToken) IStrategoAppl(org.spoofax.interpreter.terms.IStrategoAppl) Nullable(javax.annotation.Nullable)

Example 12 with IToken

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

the class TermOrigin method toString.

@Override
public String toString() {
    IToken token = getImploderAttachment().getLeftToken();
    StringBuilder sb = new StringBuilder();
    sb.append("@");
    sb.append(token.getFilename());
    sb.append(":");
    sb.append(token.getLine());
    sb.append(",");
    sb.append(token.getColumn());
    return sb.toString();
}
Also used : IToken(org.spoofax.jsglr.client.imploder.IToken)

Example 13 with IToken

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

the class JSGLRCompletionService method getLists.

@Nullable
private Iterable<IStrategoList> getLists(final Iterable<IStrategoTerm> terms, Map<IStrategoTerm, Boolean> leftRecursiveTerms, Map<IStrategoTerm, Boolean> rightRecursiveTerms) {
    Collection<IStrategoList> lists = Lists.newLinkedList();
    for (IStrategoTerm term : terms) {
        if (term instanceof IStrategoList) {
            final IStrategoList list = (IStrategoList) term;
            lists.add(list);
        } else {
            IToken left = ImploderAttachment.getLeftToken(term);
            IToken right = ImploderAttachment.getRightToken(term);
            // if term is not nullable, nor a list nor left or right recursive stop the search
            if (left.getStartOffset() <= right.getEndOffset()) {
                boolean isLeftRecursive = leftRecursiveTerms.containsKey(term);
                boolean isRightRecursive = rightRecursiveTerms.containsKey(term);
                if (!isLeftRecursive && !isRightRecursive) {
                    break;
                }
            }
        }
    }
    return lists;
}
Also used : IStrategoTerm(org.spoofax.interpreter.terms.IStrategoTerm) IToken(org.spoofax.jsglr.client.imploder.IToken) IStrategoList(org.spoofax.interpreter.terms.IStrategoList) Nullable(javax.annotation.Nullable)

Example 14 with IToken

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

the class JSGLRCompletionService method createCompletionInsertBefore.

private ICompletion createCompletionInsertBefore(String name, String text, String additionalInfo, StrategoAppl change) {
    final StrategoTerm oldNode = (StrategoTerm) change.getSubterm(0);
    final StrategoTerm newNode = (StrategoTerm) change.getSubterm(1);
    // expect two terms and 1st should be an element of a list
    final StrategoTerm oldList = (StrategoTerm) ParentAttachment.getParent(oldNode);
    if (change.getSubtermCount() != 2 || !(oldNode instanceof IStrategoAppl) || !(newNode instanceof IStrategoList) || !(oldList instanceof IStrategoList)) {
        return null;
    }
    final String sort = ImploderAttachment.getSort(oldNode);
    int insertionPoint, suffixPoint;
    ITokens tokenizer = ImploderAttachment.getTokenizer(oldNode);
    IStrategoTerm[] subterms = oldList.getAllSubterms();
    int indexOfElement;
    for (indexOfElement = 0; indexOfElement < subterms.length; indexOfElement++) {
        if (subterms[indexOfElement] == oldNode)
            break;
    }
    // if inserted element is first (only two elements)
    if (indexOfElement == 0) {
        // insert after the first non-layout token before the leftmost token of the
        // completion node
        final ImploderAttachment oldNodeIA = oldNode.getAttachment(ImploderAttachment.TYPE);
        int tokenPosition = oldNodeIA.getLeftToken().getIndex() - 1 > 0 ? oldNodeIA.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 inserted element is not first
        // insert after at end offset of the rightmost token of the element before the
        // completion
        StrategoTerm elementBefore = (StrategoTerm) oldList.getSubterm(indexOfElement - 1);
        insertionPoint = elementBefore.getAttachment(ImploderAttachment.TYPE).getRightToken().getEndOffset();
    }
    // if completion is separated by a newline, preserve indentation of the subsequent node
    // else separation follows from the grammar
    String separator = "";
    for (int i = text.length() - 1; i >= 0; i--) {
        if (text.charAt(i) == additionalInfo.charAt(additionalInfo.length() - 1)) {
            break;
        }
        separator = text.charAt(i) + separator;
    }
    IToken checkToken = oldNode.getAttachment(ImploderAttachment.TYPE).getLeftToken();
    int checkTokenIdx = oldNode.getAttachment(ImploderAttachment.TYPE).getLeftToken().getIndex();
    suffixPoint = insertionPoint;
    if (separator.contains("\n")) {
        for (; checkTokenIdx >= 0; checkTokenIdx--) {
            checkToken = tokenizer.getTokenAt(checkTokenIdx);
            if (tokenizer.toString(checkToken, checkToken).contains("\n")) {
                break;
            }
            suffixPoint = checkToken.getStartOffset();
        }
    } else {
        suffixPoint = checkToken.getStartOffset();
    }
    return new Completion(name, sort, text, additionalInfo, insertionPoint + 1, suffixPoint, CompletionKind.expansion);
}
Also used : IStrategoTerm(org.spoofax.interpreter.terms.IStrategoTerm) 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) IStrategoAppl(org.spoofax.interpreter.terms.IStrategoAppl) 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)

Example 15 with IToken

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

the class JSGLRCompletionService method getRightRecursiveTerms.

private Iterable<IStrategoTerm> getRightRecursiveTerms(int position, Iterable<IStrategoTerm> terms, Map<IStrategoTerm, Boolean> rightRecursiveTerms) {
    Collection<IStrategoTerm> rightRecursive = Lists.newLinkedList();
    for (IStrategoTerm term : terms) {
        boolean isRightRecursive = rightRecursiveTerms.containsKey(term);
        IToken left = ImploderAttachment.getLeftToken(term);
        IToken right = ImploderAttachment.getRightToken(term);
        if (isRightRecursive && position <= left.getStartOffset()) {
            rightRecursive.add(term);
        } else if (term instanceof IStrategoList || left.getStartOffset() > right.getEndOffset()) {
            continue;
        } else {
            break;
        }
    }
    return rightRecursive;
}
Also used : IStrategoTerm(org.spoofax.interpreter.terms.IStrategoTerm) IToken(org.spoofax.jsglr.client.imploder.IToken) IStrategoList(org.spoofax.interpreter.terms.IStrategoList)

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