From 62af7c4bdffa993292bee8dcf5f68330686a5af5 Mon Sep 17 00:00:00 2001 From: Ali Mohammad Pur Date: Thu, 6 May 2021 16:58:44 +0430 Subject: [PATCH] AK+LibCpp: Remove DEBUG_SPAM in favour of per-application defines What happens if one file defines DEBUG_SPAM, and another doesn't, then we link them together and get ODR violations? -- @ADKaster --- AK/ScopeLogger.h | 14 +++++-- Meta/CMake/all_the_debug_macros.cmake | 1 - Userland/Libraries/LibCpp/Parser.cpp | 54 +++++++++++++-------------- 3 files changed, 35 insertions(+), 34 deletions(-) diff --git a/AK/ScopeLogger.h b/AK/ScopeLogger.h index d077f9dd1d..297cc4c8c4 100644 --- a/AK/ScopeLogger.h +++ b/AK/ScopeLogger.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2020, Denis Campredon + * Copyright (c) 2021, the SerenityOS developers. * * SPDX-License-Identifier: BSD-2-Clause */ @@ -10,9 +11,9 @@ #include namespace AK { +template class ScopeLogger { public: -#ifdef DEBUG_SPAM ScopeLogger(StringView extra, const SourceLocation& location = SourceLocation::current()) : m_location(location) , m_extra(extra) @@ -49,10 +50,15 @@ private: static inline size_t m_depth = 0; SourceLocation m_location; StringView m_extra; -#else - ScopeLogger() = default; -#endif }; + +template<> +class ScopeLogger { +public: + template + ScopeLogger(Args...) { } +}; + } using AK::ScopeLogger; diff --git a/Meta/CMake/all_the_debug_macros.cmake b/Meta/CMake/all_the_debug_macros.cmake index 8db57c43e3..8d61e0f65d 100644 --- a/Meta/CMake/all_the_debug_macros.cmake +++ b/Meta/CMake/all_the_debug_macros.cmake @@ -167,7 +167,6 @@ set(VOLATILE_PAGE_RANGES_DEBUG ON) set(WSMESSAGELOOP_DEBUG ON) set(GPT_DEBUG ON) set(CPP_DEBUG ON) -set(DEBUG_SPAM ON) set(DEBUG_CPP_LANGUAGE_SERVER ON) set(DEBUG_AUTOCOMPLETE ON) set(FILE_WATCHER_DEBUG ON) diff --git a/Userland/Libraries/LibCpp/Parser.cpp b/Userland/Libraries/LibCpp/Parser.cpp index 5f055a2e32..ff6f72263e 100644 --- a/Userland/Libraries/LibCpp/Parser.cpp +++ b/Userland/Libraries/LibCpp/Parser.cpp @@ -4,10 +4,6 @@ * SPDX-License-Identifier: BSD-2-Clause */ -#ifdef CPP_DEBUG -# define DEBUG_SPAM -#endif - #include "Parser.h" #include "AST.h" #include @@ -54,7 +50,7 @@ void Parser::initialize_program_tokens(const StringView& program) NonnullRefPtr Parser::parse() { - ScopeLogger logger {}; + ScopeLogger logger; if (m_tokens.is_empty()) return create_root_ast_node({}, {}); auto unit = create_root_ast_node(m_tokens.first().start(), m_tokens.last().end()); @@ -156,7 +152,7 @@ NonnullRefPtr Parser::parse_function_declaration(ASTNode& p NonnullRefPtr Parser::parse_function_definition(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; auto func = create_ast_node(parent, position(), {}); consume(Token::Type::LeftCurly); while (!eof() && peek().type() != Token::Type::RightCurly) { @@ -170,7 +166,7 @@ NonnullRefPtr Parser::parse_function_definition(ASTNode& par NonnullRefPtr Parser::parse_statement(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; ArmedScopeGuard consume_semicolon([this]() { consume(Token::Type::Semicolon); }); @@ -222,7 +218,7 @@ bool Parser::match_block_statement() NonnullRefPtr Parser::parse_block_statement(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; auto block_statement = create_ast_node(parent, position(), {}); consume(Token::Type::LeftCurly); while (!eof() && peek().type() != Token::Type::RightCurly) { @@ -269,7 +265,7 @@ bool Parser::match_template_arguments() NonnullRefPtrVector Parser::parse_template_arguments(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; consume(Token::Type::Less); @@ -285,7 +281,7 @@ NonnullRefPtrVector Parser::parse_template_arguments(ASTNode& parent) bool Parser::match_variable_declaration() { - ScopeLogger logger {}; + ScopeLogger logger; save_state(); ScopeGuard state_guard = [this] { load_state(); }; @@ -316,7 +312,7 @@ bool Parser::match_variable_declaration() NonnullRefPtr Parser::parse_variable_declaration(ASTNode& parent, bool expect_semicolon) { - ScopeLogger logger {}; + ScopeLogger logger; auto var = create_ast_node(parent, position(), {}); if (!match_variable_declaration()) { error("unexpected token for variable type"); @@ -344,7 +340,7 @@ NonnullRefPtr Parser::parse_variable_declaration(ASTNode& p NonnullRefPtr Parser::parse_expression(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; auto expression = parse_primary_expression(parent); // TODO: remove eof() logic, should still work without it if (eof() || match(Token::Type::Semicolon)) { @@ -406,7 +402,7 @@ bool Parser::match_secondary_expression() NonnullRefPtr Parser::parse_primary_expression(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; // TODO: remove eof() logic, should still work without it if (eof()) { auto node = create_ast_node(parent, position(), position()); @@ -536,7 +532,7 @@ NonnullRefPtr Parser::parse_literal(ASTNode& parent) NonnullRefPtr Parser::parse_secondary_expression(ASTNode& parent, NonnullRefPtr lhs) { - ScopeLogger logger {}; + ScopeLogger logger; switch (peek().type()) { case Token::Type::Plus: return parse_binary_expression(parent, lhs, BinaryOp::Addition); @@ -689,7 +685,7 @@ bool Parser::match_function_declaration() Optional> Parser::parse_parameter_list(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; NonnullRefPtrVector parameters; while (peek().type() != Token::Type::RightParen && !eof()) { if (match_ellipsis()) { @@ -739,7 +735,7 @@ bool Parser::match_preprocessor() void Parser::consume_preprocessor() { - ScopeLogger logger {}; + ScopeLogger logger; switch (peek().type()) { case Token::Type::PreprocessorStatement: consume(); @@ -756,7 +752,7 @@ void Parser::consume_preprocessor() Optional Parser::consume_whitespace() { - ScopeLogger logger {}; + ScopeLogger logger; return consume(Token::Type::Whitespace); } @@ -832,7 +828,7 @@ String Parser::text_in_range(Position start, Position end) const void Parser::error(StringView message) { - ScopeLogger logger {}; + ScopeLogger logger; if (message.is_null() || message.is_empty()) message = ""; String formatted_message; @@ -937,7 +933,7 @@ void Parser::print_tokens() const NonnullRefPtr Parser::parse_string_literal(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; Optional start_token_index; Optional end_token_index; while (!eof()) { @@ -971,7 +967,7 @@ NonnullRefPtr Parser::parse_string_literal(ASTNode& parent) NonnullRefPtr Parser::parse_return_statement(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; auto return_statement = create_ast_node(parent, position(), {}); consume(Token::Type::Keyword); if (!peek(Token::Type::Semicolon).has_value()) { @@ -984,7 +980,7 @@ NonnullRefPtr Parser::parse_return_statement(ASTNode& parent) NonnullRefPtr Parser::parse_enum_declaration(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; auto enum_decl = create_ast_node(parent, position(), {}); consume_keyword("enum"); auto name_token = consume(Token::Type::Identifier); @@ -1031,7 +1027,7 @@ bool Parser::match_keyword(const String& keyword) NonnullRefPtr Parser::parse_struct_or_class_declaration(ASTNode& parent, StructOrClassDeclaration::Type type) { - ScopeLogger logger {}; + ScopeLogger logger; auto decl = create_ast_node(parent, position(), {}, type); switch (type) { case StructOrClassDeclaration::Type::Struct: @@ -1058,7 +1054,7 @@ NonnullRefPtr Parser::parse_struct_or_class_declaratio NonnullRefPtr Parser::parse_member_declaration(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; auto member_decl = create_ast_node(parent, position(), {}); member_decl->m_type = parse_type(*member_decl); @@ -1077,7 +1073,7 @@ NonnullRefPtr Parser::parse_member_declaration(ASTNode& paren NonnullRefPtr Parser::parse_boolean_literal(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; auto token = consume(Token::Type::Keyword); auto text = text_of_token(token); // text == "true" || text == "false"; @@ -1096,7 +1092,7 @@ bool Parser::match_boolean_literal() NonnullRefPtr Parser::parse_type(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; if (!match_type()) { auto token = consume(); @@ -1134,7 +1130,7 @@ NonnullRefPtr Parser::parse_type(ASTNode& parent) NonnullRefPtr Parser::parse_for_statement(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; auto for_statement = create_ast_node(parent, position(), {}); consume(Token::Type::Keyword); consume(Token::Type::LeftParen); @@ -1158,7 +1154,7 @@ NonnullRefPtr Parser::parse_for_statement(ASTNode& parent) NonnullRefPtr Parser::parse_if_statement(ASTNode& parent) { - ScopeLogger logger {}; + ScopeLogger logger; auto if_statement = create_ast_node(parent, position(), {}); consume(Token::Type::Keyword); consume(Token::Type::LeftParen); @@ -1176,7 +1172,7 @@ NonnullRefPtr Parser::parse_if_statement(ASTNode& parent) } Vector Parser::parse_type_qualifiers() { - ScopeLogger logger {}; + ScopeLogger logger; Vector qualifiers; while (!eof()) { auto token = peek(); @@ -1195,7 +1191,7 @@ Vector Parser::parse_type_qualifiers() Vector Parser::parse_function_qualifiers() { - ScopeLogger logger {}; + ScopeLogger logger; Vector qualifiers; while (!eof()) { auto token = peek();