2011-10-17 15 views
8

Estoy buscando un ejemplo (en XText) de cómo implementar la finalización de código en los miembros de un objeto definido por el usuario. Por lo que puedo ver, necesito usar IScope, pero no está claro cómo todos estos cables juntos.Ejemplo de Xtext de un objeto de ámbito

Dado que trait es un tipo definido por el usuario, ¿cómo hago para construir una gramática para completar/validar los métodos contenidos en String cuando escribo name.?

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

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

Gracias

Respuesta

17

Es altamente depende de su gramática lo que tiene que hacer para adoptar alcance. Digamos que usted tiene una gramática como

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] "()" 
; 

entonces su scopeprovider se vería

public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider { 

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

puede encontrar una serie blog sobre el tema aquí:

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

+0

Excelente, gracias a Christian exactamente el kickstart que necesitaba;) –

+5

Para aquellos tan despistados sobre EMF como yo lo estaba, puede encontrar EcoreUtil.getObjectsByType útil si necesita atravesar manualmente su DSL porque lo que desea hacer referencia no se puede obtener fácilmente a través de los métodos get. p.ej. Tiene colecciones de objetos heterogéneos que necesita abarcar. – Bae

Cuestiones relacionadas