-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Dump
functions to Check, Parse, and Lex
#4669
Changes from all commits
b5d253a
9cc9ac4
e28d533
30bb063
19fddbc
08907b1
1526f1d
bdc9c01
b0b1cdf
91bc8a0
506a504
fb7840f
228273f
a8da68b
3ed5149
2bec55b
d5a2374
1964585
4fa1b64
c9d28da
3365c6c
baa3dda
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -92,6 +92,25 @@ cc_library( | |
], | ||
) | ||
|
||
cc_library( | ||
name = "dump", | ||
srcs = ["dump.cpp"], | ||
# Contains Dump methods without a forward declaration. | ||
copts = ["-Wno-missing-prototypes"], | ||
deps = [ | ||
":context", | ||
"//common:check", | ||
"//common:ostream", | ||
"//toolchain/lex:dump", | ||
"//toolchain/lex:tokenized_buffer", | ||
"//toolchain/parse:dump", | ||
"//toolchain/parse:tree", | ||
"//toolchain/sem_ir:file", | ||
], | ||
# Always link dump methods. | ||
alwayslink = 1, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Leave a comment why this is here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
) | ||
|
||
cc_library( | ||
name = "check", | ||
srcs = [ | ||
|
@@ -109,6 +128,7 @@ cc_library( | |
hdrs = ["check.h"], | ||
deps = [ | ||
":context", | ||
":dump", | ||
":impl", | ||
":interface", | ||
":pointer_dereference", | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,78 @@ | ||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM | ||
// Exceptions. See /LICENSE for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
|
||
// This library contains functions to assist dumping objects to stderr during | ||
// interactive debugging. Functions named `Dump` are intended for direct use by | ||
// developers, and should use overload resolution to determine which will be | ||
// invoked. The debugger should do namespace resolution automatically. For | ||
// example: | ||
// | ||
// - lldb: `expr Dump(context, id)` | ||
// - gdb: `call Dump(context, id)` | ||
// | ||
// The `DumpNoNewline` functions are helpers that exclude a trailing newline. | ||
// They're intended to be composed by `Dump` function implementations. | ||
|
||
#ifndef NDEBUG | ||
|
||
#include "toolchain/lex/dump.h" | ||
|
||
#include "common/check.h" | ||
#include "common/ostream.h" | ||
#include "toolchain/check/context.h" | ||
#include "toolchain/lex/tokenized_buffer.h" | ||
#include "toolchain/parse/dump.h" | ||
#include "toolchain/parse/tree.h" | ||
#include "toolchain/sem_ir/file.h" | ||
|
||
namespace Carbon::Check { | ||
|
||
static auto DumpNoNewline(const Context& context, SemIR::LocId loc_id) -> void { | ||
if (!loc_id.is_valid()) { | ||
llvm::errs() << "LocId(invalid)"; | ||
return; | ||
} | ||
|
||
if (loc_id.is_node_id()) { | ||
auto token = context.parse_tree().node_token(loc_id.node_id()); | ||
auto line = context.tokens().GetLineNumber(token); | ||
auto col = context.tokens().GetColumnNumber(token); | ||
const char* implicit = loc_id.is_implicit() ? " implicit" : ""; | ||
llvm::errs() << "LocId("; | ||
llvm::errs().write_escaped(context.sem_ir().filename()); | ||
llvm::errs() << ":" << line << ":" << col << implicit << ")"; | ||
} else { | ||
CARBON_CHECK(loc_id.is_import_ir_inst_id()); | ||
|
||
auto import_ir_id = context.sem_ir() | ||
.import_ir_insts() | ||
.Get(loc_id.import_ir_inst_id()) | ||
.ir_id; | ||
const auto* import_file = | ||
context.sem_ir().import_irs().Get(import_ir_id).sem_ir; | ||
llvm::errs() << "LocId(import from \""; | ||
llvm::errs().write_escaped(import_file->filename()); | ||
llvm::errs() << "\")"; | ||
} | ||
} | ||
|
||
LLVM_DUMP_METHOD auto Dump(const Context& context, Lex::TokenIndex token) | ||
-> void { | ||
Parse::Dump(context.parse_tree(), token); | ||
} | ||
|
||
LLVM_DUMP_METHOD auto Dump(const Context& context, Parse::NodeId node_id) | ||
-> void { | ||
Parse::Dump(context.parse_tree(), node_id); | ||
} | ||
|
||
LLVM_DUMP_METHOD auto Dump(const Context& context, SemIR::LocId loc_id) | ||
-> void { | ||
DumpNoNewline(context, loc_id); | ||
llvm::errs() << '\n'; | ||
} | ||
|
||
} // namespace Carbon::Check | ||
|
||
#endif // NDEBUG |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -184,6 +184,7 @@ cc_library( | |
hdrs = ["lex.h"], | ||
deps = [ | ||
":character_set", | ||
":dump", | ||
":helpers", | ||
":numeric_literal", | ||
":string_literal", | ||
|
@@ -198,6 +199,18 @@ cc_library( | |
], | ||
) | ||
|
||
cc_library( | ||
name = "dump", | ||
srcs = ["dump.cpp"], | ||
hdrs = ["dump.h"], | ||
deps = [ | ||
":tokenized_buffer", | ||
"//common:ostream", | ||
], | ||
# Always link dump methods. | ||
alwayslink = 1, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Leave a comment why this is here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
) | ||
|
||
cc_library( | ||
name = "token_index", | ||
hdrs = ["token_index.h"], | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM | ||
// Exceptions. See /LICENSE for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
|
||
#ifndef NDEBUG | ||
|
||
#include "toolchain/lex/dump.h" | ||
|
||
#include "common/ostream.h" | ||
|
||
namespace Carbon::Lex { | ||
|
||
auto DumpNoNewline(const TokenizedBuffer& tokens, TokenIndex token) -> void { | ||
if (!token.is_valid()) { | ||
llvm::errs() << "TokenIndex(invalid)"; | ||
return; | ||
} | ||
|
||
auto kind = tokens.GetKind(token); | ||
auto line = tokens.GetLineNumber(token); | ||
auto col = tokens.GetColumnNumber(token); | ||
|
||
llvm::errs() << "TokenIndex(kind: " << kind << ", loc: "; | ||
llvm::errs().write_escaped(tokens.source().filename()); | ||
llvm::errs() << ":" << line << ":" << col << ")"; | ||
} | ||
|
||
LLVM_DUMP_METHOD auto Dump(const TokenizedBuffer& tokens, TokenIndex token) | ||
-> void { | ||
DumpNoNewline(tokens, token); | ||
llvm::errs() << '\n'; | ||
} | ||
|
||
} // namespace Carbon::Lex | ||
|
||
#endif // NDEBUG |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,34 @@ | ||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM | ||
// Exceptions. See /LICENSE for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
|
||
// This library contains functions to assist dumping objects to stderr during | ||
// interactive debugging. Functions named `Dump` are intended for direct use by | ||
// developers, and should use overload resolution to determine which will be | ||
// invoked. The debugger should do namespace resolution automatically. For | ||
// example: | ||
// | ||
// - lldb: `expr Dump(tokens, id)` | ||
// - gdb: `call Dump(tokens, id)` | ||
// | ||
// The `DumpNoNewline` functions are helpers that exclude a trailing newline. | ||
// They're intended to be composed by `Dump` function implementations. | ||
|
||
#ifndef CARBON_TOOLCHAIN_LEX_DUMP_H_ | ||
#define CARBON_TOOLCHAIN_LEX_DUMP_H_ | ||
|
||
#ifndef NDEBUG | ||
|
||
#include "toolchain/lex/tokenized_buffer.h" | ||
|
||
namespace Carbon::Lex { | ||
|
||
auto DumpNoNewline(const TokenizedBuffer& tokens, TokenIndex token) -> void; | ||
|
||
auto Dump(const TokenizedBuffer& tokens, TokenIndex token) -> void; | ||
|
||
} // namespace Carbon::Lex | ||
|
||
#endif // NDEBUG | ||
|
||
#endif // CARBON_TOOLCHAIN_LEX_DUMP_H_ |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -88,6 +88,7 @@ cc_library( | |
], | ||
deps = [ | ||
":context", | ||
":dump", | ||
":node_kind", | ||
":state", | ||
":tree", | ||
|
@@ -102,6 +103,19 @@ cc_library( | |
], | ||
) | ||
|
||
cc_library( | ||
name = "dump", | ||
srcs = ["dump.cpp"], | ||
hdrs = ["dump.h"], | ||
deps = [ | ||
":tree", | ||
"//common:ostream", | ||
"//toolchain/lex:dump", | ||
], | ||
# Always link dump methods. | ||
alwayslink = 1, | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Comment why this is here? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Done |
||
) | ||
|
||
cc_library( | ||
name = "state", | ||
srcs = ["state.cpp"], | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,39 @@ | ||
// Part of the Carbon Language project, under the Apache License v2.0 with LLVM | ||
// Exceptions. See /LICENSE for license information. | ||
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | ||
|
||
#ifndef NDEBUG | ||
|
||
#include "toolchain/parse/dump.h" | ||
|
||
#include "common/ostream.h" | ||
#include "toolchain/lex/dump.h" | ||
|
||
namespace Carbon::Parse { | ||
|
||
auto DumpNoNewline(const Tree& tree, NodeId node_id) -> void { | ||
if (!node_id.is_valid()) { | ||
llvm::errs() << "NodeId(invalid)"; | ||
return; | ||
} | ||
|
||
auto kind = tree.node_kind(node_id); | ||
auto token = tree.node_token(node_id); | ||
|
||
llvm::errs() << "NodeId(kind: " << kind << ", token: "; | ||
Lex::DumpNoNewline(tree.tokens(), token); | ||
llvm::errs() << ")"; | ||
} | ||
|
||
LLVM_DUMP_METHOD auto Dump(const Tree& tree, Lex::TokenIndex token) -> void { | ||
Lex::Dump(tree.tokens(), token); | ||
} | ||
|
||
LLVM_DUMP_METHOD auto Dump(const Tree& tree, NodeId node_id) -> void { | ||
DumpNoNewline(tree, node_id); | ||
llvm::errs() << '\n'; | ||
} | ||
|
||
} // namespace Carbon::Parse | ||
|
||
#endif // NDEBUG |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Leave a comment why this is here?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Done