1 //===--- InsertionPoint.h - Where should we add new code? --------*- C++-*-===//
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/AST/DeclCXX.h"
10 #include "clang/Basic/Specifiers.h"
11 #include "clang/Tooling/Core/Replacement.h"
12 
13 namespace clang {
14 namespace clangd {
15 
16 // An anchor describes where to insert code into a decl sequence.
17 //
18 // It allows inserting above or below a block of decls matching some criterion.
19 // For example, "insert after existing constructors".
20 struct Anchor {
21   // A predicate describing which decls are considered part of a block.
22   // Match need not handle TemplateDecls, which are unwrapped before matching.
23   std::function<bool(const Decl *)> Match;
24   // Whether the insertion point should be before or after the matching block.
25   enum Dir { Above, Below } Direction = Below;
26 };
27 
28 // Returns the point to insert a declaration according to Anchors.
29 // Anchors are tried in order. For each, the first matching location is chosen.
30 SourceLocation insertionPoint(const DeclContext &Ctx,
31                               llvm::ArrayRef<Anchor> Anchors);
32 
33 // Returns an edit inserting Code inside Ctx.
34 // Location is chosen according to Anchors, falling back to the end of Ctx.
35 // Fails if the chosen insertion point is in a different file than Ctx itself.
36 llvm::Expected<tooling::Replacement> insertDecl(llvm::StringRef Code,
37                                                 const DeclContext &Ctx,
38                                                 llvm::ArrayRef<Anchor> Anchors);
39 
40 // Variant for C++ classes that ensures the right access control.
41 SourceLocation insertionPoint(const CXXRecordDecl &InClass,
42                               std::vector<Anchor> Anchors,
43                               AccessSpecifier Protection);
44 
45 // Variant for C++ classes that ensures the right access control.
46 // May insert a new access specifier if needed.
47 llvm::Expected<tooling::Replacement> insertDecl(llvm::StringRef Code,
48                                                 const CXXRecordDecl &InClass,
49                                                 std::vector<Anchor> Anchors,
50                                                 AccessSpecifier Protection);
51 
52 } // namespace clangd
53 } // namespace clang
54