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;
}
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();
}
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;
}
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);
}
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;
}
Aggregations