8

ユーザー定義オブジェクトのメンバーにコード補完を実装する方法の例 (XText) を探しています。私が見る限り、IScope を使用する必要がありますが、これらすべてがどのように接続されているかは不明です。

それがユーザー定義型であるとすれば、入力時にtrait含まれるメソッドを完全にコード化/検証するための文法を構築するにはどうすればよいですか?Stringname.

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

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

ありがとう

4

2 に答える 2

17

スコープを採用するために何をしなければならないかは、文法に大きく依存します。次のような文法があるとしましょう

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

次に、スコーププロバイダーは次のようになります

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

于 2011-10-18T19:36:43.060 に答える
3

Xtext に関する私の著書「Implementing Domain-Specific Languages with Xtext and Xtend」( https://www.packtpub.com/application-development/implementing-domain-specific-languages-xtext-and-xtend ) には、次の章があります。 「より小さな」Java 言語のスコープについて (継承も扱う)。ここで例のソースを見つけることができます: https://github.com/LorenzoBettini/packtpub-xtext-book-examples

于 2014-09-12T08:33:06.773 に答える