Skip to main content



      Home
Home » Modeling » TMF (Xtext) » Referencing nameless Cross-references
Referencing nameless Cross-references [message #1752356] Sun, 22 January 2017 18:15 Go to next message
Eclipse UserFriend
generate mydsl "myfirm/mydsl"
Constants : 
   'KONSTANTE' ( (name=ID ',' foo=INT)
    | ( const=[typ::Konstante] )) // nameless reference
;

Otherrule:
name=ID ref=[Constants] // can only reference the locally declared constants
;


generate typ "myfirm/typ"
Konstante:
	'KONSTANTE' name = ID ':' foo=INT
;


Hi, I am having trouble getting the references to work. I want to reference the rule 'constants' but I can only get the references to match for the locally declared 'constants'. But I want to get the references to the nameless 'constants' as well.

I figuered out that I have implement my own QualifiedNameProvider but the name of the Konstante is not loaded (null) when I try to access it.


class MyDSLQualifiedNameProvider extends IQualifiedNameProvider.AbstractImpl {
    @Inject  private IQualifiedNameConverter qualifiedNameConverter;

    override getFullyQualifiedName(EObject obj) {
        var name = SimpleAttributeResolver.NAME_RESOLVER.apply(obj);

        if (name == null || name.length() == 0) {
            if (obj.class == ConstantsImpl) {
                var constants = obj as Constants;
                // constants.const.name is always null
                if (constants.const.name == null) {
                    return null;
                }

                return qualifiedNameConverter.toQualifiedName(constants.const.name)
            } else {
                return null;
            }
        }
        return qualifiedNameConverter.toQualifiedName(name);
    }
}



How can I get access to the name of the externally referenced object?
Or is there a other solution to the problem or an example where someone else has solved this issue?
Re: Referencing nameless Cross-references [message #1752417 is a reply to message #1752356] Mon, 23 January 2017 10:47 Go to previous messageGo to next message
Eclipse UserFriend
hi

you can use NodeModelUtils to obtain the text in the model for the const feature.
then you can implement iQualifiedNameProvider to use that text to give the nameless constant a name
icon7.gif  Re: Referencing nameless Cross-references [message #1752437 is a reply to message #1752417] Mon, 23 January 2017 13:04 Go to previous message
Eclipse UserFriend
Thanks so much, I've been struggling with this problem for literally two whole days now..

I am accually using this in my scopeProvider:
            if (reference == M2Package.Literals.OTHERRULE__REF ) {
                val rootElement = EcoreUtil2.getRootContainer(context)
                val candidates = EcoreUtil2.getAllContentsOfType(rootElement, ConstantsImpl)
                for(ConstantsImpl c : candidates){
                    if(c.const!=null){
                        c.name = (((NodeModelUtils.getNode(c).semanticElement) as ConstantsImpl).const as Konstante).name;
                    }
                }
                val existingScope = Scopes.scopeFor(candidates)
                return new FilteringScope(existingScope, [getEObjectOrProxy != context])
            }

I guess it's not the most beautifull solution but it works... Smile
Previous Topic:Formatter2 Junit test passes in Eclipse but fails in maven (Xtext 2.10.0)
Next Topic:Doing a Clean Build on Xtext 2.9.1
Goto Forum:
  


Current Time: Wed Apr 23 21:41:16 EDT 2025

Powered by FUDForum. Page generated in 0.03926 seconds
.:: Contact :: Home ::.

Powered by: FUDforum 3.0.2.
Copyright ©2001-2010 FUDforum Bulletin Board Software

Back to the top