|
|
@@ -15,18 +15,17 @@ namespace Carbon::LanguageServer {
|
|
|
|
|
|
// Returns the text of first child of kind IdentifierNameBeforeParams or
|
|
|
// IdentifierNameNotBeforeParams.
|
|
|
-static auto GetIdentifierName(const SharedValueStores& value_stores,
|
|
|
- const Lex::TokenizedBuffer& tokens,
|
|
|
- const Parse::TreeAndSubtrees& tree_and_subtrees,
|
|
|
+static auto GetIdentifierName(const Parse::TreeAndSubtrees& tree_and_subtrees,
|
|
|
Parse::NodeId node)
|
|
|
-> std::optional<llvm::StringRef> {
|
|
|
+ const auto& tokens = tree_and_subtrees.tree().tokens();
|
|
|
for (auto child : tree_and_subtrees.children(node)) {
|
|
|
switch (tree_and_subtrees.tree().node_kind(child)) {
|
|
|
case Parse::NodeKind::IdentifierNameBeforeParams:
|
|
|
case Parse::NodeKind::IdentifierNameNotBeforeParams: {
|
|
|
auto token = tree_and_subtrees.tree().node_token(child);
|
|
|
if (tokens.GetKind(token) == Lex::TokenKind::Identifier) {
|
|
|
- return value_stores.identifiers().Get(tokens.GetIdentifier(token));
|
|
|
+ return tokens.GetTokenText(token);
|
|
|
}
|
|
|
break;
|
|
|
}
|
|
|
@@ -42,22 +41,19 @@ auto HandleDocumentSymbol(
|
|
|
llvm::function_ref<
|
|
|
void(llvm::Expected<std::vector<clang::clangd::DocumentSymbol>>)>
|
|
|
on_done) -> void {
|
|
|
- SharedValueStores value_stores;
|
|
|
- llvm::vfs::InMemoryFileSystem vfs;
|
|
|
- auto lookup = context.files().Lookup(params.textDocument.uri.file());
|
|
|
- CARBON_CHECK(lookup);
|
|
|
- vfs.addFile(lookup.key(), /*mtime=*/0,
|
|
|
- llvm::MemoryBuffer::getMemBufferCopy(lookup.value()));
|
|
|
+ auto* file = context.LookupFile(params.textDocument.uri.file());
|
|
|
+ if (!file) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const auto& tree_and_subtrees = file->tree_and_subtrees();
|
|
|
+ const auto& tree = tree_and_subtrees.tree();
|
|
|
+ const auto& tokens = tree.tokens();
|
|
|
|
|
|
- auto source =
|
|
|
- SourceBuffer::MakeFromFile(vfs, lookup.key(), NullDiagnosticConsumer());
|
|
|
- auto tokens = Lex::Lex(value_stores, *source, NullDiagnosticConsumer());
|
|
|
- auto tree = Parse::Parse(tokens, NullDiagnosticConsumer(), nullptr);
|
|
|
- Parse::TreeAndSubtrees tree_and_subtrees(tokens, tree);
|
|
|
std::vector<clang::clangd::DocumentSymbol> result;
|
|
|
- for (const auto& node : tree.postorder()) {
|
|
|
+ for (const auto& node_id : tree.postorder()) {
|
|
|
clang::clangd::SymbolKind symbol_kind;
|
|
|
- switch (tree.node_kind(node)) {
|
|
|
+ switch (tree.node_kind(node_id)) {
|
|
|
case Parse::NodeKind::FunctionDecl:
|
|
|
case Parse::NodeKind::FunctionDefinitionStart:
|
|
|
symbol_kind = clang::clangd::SymbolKind::Function;
|
|
|
@@ -76,9 +72,8 @@ auto HandleDocumentSymbol(
|
|
|
continue;
|
|
|
}
|
|
|
|
|
|
- if (auto name =
|
|
|
- GetIdentifierName(value_stores, tokens, tree_and_subtrees, node)) {
|
|
|
- auto token = tree.node_token(node);
|
|
|
+ if (auto name = GetIdentifierName(tree_and_subtrees, node_id)) {
|
|
|
+ auto token = tree.node_token(node_id);
|
|
|
clang::clangd::Position pos{tokens.GetLineNumber(token) - 1,
|
|
|
tokens.GetColumnNumber(token) - 1};
|
|
|
|