2016-03-25 1 views
3

Xtext 2.9 a modifié le fonctionnement des fournisseurs d'étendue et je ne comprends pas comment ils fonctionnent maintenant.Xtext 2.9 fournisseur d'étendue

Disons que j'ai la grammaire suivante:

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

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

Model: 
    ((things+=Thing) | (refs+=Reference))* 
; 

Thing: 
    'thing' name=ID '{' 
     stuff += Stuff* 
    '}' 
; 

Stuff: 
    'stuff' name=ID 
; 

Reference: 
    'reference' thing=[Thing] stuff=[Stuff] 
; 

Pour la clause de référence au travail, je besoin d'un fournisseur de portée.

XText 2.9 génère le code de fournisseur de champ suivant pour vous (en MyDslScopeProvider.xtend):

class MyDslScopeProvider extends AbstractMyDslScopeProvider { 
} 

AbstractMyDslScopeProvider n'a pas de méthode de son propre, il hérite seulement de DelegatingScopeProvider.

Je ne peux pas comprendre comment cela fonctionne ni où devrait aller le code pour la recherche d'oscilloscope. La "documentation" n'aide pas vraiment, car il n'y a que des extraits de code inutiles au lieu d'un exemple de travail complet.

versions antérieures de XText utilisées AbstractDeclarativeScopeProvider et qui était assez facile à comprendre et à utiliser, avant 2.9, il aurait été:

class MyDslScopeProvider extends AbstractDeclarativeScopeProvider { 
    def IScope scope_Reference_stuff(Reference reference, EReference ref) { 
     scopeFor(reference?.thing.stuff) 
    } 
} 

Répondre

3

Vous devez implémenter la méthode getScope

override getScope(EObject ctx, EReference ref) { 
    if (ref == MyDslPackage.Literals.REFERENCE_THING) { 
     return createScopeForThings() 
    } else if (ref == MyDslPackage.Literals.REFERENCE_STUFF) { 
     return createScopeForStuff() 
    } 
} 

Dans votre Si vous recevez un appel où EObject est une instance de Reference, la référence ER est MyDslPackage.Literals.REFERENCE_THING ou MyDslPackage.Literals.REFERENCE_STUFF.

Vous devez créer et renvoyer une instance de IScope, qui peut être utilisée par l'éditeur de liens et l'assistant de contenu. Voir le JavaDoc de IScopeProvider et IScope pour plus de détails.

+1

Ce que je ne comprends toujours pas: À quoi sert la classe AbstractMyDslScopeProvider? MyDslScopeProvider peut étendre DelegateScopeProvider directement sans la classe abstraite vide entre les deux. –