2011-10-17 65 views
8

我正在尋找如何在用戶定義的對象成員上實現代碼完成的示例(在XText中)。據我所見,我需要使用IScope,但所有這些線路如何不清楚。作用域對象的Xtext示例

鑑於trait是用戶定義的類型,我怎麼去建設一個語法編寫完成/驗證中String包含當我輸入name.的方法呢?

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

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

感謝

回答

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

語法那麼你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

+0

非常感謝基督徒正是我需要的kickstart;) –

+5

對於那些對EMF毫無頭緒的人,我可能會發現有用的EcoreUtil.getObjectsByType,如果你需要手動遍歷你的DSL因爲你想引用的內容不能通過get方法輕鬆獲得。例如您有需要擴大範圍的異構對象的集合。 – Bae