use of org.spoofax.interpreter.terms.IStrategoAppl in project spoofax by metaborg.
the class JSGLRCompletionService method fromTokens.
// TODO: Do these strategies need to be specific for a language
@Nullable
protected ISourceLocation fromTokens(IStrategoTerm fragment, HybridInterpreter runtime, ITermFactory termFactory, int position, String languageName, Map<IStrategoTerm, Boolean> leftRecursiveTerms, Map<IStrategoTerm, Boolean> rightRecursiveTerms) {
final FileObject resource = SourceAttachment.getResource(fragment, resourceService);
final IToken left = ImploderAttachment.getLeftToken(fragment);
final IToken right = ImploderAttachment.getRightToken(fragment);
ITokens tokenizer = ImploderAttachment.getTokenizer(fragment);
IToken leftmostValid = left;
IToken rightmostValid = right;
boolean isList = (fragment instanceof IStrategoList) ? true : false;
boolean isOptional = false;
String sort = ImploderAttachment.getSort(fragment);
IStrategoTerm input = termFactory.makeString(sort);
boolean isLeftRecursive = false;
if (fragment instanceof IStrategoAppl && position > right.getEndOffset()) {
try {
isLeftRecursive = strategoCommon.invoke(runtime, input, "is-left-recursive") != null;
} catch (MetaborgException e) {
logger.error("Failed to check recursivity for term {} of sort {} - syntactic completion not activated for this language, please import the completion stratego library", fragment, sort);
}
}
boolean isRightRecursive = false;
if (fragment instanceof IStrategoAppl && position <= left.getStartOffset()) {
try {
isRightRecursive = strategoCommon.invoke(runtime, input, "is-right-recursive") != null;
} catch (MetaborgException e) {
logger.error("Failed to check recursivity for term {} of sort {} - syntactic completion not activated for this language, please import the completion stratego library", fragment, sort);
}
}
if (isLeftRecursive) {
leftRecursiveTerms.put(fragment, true);
}
if (isRightRecursive) {
rightRecursiveTerms.put(fragment, true);
}
if (left == null || right == null) {
return null;
}
if (!isList && left == right && left.getEndOffset() < left.getStartOffset()) {
isOptional = true;
}
// if it's a list or a node that is empty make the element includes the surrounding layout tokens
if (left.getStartOffset() > right.getEndOffset() || isList || isOptional || (isLeftRecursive && isRightRecursive)) {
for (int i = left.getIndex() - 1; i >= 0; i--) {
if (tokenizer.getTokenAt(i).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(i).getKind() == IToken.TK_ERROR) {
leftmostValid = tokenizer.getTokenAt(i);
} else {
break;
}
}
for (int i = right.getIndex() + 1; i < tokenizer.getTokenCount(); i++) {
if (tokenizer.getTokenAt(i).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(i).getKind() == IToken.TK_EOF || tokenizer.getTokenAt(i).getKind() == IToken.TK_ERROR) {
rightmostValid = tokenizer.getTokenAt(i);
} else {
break;
}
}
// if it is left recursive include the layout only on the right
} else if (isLeftRecursive) {
for (int i = left.getIndex(); i < right.getIndex(); i++) {
if (tokenizer.getTokenAt(i).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(i).getKind() == IToken.TK_ERROR) {
leftmostValid = tokenizer.getTokenAt(i + 1);
} else {
break;
}
}
for (int i = right.getIndex() + 1; i < tokenizer.getTokenCount(); i++) {
if (tokenizer.getTokenAt(i).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(i).getKind() == IToken.TK_EOF || tokenizer.getTokenAt(i).getKind() == IToken.TK_ERROR) {
rightmostValid = tokenizer.getTokenAt(i);
} else {
break;
}
}
// if it is right recursive include the layout only on the left
} else if (isRightRecursive) {
for (int i = left.getIndex() - 1; i >= 0; i--) {
if (tokenizer.getTokenAt(i).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(i).getKind() == IToken.TK_ERROR) {
leftmostValid = tokenizer.getTokenAt(i);
} else {
break;
}
}
for (int i = right.getIndex(); i > left.getIndex(); i--) {
if (tokenizer.getTokenAt(i).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(i).getKind() == IToken.TK_EOF || tokenizer.getTokenAt(i).getKind() == IToken.TK_ERROR) {
rightmostValid = tokenizer.getTokenAt(i - 1);
} else {
break;
}
}
} else // if not make it stripes the surrounding layout tokens
{
for (int i = left.getIndex(); i < right.getIndex(); i++) {
if (tokenizer.getTokenAt(i).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(i).getKind() == IToken.TK_ERROR) {
leftmostValid = tokenizer.getTokenAt(i + 1);
} else {
break;
}
}
for (int i = right.getIndex(); i > left.getIndex(); i--) {
if (tokenizer.getTokenAt(i).getKind() == IToken.TK_LAYOUT || tokenizer.getTokenAt(i).getKind() == IToken.TK_EOF || tokenizer.getTokenAt(i).getKind() == IToken.TK_ERROR) {
rightmostValid = tokenizer.getTokenAt(i - 1);
} else {
break;
}
}
}
final ISourceRegion region = JSGLRSourceRegionFactory.fromTokensLayout(leftmostValid, rightmostValid, (isOptional || isList || isLeftRecursive || isRightRecursive));
return new SourceLocation(region, resource);
}
use of org.spoofax.interpreter.terms.IStrategoAppl in project spoofax by metaborg.
the class ActionFacetFromESV method create.
@Nullable
public static ActionFacet create(IStrategoAppl esv) {
final Iterable<IStrategoAppl> menuTerms = ESVReader.collectTerms(esv, "ToolbarMenu");
final Collection<IMenu> menus = Lists.newLinkedList();
final Multimap<ITransformGoal, ITransformAction> actions = HashMultimap.create();
final ImmutableList<String> nesting = ImmutableList.of();
for (IStrategoAppl menuTerm : menuTerms) {
final IMenu submenu = menu(menuTerm, new TransformActionFlags(), nesting, actions);
menus.add(submenu);
}
addCompileGoal(esv, actions);
if (menus.isEmpty() && actions.isEmpty()) {
return null;
}
return new ActionFacet(actions, menus);
}
use of org.spoofax.interpreter.terms.IStrategoAppl in project spoofax by metaborg.
the class ActionFacetFromESV method addCompileGoal.
private static void addCompileGoal(IStrategoAppl esv, Multimap<ITransformGoal, ITransformAction> actions) {
final List<IStrategoAppl> onSaveHandlers = ESVReader.collectTerms(esv, "OnSave");
if (onSaveHandlers.isEmpty()) {
return;
}
for (IStrategoAppl onSaveHandler : onSaveHandlers) {
final String strategyName = Tools.asJavaString(onSaveHandler.getSubterm(0).getSubterm(0));
final ITransformGoal goal = new CompileGoal();
final ITransformAction action = new TransformAction("Compile", goal, new TransformActionFlags(), strategyName);
actions.put(goal, action);
}
}
use of org.spoofax.interpreter.terms.IStrategoAppl in project spoofax by metaborg.
the class ContextFacetFromESV method type.
@Nullable
public static String type(IStrategoAppl esv) {
final IStrategoAppl contextTerm = ESVReader.findTerm(esv, "Context");
if (contextTerm == null) {
return null;
}
final IStrategoAppl typeTerm = (IStrategoAppl) contextTerm.getSubterm(0);
final String name = typeTerm.getConstructor().getName();
switch(name) {
case "None":
return null;
default:
logger.warn("Unknown context type {}, defaulting to legacy context.", name);
case "Legacy":
return LegacyContextFactory.name;
case "TaskEngine":
return IndexTaskContextFactory.name;
}
}
use of org.spoofax.interpreter.terms.IStrategoAppl 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;
}
Aggregations