Hand-Written Code Preservation in Model-to-Text Transformation using Intrinsic Redundancy

Abstraction

We present a novel language-agnostic approach for integrating and preserving hand-written code in files generated via model-to-text transformation. Unlike existing approaches that only support modification of generated files in predefined locations (e.g., protected regions), the proposed approach allows users to make edits anywhere within generated files. Our handwritten code preservation technique has been implemented on top of an existing model-to-text transformation language (Epsilon’s EGL). The approach is illustrated in a case study involving a code generator of Sirius Web editors and is contrasted with existing approaches such as protected regions and separation of generated and non-generated code using inheritance and delegation.

Introduction

M2T 转换语言为将静态内容与根据一个或多个输入模型的元素计算的文本相结合提供了一流的支持,并且与使用字符串连接实现的命令式 M2T 转换程序相比,可以提供更高的可读性。

现有的建模语言无法提供足够的捕获全部代码生成细节的表达能力(比如EMF),现有的几种操作方法:

  • 使用受保护区域或目标语言感知合并以受控方式将指定缺失细节的手写代码添加到生成的文件中(例如,EMF 中的“@Generate NOT”方法注释);
  • 使用继承、委托或特定于语言的构造(例如部分类)将生成的代码与手写的代码完全分离;
  • 扩展建模语言,允许建模者将用目标实现语言编写的代码片段嵌入到他们的模型中(例如,将 3GL 代码嵌入到面向对象的模型中)。

这导致了几个问题:

  • 受保护区域和目标语言感知合并需要预测生成的代码中 M2T 转换的用户可能想要扩展/定制的所有位置。他们还可能在生成的代码中散布受保护区域标记和注释,这可能使其看起来不自然。
  • 促进生成/手写代码之间清晰分离的方法可能会导致更复杂的体系结构。例如,我们不需要从面向对象模型中的每个类生成一个 Java 类,而是需要生成一个接口和一个默认实现,以及一些可用于控制实例创建的机制(例如工厂)。这是 EMF 代码生成器所遵循的方法。
  • 对于具有固定元模型(例如标准)的语言,不可能扩展建模语言。即使可以在模型中包含代码,它也并不理想,因为它可以(1)将模型耦合到特定的实现技术,并且(2)要求用户使用次优工具(例如纯文本编辑器)在模型中键入代码。

我们的审查尚未发现任何手写代码保存技术能够 (1) 支持在生成的文件中的任何位置保存手写代码,而无需明确预测它们,以及 (2) 独立于建模和目标语言。

本文提出了 Intred,一种独立于建模语言和目标实现语言的手写代码保存技术。 Intred 是在 Epsilon Generation Language (EGL)(一种基于模板的 M2T 转换语言)之上开发的,并在涉及 Sirius Web 编辑器的代码生成器的案例研究中进行了说明。我们的方法依赖于 Intred 注释行,代表内在冗余,其中包含 Base64 格式的相应 M2T 转换模板的最后执行输出的冗余副本。

Motivating Example

Playground中常见的任务分配的例子,生成html网页

Extending the Generated Reports

Use Clean Content Separation

Extend the Metamodel

Intred: Hand-written code preservation

Intred:当 M2T 转换生成文件时,它会在生成的文件末尾包含一个额外的行,该行由模板生成的文本的无损编码组成。

Conclusion and future work

本文提出了一种与语言无关的新颖方法,用于将手写代码集成到通过 M2T 转换生成的文件中。与仅支持在预定义位置修改生成文件的现有方法相比,我们的方法利用内在冗余来允许用户添加手写代码并在生成文件中的任何位置进行更改。我们的手写代码保存技术已在实际案例研究的背景下进行了评估,该案例研究强调了我们方法的优点:为 M2T 转换开发人员提高了灵活性,以及​​包含较少生成和手写代码的低复杂性架构。在未来的工作中,我们计划开发一个支持编辑器扩展,它可以理解 Intred 行并使用其中包含的信息向用户显示文件中的哪些行是自动生成的以及哪些行是手动添加的(例如,通过用不同的颜色突出显示它们)。

个人总结:York组在Epsilon上的最新研究成果。MDE领域有技术性和试验性的一篇文章,也是当年度Models的best paper。