Search in sources :

Example 11 with EEnum

use of org.eclipse.emf.ecore.EEnum in project xtext-core by eclipse.

the class GrammarParserTest method testEnum_07.

@Test
public void testEnum_07() throws Exception {
    String modelAsString = "grammar TestLanguage with org.eclipse.xtext.common.Terminals\n" + "generate testLanguage 'http://www.eclipse.org/2009/tmf/xtext/AbstractEnumRulesTest/TestEnum/7'\n" + "Model: enumValue=MyEnum;\n" + "enum MyEnum: Value | Value;";
    Grammar grammar = (Grammar) getModel(modelAsString);
    assertTrue(grammar.eResource().getErrors().toString(), grammar.eResource().getErrors().isEmpty());
    checkEnums(grammar);
    EPackage pack = grammar.getMetamodelDeclarations().get(0).getEPackage();
    assertEquals("http://www.eclipse.org/2009/tmf/xtext/AbstractEnumRulesTest/TestEnum/7", pack.getNsURI());
    EEnum eEnum = (EEnum) pack.getEClassifier("MyEnum");
    assertNotNull(eEnum);
    assertEquals(1, eEnum.getELiterals().size());
    EEnumLiteral value = eEnum.getELiterals().get(0);
    assertEquals("Value", value.getName());
    assertEquals(0, value.getValue());
    assertEquals("Value", value.getLiteral());
}
Also used : EEnumLiteral(org.eclipse.emf.ecore.EEnumLiteral) Grammar(org.eclipse.xtext.Grammar) EEnum(org.eclipse.emf.ecore.EEnum) EPackage(org.eclipse.emf.ecore.EPackage) Test(org.junit.Test)

Example 12 with EEnum

use of org.eclipse.emf.ecore.EEnum in project xtext-core by eclipse.

the class Xtext2EcoreTransformer method deriveEnums.

private void deriveEnums(EnumRule rule) {
    EEnum returnType = (EEnum) rule.getType().getClassifier();
    if (returnType != null) {
        List<EnumLiteralDeclaration> decls = EcoreUtil2.getAllContentsOfType(rule, EnumLiteralDeclaration.class);
        for (EnumLiteralDeclaration decl : decls) {
            if (decl.getEnumLiteral() == null) {
                List<INode> nodes = NodeModelUtils.findNodesForFeature(decl, XtextPackage.Literals.ENUM_LITERAL_DECLARATION__ENUM_LITERAL);
                if (!nodes.isEmpty()) {
                    if (nodes.size() > 1)
                        throw new IllegalStateException("Unexpected nodes found: " + nodes);
                    INode node = nodes.get(0);
                    String text = node.getText();
                    EEnumLiteral literal = null;
                    if (rule.getType().getMetamodel() instanceof ReferencedMetamodel) {
                        literal = returnType.getEEnumLiteral(text);
                    } else {
                        EEnumLiteral existing = returnType.getEEnumLiteral(text);
                        if (existing == null) {
                            literal = EcoreFactory.eINSTANCE.createEEnumLiteral();
                            int index = returnType.getELiterals().size();
                            returnType.getELiterals().add(literal);
                            literal.setName(text);
                            literal.setValue(index);
                            if (decl.getLiteral() != null) {
                                literal.setLiteral(decl.getLiteral().getValue());
                            } else {
                                literal.setLiteral(text);
                            }
                        } else {
                            literal = existing;
                        }
                        SourceAdapter.adapt(literal, decl);
                    }
                    if (literal == null) {
                        reportError(new TransformationException(TransformationErrorCode.InvalidFeature, "Enum literal '" + text + "' does not exist.", decl));
                    } else {
                        decl.setEnumLiteral(literal);
                    }
                }
            }
            if (decl.getLiteral() == null && decl.getEnumLiteral() != null) {
                Keyword kw = XtextFactory.eINSTANCE.createKeyword();
                kw.setValue(decl.getEnumLiteral().getLiteral());
                decl.setLiteral(kw);
            }
        }
    }
}
Also used : INode(org.eclipse.xtext.nodemodel.INode) EnumLiteralDeclaration(org.eclipse.xtext.EnumLiteralDeclaration) Keyword(org.eclipse.xtext.Keyword) EEnumLiteral(org.eclipse.emf.ecore.EEnumLiteral) EEnum(org.eclipse.emf.ecore.EEnum) ReferencedMetamodel(org.eclipse.xtext.ReferencedMetamodel)

Example 13 with EEnum

use of org.eclipse.emf.ecore.EEnum in project xtext-core by eclipse.

the class Ecore2XtextGrammarCreator method rule.

public CharSequence rule(final EClassifier it) {
    CharSequence _switchResult = null;
    boolean _matched = false;
    if (it instanceof EClass) {
        _matched = true;
        StringConcatenation _builder = new StringConcatenation();
        String _concreteRuleName = Ecore2XtextExtensions.concreteRuleName(((EClass) it));
        _builder.append(_concreteRuleName);
        _builder.append(" returns ");
        String _fqn = Ecore2XtextExtensions.fqn(it);
        _builder.append(_fqn);
        _builder.append(":");
        _builder.newLineIfNotEmpty();
        {
            boolean _onlyOptionalFeatures = Ecore2XtextExtensions.onlyOptionalFeatures(((EClass) it));
            if (_onlyOptionalFeatures) {
                _builder.append("\t");
                _builder.append("{");
                String _fqn_1 = Ecore2XtextExtensions.fqn(it);
                _builder.append(_fqn_1, "\t");
                _builder.append("}");
                _builder.newLineIfNotEmpty();
            }
        }
        {
            Iterable<EStructuralFeature> _prefixFeatures = Ecore2XtextExtensions.prefixFeatures(((EClass) it));
            for (final EStructuralFeature strF : _prefixFeatures) {
                _builder.append("\t");
                CharSequence _assigment = this.assigment(strF);
                _builder.append(_assigment, "\t");
                _builder.newLineIfNotEmpty();
            }
        }
        _builder.append("\t");
        _builder.append("\'");
        String _name = ((EClass) it).getName();
        _builder.append(_name, "\t");
        _builder.append("\'");
        _builder.newLineIfNotEmpty();
        _builder.append("\t");
        CharSequence _idAssignment = this.idAssignment(((EClass) it));
        _builder.append(_idAssignment, "\t");
        {
            boolean _isEmpty = IterableExtensions.isEmpty(Ecore2XtextExtensions.inlinedFeatures(((EClass) it)));
            boolean _not = (!_isEmpty);
            if (_not) {
                _builder.newLineIfNotEmpty();
                _builder.append("\t");
                _builder.append("\'{\'");
                _builder.newLine();
                {
                    Iterable<EAttribute> _allAttributes = Ecore2XtextExtensions.allAttributes(((EClass) it));
                    for (final EAttribute attr : _allAttributes) {
                        _builder.append("\t");
                        _builder.append("\t");
                        CharSequence _assigment_1 = this.assigment(attr);
                        _builder.append(_assigment_1, "\t\t");
                        _builder.newLineIfNotEmpty();
                    }
                }
                {
                    Iterable<EReference> _allCrossReferences = Ecore2XtextExtensions.allCrossReferences(((EClass) it));
                    for (final EReference ref : _allCrossReferences) {
                        _builder.append("\t");
                        _builder.append("\t");
                        CharSequence _assigment_2 = this.assigment(ref);
                        _builder.append(_assigment_2, "\t\t");
                        _builder.newLineIfNotEmpty();
                    }
                }
                {
                    Iterable<EReference> _allContainmentReferences = Ecore2XtextExtensions.allContainmentReferences(((EClass) it));
                    for (final EReference conti : _allContainmentReferences) {
                        _builder.append("\t");
                        _builder.append("\t");
                        CharSequence _assigment_3 = this.assigment(conti);
                        _builder.append(_assigment_3, "\t\t");
                        _builder.newLineIfNotEmpty();
                    }
                }
                _builder.append("\t");
                _builder.append("\'}\'");
            }
        }
        _builder.append(";");
        _builder.newLineIfNotEmpty();
        _switchResult = _builder;
    }
    if (!_matched) {
        if (it instanceof EEnum) {
            _matched = true;
            StringConcatenation _builder = new StringConcatenation();
            _builder.append("enum ");
            String _quoteIfNeccesary = Ecore2XtextExtensions.quoteIfNeccesary(((EEnum) it).getName());
            _builder.append(_quoteIfNeccesary);
            _builder.append(" returns ");
            String _fqn = Ecore2XtextExtensions.fqn(it);
            _builder.append(_fqn);
            _builder.append(":");
            _builder.newLineIfNotEmpty();
            _builder.append("\t\t\t\t");
            final Function1<EEnumLiteral, String> _function = (EEnumLiteral it_1) -> {
                String _name = it_1.getName();
                String _plus = (_name + " = \'");
                String _name_1 = it_1.getName();
                String _plus_1 = (_plus + _name_1);
                return (_plus_1 + "\'");
            };
            String _join = IterableExtensions.join(ListExtensions.<EEnumLiteral, String>map(((EEnum) it).getELiterals(), _function), " | ");
            _builder.append(_join, "\t\t\t\t");
            _builder.append(";");
            _switchResult = _builder;
        }
    }
    if (!_matched) {
        if (it instanceof EDataType) {
            _matched = true;
            CharSequence _xifexpression = null;
            boolean _isSerializable = ((EDataType) it).isSerializable();
            if (_isSerializable) {
                StringConcatenation _builder = new StringConcatenation();
                String _uniqueName = UniqueNameUtil.uniqueName(it);
                _builder.append(_uniqueName);
                _builder.append(" returns ");
                String _fqn = Ecore2XtextExtensions.fqn(it);
                _builder.append(_fqn);
                _builder.append(":");
                _builder.newLineIfNotEmpty();
                _builder.append("\t");
                String _dataTypeRuleBody = Ecore2XtextExtensions.dataTypeRuleBody(((EDataType) it));
                _builder.append(_dataTypeRuleBody, "\t");
                _builder.append(";");
                _builder.newLineIfNotEmpty();
                _xifexpression = _builder;
            }
            _switchResult = _xifexpression;
        }
    }
    if (!_matched) {
        throw new IllegalStateException(("No rule template for " + it));
    }
    return _switchResult;
}
Also used : EDataType(org.eclipse.emf.ecore.EDataType) EStructuralFeature(org.eclipse.emf.ecore.EStructuralFeature) EEnum(org.eclipse.emf.ecore.EEnum) EClass(org.eclipse.emf.ecore.EClass) EAttribute(org.eclipse.emf.ecore.EAttribute) StringConcatenation(org.eclipse.xtend2.lib.StringConcatenation) EEnumLiteral(org.eclipse.emf.ecore.EEnumLiteral) EReference(org.eclipse.emf.ecore.EReference)

Example 14 with EEnum

use of org.eclipse.emf.ecore.EEnum in project xtext-core by eclipse.

the class XtextScopeProvider method getScope.

@Override
public IScope getScope(final EObject context, EReference reference) {
    if (reference == XtextPackage.eINSTANCE.getTypeRef_Classifier()) {
        if (context instanceof TypeRef) {
            final TypeRef typeRef = (TypeRef) context;
            final AbstractMetamodelDeclaration metaModel = typeRef.getMetamodel();
            if (metaModel != null) {
                EPackage pack = metaModel.getEPackage();
                if (pack != null)
                    return createClassifierScope(pack.getEClassifiers());
            } else {
                return createReferencedPackagesScope(GrammarUtil.getGrammar(context));
            }
        } else {
            return createReferencedPackagesScope(GrammarUtil.getGrammar(context));
        }
        return IScope.NULLSCOPE;
    }
    if (reference == XtextPackage.eINSTANCE.getEnumLiteralDeclaration_EnumLiteral()) {
        final EnumRule rule = GrammarUtil.containingEnumRule(context);
        if (rule.getType() != null && rule.getType().getClassifier() != null && rule.getType().getClassifier() instanceof EEnum) {
            return createEnumLiteralsScope((EEnum) rule.getType().getClassifier());
        }
        return IScope.NULLSCOPE;
    }
    if (reference == XtextPackage.eINSTANCE.getGrammar_UsedGrammars()) {
        return globalScopeProvider.getScope(context.eResource(), reference, new Predicate<IEObjectDescription>() {

            @Override
            public boolean apply(IEObjectDescription input) {
                return !input.getEObjectURI().equals(EcoreUtil.getURI(context));
            }
        });
    }
    if (reference == XtextPackage.eINSTANCE.getRuleCall_Rule()) {
        return createScope(context.eResource(), reference.getEReferenceType(), new SuperCallScope(context));
    }
    if (reference == XtextPackage.eINSTANCE.getParameterReference_Parameter()) {
        ParserRule rule = GrammarUtil.containingParserRule(context);
        if (rule == null) {
            return IScope.NULLSCOPE;
        }
        return Scopes.scopeFor(rule.getParameters());
    }
    if (reference == XtextPackage.eINSTANCE.getNamedArgument_Parameter()) {
        RuleCall ruleCall = EcoreUtil2.getContainerOfType(context, RuleCall.class);
        if (ruleCall == null) {
            return IScope.NULLSCOPE;
        }
        AbstractRule referencedRule = ruleCall.getRule();
        if (referencedRule instanceof ParserRule) {
            return Scopes.scopeFor(((ParserRule) referencedRule).getParameters());
        }
        return IScope.NULLSCOPE;
    }
    return createScope(context.eResource(), reference.getEReferenceType(), IScope.NULLSCOPE);
}
Also used : EnumRule(org.eclipse.xtext.EnumRule) ParserRule(org.eclipse.xtext.ParserRule) TypeRef(org.eclipse.xtext.TypeRef) EEnum(org.eclipse.emf.ecore.EEnum) AbstractMetamodelDeclaration(org.eclipse.xtext.AbstractMetamodelDeclaration) AbstractRule(org.eclipse.xtext.AbstractRule) RuleCall(org.eclipse.xtext.RuleCall) EPackage(org.eclipse.emf.ecore.EPackage) IEObjectDescription(org.eclipse.xtext.resource.IEObjectDescription)

Aggregations

EEnum (org.eclipse.emf.ecore.EEnum)14 EEnumLiteral (org.eclipse.emf.ecore.EEnumLiteral)11 EPackage (org.eclipse.emf.ecore.EPackage)10 Grammar (org.eclipse.xtext.Grammar)9 Test (org.junit.Test)9 EnumLiteralDeclaration (org.eclipse.xtext.EnumLiteralDeclaration)5 EnumRule (org.eclipse.xtext.EnumRule)5 RuleCall (org.eclipse.xtext.RuleCall)2 EAttribute (org.eclipse.emf.ecore.EAttribute)1 EClass (org.eclipse.emf.ecore.EClass)1 EDataType (org.eclipse.emf.ecore.EDataType)1 EObject (org.eclipse.emf.ecore.EObject)1 EReference (org.eclipse.emf.ecore.EReference)1 EStructuralFeature (org.eclipse.emf.ecore.EStructuralFeature)1 StringConcatenation (org.eclipse.xtend2.lib.StringConcatenation)1 AbstractMetamodelDeclaration (org.eclipse.xtext.AbstractMetamodelDeclaration)1 AbstractRule (org.eclipse.xtext.AbstractRule)1 GeneratedMetamodel (org.eclipse.xtext.GeneratedMetamodel)1 Keyword (org.eclipse.xtext.Keyword)1 ParserRule (org.eclipse.xtext.ParserRule)1