我正在使用Xtext构建DSL,我希望当用户编写类似这样的语句时:
import "someFile.txt"
能够验证并检查该文件是否已存在。如果导入定义如上,则该文件应与用户正在编写的DSL程序位于同一项目中。但他也应该能够指定绝对路径。
问题是我找不到在验证器中访问文件系统的方法!我看到很多人都在谈论ResourcesPlugin,但我无法从Xtext生成的基础项目中访问它(我不仅可以在ui生成的项目中访问它,而且验证器存在于基础项目中)。
我该怎么做?
答案 0 :(得分:0)
你可以像在Java中那样简单地完成它:
import java.io.File
import java.io.BufferedReader
import java.io.FileReader
class FileTest {
def static void main(String[] args) {
try{
var testFile = new File(TheFilePathTheUserTypedAfterImportStatement)
if(!testFile.exists){
println("That file doesn't exist!")
}else {
var reader = new BufferedReader(new FileReader(testFile))
var String line
while((line = reader.readLine) != null) {
println(line)
}
}
}
catch(Exception e) {
println(e.stackTrace)
}
}
}
您可以使用内容/文件不存在的事实来计算验证方法
中的内容,而不是打印文件不存在的消息或打印lineContent。问候Krzmbrzl
答案 1 :(得分:0)
您可以编写一个小界面,如:
interface FileFinder {
def boolean exists(String fileName, emf.Resource context)
}
然后有一个使用java.io.File的实现和一个使用Eclipse资源API的实现。您可以分别使用您的语言的RuntimeModule和UiModule绑定它们:
public Class<? extends FileFinder> bindFileFinder() {
return JavaIOFileFinder.class;
}
然后在验证规则中使用它:
@Inject FileFinder finder
@Check
def checkFiles(Model model) {
for (file: model.files) {
if (!finder.exists(file, model.eResource))
error...
}
}