2011-01-18 12 views
3

最近、released beta version of Stringtemplate 4に問題があります。 StringTemplate 3においてStringTemplate4と匿名テンプレート

は、Iリテラル閉じ括弧を含む

<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()); 
    } 
} 

答えて

4

私は

テスト1時44分を取得:無効な文字を '}'

あなたはST3で働いていることを確認していますか? inside}は一致しますが、引用符のように、最初の}はテンプレートを終了する必要があります。 STはテンプレート内のテキストを解釈してはなりません。これはどう?動作するはずですが、私は{の内側を見ていないならば

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

。それはあなたが生成している完全な機能ではない頭部かもしれません、そうですか?

v3のようなサウンドにはバグがありました。 ;)

Ter

+0

私はテストケースのマークアップを修正しました(重要な部分は欠落していました)。 ST3でなぜ機能したのかについての私の無神経な推測は、クローズ}の後ろにテンプレート終了文字(外側テンプレートの場合はドルよりも大きい)が続くかどうかを判断するための先読み匿名テンプレートのクローズトークンとして解釈します。 – pmf