xref: /llvm-project/clang-tools-extra/clangd/support/Context.cpp (revision ad97ccf6b26a29262c9cbf5b3e7f6e84c6dcf55f)
1*ad97ccf6SSam McCall //===--- Context.cpp ---------------------------------------------*- C++-*-===//
2*ad97ccf6SSam McCall //
3*ad97ccf6SSam McCall // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*ad97ccf6SSam McCall // See https://llvm.org/LICENSE.txt for license information.
5*ad97ccf6SSam McCall // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*ad97ccf6SSam McCall //
7*ad97ccf6SSam McCall //===----------------------------------------------------------------------===//
8*ad97ccf6SSam McCall 
9*ad97ccf6SSam McCall #include "support/Context.h"
10*ad97ccf6SSam McCall #include <cassert>
11*ad97ccf6SSam McCall 
12*ad97ccf6SSam McCall namespace clang {
13*ad97ccf6SSam McCall namespace clangd {
14*ad97ccf6SSam McCall 
empty()15*ad97ccf6SSam McCall Context Context::empty() { return Context(/*DataPtr=*/nullptr); }
16*ad97ccf6SSam McCall 
Context(std::shared_ptr<const Data> DataPtr)17*ad97ccf6SSam McCall Context::Context(std::shared_ptr<const Data> DataPtr)
18*ad97ccf6SSam McCall     : DataPtr(std::move(DataPtr)) {}
19*ad97ccf6SSam McCall 
clone() const20*ad97ccf6SSam McCall Context Context::clone() const { return Context(DataPtr); }
21*ad97ccf6SSam McCall 
currentContext()22*ad97ccf6SSam McCall static Context &currentContext() {
23*ad97ccf6SSam McCall   static thread_local auto C = Context::empty();
24*ad97ccf6SSam McCall   return C;
25*ad97ccf6SSam McCall }
26*ad97ccf6SSam McCall 
current()27*ad97ccf6SSam McCall const Context &Context::current() { return currentContext(); }
28*ad97ccf6SSam McCall 
swapCurrent(Context Replacement)29*ad97ccf6SSam McCall Context Context::swapCurrent(Context Replacement) {
30*ad97ccf6SSam McCall   std::swap(Replacement, currentContext());
31*ad97ccf6SSam McCall   return Replacement;
32*ad97ccf6SSam McCall }
33*ad97ccf6SSam McCall 
34*ad97ccf6SSam McCall } // namespace clangd
35*ad97ccf6SSam McCall } // namespace clang
36