//===--- UsingDeclarationsSorter.cpp ----------------------------*- 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 implements UsingDeclarationsSorter, a TokenAnalyzer that /// sorts consecutive using declarations. /// //===----------------------------------------------------------------------===// #include "UsingDeclarationsSorter.h" #include "clang/Format/Format.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Regex.h" #include <algorithm> #define DEBUG_TYPE … namespace clang { namespace format { namespace { // The order of using declaration is defined as follows: // Split the strings by "::" and discard any initial empty strings. The last // element of each list is a non-namespace name; all others are namespace // names. Sort the lists of names lexicographically, where the sort order of // individual names is that all non-namespace names come before all namespace // names, and within those groups, names are in case-insensitive lexicographic // order. int compareLabelsLexicographicNumeric(StringRef A, StringRef B) { … } int compareLabelsLexicographic(StringRef A, StringRef B) { … } int compareLabels( StringRef A, StringRef B, FormatStyle::SortUsingDeclarationsOptions SortUsingDeclarations) { … } struct UsingDeclaration { … }; /// Computes the label of a using declaration starting at tthe using token /// \p UsingTok. /// If \p UsingTok doesn't begin a using declaration, returns the empty string. /// Note that this detects specifically using declarations, as in: /// using A::B::C; /// and not type aliases, as in: /// using A = B::C; /// Type aliases are in general not safe to permute. std::string computeUsingDeclarationLabel(const FormatToken *UsingTok) { … } void endUsingDeclarationBlock( SmallVectorImpl<UsingDeclaration> *UsingDeclarations, const SourceManager &SourceMgr, tooling::Replacements *Fixes, FormatStyle::SortUsingDeclarationsOptions SortUsingDeclarations) { … } } // namespace UsingDeclarationsSorter::UsingDeclarationsSorter(const Environment &Env, const FormatStyle &Style) : … { … } std::pair<tooling::Replacements, unsigned> UsingDeclarationsSorter::analyze( TokenAnnotator &Annotator, SmallVectorImpl<AnnotatedLine *> &AnnotatedLines, FormatTokenLexer &Tokens) { … } } // namespace format } // namespace clang