2011-10-17 7 views
8

Sto cercando un esempio (in XText) su come implementare il completamento del codice su membri di oggetti definiti dall'utente. Per quanto posso vedere ho bisogno di usare IScope, ma come tutti questi fili insieme non è chiaro.Esempio xtext di un oggetto con scope

Dato che trait è un tipo definito dall'utente, come posso fare per la costruzione di una grammatica di codice completo/validare i metodi contenuti in String quando si digita name.?

trait String { 
    def toLowerCase(): String 
    def toUpperCase(): String 
} 

val name = new String() 
name.toLowerCase() 

Grazie

risposta

17

Esso dipende in larga misura la grammatica quello che hai da fare per adottare scoping. Diciamo che avete una grammatica come

Model: 
    statements+=Statement+ 
; 

Statement: 
    Trait | VarDef | Call 
; 

Trait: 
    "trait" name=ID "{" 
     ops+=Operation* 
    "}" 
; 

Operation: 
    "def" name=ID "()" ":" type=[Trait] 
; 

VarDef: 
    "val" name=ID "=" "new" type=[Trait] "()" 
; 

Call: 
    var=[VarDef] "." op=[Operation] "()" 
; 

allora il vostro scopeprovider assomiglierebbe

public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider { 

    IScope scope_Call_op(Call call, EReference ref) { 
     return Scopes.scopeFor(call.getVar().getType().getOps()); 
    } 
}  

È possibile trovare una serie di blog sul tema qui:

https://web.archive.org/web/20130129085620/http://blogs.itemis.de/stundzig/archives/773

+0

eccellente, grazie Christian esattamente la kickstart avevo bisogno;) –

+5

Per quelli come all'oscuro circa EMF come lo ero io, si possono trovare utili EcoreUtil.getObjectsByType se è necessario attraversare manualmente il DSL perché quello che vuoi fare riferimento non può essere facilmente ottenuto tramite i metodi get. per esempio. Hai raccolte di oggetti eterogenei di cui hai bisogno per mirare. – Bae

Problemi correlati