Intellij模板生成器语法

时间:2017-11-08 01:32:19

标签: java string intellij-idea equals

在Intellij IDE中,您可以编写自己的模板以生成代码。我想写一个模板来生成 equals方法。 目标是使用一个不等于null和空字符串的equals方法,如下所示:
(使用来自apache.commons.language的StringUtils.IsNotEmpty)

public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;

    POJO pojo = (POJO) o;

    if(StringUtils.IsNotEmpty(stringAtt) ? !stringAtt.equals(pojo.stringAtt) : StringUtils.IsNotEmpty(pojo.stringAtt)) return false;

    return true;       
}

我想写这个等于作为模板,所以我可以为我正在使用的所有POJO生成代码。

问题是我不完全理解用于intellij模板生成的语言和令牌的语法。它看起来像这样:

#parse("equalsHelper.vm")
public boolean equals(##
#if ($settings.generateFinalParameters)
  final ##
#end
Object $paramName){
#addEqualsPrologue()
#if ($fields.size() > 0)
  #addClassInstance()
#foreach($field in $fields)     
  #addFieldComparison($field)
#end
#end

return true;
}
##
#macro(addFieldComparison $field)
  #if ($field.notNull)
    if(!${field.accessor}.equals(${classInstanceName}.$field.accessor))return false;
  #else
    if($field.accessor != null ? !${field.accessor}.equals(${classInstanceName}.$field.accessor) : ${classInstanceName}.$field.accessor != null)return false;
  #end
#end
##

我在Intellij文档页面上查找过,但我找不到语法的解释。

  • 有人可以给我一个很好的例子或指向一些文档网页,以便我可以学习如何做到这一点吗?
  • 或者这是什么语言,所以我可以自己学习

感谢。

1 个答案:

答案 0 :(得分:2)

所以用于此的语言是Velocity Template Language或VTL

我想我已经完成了工作。唯一重要的是检查POJO的字段是否为字符串。然后,如果它写了代码straigth foward。这是我的答案,我希望它有所帮助,我只给出了addFieldComparisson宏的代码,其余的是相同的:

#macro(addFieldComparison $field)
  ## Check if the field is a String
  // CHECKED TYPE: ${field.accessor.class.name}
  #if (${field.accessor.class.name} == "java.lang.String")
    //is a String
    if(StringUtils.isNotEmpty($field.accessor) ? !${field.accessor}.equals(${classInstanceName}.$field.accessor) : StringUtils.isNotEmpty(${classInstanceName}.$field.accessor))return false;
  #else
    // Not a String
    if($field.accessor != null ? !${field.accessor}.equals(${classInstanceName}.$field.accessor) : ${classInstanceName}.$field.accessor != null)return false;
  #end
#end