【问题标题】:Acceleo file tagsAcceleo 文件标签
【发布时间】:2017-06-07 20:38:59
【问题描述】:

我是 Acceleo 的新手,我正在尝试找出一些关于我可以使用的文件标签的事情。 我最常见的格式是这样的:

[file (someElement.anotherElement.concat('SomeText.java'), false, 'UTF-8')]

第一个问题:我怎样才能先写一些文本,然后再写一些元素的文本?例如创建一个名为“SomeTextElement1.java”的文件。其中 Element1 是 .ecore 文件中的属性(或其他东西)

第二个问题:如何从 2 个不同的元素中获取值? 例如创建一个名为“Element1-Element2.java”的文件。其中 Element1 和 Element2 取自 .ecore 文件。

和第三个问题:如何将文件语句放在 [if] 语句中??? 例如

[if (condition) /]
[file (Element1.concat('.java'),false, 'UTF-8')]
[else if (condition)]
[file (Element1.concat('.java'),false, 'UTF-8')]
[if/]

我收到一条错误消息,提示文件标签未终止。但我不想在 if 语句中终止它,因为那样我将不得不写两次相同的代码......我只想在条件为真时更改文件名......这可能吗?

提前致谢。

【问题讨论】:

    标签: java file tags acceleo


    【解决方案1】:

    您通常不希望为此使用外部“if”。文件名本身是一个表达式,而不是一个简单的字符串,因此您可以通过以下方式实现您想要获得的内容:

    [file (if (condition) then 'somename.java' else 'someothername.java' endif, false, 'UTF-8')]
    

    请注意,在这种情况下,您将使用的“if”结构是 OCL“if”,因此您必须正确使用“if then else endif”结构。如果你想要多个条件,这将成为

    if (condition) then 'somename' else
        if (otherCondition) then 'someothername' else 'yetanothername' endif
    endif
    

    【讨论】:

    • 非常感谢!实际上这是我的第三个问题的答案。我正在寻找的确切答案。另外,我自己找到了前两个问题的答案。我只是在这里为任何可能阅读此内容的其他人发布它:第一个问题:基本上很容易......只需编写 [file ("someText" + Element1.concat(.java), (...), (. ..) ) ] 和第二个问题:相同的逻辑 [file (element1+element2+"someText.java,(...),(...) ) ] 再次感谢...感谢...
    【解决方案2】:

    为了在一个条件下为同一类型生成两个不同的文件,您有多种选择:

    您可以按照@Kellindil 在[file ()] 标签中的建议进行操作

    您也可以使用您的解决方案,但通过在 [if..] 中结束 [/file] 标记,如下所示:

    [if (condition)]
    [file ('name1', ...)]
    ...
    [/file]
    [elseif (condition)]
    [file ('name2', ...)]
    ...
    [/file]
    [/if]
    

    最后,您还可以在拥有代码的模板上使用保护:

    [template public generate_stuff(p : your_type) ? (condition1)]
    [file ('name1' ....)]
    ...
    [/file]
    [/template]
    
    [comment Yep, the template name is exactly the same, only the condition change/]
    [template public generate_stuff(p: your_type) ? (condition2)]
    [file ('name2' ....)]
    ...
    [/file]
    [/template]
    

    这个后来的解决方案可能是最好的,因为您可以清楚地“剪切”您的代码并编写有关条件的专用实现。

    (您也可以使用将if 解决方案与多个模板混合的解决方案)

    编辑>

    最后一个解决方案可以产生相同的代码,这没有问题

    [template public generate_stuff(p : your_type) ? (condition1)]
    [file ('name1' ....)]
    [p.body_generation()/]
    [/file]
    [/template]
    
    [comment Yep, the template name is exactly the same, only the condition change/]
    [template public generate_stuff(p: your_type) ? (condition2)]
    [file ('name2' ....)]
    [p.body_generation()/]
    [/file]
    [/template]
    
    [template public body_generation(p: your_type)]
    ...
    [/template]
    

    Acceleo 是一种非常冗长的语言,试图将所有内容放在一个语句中通常不是提高可读性的好主意。

    【讨论】:

    • 我不知道我是否没有让自己理解或者我不理解您的答案,但我想我想要与您发布的内容完全相反...我不如果条件为真或假,想编写不同的代码...我想编写完全相同的代码,只是希望它具有不同的文件名...无论如何感谢您的回答:)
    • 这不是问题,最后一个解决方案完全相关并且更好(它使用保护并且更易于阅读),如果您需要相同的代码,那么您编写一个新模板并调用它。我编辑我的答案向你展示如何。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2021-11-08
    相关资源
    最近更新 更多