use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.
the class AbstractPDAProvider method createState.
/**
* @since 2.0
*/
protected PDAState createState(PDAContext<CTX> ctx, RuleCallStackElement stack, INFAState<?, ?> fromNfa, EClass constructedType, boolean returning, boolean canReturn, Set<Pair<Boolean, INFAState<?, ?>>> visited) {
Set<Pair<Boolean, INFAState<?, ?>>> visited2 = Sets.newHashSet();
if (stack == null || !canReachContextEnd(ctx, stack.cloneWithoutVisited(), fromNfa, constructedType, returning, canReturn, visited2))
return null;
if (constructedType == null)
constructedType = getConstructedType(fromNfa.getGrammarElement());
AbstractElement ge = fromNfa.getGrammarElement();
PDAState result = null;
if (canEnterRuleCall(fromNfa)) {
if (returning) {
if ((result = ctx.ruleCallExit.get(fromNfa)) == null)
ctx.ruleCallExit.put(fromNfa, result = createState(PDAStateType.RULECALL_EXIT, ge));
} else {
if ((result = ctx.ruleCallEnter.get(fromNfa)) == null)
ctx.ruleCallEnter.put(fromNfa, result = createState(PDAStateType.RULECALL_ENTER, ge));
}
} else {
if ((result = ctx.elements.get(fromNfa)) == null)
ctx.elements.put(fromNfa, result = createState(PDAStateType.ELEMENT, ge));
}
if (!visited.add(Tuples.<Boolean, INFAState<?, ?>>create(returning, fromNfa)))
return result;
if (!returning && canEnterRuleCall(fromNfa)) {
if (stack.hasEnteredTwice(fromNfa))
return result;
stack = stackPush(stack, fromNfa);
visited = Sets.newHashSet();
}
if (result.followers == null || result.followers == Collections.EMPTY_SET) {
result.followers = Sets.newHashSet();
}
if (isFinalState(ctx.context, fromNfa, returning, canReturn))
result.followers.add(ctx.stop);
for (INFAState<?, ?> follower : getFollowers(ctx.context, fromNfa, returning, canReturn)) {
boolean folCanReturn = !canEnterRuleCall(follower);
boolean folReturning = follower.hasOutgoingRuleCall() && folCanReturn;
PDAState r = createState(ctx, stack, follower, constructedType, folReturning, folCanReturn, visited);
if (r != null)
result.followers.add(r);
}
if (canReturn && fromNfa.isEndState() && stack != null && stack.getRuleCall() != null) {
visited = Sets.newHashSet();
PDAState r = createState(ctx, stack.getParent(), stack.getRuleCall(), constructedType, true, true, visited);
if (r != null)
result.followers.add(r);
}
return result;
}
use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.
the class StringProduction method lex.
protected Stack<Pair<Token, String>> lex(String string) {
int offset = 0;
Matcher wsMatcher = WS.matcher(string);
List<Pair<Token, Matcher>> matcher = Lists.newArrayList();
for (Token t : Token.values()) matcher.add(Tuples.create(t, t.pattern.matcher(string)));
Stack<Pair<Token, String>> result = new Stack<Pair<Token, String>>();
ROOT: while (offset < string.length()) {
wsMatcher.region(offset, string.length());
if (wsMatcher.find()) {
offset = wsMatcher.end();
continue ROOT;
}
for (Pair<Token, Matcher> m : matcher) {
m.getSecond().region(offset, string.length());
if (m.getSecond().find()) {
result.add(Tuples.create(m.getFirst(), m.getSecond().group(m.getSecond().groupCount() == 1 ? 1 : 0)));
offset = m.getSecond().end();
continue ROOT;
}
}
throw new RuntimeException("No valid token found at '" + string.substring(offset) + "'");
}
Collections.reverse(result);
return result;
}
use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.
the class LazyLinkerTest method setUp.
@Override
public void setUp() throws Exception {
super.setUp();
with(new AbstractModule() {
@Override
protected void configure() {
bind(EPackage.Registry.class).toInstance(EPackage.Registry.INSTANCE);
bind(IGrammarAccess.class).toInstance(new IGrammarAccess() {
@Override
public List<Pair<Keyword, Keyword>> findKeywordPairs(String leftKw, String rightKw) {
return Collections.emptyList();
}
@Override
public List<Keyword> findKeywords(String... keywords) {
return Collections.emptyList();
}
@Override
public List<RuleCall> findRuleCalls(AbstractRule... rules) {
return Collections.emptyList();
}
@Override
public Grammar getGrammar() {
return XtextFactory.eINSTANCE.createGrammar();
}
});
}
});
linker = get(LazyLinker.class);
resourceSet = get(XtextResourceSet.class);
resourceSet.setClasspathURIContext(getClass());
lazyLinkingPackage = (EPackage) resourceSet.getResource(URI.createURI("classpath:/org/eclipse/xtext/linking/lazy/LazyLinking.ecore"), true).getContents().get(0);
}
use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.
the class SerializerTestHelper method assertSerializeWithoutNodeModel.
public void assertSerializeWithoutNodeModel(EObject semanticObject) {
try {
EObject parsed;
if (semanticObject.eResource().getContents().contains(semanticObject)) {
List<Pair<EObject, ICompositeNode>> nodes = detachNodeModel(semanticObject);
String serialized = serializeWithoutNodeModel(semanticObject);
parsed = parseHelper.parse(serialized, semanticObject.eResource().getResourceSet());
reattachNodes(nodes);
} else {
INode oldNode = NodeModelUtils.getNode(semanticObject);
String oldtext = oldNode.getRootNode().getText();
String oldURI = semanticObject.eResource().getURIFragment(semanticObject);
List<Pair<EObject, ICompositeNode>> nodes = detachNodeModel(semanticObject);
String serialized = serializeWithoutNodeModel(semanticObject);
ITextRegion oldRegion = oldNode.getTextRegion();
String newtext = oldtext.substring(0, oldRegion.getOffset()) + serialized + oldtext.substring(oldRegion.getOffset() + oldRegion.getLength());
EObject newmodel = parseHelper.parse(newtext, semanticObject.eResource().getResourceSet());
parsed = newmodel.eResource().getEObject(oldURI);
reattachNodes(nodes);
}
EcoreUtil.resolveAll(parsed);
Assert.assertTrue(parsed.eResource().getErrors().toString(), parsed.eResource().getErrors().isEmpty());
parsed.eResource().getResourceSet().getResources().remove(parsed.eResource());
assertEqualWithEmfFormatter(semanticObject, parsed);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
use of org.eclipse.xtext.util.Pair in project xtext-core by eclipse.
the class SerializerTestHelper method detachNodeModel.
protected List<Pair<EObject, ICompositeNode>> detachNodeModel(EObject eObject) {
EcoreUtil.resolveAll(eObject);
List<Pair<EObject, ICompositeNode>> result = Lists.newArrayList();
Iterator<Object> iterator = EcoreUtil.getAllContents(eObject.eResource(), false);
while (iterator.hasNext()) {
EObject object = (EObject) iterator.next();
Iterator<Adapter> adapters = object.eAdapters().iterator();
while (adapters.hasNext()) {
Adapter adapter = adapters.next();
if (adapter instanceof ICompositeNode) {
adapters.remove();
result.add(Tuples.create(object, (ICompositeNode) adapter));
break;
}
}
}
return result;
}
Aggregations