@@ -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
30913079auto 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 ();
0 commit comments