MetaCredo.Analysis.Duplication (MetaCredo v0.3.1)

View Source

Programmatic code duplication detection API.

Detects code clones across the same or different programming languages by operating on the unified MetaAST representation. Supports four types:

  • Type I: Exact clones (identical AST)
  • Type II: Renamed clones (identical structure, different identifiers)
  • Type III: Near-miss clones (similar structure with modifications)
  • Type IV: Semantic clones (different syntax, same behavior)

Usage

alias Metastatic.Document
alias MetaCredo.Analysis.Duplication

doc1 = Document.new(ast1, :elixir)
doc2 = Document.new(ast2, :python)

{:ok, result} = Duplication.detect(doc1, doc2)
result.duplicate?        # => true
result.clone_type        # => :type_i
result.similarity_score  # => 1.0

Summary

Functions

Detects duplication between two documents.

Detects duplication between two documents, raising on error.

Detects duplicates across multiple documents.

Detects duplicates across multiple documents, raising on error.

Generates a structural fingerprint for an AST.

Calculates similarity score between two ASTs (0.0 to 1.0).

Types

detect_opts()

@type detect_opts() :: [
  threshold: float(),
  min_tokens: non_neg_integer(),
  ignore_literals: boolean(),
  ignore_variables: boolean(),
  cross_language: boolean(),
  clone_types: [atom()]
]

Functions

detect(doc1, doc2, opts \\ [])

Detects duplication between two documents.

detect!(doc1, doc2, opts \\ [])

Detects duplication between two documents, raising on error.

detect_in_list(documents, opts \\ [])

@spec detect_in_list([Metastatic.Document.t()], detect_opts()) :: {:ok, [map()]}

Detects duplicates across multiple documents.

detect_in_list!(documents, opts \\ [])

@spec detect_in_list!([Metastatic.Document.t()], detect_opts()) :: [map()]

Detects duplicates across multiple documents, raising on error.

fingerprint(ast)

@spec fingerprint(Metastatic.AST.meta_ast()) :: String.t()

Generates a structural fingerprint for an AST.

similarity(ast1, ast2)

Calculates similarity score between two ASTs (0.0 to 1.0).