Search in sources :

Example 11 with Group

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

the class AntlrGrammarGenUtil method doGetPredicatedElement.

private static AbstractElement doGetPredicatedElement(final AbstractElement element) {
    if (element instanceof Alternatives || element instanceof Group) {
        EcoreUtil.Copier copier = new EcoreUtil.Copier(true, true) {

            private static final long serialVersionUID = 1L;

            @Override
            public EObject copy(EObject eObject) {
                if (eObject instanceof AbstractElement) {
                    if (((AbstractElement) eObject).isFirstSetPredicated() && isLastInGroup(eObject)) {
                        Collection<AbstractElement> firstSet = EcoreUtil.copyAll(getFirstSet((AbstractElement) eObject));
                        if (firstSet.size() == 1) {
                            AbstractElement result = firstSet.iterator().next();
                            result.setCardinality(((AbstractElement) eObject).getCardinality());
                            return result;
                        }
                        Alternatives result = XtextFactory.eINSTANCE.createAlternatives();
                        for (AbstractElement firstElement : firstSet) {
                            firstElement.setCardinality(null);
                        }
                        result.getElements().addAll(firstSet);
                        result.setCardinality(((AbstractElement) eObject).getCardinality());
                        return result;
                    }
                }
                return super.copy(eObject);
            }

            private boolean isLastInGroup(EObject eObject) {
                if (eObject == element) {
                    return true;
                }
                EObject container = eObject.eContainer();
                if (container instanceof Group) {
                    List<AbstractElement> siblings = ((Group) container).getElements();
                    if (siblings.get(siblings.size() - 1) == eObject) {
                        return isLastInGroup(container);
                    }
                }
                if (container instanceof Alternatives) {
                    return isLastInGroup(container);
                }
                return false;
            }
        };
        AbstractElement clone = (AbstractElement) copier.copy(element);
        copier.copyReferences();
        return clone;
    }
    return element;
}
Also used : Group(org.eclipse.xtext.Group) AbstractElement(org.eclipse.xtext.AbstractElement) EObject(org.eclipse.emf.ecore.EObject) EcoreUtil(org.eclipse.emf.ecore.util.EcoreUtil) Alternatives(org.eclipse.xtext.Alternatives)

Example 12 with Group

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

the class Xtext2EcoreTransformer method deriveFeatures.

private Xtext2EcoreInterpretationContext deriveFeatures(final Xtext2EcoreInterpretationContext context, AbstractElement element) {
    XtextSwitch<Xtext2EcoreInterpretationContext> visitor = new XtextSwitch<Xtext2EcoreInterpretationContext>() {

        /*
			 * Used for Alternatives and UnorderedGroups
			 */
        @Override
        public Xtext2EcoreInterpretationContext caseCompoundElement(CompoundElement object) {
            List<Xtext2EcoreInterpretationContext> contexts = new ArrayList<Xtext2EcoreInterpretationContext>();
            for (AbstractElement group : object.getElements()) {
                contexts.add(deriveFeatures(context, group));
            }
            Xtext2EcoreInterpretationContext result = context;
            if (!contexts.isEmpty()) {
                if (GrammarUtil.isOptionalCardinality(object)) {
                    contexts.add(0, result);
                } else {
                    result = contexts.get(0);
                }
                result = result.mergeSpawnedContexts(contexts);
            }
            return result;
        }

        @Override
        public Xtext2EcoreInterpretationContext caseAssignment(Assignment object) {
            try {
                context.addFeature(object);
            } catch (TransformationException ex) {
                reportError(ex);
            }
            return context;
        }

        @Override
        public Xtext2EcoreInterpretationContext caseGroup(Group object) {
            return visitElements(object, object.getElements());
        }

        private Xtext2EcoreInterpretationContext visitElements(AbstractElement caller, List<AbstractElement> elementsToProcess) {
            Xtext2EcoreInterpretationContext result = deriveFeatures(context.spawnContextForGroup(), elementsToProcess);
            if (GrammarUtil.isMultipleCardinality(caller)) {
                result = deriveFeatures(result.spawnContextForGroup(), elementsToProcess);
            }
            if (GrammarUtil.isOptionalCardinality(caller)) {
                result = result.mergeSpawnedContexts(Arrays.asList(context, result));
            }
            return result;
        }

        @Override
        public Xtext2EcoreInterpretationContext caseAlternatives(Alternatives object) {
            List<Xtext2EcoreInterpretationContext> contexts = newArrayList();
            if (GrammarUtil.isOptionalCardinality(object)) {
                contexts.add(context);
            }
            for (AbstractElement alternative : object.getElements()) {
                contexts.add(deriveFeatures(context.spawnContextForGroup(), alternative));
            }
            Xtext2EcoreInterpretationContext result = context.mergeSpawnedContexts(contexts);
            if (GrammarUtil.isMultipleCardinality(object)) {
                for (AbstractElement alternative : object.getElements()) {
                    deriveFeatures(result.spawnContextForGroup(), alternative);
                }
            }
            return result;
        }

        @Override
        public Xtext2EcoreInterpretationContext caseRuleCall(RuleCall object) {
            AbstractRule calledRule = object.getRule();
            if (isWildcardFragment(calledRule)) {
                AbstractElement ruleBody = calledRule.getAlternatives();
                if (ruleBody != null) {
                    return visitElements(object, Collections.singletonList(ruleBody));
                }
                return context;
            }
            if (isParserRuleFragment(calledRule)) {
                return context;
            }
            if (!GrammarUtil.isOptionalCardinality(object)) {
                // announced during the first iteration
                if (calledRule != null && calledRule instanceof ParserRule && !GrammarUtil.isDatatypeRule((ParserRule) calledRule)) {
                    try {
                        EClassifierInfo eClassifierInfo = findOrCreateEClassifierInfo(calledRule);
                        return context.spawnContextWithCalledRule(eClassifierInfo, object);
                    } catch (TransformationException e) {
                        reportError(e);
                    }
                }
            }
            return context;
        }

        @Override
        public Xtext2EcoreInterpretationContext caseAction(Action object) {
            try {
                TypeRef actionTypeRef = object.getType();
                EClassifierInfo actionType = findOrCreateEClassifierInfo(actionTypeRef, null, true);
                EClassifierInfo currentCompatibleType = context.getCurrentCompatibleType();
                Xtext2EcoreInterpretationContext ctx = context.spawnContextWithReferencedType(actionType, object);
                if (object.getFeature() != null) {
                    ctx.addFeature(object.getFeature(), currentCompatibleType, GrammarUtil.isMultipleAssignment(object), true, object);
                }
                return ctx;
            } catch (TransformationException e) {
                reportError(e);
            }
            return context;
        }

        @Override
        public Xtext2EcoreInterpretationContext defaultCase(EObject object) {
            return context;
        }
    };
    return visitor.doSwitch(element);
}
Also used : Group(org.eclipse.xtext.Group) ParserRule(org.eclipse.xtext.ParserRule) Action(org.eclipse.xtext.Action) AbstractElement(org.eclipse.xtext.AbstractElement) TypeRef(org.eclipse.xtext.TypeRef) ArrayList(java.util.ArrayList) Alternatives(org.eclipse.xtext.Alternatives) RuleCall(org.eclipse.xtext.RuleCall) Assignment(org.eclipse.xtext.Assignment) EObject(org.eclipse.emf.ecore.EObject) InternalEObject(org.eclipse.emf.ecore.InternalEObject) List(java.util.List) ArrayList(java.util.ArrayList) XtextSwitch(org.eclipse.xtext.util.XtextSwitch) CompoundElement(org.eclipse.xtext.CompoundElement) AbstractRule(org.eclipse.xtext.AbstractRule)

Example 13 with Group

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

the class FlattenedGrammarAccess method copyRuleBodies.

private Multimap<TerminalRule, AbstractRule> copyRuleBodies(final List<AbstractRule> copies, final Map<RuleWithParameterValues, AbstractRule> origToCopy) {
    abstract class __FlattenedGrammarAccess_1 extends EcoreUtil.Copier {

        final __FlattenedGrammarAccess_1 _this__FlattenedGrammarAccess_1 = this;

        abstract Set<Parameter> getParameterConfig(final RuleCall origRuleCall, final RuleCall copyRuleCall);

        abstract void mergePredicates(final AbstractElement into, final AbstractElement from);

        abstract void mergeCardinalities(final AbstractElement into, final AbstractElement from);

        abstract boolean evaluate(final Condition condition);
    }
    final HashMultimap<TerminalRule, AbstractRule> calledFrom = HashMultimap.<TerminalRule, AbstractRule>create();
    for (final AbstractRule copy : copies) {
        {
            AbstractRule orig = RuleWithParameterValues.getOriginalRule(copy);
            final Set<Parameter> paramValues = RuleWithParameterValues.getParamValues(copy);
            EcoreUtil.Copier copier = new __FlattenedGrammarAccess_1() {

                @Override
                protected void copyReference(final EReference eReference, final EObject eObject, final EObject copyEObject) {
                    if ((eReference == XtextPackage.Literals.RULE_CALL__RULE)) {
                        RuleCall origRuleCall = ((RuleCall) eObject);
                        RuleCall copyRuleCall = ((RuleCall) copyEObject);
                        AbstractRule _rule = origRuleCall.getRule();
                        Set<Parameter> _parameterConfig = this.getParameterConfig(origRuleCall, copyRuleCall);
                        RuleWithParameterValues _ruleWithParameterValues = new RuleWithParameterValues(_rule, _parameterConfig);
                        AbstractRule calledCopy = origToCopy.get(_ruleWithParameterValues);
                        copyRuleCall.setRule(calledCopy);
                        if ((calledCopy instanceof TerminalRule)) {
                            calledFrom.put(((TerminalRule) calledCopy), copy);
                        }
                    } else {
                        super.copyReference(eReference, eObject, copyEObject);
                    }
                }

                Set<Parameter> getParameterConfig(final RuleCall origRuleCall, final RuleCall copyRuleCall) {
                    boolean _isEmpty = origRuleCall.getArguments().isEmpty();
                    if (_isEmpty) {
                        return Collections.<Parameter>emptySet();
                    }
                    final Function1<NamedArgument, Boolean> _function = (NamedArgument it) -> {
                        return Boolean.valueOf(this.evaluate(it.getValue()));
                    };
                    final Function1<NamedArgument, Parameter> _function_1 = (NamedArgument it) -> {
                        return it.getParameter();
                    };
                    Set<Parameter> result = IterableExtensions.<Parameter>toSet(IterableExtensions.<NamedArgument, Parameter>map(IterableExtensions.<NamedArgument>filter(origRuleCall.getArguments(), _function), _function_1));
                    return result;
                }

                @Override
                protected void copyContainment(final EReference eReference, final EObject eObject, final EObject copyEObject) {
                    boolean _matched = false;
                    if (Objects.equal(eReference, XtextPackage.Literals.RULE_CALL__ARGUMENTS)) {
                        _matched = true;
                    }
                    if (!_matched) {
                        if (Objects.equal(eReference, XtextPackage.Literals.GROUP__GUARD_CONDITION)) {
                            _matched = true;
                        }
                    }
                    if (_matched) {
                        return;
                    }
                    super.copyContainment(eReference, eObject, copyEObject);
                }

                @Override
                public EObject copy(final EObject eObject) {
                    if ((eObject instanceof Group)) {
                        Group group = ((Group) eObject);
                        Condition _guardCondition = group.getGuardCondition();
                        boolean _tripleNotEquals = (_guardCondition != null);
                        if (_tripleNotEquals) {
                            boolean _evaluate = this.evaluate(group.getGuardCondition());
                            boolean _not = (!_evaluate);
                            if (_not) {
                                return null;
                            }
                        }
                    }
                    EObject result = super.copy(eObject);
                    if ((result instanceof CompoundElement)) {
                        List<AbstractElement> elements = ((CompoundElement) result).getElements();
                        int _size = elements.size();
                        boolean _tripleEquals = (_size == 1);
                        if (_tripleEquals) {
                            if (((!((CompoundElement) result).isFirstSetPredicated()) && (!((CompoundElement) result).isPredicated()))) {
                                AbstractElement element = elements.get(0);
                                this.mergeCardinalities(element, ((AbstractElement) result));
                                this.mergePredicates(element, ((AbstractElement) result));
                                return element;
                            } else {
                                AbstractElement element_1 = elements.get(0);
                                this.mergePredicates(((AbstractElement) result), element_1);
                                element_1.setFirstSetPredicated(false);
                                element_1.setPredicated(false);
                            }
                        }
                    }
                    if ((eObject instanceof AbstractElement)) {
                        OriginalElement original = new OriginalElement(((AbstractElement) eObject));
                        EClass _eClass = ((AbstractElement) eObject).eClass();
                        EClass _eClass_1 = result.eClass();
                        boolean _notEquals = (!Objects.equal(_eClass, _eClass_1));
                        if (_notEquals) {
                            String _name = result.eClass().getName();
                            String _plus = ("copy is: \'" + _name);
                            String _plus_1 = (_plus + "\' but original was: \'");
                            String _name_1 = ((AbstractElement) eObject).eClass().getName();
                            String _plus_2 = (_plus_1 + _name_1);
                            String _plus_3 = (_plus_2 + "\'");
                            throw new IllegalStateException(_plus_3);
                        }
                        original.attachToEmfObject(result);
                    }
                    return result;
                }

                void mergePredicates(final AbstractElement into, final AbstractElement from) {
                    boolean _isPredicated = from.isPredicated();
                    if (_isPredicated) {
                        into.setPredicated(true);
                        into.setFirstSetPredicated(false);
                    } else {
                        if (((!into.isPredicated()) && from.isFirstSetPredicated())) {
                            into.setFirstSetPredicated(true);
                        }
                    }
                }

                void mergeCardinalities(final AbstractElement into, final AbstractElement from) {
                    String c1 = into.getCardinality();
                    String c2 = from.getCardinality();
                    String _switchResult = null;
                    boolean _matched = false;
                    if ((Objects.equal(c1, "*") || Objects.equal(c2, "*"))) {
                        _matched = true;
                    }
                    if (!_matched) {
                        if ((Objects.equal(c1, "+") && Objects.equal(c2, "?"))) {
                            _matched = true;
                        }
                    }
                    if (!_matched) {
                        if ((Objects.equal(c1, "?") && Objects.equal(c2, "+"))) {
                            _matched = true;
                        }
                    }
                    if (_matched) {
                        _switchResult = "*";
                    }
                    if (!_matched) {
                        if (Objects.equal(c1, null)) {
                            _matched = true;
                            _switchResult = c2;
                        }
                    }
                    if (!_matched) {
                        _switchResult = c1;
                    }
                    into.setCardinality(_switchResult);
                }

                boolean evaluate(final Condition condition) {
                    boolean result = new ConditionEvaluator(paramValues).evaluate(condition);
                    return result;
                }
            };
            EObject _copy = copier.copy(orig.getAlternatives());
            AbstractElement copiedBody = ((AbstractElement) _copy);
            copier.copyReferences();
            copy.setAlternatives(copiedBody);
            if ((orig instanceof ParserRule)) {
                ParserRule castedCopy = ((ParserRule) copy);
                boolean _isDefinesHiddenTokens = ((ParserRule) orig).isDefinesHiddenTokens();
                if (_isDefinesHiddenTokens) {
                    castedCopy.setDefinesHiddenTokens(true);
                    EList<AbstractRule> _hiddenTokens = ((ParserRule) orig).getHiddenTokens();
                    for (final AbstractRule rule : _hiddenTokens) {
                        {
                            RuleWithParameterValues _ruleWithParameterValues = new RuleWithParameterValues(rule);
                            final AbstractRule copiedTerminalRule = origToCopy.get(_ruleWithParameterValues);
                            EList<AbstractRule> _hiddenTokens_1 = castedCopy.getHiddenTokens();
                            _hiddenTokens_1.add(copiedTerminalRule);
                            calledFrom.put(((TerminalRule) copiedTerminalRule), castedCopy);
                        }
                    }
                }
            }
        }
    }
    return calledFrom;
}
Also used : Group(org.eclipse.xtext.Group) ParserRule(org.eclipse.xtext.ParserRule) ImmutableSet(com.google.common.collect.ImmutableSet) Set(java.util.Set) RuleCall(org.eclipse.xtext.RuleCall) EClass(org.eclipse.emf.ecore.EClass) EObject(org.eclipse.emf.ecore.EObject) List(java.util.List) ArrayList(java.util.ArrayList) EList(org.eclipse.emf.common.util.EList) NamedArgument(org.eclipse.xtext.NamedArgument) EReference(org.eclipse.emf.ecore.EReference) OriginalElement(org.eclipse.xtext.xtext.OriginalElement) Condition(org.eclipse.xtext.Condition) AbstractElement(org.eclipse.xtext.AbstractElement) RuleWithParameterValues(org.eclipse.xtext.xtext.RuleWithParameterValues) Function1(org.eclipse.xtext.xbase.lib.Functions.Function1) ConditionEvaluator(org.eclipse.xtext.xtext.ConditionEvaluator) EList(org.eclipse.emf.common.util.EList) Parameter(org.eclipse.xtext.Parameter) TerminalRule(org.eclipse.xtext.TerminalRule) AbstractRule(org.eclipse.xtext.AbstractRule) CompoundElement(org.eclipse.xtext.CompoundElement)

Example 14 with Group

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

the class ComputedPropertyNameValueConverter method setRule.

/**
 * The method being overridden expects a rule of a certain form (body does not contain an alternative of keywords
 * and a single rule) but the rules arriving here don't have this format.
 * <p>
 * Therefore pass to that method the first one of the two nested rules Some-Identifier that are expected in any of
 * the rules arriving here.
 *
 * For more details see grammar rules
 * <ul>
 * <li><code>N4JSPropertyComputedName</code></li>
 * <li><code>JsPropertyComputedName</code></li>
 * <li><code>TypesComputedPropertyName</code></li>
 * </ul>
 */
@Override
public void setRule(AbstractRule rule) {
    // TODO make this safer / throw exceptions more informative exceptions
    // rule: '[' (SymbolLiteralComputedName | StringLiteralComputedName) ']'
    Group g = (Group) rule.getAlternatives();
    Alternatives elem = (Alternatives) g.getElements().get(1);
    // SymbolLiteralComputedName: N4JSIdentifier '.' N4JSIdentifier
    AbstractRule symLitCompName = ((RuleCall) elem.getElements().get(0)).getRule();
    Group g2 = (Group) symLitCompName.getAlternatives();
    RuleCall identCall = (RuleCall) g2.getElements().get(0);
    AbstractRule ident = identCall.getRule();
    super.setRule(ident);
}
Also used : Group(org.eclipse.xtext.Group) Alternatives(org.eclipse.xtext.Alternatives) AbstractRule(org.eclipse.xtext.AbstractRule) RuleCall(org.eclipse.xtext.RuleCall)

Example 15 with Group

use of org.eclipse.xtext.Group in project statecharts by Yakindu.

the class SGenFormatter method configureFormatting.

@Override
protected void configureFormatting(FormattingConfig c) {
    SGenGrammarAccess g = (SGenGrammarAccess) getGrammarAccess();
    // It's usually a good idea to activate the following three statements.
    // They will add and preserve newlines around comments
    c.setLinewrap(0, 1, 2).before(g.getSL_COMMENTRule());
    c.setLinewrap(0, 1, 2).before(g.getML_COMMENTRule());
    c.setLinewrap(0, 1, 1).after(g.getML_COMMENTRule());
    c.setLinewrap().before(g.getPropertyDefinitionRule());
    // - Line wrap before opening and after closing element
    for (Pair<Keyword, Keyword> pair : grammar.findKeywordPairs("{", "}")) {
        c.setIndentation(pair.getFirst(), pair.getSecond());
        c.setLinewrap().after(pair.getFirst());
        c.setLinewrap().around(pair.getSecond());
        Keyword openingBrace = pair.getFirst();
        Group containingGroup = (Group) openingBrace.eContainer();
        c.setLinewrap(1, 2, 2).before(containingGroup);
        c.setLinewrap(1, 1, 2).after(containingGroup);
    }
    c.setLinewrap().around(g.getFeatureConfigurationRule());
    c.setLinewrap().around(g.getFeatureParameterValueRule());
    c.setNoLinewrap().after(g.getGeneratorEntryAccess().getContentTypeAssignment_0());
    c.setNoLinewrap().after(g.getFeatureConfigurationAccess().getFeatureKeyword_1());
    c.setNoLinewrap().before(g.getGeneratorModelAccess().getGeneratorModelKeyword_0());
}
Also used : Group(org.eclipse.xtext.Group) SGenGrammarAccess(org.yakindu.sct.generator.genmodel.services.SGenGrammarAccess) Keyword(org.eclipse.xtext.Keyword)

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