class Detector::Cpp::Cli

Overview

Detects C++ command-line applications, gated on a CLI library / parser construct (CLI11, getopt/getopt_long, cxxopts, boost::program_options, gflags, Abseil Flags, p-ranav/argparse) — not on bare main(int argc, char** argv), which every C++ program (servers included) has.

Defined in:

detector/detectors/cpp/cli.cr

Constant Summary

ABSL_FLAG = /\bABSL_FLAG\s*\(/
ARGPARSE = /\bargparse::ArgumentParser\b/
BOOST_PO = /\bprogram_options\b/
CLI11 = /\bCLI::App\b|include\s*[<"]CLI\/CLI\.hpp/
CXXOPTS = /\bcxxopts::/
EXTS = [".cpp", ".cc", ".cxx", ".c++", ".hpp", ".hh", ".hxx"]
GETOPT = /\bgetopt(?:_long)?\s*\(|\bstruct\s+option\b/
GFLAGS = /\bDEFINE_(?:string|int32|int64|bool|double|uint32|uint64)\s*\(/

Instance Method Summary

Instance methods inherited from class Detector

applicable?(filename : String) : Bool applicable?, detect(filename : String, file_contents : String) : Bool detect, gemfile_dependency?(file_contents : String, gem_name : String) : Bool gemfile_dependency?, gemspec_dependency?(file_contents : String, gem_name : String) : Bool gemspec_dependency?, idempotent? : Bool idempotent?, logger : NoirLogger logger, name : String name, path_sensitive? : Bool path_sensitive?

Constructor methods inherited from class Detector

new(options : Hash(String, YAML::Any)) new

Instance Method Detail

def applicable?(filename : String) : Bool #
Description copied from class Detector

Cheap filename-only filter the detector pass uses to skip #detect on files the detector cannot possibly match. The default true preserves prior behavior (every detector runs on every file). Override with the same predicate the body of #detect starts with — e.g., filename.ends_with?(".py") for a Python framework detector — so the detector loop avoids the #detect dispatch on files outside the detector's language.

On large codebases (saleor's 4255 .py files) this lifts ~100 virtual #detect calls per file out of the hot loop because most detectors' inner first-line is exactly this kind of cheap filename check.


[View source]
def detect(filename : String, file_contents : String) : Bool #

[View source]
def set_name #

[View source]