コンテンツにスキップ

言語サポートとAPI忠実度

codeknit はコンパイラの実行、マクロの評価、プロジェクトの依存関係のロードを行わずに構文を抽出します。以下のマトリックスは、テスト済みの構造を示しており、言語の完全な準拠やクロスファイルの名前解決を保証するものではありません。

各言語には、internal/plugin/api_fidelity_test.go に厳密な基本パラメータ/戻り値シグネチャのアサーションがあります。宣言のカバレッジは internal/plugin/coverage_test.go および個別の言語テストパッケージでもチェックされます。

言語 拡張子 シグネチャの基準 宣言とコンテナのカバレッジ
C .c, .h 定義およびプロトタイプにおける名前付きパラメータと戻り値の型 構造体、共用体、列挙型、typedef、マクロ;ヘッダーガード内の宣言
C++ .cpp, .cc, .cxx, .hpp, .hxx, .h 関数、プロトタイプ、およびメソッド宣言における名前付きパラメータと戻り値の型 クラス、構造体、メソッド、名前空間、テンプレート;ヘッダーガードおよび extern "C" ラッパー
C# .cs 名前付きの型指定パラメータと明示的な戻り値の型 クラス、構造体、インターフェース、メソッド、フィールド、デリゲート、名前空間
Go .go グループ化、無名、可変長、関数型およびジェネリックパラメータ;名前付き/複数の結果;ジェネリックレシーバー 型とタグを持つ構造体フィールド、埋め込みフィールド、インターフェースメソッドシグネチャ、型パラメータ、パッケージ
Java .java 名前付きの型指定パラメータと明示的な戻り値の型 クラス、インターフェース、コンストラクタ、メソッド、フィールド、ネストされたクラス、パッケージ
JavaScript .js, .jsx, .mjs, .cjs 名前付きパラメータ;戻り値の型は推論されない 関数、アロー関数、クラス、フィールド、メソッド、JSXを含む宣言
PHP .php 名前付きの型指定パラメータと明示的な戻り値の型 クラス、インターフェース、トレイト、列挙型、メソッド、プロパティ、名前空間
Python .py, .pyi アノテーション、デフォルト値、*args、**kwargs、位置/キーワードセパレータ、戻り値のアノテーション 関数、クラス、ネストされたクラス、装飾されたメソッド;慣例的なバインドレシーバーは省略
Ruby .rb 名前付きパラメータ;戻り値の型は推論されない クラス、モジュール、インスタンス/シングルトンメソッド、定数
Rust .rs 型指定パターン、self/&self/&mut self、可変バインディング、明示的な戻り値の型 インラインおよびネストされたモジュール、名前付き構造体フィールド、トレイトメソッドおよび実装メソッド
Scala .scala, .sc 名前付きの型指定パラメータと明示的な戻り値の型 クラス、トレイト、オブジェクト、メソッド、列挙型、パッケージ
TypeScript .ts, .tsx, .mts, .cts 名前付きの型指定パラメータと明示的な戻り値のアノテーション 関数、アロー関数、インターフェース、クラス、フィールド、名前空間;TSXは独自の文法を使用

すべてのソース処理 CLI コマンドは --header-language c|cpp を受け付けます。この選択は .h ファイルにのみ適用されます。その他の拡張子は通常のパーサーを保持します。

ターミナルウィンドウ
codeknit parse ./src --header-language cpp
codeknit fingerprint ./src --header-language c
codeknit graph analyze ./src --header-language cpp

デフォルトは c で、C のマクロ、typedef、共用体の抽出を保持します。.h と名付けられた C++ ヘッダーには cpp を使用してください;.hpp および .hxx と名付けられたファイルは既に C++ を使用しています。この選択は明示的です。なぜなら、両方の文法が他方の言語の構文の一部を受け入れることができるものの、その完全な構造を抽出するわけではないからです。

ヘッダーガードおよび条件分岐は、その条件を評価せずにトラバースされます。したがって、結果には相互排他的な分岐からの宣言が含まれる場合があります。マクロ展開、インクルード解決、およびビルドフラグは適用されません。TUI は .h ファイルに対してデフォルトの C 選択を使用します。

例えば、Go の場合:

func Pair(a, b int, rest ...string) (string, error)

以下を生成します:

Pair(a: int, b: int, rest: ...string) -> (string, error)

Go のインターフェースメソッドおよび Go/Rust の名前付きフィールドは、通常モードとフィンガープリントモードの両方でシンボルとして表示されます。メソッドとフィールドは、それらが属する型を保持します。ネストされた Rust モジュールは、service.storage.read のような修飾名を保持します。これには、他のモジュールが同じ名前の関数を宣言している場合も含まれます。

Rust では、同じ名前のフィールドとメソッドが許可されています。フィールドスコープの名前には内部的に #field サフィックスが付けられ、ID と包含エッジが区別されます;表示名とシグネチャは元のフィールド名を保持します。

Python のシグネチャは、アノテーション、デフォルト値、スプラット、および呼び出し規約セパレータを保持します。慣例的な最初の self または cls パラメータは、バインドされたメソッドからは省略されますが、自由関数または静的メソッドでは保持されます。

複数行のシグネチャは、JSON においてソースの改行を保持します。SKT は改行を \n および \r としてエスケープするため、各シンボルは1つの物理的な出力行に収まります。

関係はレシーバーの修飾とレキシカルな所有権を保持します。相対インポートおよび JavaScript/TypeScript と Python の名前変更されたインポートは、ターゲットコンテキストを提供します。Go および Java のパッケージ宣言は、同じディレクトリ内のファイル間で解決できます。一致しないインポートは、無関係な宣言にフォールバックすることはなく、競合する候補は曖昧なままです。

ローカルなレシーバーバインディングは、名前空間のインポートよりも優先されます。これには、パラメータがインポートされた名前空間をシャドウイングする場合も含まれます。Python のパッケージインポートは、パッケージの __init__ モジュール内の宣言を考慮し、任意の子孫モジュールは考慮しません。そのモジュールから確立できない再エクスポートは未解決のままです。

Java、C++、C#、Scala、および TypeScript の呼び出し可能な抽出は、宣言のバイト範囲を保持するため、オーバーロードされた本体は異なる呼び出し元とエイリアススコープを持つことができます。これには、同じ行にある宣言も含まれます。オーバーロードされたターゲットの選択は保守的なままです。Java、C++、C#、Scala、および TypeScript における明示的なオーバーライド関係は、最も近い継承された宣言を探します;欠落した基底、サイクル、または競合する候補は、自己リンクを生成する代わりに不確実性を保持します。

これは構文ベースのグラフ分析であり、コンパイラやランタイムの呼び出しグラフではありません。プレーンな JavaScript パッケージ指定子、パッケージの再エクスポート、ビルド構成、複雑なレシーバー型、および動的ディスパッチは未解決のままである可能性があります。リポジトリ内の他の場所にある一意の名前は、依存関係の証拠としては不十分です。

JSON は、resolution: "unresolved" または "ambiguous" の不確実なエッジを保持し、利用可能な場合は候補 ID を含めます。これらのエッジにはターゲットの ShortID がありません。

SKT は、すべての関係に対して同じエッジ表記を使用し、オプションの解決マーカーを付けます:

S8 --references--> S5
S10 --references[unresolved]--> string, bool
S11 --calls[ambiguous]--> Helper [candidates=S12, S15]

既知のエンドポイントおよび候補は ShortID を使用し、未解決の関係のエンドポイントも含みます。シンボルのない不確実なターゲットは、ソースファイルに対する相対名です。ShortID に似たリテラル名やその他の複雑な識別子は、曖昧さを避けるために引用された完全な ID を使用します。同じソース、種類、解決、および候補セットを持つエッジは、1つのターゲットリストを共有します。SKT リーダーは解決と候補を保持し、後続の出力チャンク内のシンボルへの参照も含みます。最小化された出力は関係の種類をエンコードしながら、解決マーカーを読み取り可能なままにします。

C/C++ のインクルードには、明示的な meta/file および meta/include シンボルがあります。ヘッダーのスペルはシンボルリストに一度だけ表示されます;エッジはそれらの ShortID を使用します:

[symbols]
## src/main.c
S1 meta/file L1-L4 main.c
S2 meta/include L1-L1 "config.h" {resolution=unresolved}
S3 meta/include L2-L2 "utils.h" {resolution=unresolved}
S4 meta/include L3-L3 <stdio.h> {resolution=unresolved}
[edges]
S1 --references[unresolved]--> S2, S3, S4

インクルードシンボルは、解決されたヘッダー宣言ではなく、書かれたディレクティブを記述します。ファイル内の繰り返しインクルードはエンドポイントを共有します。ファイル/インクルードメタデータは、依存関係のランキングやデッドコードの発見から除外されます;ID を追加しても、コンパイラのインクルード検索構成を通じてヘッダーが見つかったことを主張するものではありません。

依存関係メトリクスおよび HTML グラフリンクは、解決されたエッジのみを使用します。レポートには除外された関係のカウントが表示され、HTML グラフには不確実性のカウントが表示されます。ファンインとファンアウトは、異なる隣接ノードの数をカウントします。継承分析はすべての基底およびインターフェースを考慮します;循環継承には報告される深さがありません。到達可能性は、名前付きの main、Main、または init 呼び出し可能なものから始まり、依存関係エッジをたどります。メンバーに到達すると、そのコンテナが関連するものになりますが、すべての兄弟が到達可能になるわけではありません。認識されたエントリーポイントがない場合、到達可能性の発見は省略されます。

コールバック引数および返された呼び出し可能なものは参照であり、呼び出しの証拠ではありません。エイリアス解決はファイル、関数、およびオブジェクトの同一性を保持します;競合する割り当ては不確実なままです。グラフ分析の発見はレビュー候補です:外部の呼び出し元や動的な振る舞いによって結果が変わる可能性があります。ディレクトリベースのレイヤールールや変更伝播の重みはヒューリスティックであり、測定された確率ではありません。

  • 複雑な C/C++ のポインタ、参照、配列、および関数ポインタの宣言子は、不完全なシグネチャを持つ場合があります。マクロ生成の宣言は展開されません。
  • TypeScript/JavaScript のコンストラクタ処理および一部のオプション、レスト、または分割代入パラメータ形式は不完全です。
  • テストケース外の高度なジェネリック制約および型形式は、言語によって異なります。戻り値の型は推論されません。
  • Rust のマクロは展開されません。アウトオブラインモジュール宣言は記録されます;それらのファイルはスキャンに含める必要があります。タプルフィールド、列挙型バリアントの詳細、および関連アイテムは部分的なカバレッジです。
  • 構文抽出は、動的ディスパッチ、オーバーロード、インポートされた依存関係、またはビルド構成のセマンティクスをコンパイラの精度で解決しません。
  • 構文エラーの一部は、宣言を省略する可能性があります。報告された警告を確認し、リファクタリングを適用する前にソースを検証してください。

より完全な抽出はシンボル数と ShortID を変更します。既存のスケルトン出力をアップグレード時に再生成し、古い出力と混在させないでください。