0

特定のモデルからソース コード (C#、Java、IOS など) を生成するツールがあります。コードは、コード ジェネレーターによって欠落している機能について手動で編集されます。モデルに変更が加えられ、モデルからソース コードを生成する必要がある場合は常に、以前のバージョンで実行された手動の変更は失われます。

損失を最小限に抑えるために、ユーザーが編集したコード ブロック (メソッド、クラス、プロパティなど) はカスタム属性 (たとえばCUSTCODE) でマークされます。新しいバージョンのソースを生成しているときに、以前のバージョンのパスが (ユーザーによって) 言及されている場合、システムは 2 つのソース コードを比較し、次のように内容をマージします (この場合、以前のバージョンはベースと見なされます)。

  1. CUSTCODE としてマークされていない、以前のバージョンでは使用でき、新しいバージョンでは使用できないコード ブロックをすべて削除します。
  2. 両方のバージョンで使用でき、CUSTCODE としてマークされていないコード ブロックを最新バージョンのコードに置き換えます。
  3. 不足しているコード ブロックを最新のコードから追加します。

このためにMicrosoft Roslyn、C# を使用しており、期待どおりに動作しています (もちろん、using などの追加のチェックが実行されます)。

[注: 合併アプリには Java / C# を使用できます。システムは、params を渡すことで任意のアプリを呼び出します。ASTRewriterfor Javaを使用して同じことが達成されます]

ここでの課題は、JS と HTML です。現在はJSを中心に活動中。Rhino、IronJS、astify などのいくつかの AST JavaScript パーサーを確認しましたが、ある時点でそれらの使用がブロックされました。

だから私はカスタム合併を構築したい。JavaScript は非常に動的であるため、JS コードのガイドラインを設定します。

  1. すべてのコードを名前付き関数で囲みます。これは、一致およびマージするための一意の識別子として機能します。
  2. システムがマージ中に機能をそのまま維持する必要がある場合は、メソッドの先頭に「CUSTCODE」のコメントを追加します。

私たちの意図は、次のアプローチに従うことです。

  1. jQuery で見つかった無名関数を名前付き関数に移動し、jQuery で呼び出します
  2. var v = function()... のような匿名関数に名前を付けます。
  3. すべての jQuery とスタンドアロン コードを名前付きの自己実行可能関数にラップし、順序はそのままにします。
  4. すべてのグローバル変数を JS ファイルの先頭に移動します。(どの関数にも囲まないでください)

マージ プロセスは次のように機能します。

  1. すべての文字列 (一重引用符、二重引用符)、コメント (インライン、ブロック) をキャプチャし、いくつかの一意の識別子に置き換えます。(「CUSTCODE」のタグが付いたものを除く)
  2. ('{' と '}' の数に基づいて) 関数本体をキャプチャし、一意の識別子に置き換えます。前の行を読み、「CUSTCODE」の場合はメソッドにマークを付けます
  3. キャプチャされた関数本体を最新バージョンのコンテンツと適切に比較して置き換えます。
  4. すべてのキャプチャを復元して、最終的な出力を生成します。

他に検討する必要があるかどうか疑問に思っています。

4

0 に答える 0