Search in sources :

Example 31 with Group

use of org.eclipse.xtext.Group in project xtext-core by eclipse.

the class XtextSerializerTest method testFQNInSuper_02.

@Ignore("Serialization does not have the correct context information")
@Test
public void testFQNInSuper_02() {
    Grammar grammar = load(URI.createURI("classpath:/org/eclipse/xtext/grammarinheritance/InheritanceTestLanguage.xtext"));
    AbstractRule rule = GrammarUtil.findRuleForName(grammar, "FQN");
    Assert.assertNotNull(rule);
    Group group = (Group) rule.getAlternatives();
    RuleCall ruleCall = (RuleCall) group.getElements().get(0);
    TerminalRule id = (TerminalRule) ruleCall.getRule();
    Assert.assertSame(grammar, GrammarUtil.getGrammar(id));
    String string = get(ISerializer.class).serialize(rule.getAlternatives());
    Assert.assertEquals("ID (\".\" ID)*", string);
    // currently wrong result is
    Assert.assertEquals("super::ID (\".\" super::ID)*", string);
}
Also used : Group(org.eclipse.xtext.Group) Grammar(org.eclipse.xtext.Grammar) TerminalRule(org.eclipse.xtext.TerminalRule) AbstractRule(org.eclipse.xtext.AbstractRule) RuleCall(org.eclipse.xtext.RuleCall) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 32 with Group

use of org.eclipse.xtext.Group in project xtext-eclipse by eclipse.

the class XtextDocumentModifyTest method testCommentsNotDuplicated.

@Test
public void testCommentsNotDuplicated() throws Exception {
    String grammar = "grammar foo.Foo\n" + "generate foo \"http://foo.net/foo\"\n" + "Foo: // comment in Foo \n" + "// comment before Assignment\n" + "  bars+=/* comment in assignment */Bar // comment after assignment\n" + "// comment before keywod\n" + "'foo';\n" + "Bar: 'bar';";
    IXtextDocument document = createDocument(grammar);
    document.modify(new IUnitOfWork<Object, XtextResource>() {

        @Override
        public Object exec(XtextResource state) throws Exception {
            assertEquals(resource, state);
            Grammar grammar = (Grammar) state.getContents().get(0);
            Group group = (Group) grammar.getRules().get(0).getAlternatives();
            Assignment assignment = (Assignment) group.getElements().get(0);
            assignment.setFeature("foobars");
            return grammar;
        }
    });
    assertEquals(grammar.replace("bars", "foobars"), document.get());
}
Also used : Assignment(org.eclipse.xtext.Assignment) Group(org.eclipse.xtext.Group) XtextResource(org.eclipse.xtext.resource.XtextResource) Grammar(org.eclipse.xtext.Grammar) IXtextDocument(org.eclipse.xtext.ui.editor.model.IXtextDocument) Test(org.junit.Test)

Example 33 with Group

use of org.eclipse.xtext.Group in project n4js by eclipse.

the class PatchedFollowElementComputer method computeFollowElements.

@Override
protected void computeFollowElements(FollowElementCalculator calculator, FollowElement element, Multimap<Integer, List<AbstractElement>> visited) {
    List<AbstractElement> currentState = Lists.newArrayList(element.getLocalTrace());
    currentState.add(element.getGrammarElement());
    if (!visited.put(element.getLookAhead(), currentState))
        return;
    if (element.getLookAhead() <= 1) {
        for (AbstractElement abstractElement : currentState) {
            Assignment ass = EcoreUtil2.getContainerOfType(abstractElement, Assignment.class);
            if (ass != null)
                calculator.doSwitch(ass);
            else {
                if (abstractElement instanceof UnorderedGroup && abstractElement == element.getGrammarElement()) {
                    calculator.doSwitch((UnorderedGroup) abstractElement, element.getHandledUnorderedGroupElements());
                } else {
                    calculator.doSwitch(abstractElement);
                    if (GrammarUtil.isOptionalCardinality(abstractElement)) {
                        EObject container = abstractElement.eContainer();
                        if (container instanceof Group) {
                            Group group = (Group) container;
                            int idx = group.getElements().indexOf(abstractElement);
                            if (idx == group.getElements().size() - 1) {
                                if (!currentState.contains(group) && GrammarUtil.isMultipleCardinality(group)) {
                                    calculator.doSwitch(group);
                                }
                            } else if (idx < group.getElements().size() - 1 && "?".equals(abstractElement.getCardinality())) {
                                // loops are fine
                                AbstractElement nextElement = group.getElements().get(idx + 1);
                                if (!currentState.contains(nextElement)) {
                                    calculator.doSwitch(nextElement);
                                }
                            }
                        }
                    } else if (isAlternativeWithEmptyPath(abstractElement)) {
                        EObject container = abstractElement.eContainer();
                        if (container instanceof Group) {
                            Group group = (Group) container;
                            int idx = group.getElements().indexOf(abstractElement);
                            if (!currentState.contains(group) && idx != group.getElements().size() - 1) {
                                AbstractElement next = group.getElements().get(idx + 1);
                                if (!currentState.contains(next)) {
                                    calculator.doSwitch(next);
                                }
                            }
                        }
                    }
                }
            }
        }
        // we need a synthetic rule call
        if (element.getTrace().equals(element.getLocalTrace())) {
            ParserRule parserRule = GrammarUtil.containingParserRule(element.getGrammarElement());
            if (parserRule != null) {
                RuleCall ruleCall = XtextFactory.eINSTANCE.createRuleCall();
                ruleCall.setRule(parserRule);
                calculator.doSwitch(ruleCall);
            }
        }
        return;
    }
    Collection<FollowElement> followElements = parser.getFollowElements(element);
    for (FollowElement newElement : followElements) {
        if (newElement.getLookAhead() != element.getLookAhead() || newElement.getGrammarElement() != element.getGrammarElement()) {
            if (newElement.getLookAhead() == element.getLookAhead()) {
                int originalTraceSize = element.getLocalTrace().size();
                List<AbstractElement> newTrace = newElement.getLocalTrace();
                if (newTrace.size() > originalTraceSize) {
                    if (Collections.indexOfSubList(element.getLocalTrace(), newTrace.subList(originalTraceSize, newTrace.size())) != -1) {
                        continue;
                    }
                }
            }
            computeFollowElements(calculator, newElement, visited);
        }
    }
}
Also used : Assignment(org.eclipse.xtext.Assignment) UnorderedGroup(org.eclipse.xtext.UnorderedGroup) Group(org.eclipse.xtext.Group) ParserRule(org.eclipse.xtext.ParserRule) AbstractElement(org.eclipse.xtext.AbstractElement) UnorderedGroup(org.eclipse.xtext.UnorderedGroup) EObject(org.eclipse.emf.ecore.EObject) RuleCall(org.eclipse.xtext.RuleCall) FollowElement(org.eclipse.xtext.ide.editor.contentassist.antlr.FollowElement)

Example 34 with Group

use of org.eclipse.xtext.Group in project n4js by eclipse.

the class PatchedRequiredRuleNameComputer method getRequiredRuleNames.

@SuppressWarnings("restriction")
@Override
public String[][] getRequiredRuleNames(Param param) {
    if (isFiltered(param)) {
        return EMPTY_ARRAY;
    }
    AbstractElement elementToParse = param.elementToParse;
    String ruleName = param.ruleName;
    if (ruleName == null) {
        if (elementToParse instanceof RuleCall) {
            RuleCall call = (RuleCall) elementToParse;
            if (call.getRule() instanceof ParserRule) {
                String antlrRuleName = getRuleNames().getAntlrRuleName(call.getRule());
                if (!call.getArguments().isEmpty()) {
                    Set<Parameter> context = param.getAssignedParametes();
                    Set<Parameter> arguments = getAssignedArguments(call, context);
                    int config = getParameterConfig(arguments);
                    antlrRuleName = getRuleNames().getAntlrRuleName(call.getRule(), config);
                }
                return new String[][] { { antlrRuleName } };
            }
        }
        return EMPTY_ARRAY;
    }
    String adjustedRuleName = adjustRuleName(ruleName, param);
    if (!(GrammarUtil.isOptionalCardinality(elementToParse) || GrammarUtil.isOneOrMoreCardinality(elementToParse))) {
        return new String[][] { { adjustedRuleName } };
    }
    if ((elementToParse.eContainer() instanceof Group)) {
        List<AbstractElement> tokens = getFilteredElements(((Group) elementToParse.eContainer()).getElements(), param);
        int idx = tokens.indexOf(elementToParse) + 1;
        if (idx != tokens.size()) {
            String secondRule = param.getBaseRuleName((AbstractElement) elementToParse.eContainer());
            secondRule = secondRule.substring(0, secondRule.lastIndexOf('_') + 1) + idx;
            String adjustedSecondRule = adjustRuleName(secondRule, param);
            if (GrammarUtil.isMultipleCardinality(elementToParse))
                return new String[][] { { adjustedRuleName }, { adjustedRuleName, adjustedSecondRule } };
            return new String[][] { { adjustedRuleName, adjustedSecondRule } };
        }
    }
    // Fix is here. Original method returns the original ruleName instead of the adjusted rule name.
    return new String[][] { { adjustedRuleName } };
}
Also used : ParserRule(org.eclipse.xtext.ParserRule) Group(org.eclipse.xtext.Group) AbstractElement(org.eclipse.xtext.AbstractElement) Parameter(org.eclipse.xtext.Parameter) RuleCall(org.eclipse.xtext.RuleCall)

Aggregations

Group (org.eclipse.xtext.Group)34 AbstractElement (org.eclipse.xtext.AbstractElement)16 RuleCall (org.eclipse.xtext.RuleCall)16 UnorderedGroup (org.eclipse.xtext.UnorderedGroup)15 Test (org.junit.Test)14 AbstractRule (org.eclipse.xtext.AbstractRule)13 Assignment (org.eclipse.xtext.Assignment)13 ParserRule (org.eclipse.xtext.ParserRule)13 EObject (org.eclipse.emf.ecore.EObject)10 Grammar (org.eclipse.xtext.Grammar)10 Alternatives (org.eclipse.xtext.Alternatives)9 Action (org.eclipse.xtext.Action)6 Parameter (org.eclipse.xtext.Parameter)5 TerminalRule (org.eclipse.xtext.TerminalRule)5 CompoundElement (org.eclipse.xtext.CompoundElement)4 ArrayList (java.util.ArrayList)3 Keyword (org.eclipse.xtext.Keyword)3 NamedArgument (org.eclipse.xtext.NamedArgument)3 ParameterReference (org.eclipse.xtext.ParameterReference)3 XtextSwitch (org.eclipse.xtext.util.XtextSwitch)3