xText入门二-进阶

参考: 这篇文章基于上篇文章中的语法解析,如何生成对应的java代码。(上篇文章中解析到元素名字等属性都会被用的。)

参考:

https://www.eclipse.org/Xtext/documentation/103_domainmodelnextsteps.html

https://blog.csdn.net/donhao/article/details/7183867?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160447024819725225045373%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=160447024819725225045373&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v1~rank_blog_v1-4-7183867.pc_v1_rank_blog_v1&utm_term=xtext&spm=1018.2118.3001.4450

 

修改文件:DomainmodelGenerator.xtend

 

class DomainmodelGenerator extends AbstractGenerator {
 
    override void doGenerate(Resource resource, IFileSystemAccess2 fsa, IGeneratorContext context) {
        for (e : resource.allContents.toIterable.filter(Entity)) {
                
        }
    }
}

对资源中的内容进行遍历来找出所对应的entity,因此,对嵌套的元素进行遍历。Xtend可以简化这个过程,类ResourceExtensions提供了功能非常强大的方法allContentsIterable(),我们可以静态import。

 

@Inject extension IQualifiedNameProvider nameProvider
override void doGenerate(Resource resource, IFileSystemAccess fsa) {
    for(e: resource.allContents.toIterable.filter(typeof(Entity))) {
        fsa.generateFile(
            e.fullyQualifiedName.toString.replace(".", "/") + ".java",
            e.compile)
    }
}

由于Java支持这种模式,因此可以基于Entity的限定名称来进行命名。可以通过一种特殊的服务来获得适用于所有语言的限定命名。幸运的是,Xtend提供了相应的功能,只需简单的在生成器中inject IQuali edNameProvider即可。

 

private def compile(Entity e) '''
    package «e.eContainer.fullyQualifiedName»;
        
    public class «e.name» {
    }
'''

The next step is to write the actual template code for an entity. For now, the function Entity.compile does not exist, but it is easy to create it:

 

private def compile(Feature f) '''
    private «f.type.fullyQualifiedName» «f.name»;
        
    public «f.type.fullyQualifiedName» get«f.name.toFirstUpper»() {
        return «f.name»;
    }
        
    public void set«f.name.toFirstUpper»(«f.type.fullyQualifiedName» «f.name») {
        this.«f.name» = «f.name»;
    }
'''


private def compile(Entity e) '''
    «IF e.eContainer.fullyQualifiedName !== null»
        package «e.eContainer.fullyQualifiedName»;
    «ENDIF»
        
    public class «e.name» «IF e.superType !== null
            »extends «e.superType.fullyQualifiedName» «ENDIF»{
        «FOR f : e.features»
            «f.compile»
        «ENDFOR»
    }
'''

根据不同的元素类型,进行解析。这部分容易理解。

写好后,运行Run As → Eclipse Application,在新启动的eclipse里就能看到如图新生成的java代码。

coding-xText入门二-进阶-

 

 

 

 

 

 

匿名

发表评论

匿名网友