コード行数(LoC)

このドキュメントでは、このクレートで利用できる LoC メトリクスの実装方法についての手引きを示します。コード行数は、ソースコードの行を数えることでソースコードの規模の目安を与えるソフトウェアメトリクスです。LoC には多くの種類があるため、まず例を使ってそれらを説明します。

LoC の種類

#![allow(unused)]
fn main() {
/*
課題: 階乗関数を実装せよ
追加加点として、可変状態や `for`・`while` のような命令型ループは使用しないこと。
 */

/// 階乗: n! = n*(n-1)*(n-2)*(n-3)...3*2*1
fn factorial(num: u64) -> u64 {

    // `Iterator` の `product` を使う
    (1..=num).product()
}
}

上の例を使って、以下で説明する各 LoC メトリクスを説明します。

SLOC

コード、コメント、空行を含む、ファイル内の全行を単純に数えたものです。
メトリクス値: 11

PLOC

ソースコードに含まれる命令行の数です。新しい行に置かれた括弧などの類似構文も含まれます。コメントと空行はここには数えられないことに注意してください。メトリクス値: 3

LLOC

「論理」行は、コード内の文の数を数えたものです。何を文とみなすかは言語によって異なることに注意してください。上の例では文は 1 つだけで、それは Iterator を引数とする product の関数呼び出しです。メトリクス値: 1

CLOC

コード内のコメントの数です。単一行、ブロック、doc といったコメントの種類は問いません。
メトリクス値: 6

BLANK

最後になりましたが、このメトリクスはコード中に存在する空行を数えます。メトリクス値: 2

空白文字のみのファイル

トークンをまったく含まないソース — スペース、タブ、改行だけのファイル — は、末尾の改行が LoC の値を変える唯一の入力クラスです。それ以外の場所では、末尾の改行はどのメトリクスも依存しない書式上の詳細にすぎません。

そのような入力に対して、ほとんどの文法は tree-sitter のルートノードをファイル全体にまたがらせるのではなく、入力末尾の幅ゼロのノードに畳み込みます。SLOC はそのスパンから導出されるため、これらのファイルは改行で終わる場合に sloc 0、終わらない場合に sloc 1 を報告します。5 つの文法 — Elixir、Tcl、iRules、および preproc / ccomment ヘルパー — はルートのスパンを保持し、どちらの場合も行数を報告します。

ある言語がどちらに該当するかは上流の文法の挙動であって、このクレートが下す判断ではありません。したがって文法のバージョン更新によって言語が別側へ移ることがあります。言語ごとの値は /src/metrics/loc.rswhitespace_only_input_is_the_documented_carve_out で固定されています。

実装

上で説明した LoC 関連のメトリクスを実装するには、サポートしたい言語に対して Loc トレイトを実装する必要があります。

これには compute 関数の実装が必要です。実装場所と他言語の例については /src/metrics/loc.rs を参照してください。

PLOC に行を挿入するキャッチオールの _ アームには注意してください。Tcl ファミリーのように、文法が行終端子を extra ではなく_トークン_として表出する場合、そのトークンの開始行は終端する行そのものなので、キャッチオールはコメントのみの行や空行を PLOC に計上してしまいます。そうしたトークンには明示的な no-op アームを与えてください。