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