Skip to content

Commit 7d409dd

Browse files
committed
chore: Simplify APIs to resolve source locations
1 parent 59f860f commit 7d409dd

File tree

10 files changed

+87
-116
lines changed

10 files changed

+87
-116
lines changed

packages/cxx-gen-ast/src/gen_ast_encoder_cc.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -264,36 +264,34 @@ auto ASTEncoder::encodeSourceLocation(const SourceLocation& loc)
264264
return {};
265265
}
266266
267-
std::string_view fileName;
268-
std::uint32_t line = 0, column = 0;
269-
unit_->getTokenStartPosition(loc, &line, &column, &fileName);
267+
const auto start = unit_->tokenStartPosition(loc);
270268
271269
flatbuffers::Offset<io::SourceLine> sourceLineOffset;
272270
273-
auto key = std::tuple(fileName, line);
271+
auto key = std::tuple(start.fileName, start.line);
274272
275273
if (sourceLines_.contains(key)) {
276274
sourceLineOffset = sourceLines_.at(key).o;
277275
} else {
278276
flatbuffers::Offset<flatbuffers::String> fileNameOffset;
279277
280-
if (sourceFiles_.contains(fileName)) {
281-
fileNameOffset = sourceFiles_.at(fileName);
278+
if (sourceFiles_.contains(start.fileName)) {
279+
fileNameOffset = sourceFiles_.at(start.fileName);
282280
} else {
283-
fileNameOffset = fbb_.CreateString(fileName);
284-
sourceFiles_.emplace(fileName, fileNameOffset.o);
281+
fileNameOffset = fbb_.CreateString(start.fileName);
282+
sourceFiles_.emplace(start.fileName, fileNameOffset.o);
285283
}
286284
287285
io::SourceLineBuilder sourceLineBuilder{fbb_};
288286
sourceLineBuilder.add_file_name(fileNameOffset);
289-
sourceLineBuilder.add_line(line);
287+
sourceLineBuilder.add_line(start.line);
290288
sourceLineOffset = sourceLineBuilder.Finish();
291289
sourceLines_.emplace(std::move(key), sourceLineOffset.o);
292290
}
293291
294292
io::SourceLocationBuilder sourceLocationBuilder{fbb_};
295293
sourceLocationBuilder.add_source_line(sourceLineOffset);
296-
sourceLocationBuilder.add_column(column);
294+
sourceLocationBuilder.add_column(start.column);
297295
298296
auto offset = sourceLocationBuilder.Finish();
299297

src/frontend/cxx/cxx_document.cc

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -47,27 +47,17 @@ struct Diagnostics final : cxx::DiagnosticsClient {
4747
Vector<lsp::Diagnostic> diagnostics{messages};
4848

4949
void report(const cxx::Diagnostic& diag) override {
50-
std::string_view fileName;
51-
std::uint32_t line = 0;
52-
std::uint32_t column = 0;
53-
54-
preprocessor()->getTokenStartPosition(diag.token(), &line, &column,
55-
&fileName);
56-
57-
std::uint32_t endLine = 0;
58-
std::uint32_t endColumn = 0;
59-
60-
preprocessor()->getTokenEndPosition(diag.token(), &endLine, &endColumn,
61-
nullptr);
50+
auto start = preprocessor()->tokenStartPosition(diag.token());
51+
auto end = preprocessor()->tokenEndPosition(diag.token());
6252

6353
auto tmp = json::object();
6454

6555
auto d = diagnostics.emplace_back();
6656

67-
int s = std::max(int(line) - 1, 0);
68-
int sc = std::max(int(column) - 1, 0);
69-
int e = std::max(int(endLine) - 1, 0);
70-
int ec = std::max(int(endColumn) - 1, 0);
57+
int s = std::max(int(start.line) - 1, 0);
58+
int sc = std::max(int(start.column) - 1, 0);
59+
int e = std::max(int(end.line) - 1, 0);
60+
int ec = std::max(int(end.column) - 1, 0);
7161

7262
d.message(diag.message());
7363
d.range().start(lsp::Position(tmp).line(s).character(sc));

src/frontend/cxx/verify_diagnostics_client.cc

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020

2121
#include "verify_diagnostics_client.h"
2222

23+
#include <cxx/source_location.h>
24+
2325
namespace cxx {
2426

2527
auto VerifyDiagnosticsClient::verify() const -> bool { return verify_; }
@@ -46,11 +48,8 @@ void VerifyDiagnosticsClient::handleComment(Preprocessor* preprocessor,
4648
return;
4749
}
4850

49-
std::string_view fileName;
50-
unsigned line = 0;
51-
unsigned column = 0;
52-
53-
preprocessor->getTokenStartPosition(token, &line, &column, &fileName);
51+
const auto pos = preprocessor->tokenStartPosition(token);
52+
auto line = pos.line;
5453

5554
Severity severity = Severity::Error;
5655

@@ -67,7 +66,7 @@ void VerifyDiagnosticsClient::handleComment(Preprocessor* preprocessor,
6766
const auto& message = match[3];
6867

6968
expectedDiagnostics_.push_back(
70-
{token, severity, std::string(fileName), message, line});
69+
{token, severity, std::string(pos.fileName), message, line});
7170
}
7271

7372
auto VerifyDiagnosticsClient::hasErrors() const -> bool {
@@ -121,15 +120,11 @@ auto VerifyDiagnosticsClient::findDiagnostic(const ExpectedDiagnostic& expected)
121120
return false;
122121
}
123122

124-
unsigned line = 0;
125-
unsigned column = 0;
126-
std::string_view fileName;
127-
128-
preprocessor()->getTokenStartPosition(d.token(), &line, &column, &fileName);
123+
const auto pos = preprocessor()->tokenStartPosition(d.token());
129124

130-
if (line != expected.line) return false;
125+
if (pos.line != expected.line) return false;
131126

132-
if (fileName != expected.fileName) return false;
127+
if (pos.fileName != expected.fileName) return false;
133128

134129
if (d.message() != expected.message) return false;
135130

src/parser/cxx/diagnostics_client.cc

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
// cxx
2424
#include <cxx/preprocessor.h>
25+
#include <cxx/source_location.h>
2526

2627
#include <cctype>
2728
#include <cstdlib>
@@ -50,19 +51,15 @@ void DiagnosticsClient::report(const Diagnostic& diag) {
5051
break;
5152
} // switch
5253

53-
std::string_view fileName;
54-
std::uint32_t line = 0;
55-
std::uint32_t column = 0;
54+
const auto pos = preprocessor_->tokenStartPosition(diag.token());
5655

57-
preprocessor_->getTokenStartPosition(diag.token(), &line, &column, &fileName);
58-
59-
if (!fileName.empty()) {
60-
std::cerr << std::format("{}:{}:{}: {}\n", fileName, line, column,
61-
diag.message());
56+
if (!pos.fileName.empty()) {
57+
std::cerr << std::format("{}:{}:{}: {}\n", pos.fileName, pos.line,
58+
pos.column, diag.message());
6259

6360
const auto textLine = preprocessor_->getTextLine(diag.token());
6461

65-
const auto end = std::max(0, static_cast<int>(column) - 1);
62+
const auto end = std::max(0, static_cast<int>(pos.column) - 1);
6663

6764
std::string indent{textLine.substr(0, end)};
6865

src/parser/cxx/flatbuffers/ast_encoder.cc

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,36 +90,34 @@ auto ASTEncoder::encodeSourceLocation(const SourceLocation& loc)
9090
return {};
9191
}
9292

93-
std::string_view fileName;
94-
std::uint32_t line = 0, column = 0;
95-
unit_->getTokenStartPosition(loc, &line, &column, &fileName);
93+
const auto start = unit_->tokenStartPosition(loc);
9694

9795
flatbuffers::Offset<io::SourceLine> sourceLineOffset;
9896

99-
auto key = std::tuple(fileName, line);
97+
auto key = std::tuple(start.fileName, start.line);
10098

10199
if (sourceLines_.contains(key)) {
102100
sourceLineOffset = sourceLines_.at(key).o;
103101
} else {
104102
flatbuffers::Offset<flatbuffers::String> fileNameOffset;
105103

106-
if (sourceFiles_.contains(fileName)) {
107-
fileNameOffset = sourceFiles_.at(fileName);
104+
if (sourceFiles_.contains(start.fileName)) {
105+
fileNameOffset = sourceFiles_.at(start.fileName);
108106
} else {
109-
fileNameOffset = fbb_.CreateString(fileName);
110-
sourceFiles_.emplace(fileName, fileNameOffset.o);
107+
fileNameOffset = fbb_.CreateString(start.fileName);
108+
sourceFiles_.emplace(start.fileName, fileNameOffset.o);
111109
}
112110

113111
io::SourceLineBuilder sourceLineBuilder{fbb_};
114112
sourceLineBuilder.add_file_name(fileNameOffset);
115-
sourceLineBuilder.add_line(line);
113+
sourceLineBuilder.add_line(start.line);
116114
sourceLineOffset = sourceLineBuilder.Finish();
117115
sourceLines_.emplace(std::move(key), sourceLineOffset.o);
118116
}
119117

120118
io::SourceLocationBuilder sourceLocationBuilder{fbb_};
121119
sourceLocationBuilder.add_source_line(sourceLineOffset);
122-
sourceLocationBuilder.add_column(column);
120+
sourceLocationBuilder.add_column(start.column);
123121

124122
auto offset = sourceLocationBuilder.Finish();
125123

src/parser/cxx/preprocessor.cc

Lines changed: 27 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,11 +1313,9 @@ void Preprocessor::Private::initialize() {
13131313
"__LINE__",
13141314
[this](const MacroExpansionContext &context) -> const TokList * {
13151315
auto ts = context.ts;
1316-
unsigned line = 0;
1317-
preprocessor_->getTokenStartPosition(ts->tok->token(), &line, nullptr,
1318-
nullptr);
1319-
auto tk =
1320-
gen(TokenKind::T_INTEGER_LITERAL, string(std::to_string(line)));
1316+
const auto start = preprocessor_->tokenStartPosition(ts->tok->token());
1317+
auto tk = gen(TokenKind::T_INTEGER_LITERAL,
1318+
string(std::to_string(start.line)));
13211319
tk->sourceFile = ts->tok->sourceFile;
13221320
tk->space = true;
13231321
return cons(tk, ts->next);
@@ -2936,15 +2934,8 @@ void Preprocessor::getPreprocessedText(const std::vector<Token> &tokens,
29362934
if (lastFileId != std::numeric_limits<std::uint32_t>::max()) {
29372935
out << '\n';
29382936
}
2939-
const auto &sourceFile = *d->sourceFiles_[fileId - 1];
2940-
std::uint32_t line = 0, column = 0;
2941-
getTokenStartPosition(token, &line, &column, nullptr);
2942-
#if true
2943-
out << std::format("# {} \"{}\"\n", line, sourceFile.fileName);
2944-
#else
2945-
out << std::format("# {} \"{}:{}:{}\"\n", line, sourceFile.fileName, line,
2946-
column);
2947-
#endif
2937+
const auto pos = tokenStartPosition(token);
2938+
out << std::format("# {} \"{}\"\n", pos.line, pos.fileName);
29482939
lastFileId = fileId;
29492940
atStartOfLine = true;
29502941
} else if (token.startOfLine()) {
@@ -2968,10 +2959,9 @@ void Preprocessor::getPreprocessedText(const std::vector<Token> &tokens,
29682959
}
29692960

29702961
if (atStartOfLine) {
2971-
std::uint32_t line = 0, column = 0;
2972-
getTokenStartPosition(token, &line, &column, nullptr);
2973-
if (column > 0) {
2974-
for (std::uint32_t i = 0; i < column - 1; ++i) {
2962+
const auto pos = tokenStartPosition(token);
2963+
if (pos.column > 0) {
2964+
for (std::uint32_t i = 0; i < pos.column - 1; ++i) {
29752965
out << ' ';
29762966
}
29772967
}
@@ -3059,44 +3049,42 @@ void Preprocessor::printMacros(std::ostream &out) const {
30593049
}
30603050
}
30613051

3062-
void Preprocessor::getTokenStartPosition(const Token &token, unsigned *line,
3063-
unsigned *column,
3064-
std::string_view *fileName) const {
3052+
auto Preprocessor::tokenStartPosition(const Token &token) const
3053+
-> SourcePosition {
30653054
if (token.fileId() == 0) {
3066-
if (line) *line = 0;
3067-
if (column) *column = 0;
3068-
if (fileName) *fileName = std::string_view();
3069-
return;
3055+
return {};
30703056
}
30713057

30723058
auto &sourceFile = *d->sourceFiles_[token.fileId() - 1];
3073-
sourceFile.getTokenStartPosition(token.offset(), line, column, fileName);
3059+
SourcePosition pos;
3060+
sourceFile.getTokenStartPosition(token.offset(), &pos.line, &pos.column,
3061+
&pos.fileName);
3062+
return pos;
30743063
}
30753064

3076-
void Preprocessor::getTokenEndPosition(const Token &token, unsigned *line,
3077-
unsigned *column,
3078-
std::string_view *fileName) const {
3065+
auto Preprocessor::tokenEndPosition(const Token &token) const
3066+
-> SourcePosition {
30793067
if (token.fileId() == 0) {
3080-
if (line) *line = 0;
3081-
if (column) *column = 0;
3082-
if (fileName) *fileName = std::string_view();
3083-
return;
3068+
return {};
30843069
}
30853070

30863071
auto &sourceFile = *d->sourceFiles_[token.fileId() - 1];
3087-
sourceFile.getTokenStartPosition(token.offset() + token.length(), line,
3088-
column, fileName);
3072+
3073+
SourcePosition pos;
3074+
sourceFile.getTokenStartPosition(token.offset() + token.length(), &pos.line,
3075+
&pos.column, &pos.fileName);
3076+
return pos;
30893077
}
30903078

30913079
auto Preprocessor::getTextLine(const Token &token) const -> std::string_view {
30923080
if (token.fileId() == 0) return {};
30933081
const SourceFile *file = d->sourceFiles_[token.fileId() - 1].get();
3094-
unsigned line = 0;
3095-
getTokenStartPosition(token, &line, nullptr, nullptr);
3082+
const auto pos = tokenStartPosition(token);
30963083
std::string_view source = file->source;
30973084
const auto &lines = file->lines;
3098-
const auto start = lines.at(line - 1);
3099-
const auto end = line < lines.size() ? lines.at(line) : source.length();
3085+
const auto start = lines.at(pos.line - 1);
3086+
const auto end =
3087+
pos.line < lines.size() ? lines.at(pos.line) : source.length();
31003088
auto textLine = source.substr(start, end - start);
31013089
while (!textLine.empty()) {
31023090
auto ch = textLine.back();

src/parser/cxx/preprocessor.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ class DiagnosticsClient;
3737
class CommentHandler;
3838
class Preprocessor;
3939
class PreprocessorDelegate;
40+
class SourcePosition;
4041

4142
class CommentHandler {
4243
public:
@@ -135,12 +136,11 @@ class Preprocessor {
135136

136137
void printMacros(std::ostream &out) const;
137138

138-
void getTokenStartPosition(const Token &token, unsigned *line,
139-
unsigned *column,
140-
std::string_view *fileName) const;
139+
[[nodiscard]] auto tokenStartPosition(const Token &token) const
140+
-> SourcePosition;
141141

142-
void getTokenEndPosition(const Token &token, unsigned *line, unsigned *column,
143-
std::string_view *fileName) const;
142+
[[nodiscard]] auto tokenEndPosition(const Token &token) const
143+
-> SourcePosition;
144144

145145
[[nodiscard]] auto getTextLine(const Token &token) const -> std::string_view;
146146

src/parser/cxx/source_location.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020

2121
#pragma once
2222

23+
#include <cstdint>
2324
#include <functional>
25+
#include <string_view>
2426
#include <tuple>
2527

2628
namespace cxx {
@@ -71,6 +73,13 @@ class SourceLocation {
7173
}
7274
};
7375

76+
class SourcePosition {
77+
public:
78+
std::string_view fileName;
79+
std::uint32_t line = 0;
80+
std::uint32_t column = 0;
81+
};
82+
7483
} // namespace cxx
7584

7685
template <>

src/parser/cxx/translation_unit.cc

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -108,16 +108,14 @@ auto TranslationUnit::tokenText(SourceLocation loc) const
108108
} // switch
109109
}
110110

111-
void TranslationUnit::getTokenStartPosition(SourceLocation loc, unsigned* line,
112-
unsigned* column,
113-
std::string_view* fileName) const {
114-
preprocessor_->getTokenStartPosition(tokenAt(loc), line, column, fileName);
111+
auto TranslationUnit::tokenStartPosition(SourceLocation loc) const
112+
-> SourcePosition {
113+
return preprocessor_->tokenStartPosition(tokenAt(loc));
115114
}
116115

117-
void TranslationUnit::getTokenEndPosition(SourceLocation loc, unsigned* line,
118-
unsigned* column,
119-
std::string_view* fileName) const {
120-
preprocessor_->getTokenEndPosition(tokenAt(loc), line, column, fileName);
116+
auto TranslationUnit::tokenEndPosition(SourceLocation loc) const
117+
-> SourcePosition {
118+
return preprocessor_->tokenEndPosition(tokenAt(loc));
121119
}
122120

123121
void TranslationUnit::parse(const ParserConfiguration& config) {

0 commit comments

Comments
 (0)