我想將XText中另一個文件中的一些對象添加到範圍中。爲了說明我需要什麼,我有這個玩具語法:XText中的簡單導入指令
grammar org.xtext.example.mydsl.MyDsl with org.eclipse.xtext.common.Terminals
generate myDsl "http://www.xtext.org/example/mydsl/MyDsl"
Model:
(imports += Import)*
(classes += ClassDef)*;
Import:
'import' filename += STRING;
ClassDef:
'class' name=ID ('extends' extends=[ClassDef])?;
可以說,我希望能夠擴展僅是一個給定的類之前定義的類,並且只有那些具有相同的第一個字母爲啓動該類正在被定義。
推薦的方法是通過scoping。這裏是做一個單一文件內的範圍提供:
package org.xtext.example.mydsl.scoping
import ....
class MyDslScopeProvider extends AbstractMyDslScopeProvider {
override getScope(EObject context, EReference reference){
if(reference == MyDslPackage.Literals.CLASS_DEF__EXTENDS){
if(! (context instanceof ClassDef)) {return IScope.NULLSCOPE }
val root = (context as ClassDef).getRootContainer
val classes = root.getAllContentsOfType(ClassDef)
val before = classes.subList(0, classes.indexOf(context))
val fstLetter = (context as ClassDef).name.charAt(0)
val haveSame1stLetter = before.filter[name.charAt(0) == fstLetter]
return Scopes::scopeFor(haveSame1stLetter)
}
}
}
我希望能夠從導入的文件訪問類的聲明是這樣的:
// --- c ---
class Xlib
class Xextend extends Xlib
// --- main.mydsl ---
import "lib.mydsl"
class A
class Xmain extends Xlib
,我發現了一些相互矛盾的建議關於使用importURI
的事情,但它似乎並沒有爲我工作,似乎是過時的做事方式。
說明文檔中提到的跨資源引用我可能需要:
- 創建
IGlobalScopeProvider
一個實例,一個QualifiedName
和它的字符串表示之間 - 出口元素
IResourceDescription
- 轉換的一部分
- 執行並綁定我自己
IDefaultResourceDescriptionStrategy
- 獲得
IContainer.Manager
- 得到
IResourceDescriptions
從
...還有更多其他的東西(注意是複數形式)。不幸的是,他們沒有把我所要做的事情添加到一個連貫的圖景中,以實現預期的行爲。
編輯:繼斯文的建議,我已經想出瞭解決方案。如果有人有興趣 - 我已經在this gist上發佈了代碼。
嗨,我試圖給出一個我想要實現的例子 – Kostya
你有多個文件夾/包/項目和相對/絕對導入或只是當前文件旁邊的文件 –
當前所有文件都是相同的夾。但我希望將文件夾作爲未來的可能性。 – Kostya