StringTemplate4 и анонимные шаблоны - PullRequest
4 голосов
/ 18 января 2011

У меня проблема с недавно выпущенной бета-версией Stringtemplate 4 .

В StringTemplate 3 у меня были такие шаблоны, как

<env_vars:{ var | void* <var>() { return null; }}>

т.е. анонимные шаблоны, содержащие буквальную закрывающую скобку ("}"), и они работали достаточно хорошо в ST3, не выходя за пределы первой закрывающей скобки.

С ST4 я получаю NPE (тестовый пример ниже печатает трассировку стека). Я могу заставить его работать, избегая закрывающей литеральной скобки, поэтому шаблон выглядит следующим образом (обратите внимание на обратную косую черту в кавычках перед первой закрывающей скобкой):

<env_vars:{ var | void* <var>() { return null; \}}>

Но это кажется немного уродливым; Я всегда восхищался неинтрузивным синтаксисом ST, и необходимость сопоставления каждого "{" для вывода с соответствующим "\}" почему-то кажется очень асимметричной.

Что-то я упускаю или это ожидаемое изменение поведения от ST3?

Контрольный пример:

import org.stringtemplate.v4.ST;

public class ST4Test
{
  public static void main(final String[] args)
  {
    final String[] env_vars = new String[]{"one", "two", "three"};

    try
    {

      // This used to work in ST3, but fails in ST4.
      final ST failingST = new ST("<env_vars:{ var | void* <var>() { return null; }}\n>");
      failingST.add("env_vars", env_vars);

      System.out.printf("%s\n", failingST.render());
    }
    catch (Exception ex)
    {
      // The failing example results in a NPE
      ex.printStackTrace();
    }

    // This works, but requires quoting the "}" contained within the anonymous
    // template, which I find a bit disturbing, considering that I use ST for
    // generating C-code, which tends to use the occasional "}", along with the
    // fact that this used to work in ST3.
    final ST workingST = new ST("<env_vars:{ var | void* <var>() { return null; \\}\n}>");
    workingST.add("env_vars", env_vars);
    System.out.printf("%s\n", workingST.render());
  }
}

1 Ответ

4 голосов
/ 19 января 2011

Я получаю

тест 1:44: недопустимый символ '}'

Вы уверены, что работали в ST3? Внутренняя часть} соответствует, но, как и кавычки, первая} должна завершить шаблон. ST вообще не должен интерпретировать текст внутри шаблонов. Как насчет этого?

<env_vars:{ var | void* <var>() {{{{{{{{{{{ return null; }>

Это должно сработать, но не сработало бы, если бы я посмотрел на {внутри. это может быть голова, не полная функция, которую вы генерируете, верно?

Звучит так, будто в v3 была ошибка! ;)

Ter

...