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