如何使用Acceleo代码生成器保护我的方法体(而不是附加的JavaDoc和Signature)

时间:2012-06-14 15:32:06

标签: code-generation eclipse-emf acceleo

我使用Acceleo以使用我制作的模型生成代码。我设法保护我的方法,以保护他们使用“@generated NOT”以防我需要使用Acceleo重新生成我的代码。问题是添加@generated NOT保护所有方法内容,即正文,签名和JavaDocs。

问题是我只需要保留方法体,或者至少保留方法体及其签名,但我需要更新文档。我怎么能这样做?



仅供参考,这里是潜在生成类的一个例子:

/*
 * @generated
 */
public class ActeurRefEntrepriseServicesImpl implements ActeurRefEntrepriseServices {

    @Autowired
    HelloWorldService helloWorldService;

    /**
     * Service which say hello
     * 
     * @param name
     *           user name
     * @return print Hello username
     * 
     * @generated NOT
     */
    @Override
    public void sayHello(final String name) {
        helloWorldService.print(name);
    }
}

1 个答案:

答案 0 :(得分:1)

巴普蒂斯特,

@generated标记使用标准的EMF保护规则:“@generated”表示将生成设置它的块的正文,其他任何意思没有再生。如果您在任何元模型生成的代码中设置了“@generated”,那么无论您进行哪些编辑,都会看到javadoc被保留。

简而言之,您无法告诉EMF重新生成除代码本身之外的任何内容。

如果你需要保护身体而不是javadoc,你必须从“@generated”保护转移到Acceleo的[protected]块。即,更改您的模板:

[template generatedMethod(methodName : String)]
    /**
     * Some doc.
     * @param param1
     *           param documentation.
     * @generated
     */
    [generateSignature(methodName)/] {
        [generateBody()/]
    }
[/template]

使用受保护的块:

[template generatedMethod(methodName : String)]
    /**
     * Some doc.
     * @param param1
     *           param documentation.
     */
    [protected (methodName)]
    [generateSignature(methodName)/] {
        [generateBody()/]
    }
    [/protected]
[/template]

通过这种模式,保护区域的任何内容都将被重新生成,其他所有内容将不会被重新生成。

另请参阅the Acceleo website提供的完整文档。

如果您绝对需要为模型使用“@generated”保护方法,则需要篡改EMF中的JMerger API并更改为您生成的启动器Acceleo以便使用自己的合并策略(参见该启动器的getGenerationStrategy方法)。请注意,这绝非易事。