//===--- CloneDetection.h - Finds code clones in an AST ---------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// \file /// This file defines classes for searching and analyzing source code clones. /// //===----------------------------------------------------------------------===// #ifndef LLVM_CLANG_ANALYSIS_CLONEDETECTION_H #define LLVM_CLANG_ANALYSIS_CLONEDETECTION_H #include "clang/AST/StmtVisitor.h" #include "llvm/Support/Regex.h" #include <vector> namespace clang { class Stmt; class Decl; class VarDecl; class ASTContext; class CompoundStmt; /// Identifies a list of statements. /// /// Can either identify a single arbitrary Stmt object, a continuous sequence of /// child statements inside a CompoundStmt or no statements at all. class StmtSequence { … }; /// Searches for similar subtrees in the AST. /// /// First, this class needs several declarations with statement bodies which /// can be passed via analyzeCodeBody. Afterwards all statements can be /// searched for clones by calling findClones with a given list of constraints /// that should specify the wanted properties of the clones. /// /// The result of findClones can be further constrained with the constrainClones /// method. /// /// This class only searches for clones in executable source code /// (e.g. function bodies). Other clones (e.g. cloned comments or declarations) /// are not supported. class CloneDetector { … }; /// This class is a utility class that contains utility functions for building /// custom constraints. class CloneConstraint { … }; /// This constraint moves clones into clone groups of type II via hashing. /// /// Clones with different hash values are moved into separate clone groups. /// Collisions are possible, and this constraint does nothing to address this /// them. Add the slower RecursiveCloneTypeIIVerifyConstraint later in the /// constraint chain, not necessarily immediately, to eliminate hash collisions /// through a more detailed analysis. class RecursiveCloneTypeIIHashConstraint { … }; /// This constraint moves clones into clone groups of type II by comparing them. /// /// Clones that aren't type II clones are moved into separate clone groups. /// In contrast to the RecursiveCloneTypeIIHashConstraint, all clones in a clone /// group are guaranteed to be type II clones of each other, but it is too /// slow to efficiently handle large amounts of clones. class RecursiveCloneTypeIIVerifyConstraint { … }; /// Ensures that every clone has at least the given complexity. /// /// Complexity is here defined as the total amount of children of a statement. /// This constraint assumes the first statement in the group is representative /// for all other statements in the group in terms of complexity. class MinComplexityConstraint { … }; /// Ensures that all clone groups contain at least the given amount of clones. class MinGroupSizeConstraint { … }; /// Ensures that no clone group fully contains another clone group. struct OnlyLargestCloneConstraint { … }; struct FilenamePatternConstraint { … }; /// Analyzes the pattern of the referenced variables in a statement. class VariablePattern { … }; /// Ensures that all clones reference variables in the same pattern. struct MatchingVariablePatternConstraint { … }; } // end namespace clang #endif // LLVM_CLANG_ANALYSIS_CLONEDETECTION_H