1 //===--- SymbolOccurrences.cpp - Clang refactoring library ----------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #include "clang/Tooling/Refactoring/Rename/SymbolOccurrences.h" 10 #include "clang/Tooling/Refactoring/Rename/SymbolName.h" 11 #include "llvm/ADT/STLExtras.h" 12 13 using namespace clang; 14 using namespace tooling; 15 16 SymbolOccurrence::SymbolOccurrence(const SymbolName &Name, OccurrenceKind Kind, 17 ArrayRef<SourceLocation> Locations) 18 : Kind(Kind) { 19 ArrayRef<std::string> NamePieces = Name.getNamePieces(); 20 assert(Locations.size() == NamePieces.size() && 21 "mismatching number of locations and lengths"); 22 assert(!Locations.empty() && "no locations"); 23 if (Locations.size() == 1) { 24 new (&SingleRange) SourceRange( 25 Locations[0], Locations[0].getLocWithOffset(NamePieces[0].size())); 26 return; 27 } 28 MultipleRanges = std::make_unique<SourceRange[]>(Locations.size()); 29 NumRanges = Locations.size(); 30 for (const auto &Loc : llvm::enumerate(Locations)) { 31 MultipleRanges[Loc.index()] = SourceRange( 32 Loc.value(), 33 Loc.value().getLocWithOffset(NamePieces[Loc.index()].size())); 34 } 35 } 36