0
votes

I'm have a simple language with something like enum's. How can I get working solution for cross-referenced EnumEntry. Also it will be good to filter EnumEntry by EnumEntity...

MyDsl.xtext

grammar org.xtext.example.mydsl.MyDsl with    
org.eclipse.xtext.common.Terminals

generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"

Model:
    entity_node = Entity | EnumEntity;

Entity:
    type = ('my_entity') ':' name = ID '{'  
    (parts += EntityPart)*
    '}';

EnumEntity:
    type = ('my_enum') ':' name = ID '{'
    //entry = EnumEntry (',' entrys+= EnumEntry)* Fixed after Christian comment
    entrys+= EnumEntry (',' entrys+= EnumEntry)*
    '}';

EnumEntry:
    name = ID;

EnumUsage:
    /* What should I do here? */
    enumEntity = [EnumEntity]'.'entry = [EnumEntry];

EntityPart:
    EnumUsage ';';

my_enum_entity.mydsl

my_enum:my_enum_entity
{
    my_enum_entry_1,
    my_enum_entry_2,
    my_enum_entry_3
}

my_pretty_entity.mydsl

my_entity:my_pretty_entity
{
    my_enum_entity.my_enum_entry_2;                                                 
}

Some error

1

1 Answers

1
votes

you did not customize the scopeprovider or did you simply missed to post the code?

id expect something like

class MyDslScopeProvider extends AbstractMyDslScopeProvider {

    override getScope(EObject context, EReference reference) {
        if (reference == MyDslPackage.Literals.ENUM_USAGE__ENUM_ENTRY) {
            if (context instanceof EnumUsage) {
                return Scopes.scopeFor(context.enumEntity.entrys)
            }
        }
        super.getScope(context, reference)
    }

}

if you dont want to adapt scoping adapt the grammar like

EnumUsage: entry = [EnumEntry|FQN];
FQN: ID ("." ID)*;