annotate clang-tools-extra/clangd/SemanticSelection.cpp @ 173:0572611fdcc8 llvm10 llvm12

reorgnization done
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 11:55:54 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===--- SemanticSelection.cpp -----------------------------------*- C++-*-===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 #include "SemanticSelection.h"
anatofuz
parents:
diff changeset
9 #include "ParsedAST.h"
anatofuz
parents:
diff changeset
10 #include "Protocol.h"
anatofuz
parents:
diff changeset
11 #include "Selection.h"
anatofuz
parents:
diff changeset
12 #include "SourceCode.h"
anatofuz
parents:
diff changeset
13 #include "clang/AST/DeclBase.h"
anatofuz
parents:
diff changeset
14 #include "clang/Basic/SourceLocation.h"
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
15 #include "llvm/ADT/ArrayRef.h"
150
anatofuz
parents:
diff changeset
16 #include "llvm/Support/Error.h"
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 namespace clang {
anatofuz
parents:
diff changeset
19 namespace clangd {
anatofuz
parents:
diff changeset
20 namespace {
anatofuz
parents:
diff changeset
21 // Adds Range \p R to the Result if it is distinct from the last added Range.
anatofuz
parents:
diff changeset
22 // Assumes that only consecutive ranges can coincide.
anatofuz
parents:
diff changeset
23 void addIfDistinct(const Range &R, std::vector<Range> &Result) {
anatofuz
parents:
diff changeset
24 if (Result.empty() || Result.back() != R) {
anatofuz
parents:
diff changeset
25 Result.push_back(R);
anatofuz
parents:
diff changeset
26 }
anatofuz
parents:
diff changeset
27 }
anatofuz
parents:
diff changeset
28 } // namespace
anatofuz
parents:
diff changeset
29
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
30 llvm::Expected<SelectionRange> getSemanticRanges(ParsedAST &AST, Position Pos) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
31 std::vector<Range> Ranges;
150
anatofuz
parents:
diff changeset
32 const auto &SM = AST.getSourceManager();
anatofuz
parents:
diff changeset
33 const auto &LangOpts = AST.getLangOpts();
anatofuz
parents:
diff changeset
34
anatofuz
parents:
diff changeset
35 auto FID = SM.getMainFileID();
anatofuz
parents:
diff changeset
36 auto Offset = positionToOffset(SM.getBufferData(FID), Pos);
anatofuz
parents:
diff changeset
37 if (!Offset) {
anatofuz
parents:
diff changeset
38 return Offset.takeError();
anatofuz
parents:
diff changeset
39 }
anatofuz
parents:
diff changeset
40
anatofuz
parents:
diff changeset
41 // Get node under the cursor.
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
42 SelectionTree ST = SelectionTree::createRight(
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
43 AST.getASTContext(), AST.getTokens(), *Offset, *Offset);
150
anatofuz
parents:
diff changeset
44 for (const auto *Node = ST.commonAncestor(); Node != nullptr;
anatofuz
parents:
diff changeset
45 Node = Node->Parent) {
anatofuz
parents:
diff changeset
46 if (const Decl *D = Node->ASTNode.get<Decl>()) {
anatofuz
parents:
diff changeset
47 if (llvm::isa<TranslationUnitDecl>(D)) {
anatofuz
parents:
diff changeset
48 break;
anatofuz
parents:
diff changeset
49 }
anatofuz
parents:
diff changeset
50 }
anatofuz
parents:
diff changeset
51
anatofuz
parents:
diff changeset
52 auto SR = toHalfOpenFileRange(SM, LangOpts, Node->ASTNode.getSourceRange());
anatofuz
parents:
diff changeset
53 if (!SR.hasValue() || SM.getFileID(SR->getBegin()) != SM.getMainFileID()) {
anatofuz
parents:
diff changeset
54 continue;
anatofuz
parents:
diff changeset
55 }
anatofuz
parents:
diff changeset
56 Range R;
anatofuz
parents:
diff changeset
57 R.start = sourceLocToPosition(SM, SR->getBegin());
anatofuz
parents:
diff changeset
58 R.end = sourceLocToPosition(SM, SR->getEnd());
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
59 addIfDistinct(R, Ranges);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
60 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
61
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
62 if (Ranges.empty()) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
63 // LSP provides no way to signal "the point is not within a semantic range".
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
64 // Return an empty range at the point.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
65 SelectionRange Empty;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
66 Empty.range.start = Empty.range.end = Pos;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
67 return std::move(Empty);
150
anatofuz
parents:
diff changeset
68 }
173
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
69
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
70 // Convert to the LSP linked-list representation.
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
71 SelectionRange Head;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
72 Head.range = std::move(Ranges.front());
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
73 SelectionRange *Tail = &Head;
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
74 for (auto &Range :
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
75 llvm::makeMutableArrayRef(Ranges.data(), Ranges.size()).drop_front()) {
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
76 Tail->parent = std::make_unique<SelectionRange>();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
77 Tail = Tail->parent.get();
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
78 Tail->range = std::move(Range);
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
79 }
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
80
0572611fdcc8 reorgnization done
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 150
diff changeset
81 return std::move(Head);
150
anatofuz
parents:
diff changeset
82 }
anatofuz
parents:
diff changeset
83
anatofuz
parents:
diff changeset
84 } // namespace clangd
anatofuz
parents:
diff changeset
85 } // namespace clang