Пример Xtext объекта с областью видимости - PullRequest
8 голосов
/ 17 октября 2011

Я ищу пример (в XText) того, как реализовать автозавершение кода для элементов, определенных пользователем объектов. Насколько я понимаю, мне нужно использовать IScope, но как все эти провода вместе, неясно.

Учитывая, что trait является определяемым пользователем типом, как я могу построить грамматику для завершения кода / проверки методов, содержащихся в String, когда я набираю name.?

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

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

Спасибо

Ответы [ 2 ]

17 голосов
/ 18 октября 2011

Это зависит от вашей грамматики, что вы должны сделать, чтобы принять область видимости.Допустим, у вас есть грамматика типа

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

, тогда ваш scopeprovider будет выглядеть так:

public class MyDslScopeProvider extends AbstractDeclarativeScopeProvider {

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

Вы можете найти серию блогов на эту тему здесь:

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

2 голосов
/ 12 сентября 2014

В моей книге по Xtext, «Реализация доменных языков с Xtext и Xtend», https://www.packtpub.com/application-development/implementing-domain-specific-languages-xtext-and-xtend, есть глава, посвященная определению «меньшего» языка Java (также касающегося наследования). Вы можете найти источники примеров здесь: https://github.com/LorenzoBettini/packtpub-xtext-book-examples

...