如何在Xtext中为生成代码复刻源码目录结构
解决Xtext生成器保留源文件目录结构的问题
没问题,咱们来调整生成器代码,让.obj文件自动匹配源文件的目录结构存到src-gen里,具体步骤如下:
首先,你需要从Resource对象里拿到源文件的相对路径,然后对路径做两个替换:把扩展名从.src改成.obj,再把路径开头的src/替换成src-gen/。这样就能完美保留原有的多级目录结构了。
修改后的完整doGenerate方法代码如下:
override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) { // Root node of parsing tree val Program prg = resource.allContents.filter(Program).next() // Compiled code var String code = prg.compile().toString() // 获取源文件的平台相对路径(比如"src/one/A.src") val sourcePath = resource.getURI().toPlatformString(true) // 替换扩展名:把.src换成.obj val pathWithObjExt = sourcePath.replace(".src", ".obj") // 替换根目录:把src/开头换成src-gen/ val outName = pathWithObjExt.replaceFirst("^src/", "src-gen/") // Generate output fsa.generateFile(outName, code) ... }
代码解释:
resource.getURI().toPlatformString(true):获取源文件相对于项目根目录的路径,true参数表示不包含项目名称,直接返回src/xxx/xxx.src这种格式。replace(".src", ".obj"):简单替换文件扩展名,适配你的需求。replaceFirst("^src/", "src-gen/"):用正则匹配路径开头的src/,只替换一次,确保多级目录的结构不会被破坏,比如src/one/two/A.src会变成src-gen/one/two/A.obj。
这样修改后,src目录下任何多级目录里的.src文件,生成的.obj都会自动对应到src-gen的相同子目录里,完全符合你的预期~
内容的提问来源于stack exchange,提问作者mzattera
相关产品推荐
相关产品推荐

