1

これは、 Google グループでの私の質問の再投稿です。うまくいけば、私はここでいくつかの応答を得るでしょう.

頻繁にこの問題に遭遇します。テキストが空でない場合、テキスト行を生成したい。空の場合は、行を生成しません。イラストテンプレート:

名前空間 @classSpec.getNamespace()

@classSpec.getComment()
クラス @classSpec.getName() {
  ...
}

@classSpec.getComment() が意味のあるコメント テキストを返す場合、結果は次のようになります。

名前空間 com.example

// これはコメントです
クラス MyClass {
  ...
}

しかし、コメントがなければ、それは

名前空間 com.example


クラス MyClass {
  ...
}

余分な空の行に注意してください。いりません。現在の解決策は、テンプレートを次のように記述することです

名前空間 @classSpec.getNamespace()

@classSpec.getComment()class @classSpec.getName() {
  ...
}

getComment() が戻り値に「\n」を追加することを確認してください。これにより、テンプレートが読みにくくなります。また、for ループで複数のパラメーターを持つ関数を生成する必要があるとします。各パラメーターにテンプレート コードの複雑なロジックが必要な場合は、上記のようにすべてを 1 行で記述する必要があります。それ以外の場合、結果ファイルには次のような機能があります

関数 myFunction(
  文字列 stringParam、
  整数 intParam、
  長い longParam
)

中心的な問題は、テンプレート ファイルにスクリプトだけでなく、出力に書き込まれる生のテキストも含まれていることです。スクリプト部分には、改行とインデントが必要です。コンパイラが通常行うように、スペースをトリミングしたいと考えています。ただし、生のテキストの場合、スペースはファイルで指定されているとおりに正確にする必要があります。この 2 つの部分を調整するには、生のテキストを制御するメカニズムがもう少し必要だと思います。

この場合に固有の、出力で複数行を単一行として扱う特別な記号はありますか? たとえば、次のように書くことができます

名前空間 @classSpec.getNamespace()

@classSpec.getComment()\\
クラス @classSpec.getName() {
  ...
}

ありがとう!

4

2 に答える 2

0

同じ問題が発生しています。独自のリズムで解決策を見つけることができませんでした。

テンプレートで複数の行を処理した結果として 1 つの行を取得するには、後処理の形で独自のメカニズムを実装する必要がありました。テンプレートでは、次の行に結合する各行の最後で、カスタム シンボル/タグをトークンとして使用します。次に、テンプレートが処理されたら、そのシンボル/タグと、その直後の改行文字を空の文字列に置き換えます。

たとえば、「#join-next-line#」というタグを使用した場合、テンプレートは次のようになります。

@for (Bar bar : foo.getBars()).join (", ") {
@bar.name#join-next-line#
}

それは完璧な解決策ではありませんが、私にとってはうまくいきました。

于 2015-12-16T17:22:16.190 に答える