Как настроить живой шаблон, который генерирует метод построителя в IntelliJ IDEA?

Мне часто нужно создавать методы построителя в моем коде. Эти методы похожи на геттеры, но они return this и используют with вместо get.

Чтобы быстрее справиться с этой задачей, я хотел бы создать живой шаблон в IDEA.

Вот как далеко я продвинулся:

конфигурация построителя

~/.IntelliJIdea14/config/templates/user.xml это выглядит так:)

<template name="builderMethod" value="public $CLASS_NAME$ with$VAR_GET$(final $TYPE$ $PARAM_NAME$) {&#10;    this.$VAR$ = $PARAM_NAME$;&#10;    return this;&#10;}" description="create a builder method" toReformat="true" toShortenFQNames="true">
    <variable name="CLASS_NAME" expression="className()" defaultValue="" alwaysStopAt="true" />
    <variable name="VAR" expression="complete()" defaultValue="" alwaysStopAt="true" />
    <variable name="PARAM_NAME" expression="VAR" defaultValue="" alwaysStopAt="true" />
    <variable name="TYPE" expression="typeOfVariable(&quot;this.&quot; + VAR)" defaultValue="" alwaysStopAt="true" />
    <variable name="VAR_GET" expression="capitalize(VAR)" defaultValue="" alwaysStopAt="true" />
    <context>
      <option name="JAVA_EXPRESSION" value="false" />
      <option name="JAVA_DECLARATION" value="true" />
    </context>
  </template>

Это почти работает, за исключением typeOfVariable("this." + VAR), который не работает. Я только догадался, как вызвать этот метод, потому что не смог найти никакой документации по синтаксису, используемому в выражениях, кроме эта страница, на которой даже не упоминается название скриптового языка или что-то, что упростило бы поиск в Google.

Как исправить вызов typeOfVariable?

Бонусный вопрос: как я могу заставить complete() для VAR показывать только поля?

Аналогичный вопрос, но даже не имеет начала: Конструктор API в IntelliJ


person yankee    schedule 05.06.2016    source источник
comment
Что касается бонусного вопроса: я не думаю, что можно перечислить только поля.   -  person binoternary    schedule 05.06.2016
comment
Вероятно, будет удобнее, если вы отметите опцию Пропустить, если определено для переменных TYPE и CLASS_NAME, так как вам, вероятно, никогда не понадобится изменять сгенерированные для них значения.   -  person binoternary    schedule 05.06.2016


Ответы (1)


Замените typeOfVariable("this." + VAR) на typeOfVariable(VAR).

Изменить:

Другой способ создания методов построителя — использование соответствующего шаблона установки (вместо живого шаблона).
https://www.jetbrains.com/help/idea/2016.1/generate-setter-dialog.html

Уже существует встроенный шаблон сеттера с именем «Builder», который генерирует такие сеттеры, как:

public Foo setBar(int bar) {
  this.bar = bar;
  return this;
}

Вы можете создать свой собственный шаблон (например, скопировав его) и изменить его так, чтобы префикс метода был with.
А чтобы сделать сгенерированный параметр метода окончательным, перейдите в настройки:

  • Editor | Code Style | Java
  • Выберите вкладку Генерация кода
  • Установите флажок Сделать сгенерированные параметры окончательными

IntelliJ IDEA добавляет final к автоматически сгенерированным сеттерам

person binoternary    schedule 05.06.2016
comment
Странный. Я мог бы поклясться, что проверял это. Очевидно, я этого не делал, потому что это работает. - person yankee; 05.06.2016