Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Xtext example of a scoped object

Tags:

scope

dsl

xtext

I'm looking for an example (in XText) of how to implement code completion on an user defined objects members. As far as I can see I need to use IScope, but how all this wires together is unclear.

Given that trait is a user defined type, how do I go about building a grammar to code complete / validate the methods contained within String when I type name.?

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

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

Thanks

like image 365
BefittingTheorem Avatar asked Oct 17 '11 09:10

BefittingTheorem


2 Answers

It highly depends on your grammar what you have to do to adopt scoping. Let us say you have a grammar like

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

then your scopeprovider would look like

public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {

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

You can find a blog series on the topic here:

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

like image 194
Christian Dietrich Avatar answered Jan 29 '23 19:01

Christian Dietrich


In my book on Xtext, "Implementing Domain-Specific Languages with Xtext and Xtend", https://www.packtpub.com/application-development/implementing-domain-specific-languages-xtext-and-xtend , there is a chapter about scoping for a "smaller" Java language (dealing also with inheritance). You can find the sources of examples here: https://github.com/LorenzoBettini/packtpub-xtext-book-examples

like image 38
lorenzo-bettini Avatar answered Jan 29 '23 18:01

lorenzo-bettini