From e6a3a87e05e4f44371201d3f8737f8b7d83a8389 Mon Sep 17 00:00:00 2001 From: Roberto Raggi Date: Wed, 19 Feb 2025 19:55:48 +0100 Subject: [PATCH] Regenerate the AST rewriter Signed-off-by: Roberto Raggi --- .../cxx-gen-ast/src/new_ast_rewriter_cc.ts | 46 +- .../cxx-gen-ast/src/new_ast_rewriter_h.ts | 22 +- src/lsp/CMakeLists.txt | 10 +- src/parser/CMakeLists.txt | 50 +- src/parser/cxx/ast_rewriter.cc | 997 ++++++++++++++---- src/parser/cxx/ast_rewriter.h | 664 +----------- src/parser/cxx/type_checker.cc | 223 ++++ src/parser/cxx/type_checker.h | 44 + 8 files changed, 1210 insertions(+), 846 deletions(-) create mode 100644 src/parser/cxx/type_checker.cc create mode 100644 src/parser/cxx/type_checker.h diff --git a/packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts b/packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts index 1aad819c..69420d99 100644 --- a/packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts +++ b/packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts @@ -55,6 +55,24 @@ export function new_ast_rewriter_cc({ return name; }; + by_base.forEach((nodes, base) => { + if (!Array.isArray(nodes)) throw new Error("not an array"); + if (base === "AST") return; + const className = chopAST(base); + emit(); + emit(` struct ASTRewriter::${className}Visitor {`); + emit(` ${opName}& rewrite;`); + emit(); + emit( + ` [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); }` + ); + nodes.forEach(({ name }) => { + emit(); + emit(` [[nodiscard]] auto operator()(${name}* ast) -> ${base}*;`); + }); + emit(` };`); + }); + const emitRewriterBody = (members: Member[], visitor: string = "rewrite") => { members.forEach((m) => { switch (m.kind) { @@ -100,11 +118,20 @@ export function new_ast_rewriter_cc({ by_base.forEach((nodes, base) => { if (base === "AST") return; emit(); - emit(`auto ${opName}::operator()(${base}* ast) -> ${base}* {`); - emit(` if (ast)`); - emit(` return visit(${chopAST(base)}Visitor{*this}, ast);`); - emit(` return {};`); - emit(`}`); + if (base == "ExpressionAST") { + emit(`auto ${opName}::operator()(${base}* ast) -> ${base}* {`); + emit(` if (!ast) return {};`); + emit(` auto expr = visit(${chopAST(base)}Visitor{*this}, ast);`); + emit(` if (expr) typeChecker_->check(expr);`); + emit(` return expr;`); + emit(`}`); + } else { + emit(`auto ${opName}::operator()(${base}* ast) -> ${base}* {`); + emit(` if (ast)`); + emit(` return visit(${chopAST(base)}Visitor{*this}, ast);`); + emit(` return {};`); + emit(`}`); + } }); by_base.get("AST")?.forEach(({ name, members }) => { emit(); @@ -146,12 +173,17 @@ export function new_ast_rewriter_cc({ // cxx #include -#include #include +#include +#include namespace cxx { -${opName}::${opName}(TranslationUnit* unit) : unit_(unit) {} +${opName}::${opName}(TypeChecker* typeChcker, + const std::vector& templateArguments) +: typeChecker_(typeChcker) +, unit_(typeChcker->translationUnit()) +, templateArguments_(templateArguments) {} ${opName}::~${opName}() {} diff --git a/packages/cxx-gen-ast/src/new_ast_rewriter_h.ts b/packages/cxx-gen-ast/src/new_ast_rewriter_h.ts index 6bfab8e7..f31792ce 100644 --- a/packages/cxx-gen-ast/src/new_ast_rewriter_h.ts +++ b/packages/cxx-gen-ast/src/new_ast_rewriter_h.ts @@ -61,18 +61,7 @@ export function new_ast_rewriter_h({ if (!Array.isArray(nodes)) throw new Error("not an array"); if (base === "AST") return; const className = chopAST(base); - emit(); - emit(` struct ${className}Visitor {`); - emit(` ${opName}& rewrite;`); - emit(); - emit( - ` [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); }`, - ); - nodes.forEach(({ name }) => { - emit(); - emit(` [[nodiscard]] auto operator()(${name}* ast) -> ${base}*;`); - }); - emit(` };`); + emit(` struct ${className}Visitor;`); }); const out = `${cpy_header} @@ -80,16 +69,20 @@ export function new_ast_rewriter_h({ #pragma once #include +#include + +#include namespace cxx { class TranslationUnit; +class TypeChecker; class Control; class Arena; class ${opName} { public: - explicit ${opName}(TranslationUnit* unit); + explicit ${opName}(TypeChecker* typeChecker, const std::vector& templateArguments); ~${opName}(); [[nodiscard]] auto translationUnit() const -> TranslationUnit* { return unit_; } @@ -99,6 +92,9 @@ public: ${code.join("\n")} +private: + TypeChecker* typeChecker_ = nullptr; + const std::vector& templateArguments_; TranslationUnit* unit_ = nullptr; }; diff --git a/src/lsp/CMakeLists.txt b/src/lsp/CMakeLists.txt index c4afba1f..5fd3609a 100644 --- a/src/lsp/CMakeLists.txt +++ b/src/lsp/CMakeLists.txt @@ -19,10 +19,14 @@ file(GLOB CXX_LSP_INCLUDE_HEADER_FILES cxx/lsp/*.h) -aux_source_directory(cxx/lsp LSP_SOURCES) - add_library(cxx-lsp - ${LSP_SOURCES} + cxx/lsp/cxx_document.cc + cxx/lsp/enums.cc + cxx/lsp/lsp.cc + cxx/lsp/lsp_server.cc + cxx/lsp/requests.cc + cxx/lsp/sync_queue.cc + cxx/lsp/types.cc ${CXX_LSP_INCLUDE_HEADER_FILES} ) diff --git a/src/parser/CMakeLists.txt b/src/parser/CMakeLists.txt index e5462c86..d59c9962 100644 --- a/src/parser/CMakeLists.txt +++ b/src/parser/CMakeLists.txt @@ -20,9 +20,49 @@ file(GLOB CXX_INCLUDE_HEADER_FILES cxx/*.h) file(GLOB CXX_VIEWS_INCLUDE_HEADER_FILES cxx/views/*.h) -aux_source_directory(cxx SOURCES) +add_library(cxx-parser + cxx/ast.cc + cxx/ast_cursor.cc + cxx/ast_interpreter.cc + cxx/ast_rewriter.cc + cxx/ast_slot.cc + cxx/base_classes.cc + cxx/cli.cc + cxx/const_expression_evaluator.cc + cxx/const_value.cc + cxx/control.cc + cxx/cxx.cc + cxx/diagnostic.cc + cxx/diagnostics_client.cc + cxx/external_name_encoder.cc + cxx/gcc_linux_toolchain.cc + cxx/lexer.cc + cxx/literals.cc + cxx/macos_toolchain.cc + cxx/memory_layout.cc + cxx/name_lookup.cc + cxx/name_printer.cc + cxx/names.cc + cxx/parser.cc + cxx/path.cc + cxx/preprocessor.cc + cxx/scope.cc + cxx/source_location.cc + cxx/symbol_chain_view.cc + cxx/symbol_instantiation.cc + cxx/symbol_printer.cc + cxx/symbols.cc + cxx/token.cc + cxx/toolchain.cc + cxx/translation_unit.cc + cxx/type_checker.cc + cxx/type_printer.cc + cxx/type_traits.cc + cxx/types.cc + cxx/util.cc + cxx/wasm32_wasi_toolchain.cc + cxx/windows_toolchain.cc -add_library(cxx-parser ${SOURCES} # generated files keywords-priv.h pp_keywords-priv.h @@ -63,8 +103,10 @@ add_custom_command(OUTPUT pp_keywords-priv.h COMMENT "Generate pp_keywords-priv.h") if (CXX_ENABLE_FLATBUFFERS) - aux_source_directory(cxx/flatbuffers FLATBUFFERS_SOURCES) - target_sources(cxx-parser PRIVATE ${FLATBUFFERS_SOURCES}) + target_sources(cxx-parser PRIVATE + cxx/flatbuffers/ast_decoder.cc + cxx/flatbuffers/ast_encoder.cc + ) # generate flatbuffers decoder for ast.fbs flatbuffers_generate_headers( diff --git a/src/parser/cxx/ast_rewriter.cc b/src/parser/cxx/ast_rewriter.cc index deff369d..37361458 100644 --- a/src/parser/cxx/ast_rewriter.cc +++ b/src/parser/cxx/ast_rewriter.cc @@ -24,10 +24,15 @@ #include #include #include +#include namespace cxx { -ASTRewriter::ASTRewriter(TranslationUnit* unit) : unit_(unit) {} +ASTRewriter::ASTRewriter(TypeChecker* typeChcker, + const std::vector& templateArguments) + : typeChecker_(typeChcker), + unit_(typeChcker->translationUnit()), + templateArguments_(templateArguments) {} ASTRewriter::~ASTRewriter() {} @@ -35,6 +40,609 @@ auto ASTRewriter::control() const -> Control* { return unit_->control(); } auto ASTRewriter::arena() const -> Arena* { return unit_->arena(); } +struct ASTRewriter::UnitVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(TranslationUnitAST* ast) -> UnitAST*; + + [[nodiscard]] auto operator()(ModuleUnitAST* ast) -> UnitAST*; +}; + +struct ASTRewriter::DeclarationVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(SimpleDeclarationAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(AsmDeclarationAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(NamespaceAliasDefinitionAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(UsingDeclarationAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(UsingEnumDeclarationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(UsingDirectiveAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(StaticAssertDeclarationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(AliasDeclarationAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(OpaqueEnumDeclarationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(FunctionDefinitionAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(TemplateDeclarationAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(ConceptDefinitionAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(DeductionGuideAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(ExplicitInstantiationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(ExportDeclarationAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(ExportCompoundDeclarationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(LinkageSpecificationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(NamespaceDefinitionAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(EmptyDeclarationAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(AttributeDeclarationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(ModuleImportDeclarationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(ParameterDeclarationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(AccessDeclarationAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(ForRangeDeclarationAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(StructuredBindingDeclarationAST* ast) + -> DeclarationAST*; + + [[nodiscard]] auto operator()(AsmOperandAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(AsmQualifierAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(AsmClobberAST* ast) -> DeclarationAST*; + + [[nodiscard]] auto operator()(AsmGotoLabelAST* ast) -> DeclarationAST*; +}; + +struct ASTRewriter::StatementVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(LabeledStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(CaseStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(DefaultStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(ExpressionStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(CompoundStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(IfStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(ConstevalIfStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(SwitchStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(WhileStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(DoStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(ForRangeStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(ForStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(BreakStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(ContinueStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(ReturnStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(CoroutineReturnStatementAST* ast) + -> StatementAST*; + + [[nodiscard]] auto operator()(GotoStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(DeclarationStatementAST* ast) -> StatementAST*; + + [[nodiscard]] auto operator()(TryBlockStatementAST* ast) -> StatementAST*; +}; + +struct ASTRewriter::ExpressionVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(GeneratedLiteralExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(CharLiteralExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(BoolLiteralExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(IntLiteralExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(FloatLiteralExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(NullptrLiteralExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(StringLiteralExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(UserDefinedStringLiteralExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(ThisExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(NestedStatementExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(NestedExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(IdExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(LambdaExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(FoldExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(RightFoldExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(LeftFoldExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(RequiresExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(VaArgExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(SubscriptExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(CallExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(TypeConstructionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(BracedTypeConstructionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(SpliceMemberExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(MemberExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(PostIncrExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(CppCastExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(BuiltinBitCastExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(BuiltinOffsetofExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(TypeidExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(TypeidOfTypeExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(SpliceExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(GlobalScopeReflectExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(NamespaceReflectExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(TypeIdReflectExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(ReflectExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(UnaryExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(AwaitExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(SizeofExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(SizeofTypeExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(SizeofPackExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(AlignofTypeExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(AlignofExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(NoexceptExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(NewExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(DeleteExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(CastExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(ImplicitCastExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(BinaryExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(ConditionalExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(YieldExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(ThrowExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(AssignmentExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(PackExpansionExpressionAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(DesignatedInitializerClauseAST* ast) + -> ExpressionAST*; + + [[nodiscard]] auto operator()(TypeTraitExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(ConditionExpressionAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(EqualInitializerAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(BracedInitListAST* ast) -> ExpressionAST*; + + [[nodiscard]] auto operator()(ParenInitializerAST* ast) -> ExpressionAST*; +}; + +struct ASTRewriter::TemplateParameterVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(TemplateTypeParameterAST* ast) + -> TemplateParameterAST*; + + [[nodiscard]] auto operator()(NonTypeTemplateParameterAST* ast) + -> TemplateParameterAST*; + + [[nodiscard]] auto operator()(TypenameTypeParameterAST* ast) + -> TemplateParameterAST*; + + [[nodiscard]] auto operator()(ConstraintTypeParameterAST* ast) + -> TemplateParameterAST*; +}; + +struct ASTRewriter::SpecifierVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(GeneratedTypeSpecifierAST* ast) + -> SpecifierAST*; + + [[nodiscard]] auto operator()(TypedefSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(FriendSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(ConstevalSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(ConstinitSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(ConstexprSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(InlineSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(StaticSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(ExternSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(ThreadLocalSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(ThreadSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(MutableSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(VirtualSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(ExplicitSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(AutoTypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(VoidTypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(SizeTypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(SignTypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(VaListTypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(IntegralTypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(FloatingPointTypeSpecifierAST* ast) + -> SpecifierAST*; + + [[nodiscard]] auto operator()(ComplexTypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(NamedTypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(AtomicTypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(UnderlyingTypeSpecifierAST* ast) + -> SpecifierAST*; + + [[nodiscard]] auto operator()(ElaboratedTypeSpecifierAST* ast) + -> SpecifierAST*; + + [[nodiscard]] auto operator()(DecltypeAutoSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(DecltypeSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(PlaceholderTypeSpecifierAST* ast) + -> SpecifierAST*; + + [[nodiscard]] auto operator()(ConstQualifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(VolatileQualifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(RestrictQualifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(EnumSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(ClassSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(TypenameSpecifierAST* ast) -> SpecifierAST*; + + [[nodiscard]] auto operator()(SplicerTypeSpecifierAST* ast) -> SpecifierAST*; +}; + +struct ASTRewriter::PtrOperatorVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(PointerOperatorAST* ast) -> PtrOperatorAST*; + + [[nodiscard]] auto operator()(ReferenceOperatorAST* ast) -> PtrOperatorAST*; + + [[nodiscard]] auto operator()(PtrToMemberOperatorAST* ast) -> PtrOperatorAST*; +}; + +struct ASTRewriter::CoreDeclaratorVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(BitfieldDeclaratorAST* ast) + -> CoreDeclaratorAST*; + + [[nodiscard]] auto operator()(ParameterPackAST* ast) -> CoreDeclaratorAST*; + + [[nodiscard]] auto operator()(IdDeclaratorAST* ast) -> CoreDeclaratorAST*; + + [[nodiscard]] auto operator()(NestedDeclaratorAST* ast) -> CoreDeclaratorAST*; +}; + +struct ASTRewriter::DeclaratorChunkVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(FunctionDeclaratorChunkAST* ast) + -> DeclaratorChunkAST*; + + [[nodiscard]] auto operator()(ArrayDeclaratorChunkAST* ast) + -> DeclaratorChunkAST*; +}; + +struct ASTRewriter::UnqualifiedIdVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(NameIdAST* ast) -> UnqualifiedIdAST*; + + [[nodiscard]] auto operator()(DestructorIdAST* ast) -> UnqualifiedIdAST*; + + [[nodiscard]] auto operator()(DecltypeIdAST* ast) -> UnqualifiedIdAST*; + + [[nodiscard]] auto operator()(OperatorFunctionIdAST* ast) + -> UnqualifiedIdAST*; + + [[nodiscard]] auto operator()(LiteralOperatorIdAST* ast) -> UnqualifiedIdAST*; + + [[nodiscard]] auto operator()(ConversionFunctionIdAST* ast) + -> UnqualifiedIdAST*; + + [[nodiscard]] auto operator()(SimpleTemplateIdAST* ast) -> UnqualifiedIdAST*; + + [[nodiscard]] auto operator()(LiteralOperatorTemplateIdAST* ast) + -> UnqualifiedIdAST*; + + [[nodiscard]] auto operator()(OperatorFunctionTemplateIdAST* ast) + -> UnqualifiedIdAST*; +}; + +struct ASTRewriter::NestedNameSpecifierVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(GlobalNestedNameSpecifierAST* ast) + -> NestedNameSpecifierAST*; + + [[nodiscard]] auto operator()(SimpleNestedNameSpecifierAST* ast) + -> NestedNameSpecifierAST*; + + [[nodiscard]] auto operator()(DecltypeNestedNameSpecifierAST* ast) + -> NestedNameSpecifierAST*; + + [[nodiscard]] auto operator()(TemplateNestedNameSpecifierAST* ast) + -> NestedNameSpecifierAST*; +}; + +struct ASTRewriter::FunctionBodyVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(DefaultFunctionBodyAST* ast) + -> FunctionBodyAST*; + + [[nodiscard]] auto operator()(CompoundStatementFunctionBodyAST* ast) + -> FunctionBodyAST*; + + [[nodiscard]] auto operator()(TryStatementFunctionBodyAST* ast) + -> FunctionBodyAST*; + + [[nodiscard]] auto operator()(DeleteFunctionBodyAST* ast) -> FunctionBodyAST*; +}; + +struct ASTRewriter::TemplateArgumentVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(TypeTemplateArgumentAST* ast) + -> TemplateArgumentAST*; + + [[nodiscard]] auto operator()(ExpressionTemplateArgumentAST* ast) + -> TemplateArgumentAST*; +}; + +struct ASTRewriter::ExceptionSpecifierVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(ThrowExceptionSpecifierAST* ast) + -> ExceptionSpecifierAST*; + + [[nodiscard]] auto operator()(NoexceptSpecifierAST* ast) + -> ExceptionSpecifierAST*; +}; + +struct ASTRewriter::RequirementVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(SimpleRequirementAST* ast) -> RequirementAST*; + + [[nodiscard]] auto operator()(CompoundRequirementAST* ast) -> RequirementAST*; + + [[nodiscard]] auto operator()(TypeRequirementAST* ast) -> RequirementAST*; + + [[nodiscard]] auto operator()(NestedRequirementAST* ast) -> RequirementAST*; +}; + +struct ASTRewriter::NewInitializerVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(NewParenInitializerAST* ast) + -> NewInitializerAST*; + + [[nodiscard]] auto operator()(NewBracedInitializerAST* ast) + -> NewInitializerAST*; +}; + +struct ASTRewriter::MemInitializerVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(ParenMemInitializerAST* ast) + -> MemInitializerAST*; + + [[nodiscard]] auto operator()(BracedMemInitializerAST* ast) + -> MemInitializerAST*; +}; + +struct ASTRewriter::LambdaCaptureVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(ThisLambdaCaptureAST* ast) -> LambdaCaptureAST*; + + [[nodiscard]] auto operator()(DerefThisLambdaCaptureAST* ast) + -> LambdaCaptureAST*; + + [[nodiscard]] auto operator()(SimpleLambdaCaptureAST* ast) + -> LambdaCaptureAST*; + + [[nodiscard]] auto operator()(RefLambdaCaptureAST* ast) -> LambdaCaptureAST*; + + [[nodiscard]] auto operator()(RefInitLambdaCaptureAST* ast) + -> LambdaCaptureAST*; + + [[nodiscard]] auto operator()(InitLambdaCaptureAST* ast) -> LambdaCaptureAST*; +}; + +struct ASTRewriter::ExceptionDeclarationVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(EllipsisExceptionDeclarationAST* ast) + -> ExceptionDeclarationAST*; + + [[nodiscard]] auto operator()(TypeExceptionDeclarationAST* ast) + -> ExceptionDeclarationAST*; +}; + +struct ASTRewriter::AttributeSpecifierVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(CxxAttributeAST* ast) -> AttributeSpecifierAST*; + + [[nodiscard]] auto operator()(GccAttributeAST* ast) -> AttributeSpecifierAST*; + + [[nodiscard]] auto operator()(AlignasAttributeAST* ast) + -> AttributeSpecifierAST*; + + [[nodiscard]] auto operator()(AlignasTypeAttributeAST* ast) + -> AttributeSpecifierAST*; + + [[nodiscard]] auto operator()(AsmAttributeAST* ast) -> AttributeSpecifierAST*; +}; + +struct ASTRewriter::AttributeTokenVisitor { + ASTRewriter& rewrite; + + [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } + + [[nodiscard]] auto operator()(ScopedAttributeTokenAST* ast) + -> AttributeTokenAST*; + + [[nodiscard]] auto operator()(SimpleAttributeTokenAST* ast) + -> AttributeTokenAST*; +}; + auto ASTRewriter::operator()(UnitAST* ast) -> UnitAST* { if (ast) return visit(UnitVisitor{*this}, ast); return {}; @@ -51,8 +659,10 @@ auto ASTRewriter::operator()(StatementAST* ast) -> StatementAST* { } auto ASTRewriter::operator()(ExpressionAST* ast) -> ExpressionAST* { - if (ast) return visit(ExpressionVisitor{*this}, ast); - return {}; + if (!ast) return {}; + auto expr = visit(ExpressionVisitor{*this}, ast); + if (expr) typeChecker_->check(expr); + return expr; } auto ASTRewriter::operator()(TemplateParameterAST* ast) @@ -171,8 +781,8 @@ auto ASTRewriter::operator()(GlobalModuleFragmentAST* ast) if (auto it = ast->declarationList) { auto out = ©->declarationList; - for (auto it = ast->declarationList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->declarationList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -194,8 +804,8 @@ auto ASTRewriter::operator()(PrivateModuleFragmentAST* ast) if (auto it = ast->declarationList) { auto out = ©->declarationList; - for (auto it = ast->declarationList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->declarationList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -217,8 +827,8 @@ auto ASTRewriter::operator()(ModuleDeclarationAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -285,6 +895,7 @@ auto ASTRewriter::operator()(InitDeclaratorAST* ast) -> InitDeclaratorAST* { copy->declarator = operator()(ast->declarator); copy->requiresClause = operator()(ast->requiresClause); copy->initializer = operator()(ast->initializer); + copy->symbol = ast->symbol; return copy; } @@ -296,8 +907,8 @@ auto ASTRewriter::operator()(DeclaratorAST* ast) -> DeclaratorAST* { if (auto it = ast->ptrOpList) { auto out = ©->ptrOpList; - for (auto it = ast->ptrOpList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->ptrOpList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -307,8 +918,8 @@ auto ASTRewriter::operator()(DeclaratorAST* ast) -> DeclaratorAST* { if (auto it = ast->declaratorChunkList) { auto out = ©->declaratorChunkList; - for (auto it = ast->declaratorChunkList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->declaratorChunkList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -326,6 +937,7 @@ auto ASTRewriter::operator()(UsingDeclaratorAST* ast) -> UsingDeclaratorAST* { copy->nestedNameSpecifier = operator()(ast->nestedNameSpecifier); copy->unqualifiedId = operator()(ast->unqualifiedId); copy->ellipsisLoc = ast->ellipsisLoc; + copy->symbol = ast->symbol; copy->isPack = ast->isPack; return copy; @@ -340,8 +952,8 @@ auto ASTRewriter::operator()(EnumeratorAST* ast) -> EnumeratorAST* { if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -361,8 +973,8 @@ auto ASTRewriter::operator()(TypeIdAST* ast) -> TypeIdAST* { if (auto it = ast->typeSpecifierList) { auto out = ©->typeSpecifierList; - for (auto it = ast->typeSpecifierList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->typeSpecifierList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -395,8 +1007,8 @@ auto ASTRewriter::operator()(BaseSpecifierAST* ast) -> BaseSpecifierAST* { if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -432,8 +1044,8 @@ auto ASTRewriter::operator()(ParameterDeclarationClauseAST* ast) if (auto it = ast->parameterDeclarationList) { auto out = ©->parameterDeclarationList; - for (auto it = ast->parameterDeclarationList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->parameterDeclarationList}) { + auto value = operator()(node); *out = new (arena()) List(ast_cast(value)); out = &(*out)->next; } @@ -481,8 +1093,8 @@ auto ASTRewriter::operator()(TypeConstraintAST* ast) -> TypeConstraintAST* { if (auto it = ast->templateArgumentList) { auto out = ©->templateArgumentList; - for (auto it = ast->templateArgumentList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->templateArgumentList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -540,8 +1152,8 @@ auto ASTRewriter::operator()(NewPlacementAST* ast) -> NewPlacementAST* { if (auto it = ast->expressionList) { auto out = ©->expressionList; - for (auto it = ast->expressionList; it; it = it->next) { - auto value = operator()(it->value); + for (auto node : ListView{ast->expressionList}) { + auto value = operator()(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -572,8 +1184,8 @@ auto ASTRewriter::UnitVisitor::operator()(TranslationUnitAST* ast) -> UnitAST* { if (auto it = ast->declarationList) { auto out = ©->declarationList; - for (auto it = ast->declarationList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declarationList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -590,8 +1202,8 @@ auto ASTRewriter::UnitVisitor::operator()(ModuleUnitAST* ast) -> UnitAST* { if (auto it = ast->declarationList) { auto out = ©->declarationList; - for (auto it = ast->declarationList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declarationList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -608,8 +1220,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(SimpleDeclarationAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -617,8 +1229,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(SimpleDeclarationAST* ast) if (auto it = ast->declSpecifierList) { auto out = ©->declSpecifierList; - for (auto it = ast->declSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -626,8 +1238,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(SimpleDeclarationAST* ast) if (auto it = ast->initDeclaratorList) { auto out = ©->initDeclaratorList; - for (auto it = ast->initDeclaratorList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->initDeclaratorList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -645,8 +1257,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -654,8 +1266,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) if (auto it = ast->asmQualifierList) { auto out = ©->asmQualifierList; - for (auto it = ast->asmQualifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->asmQualifierList}) { + auto value = rewrite(node); *out = new (arena()) List(ast_cast(value)); out = &(*out)->next; } @@ -667,8 +1279,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) if (auto it = ast->outputOperandList) { auto out = ©->outputOperandList; - for (auto it = ast->outputOperandList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->outputOperandList}) { + auto value = rewrite(node); *out = new (arena()) List(ast_cast(value)); out = &(*out)->next; } @@ -676,8 +1288,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) if (auto it = ast->inputOperandList) { auto out = ©->inputOperandList; - for (auto it = ast->inputOperandList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->inputOperandList}) { + auto value = rewrite(node); *out = new (arena()) List(ast_cast(value)); out = &(*out)->next; } @@ -685,8 +1297,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) if (auto it = ast->clobberList) { auto out = ©->clobberList; - for (auto it = ast->clobberList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->clobberList}) { + auto value = rewrite(node); *out = new (arena()) List(ast_cast(value)); out = &(*out)->next; } @@ -694,8 +1306,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(AsmDeclarationAST* ast) if (auto it = ast->gotoLabelList) { auto out = ©->gotoLabelList; - for (auto it = ast->gotoLabelList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->gotoLabelList}) { + auto value = rewrite(node); *out = new (arena()) List(ast_cast(value)); out = &(*out)->next; } @@ -731,8 +1343,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(UsingDeclarationAST* ast) if (auto it = ast->usingDeclaratorList) { auto out = ©->usingDeclaratorList; - for (auto it = ast->usingDeclaratorList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->usingDeclaratorList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -761,8 +1373,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(UsingDirectiveAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -802,17 +1414,28 @@ auto ASTRewriter::DeclarationVisitor::operator()(AliasDeclarationAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } } copy->equalLoc = ast->equalLoc; + + if (auto it = ast->gnuAttributeList) { + auto out = ©->gnuAttributeList; + for (auto node : ListView{ast->gnuAttributeList}) { + auto value = rewrite(node); + *out = new (arena()) List(value); + out = &(*out)->next; + } + } + copy->typeId = rewrite(ast->typeId); copy->semicolonLoc = ast->semicolonLoc; copy->identifier = ast->identifier; + copy->symbol = ast->symbol; return copy; } @@ -826,8 +1449,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(OpaqueEnumDeclarationAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -839,8 +1462,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(OpaqueEnumDeclarationAST* ast) if (auto it = ast->typeSpecifierList) { auto out = ©->typeSpecifierList; - for (auto it = ast->typeSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->typeSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -857,8 +1480,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(FunctionDefinitionAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -866,8 +1489,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(FunctionDefinitionAST* ast) if (auto it = ast->declSpecifierList) { auto out = ©->declSpecifierList; - for (auto it = ast->declSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -890,8 +1513,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(TemplateDeclarationAST* ast) if (auto it = ast->templateParameterList) { auto out = ©->templateParameterList; - for (auto it = ast->templateParameterList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->templateParameterList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -967,8 +1590,8 @@ auto ASTRewriter::DeclarationVisitor::operator()( if (auto it = ast->declarationList) { auto out = ©->declarationList; - for (auto it = ast->declarationList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declarationList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -989,8 +1612,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(LinkageSpecificationAST* ast) if (auto it = ast->declarationList) { auto out = ©->declarationList; - for (auto it = ast->declarationList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declarationList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1011,8 +1634,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1020,8 +1643,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) if (auto it = ast->nestedNamespaceSpecifierList) { auto out = ©->nestedNamespaceSpecifierList; - for (auto it = ast->nestedNamespaceSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->nestedNamespaceSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1031,8 +1654,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) if (auto it = ast->extraAttributeList) { auto out = ©->extraAttributeList; - for (auto it = ast->extraAttributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->extraAttributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1042,8 +1665,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(NamespaceDefinitionAST* ast) if (auto it = ast->declarationList) { auto out = ©->declarationList; - for (auto it = ast->declarationList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declarationList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1071,8 +1694,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(AttributeDeclarationAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1092,8 +1715,8 @@ auto ASTRewriter::DeclarationVisitor::operator()( if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1110,8 +1733,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(ParameterDeclarationAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1121,8 +1744,8 @@ auto ASTRewriter::DeclarationVisitor::operator()(ParameterDeclarationAST* ast) if (auto it = ast->typeSpecifierList) { auto out = ©->typeSpecifierList; - for (auto it = ast->typeSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->typeSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1163,8 +1786,8 @@ auto ASTRewriter::DeclarationVisitor::operator()( if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1172,8 +1795,8 @@ auto ASTRewriter::DeclarationVisitor::operator()( if (auto it = ast->declSpecifierList) { auto out = ©->declSpecifierList; - for (auto it = ast->declSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1184,8 +1807,8 @@ auto ASTRewriter::DeclarationVisitor::operator()( if (auto it = ast->bindingList) { auto out = ©->bindingList; - for (auto it = ast->bindingList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->bindingList}) { + auto value = rewrite(node); *out = new (arena()) List(ast_cast(value)); out = &(*out)->next; } @@ -1295,8 +1918,8 @@ auto ASTRewriter::StatementVisitor::operator()(CompoundStatementAST* ast) if (auto it = ast->statementList) { auto out = ©->statementList; - for (auto it = ast->statementList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->statementList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1486,8 +2109,8 @@ auto ASTRewriter::StatementVisitor::operator()(TryBlockStatementAST* ast) if (auto it = ast->handlerList) { auto out = ©->handlerList; - for (auto it = ast->handlerList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->handlerList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1603,31 +2226,32 @@ auto ASTRewriter::ExpressionVisitor::operator()(ThisExpressionAST* ast) return copy; } -auto ASTRewriter::ExpressionVisitor::operator()(NestedExpressionAST* ast) - -> ExpressionAST* { - auto copy = new (arena()) NestedExpressionAST{}; +auto ASTRewriter::ExpressionVisitor::operator()( + NestedStatementExpressionAST* ast) -> ExpressionAST* { + auto copy = new (arena()) NestedStatementExpressionAST{}; copy->valueCategory = ast->valueCategory; copy->type = ast->type; copy->lparenLoc = ast->lparenLoc; - copy->expression = rewrite(ast->expression); + copy->statement = ast_cast(rewrite(ast->statement)); copy->rparenLoc = ast->rparenLoc; return copy; } -auto ASTRewriter::ExpressionVisitor::operator()( - NestedStatementExpressionAST* ast) -> ExpressionAST* { - auto copy = new (arena()) NestedStatementExpressionAST{}; +auto ASTRewriter::ExpressionVisitor::operator()(NestedExpressionAST* ast) + -> ExpressionAST* { + auto copy = new (arena()) NestedExpressionAST{}; copy->valueCategory = ast->valueCategory; copy->type = ast->type; copy->lparenLoc = ast->lparenLoc; - copy->statement = ast_cast(rewrite(ast->statement)); + copy->expression = rewrite(ast->expression); copy->rparenLoc = ast->rparenLoc; return copy; } + auto ASTRewriter::ExpressionVisitor::operator()(IdExpressionAST* ast) -> ExpressionAST* { auto copy = new (arena()) IdExpressionAST{}; @@ -1654,8 +2278,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) if (auto it = ast->captureList) { auto out = ©->captureList; - for (auto it = ast->captureList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->captureList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1666,8 +2290,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) if (auto it = ast->templateParameterList) { auto out = ©->templateParameterList; - for (auto it = ast->templateParameterList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->templateParameterList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1681,8 +2305,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) if (auto it = ast->gnuAtributeList) { auto out = ©->gnuAtributeList; - for (auto it = ast->gnuAtributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->gnuAtributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1690,8 +2314,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) if (auto it = ast->lambdaSpecifierList) { auto out = ©->lambdaSpecifierList; - for (auto it = ast->lambdaSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->lambdaSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1701,8 +2325,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(LambdaExpressionAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1781,8 +2405,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(RequiresExpressionAST* ast) if (auto it = ast->requirementList) { auto out = ©->requirementList; - for (auto it = ast->requirementList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->requirementList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1834,8 +2458,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(CallExpressionAST* ast) if (auto it = ast->expressionList) { auto out = ©->expressionList; - for (auto it = ast->expressionList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->expressionList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1857,8 +2481,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(TypeConstructionAST* ast) if (auto it = ast->expressionList) { auto out = ©->expressionList; - for (auto it = ast->expressionList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->expressionList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -1975,6 +2599,7 @@ auto ASTRewriter::ExpressionVisitor::operator()( copy->commaLoc = ast->commaLoc; copy->expression = rewrite(ast->expression); copy->rparenLoc = ast->rparenLoc; + copy->symbol = ast->symbol; return copy; } @@ -2188,8 +2813,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(NewExpressionAST* ast) if (auto it = ast->typeSpecifierList) { auto out = ©->typeSpecifierList; - for (auto it = ast->typeSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->typeSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2347,8 +2972,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(TypeTraitExpressionAST* ast) if (auto it = ast->typeIdList) { auto out = ©->typeIdList; - for (auto it = ast->typeIdList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->typeIdList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2369,8 +2994,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(ConditionExpressionAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2378,8 +3003,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(ConditionExpressionAST* ast) if (auto it = ast->declSpecifierList) { auto out = ©->declSpecifierList; - for (auto it = ast->declSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2413,8 +3038,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(BracedInitListAST* ast) if (auto it = ast->expressionList) { auto out = ©->expressionList; - for (auto it = ast->expressionList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->expressionList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2436,8 +3061,8 @@ auto ASTRewriter::ExpressionVisitor::operator()(ParenInitializerAST* ast) if (auto it = ast->expressionList) { auto out = ©->expressionList; - for (auto it = ast->expressionList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->expressionList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2460,8 +3085,8 @@ auto ASTRewriter::TemplateParameterVisitor::operator()( if (auto it = ast->templateParameterList) { auto out = ©->templateParameterList; - for (auto it = ast->templateParameterList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->templateParameterList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2779,8 +3404,8 @@ auto ASTRewriter::SpecifierVisitor::operator()(ElaboratedTypeSpecifierAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2791,6 +3416,7 @@ auto ASTRewriter::SpecifierVisitor::operator()(ElaboratedTypeSpecifierAST* ast) copy->unqualifiedId = rewrite(ast->unqualifiedId); copy->classKey = ast->classKey; copy->isTemplateIntroduced = ast->isTemplateIntroduced; + copy->symbol = ast->symbol; return copy; } @@ -2866,8 +3492,8 @@ auto ASTRewriter::SpecifierVisitor::operator()(EnumSpecifierAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2879,8 +3505,8 @@ auto ASTRewriter::SpecifierVisitor::operator()(EnumSpecifierAST* ast) if (auto it = ast->typeSpecifierList) { auto out = ©->typeSpecifierList; - for (auto it = ast->typeSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->typeSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2891,14 +3517,15 @@ auto ASTRewriter::SpecifierVisitor::operator()(EnumSpecifierAST* ast) if (auto it = ast->enumeratorList) { auto out = ©->enumeratorList; - for (auto it = ast->enumeratorList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->enumeratorList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } } copy->rbraceLoc = ast->rbraceLoc; + copy->symbol = ast->symbol; return copy; } @@ -2911,8 +3538,8 @@ auto ASTRewriter::SpecifierVisitor::operator()(ClassSpecifierAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2925,8 +3552,8 @@ auto ASTRewriter::SpecifierVisitor::operator()(ClassSpecifierAST* ast) if (auto it = ast->baseSpecifierList) { auto out = ©->baseSpecifierList; - for (auto it = ast->baseSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->baseSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2936,8 +3563,8 @@ auto ASTRewriter::SpecifierVisitor::operator()(ClassSpecifierAST* ast) if (auto it = ast->declarationList) { auto out = ©->declarationList; - for (auto it = ast->declarationList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->declarationList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2980,8 +3607,8 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PointerOperatorAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -2989,8 +3616,8 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PointerOperatorAST* ast) if (auto it = ast->cvQualifierList) { auto out = ©->cvQualifierList; - for (auto it = ast->cvQualifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->cvQualifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3007,8 +3634,8 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(ReferenceOperatorAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3028,8 +3655,8 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PtrToMemberOperatorAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3037,8 +3664,8 @@ auto ASTRewriter::PtrOperatorVisitor::operator()(PtrToMemberOperatorAST* ast) if (auto it = ast->cvQualifierList) { auto out = ©->cvQualifierList; - for (auto it = ast->cvQualifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->cvQualifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3078,8 +3705,8 @@ auto ASTRewriter::CoreDeclaratorVisitor::operator()(IdDeclaratorAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3111,8 +3738,8 @@ auto ASTRewriter::DeclaratorChunkVisitor::operator()( if (auto it = ast->cvQualifierList) { auto out = ©->cvQualifierList; - for (auto it = ast->cvQualifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->cvQualifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3123,8 +3750,8 @@ auto ASTRewriter::DeclaratorChunkVisitor::operator()( if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3148,8 +3775,8 @@ auto ASTRewriter::DeclaratorChunkVisitor::operator()( if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3233,8 +3860,8 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()(SimpleTemplateIdAST* ast) if (auto it = ast->templateArgumentList) { auto out = ©->templateArgumentList; - for (auto it = ast->templateArgumentList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->templateArgumentList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3257,8 +3884,8 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()( if (auto it = ast->templateArgumentList) { auto out = ©->templateArgumentList; - for (auto it = ast->templateArgumentList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->templateArgumentList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3279,8 +3906,8 @@ auto ASTRewriter::UnqualifiedIdVisitor::operator()( if (auto it = ast->templateArgumentList) { auto out = ©->templateArgumentList; - for (auto it = ast->templateArgumentList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->templateArgumentList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3359,8 +3986,8 @@ auto ASTRewriter::FunctionBodyVisitor::operator()( if (auto it = ast->memInitializerList) { auto out = ©->memInitializerList; - for (auto it = ast->memInitializerList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->memInitializerList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3380,8 +4007,8 @@ auto ASTRewriter::FunctionBodyVisitor::operator()( if (auto it = ast->memInitializerList) { auto out = ©->memInitializerList; - for (auto it = ast->memInitializerList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->memInitializerList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3391,8 +4018,8 @@ auto ASTRewriter::FunctionBodyVisitor::operator()( if (auto it = ast->handlerList) { auto out = ©->handlerList; - for (auto it = ast->handlerList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->handlerList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3509,8 +4136,8 @@ auto ASTRewriter::NewInitializerVisitor::operator()(NewParenInitializerAST* ast) if (auto it = ast->expressionList) { auto out = ©->expressionList; - for (auto it = ast->expressionList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->expressionList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3541,8 +4168,8 @@ auto ASTRewriter::MemInitializerVisitor::operator()(ParenMemInitializerAST* ast) if (auto it = ast->expressionList) { auto out = ©->expressionList; - for (auto it = ast->expressionList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->expressionList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3649,8 +4276,8 @@ auto ASTRewriter::ExceptionDeclarationVisitor::operator()( if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3658,8 +4285,8 @@ auto ASTRewriter::ExceptionDeclarationVisitor::operator()( if (auto it = ast->typeSpecifierList) { auto out = ©->typeSpecifierList; - for (auto it = ast->typeSpecifierList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->typeSpecifierList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } @@ -3680,8 +4307,8 @@ auto ASTRewriter::AttributeSpecifierVisitor::operator()(CxxAttributeAST* ast) if (auto it = ast->attributeList) { auto out = ©->attributeList; - for (auto it = ast->attributeList; it; it = it->next) { - auto value = rewrite(it->value); + for (auto node : ListView{ast->attributeList}) { + auto value = rewrite(node); *out = new (arena()) List(value); out = &(*out)->next; } diff --git a/src/parser/cxx/ast_rewriter.h b/src/parser/cxx/ast_rewriter.h index bb15b2ca..b6485107 100644 --- a/src/parser/cxx/ast_rewriter.h +++ b/src/parser/cxx/ast_rewriter.h @@ -21,16 +21,21 @@ #pragma once #include +#include + +#include namespace cxx { class TranslationUnit; +class TypeChecker; class Control; class Arena; class ASTRewriter { public: - explicit ASTRewriter(TranslationUnit* unit); + explicit ASTRewriter(TypeChecker* typeChecker, + const std::vector& templateArguments); ~ASTRewriter(); [[nodiscard]] auto translationUnit() const -> TranslationUnit* { @@ -105,640 +110,31 @@ class ASTRewriter { -> NestedNamespaceSpecifierAST*; private: - struct UnitVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(TranslationUnitAST* ast) -> UnitAST*; - - [[nodiscard]] auto operator()(ModuleUnitAST* ast) -> UnitAST*; - }; - - struct DeclarationVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(SimpleDeclarationAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(AsmDeclarationAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(NamespaceAliasDefinitionAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(UsingDeclarationAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(UsingEnumDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(UsingDirectiveAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(StaticAssertDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(AliasDeclarationAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(OpaqueEnumDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(FunctionDefinitionAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(TemplateDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(ConceptDefinitionAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(DeductionGuideAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(ExplicitInstantiationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(ExportDeclarationAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(ExportCompoundDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(LinkageSpecificationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(NamespaceDefinitionAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(EmptyDeclarationAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(AttributeDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(ModuleImportDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(ParameterDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(AccessDeclarationAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(ForRangeDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(StructuredBindingDeclarationAST* ast) - -> DeclarationAST*; - - [[nodiscard]] auto operator()(AsmOperandAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(AsmQualifierAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(AsmClobberAST* ast) -> DeclarationAST*; - - [[nodiscard]] auto operator()(AsmGotoLabelAST* ast) -> DeclarationAST*; - }; - - struct StatementVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(LabeledStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(CaseStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(DefaultStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(ExpressionStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(CompoundStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(IfStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(ConstevalIfStatementAST* ast) - -> StatementAST*; - - [[nodiscard]] auto operator()(SwitchStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(WhileStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(DoStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(ForRangeStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(ForStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(BreakStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(ContinueStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(ReturnStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(CoroutineReturnStatementAST* ast) - -> StatementAST*; - - [[nodiscard]] auto operator()(GotoStatementAST* ast) -> StatementAST*; - - [[nodiscard]] auto operator()(DeclarationStatementAST* ast) - -> StatementAST*; - - [[nodiscard]] auto operator()(TryBlockStatementAST* ast) -> StatementAST*; - }; - - struct ExpressionVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(GeneratedLiteralExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(CharLiteralExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(BoolLiteralExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(IntLiteralExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(FloatLiteralExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(NullptrLiteralExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(StringLiteralExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(UserDefinedStringLiteralExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(ThisExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(NestedExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(NestedStatementExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(IdExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(LambdaExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(FoldExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(RightFoldExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(LeftFoldExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(RequiresExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(VaArgExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(SubscriptExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(CallExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(TypeConstructionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(BracedTypeConstructionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(SpliceMemberExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(MemberExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(PostIncrExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(CppCastExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(BuiltinBitCastExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(BuiltinOffsetofExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(TypeidExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(TypeidOfTypeExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(SpliceExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(GlobalScopeReflectExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(NamespaceReflectExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(TypeIdReflectExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(ReflectExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(UnaryExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(AwaitExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(SizeofExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(SizeofTypeExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(SizeofPackExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(AlignofTypeExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(AlignofExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(NoexceptExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(NewExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(DeleteExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(CastExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(ImplicitCastExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(BinaryExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(ConditionalExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(YieldExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(ThrowExpressionAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(AssignmentExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(PackExpansionExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(DesignatedInitializerClauseAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(TypeTraitExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(ConditionExpressionAST* ast) - -> ExpressionAST*; - - [[nodiscard]] auto operator()(EqualInitializerAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(BracedInitListAST* ast) -> ExpressionAST*; - - [[nodiscard]] auto operator()(ParenInitializerAST* ast) -> ExpressionAST*; - }; - - struct TemplateParameterVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(TemplateTypeParameterAST* ast) - -> TemplateParameterAST*; - - [[nodiscard]] auto operator()(NonTypeTemplateParameterAST* ast) - -> TemplateParameterAST*; - - [[nodiscard]] auto operator()(TypenameTypeParameterAST* ast) - -> TemplateParameterAST*; - - [[nodiscard]] auto operator()(ConstraintTypeParameterAST* ast) - -> TemplateParameterAST*; - }; - - struct SpecifierVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(GeneratedTypeSpecifierAST* ast) - -> SpecifierAST*; - - [[nodiscard]] auto operator()(TypedefSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(FriendSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(ConstevalSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(ConstinitSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(ConstexprSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(InlineSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(StaticSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(ExternSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(ThreadLocalSpecifierAST* ast) - -> SpecifierAST*; - - [[nodiscard]] auto operator()(ThreadSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(MutableSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(VirtualSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(ExplicitSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(AutoTypeSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(VoidTypeSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(SizeTypeSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(SignTypeSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(VaListTypeSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(IntegralTypeSpecifierAST* ast) - -> SpecifierAST*; - - [[nodiscard]] auto operator()(FloatingPointTypeSpecifierAST* ast) - -> SpecifierAST*; - - [[nodiscard]] auto operator()(ComplexTypeSpecifierAST* ast) - -> SpecifierAST*; - - [[nodiscard]] auto operator()(NamedTypeSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(AtomicTypeSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(UnderlyingTypeSpecifierAST* ast) - -> SpecifierAST*; - - [[nodiscard]] auto operator()(ElaboratedTypeSpecifierAST* ast) - -> SpecifierAST*; - - [[nodiscard]] auto operator()(DecltypeAutoSpecifierAST* ast) - -> SpecifierAST*; - - [[nodiscard]] auto operator()(DecltypeSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(PlaceholderTypeSpecifierAST* ast) - -> SpecifierAST*; - - [[nodiscard]] auto operator()(ConstQualifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(VolatileQualifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(RestrictQualifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(EnumSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(ClassSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(TypenameSpecifierAST* ast) -> SpecifierAST*; - - [[nodiscard]] auto operator()(SplicerTypeSpecifierAST* ast) - -> SpecifierAST*; - }; - - struct PtrOperatorVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(PointerOperatorAST* ast) -> PtrOperatorAST*; - - [[nodiscard]] auto operator()(ReferenceOperatorAST* ast) -> PtrOperatorAST*; - - [[nodiscard]] auto operator()(PtrToMemberOperatorAST* ast) - -> PtrOperatorAST*; - }; - - struct CoreDeclaratorVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(BitfieldDeclaratorAST* ast) - -> CoreDeclaratorAST*; - - [[nodiscard]] auto operator()(ParameterPackAST* ast) -> CoreDeclaratorAST*; - - [[nodiscard]] auto operator()(IdDeclaratorAST* ast) -> CoreDeclaratorAST*; - - [[nodiscard]] auto operator()(NestedDeclaratorAST* ast) - -> CoreDeclaratorAST*; - }; - - struct DeclaratorChunkVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(FunctionDeclaratorChunkAST* ast) - -> DeclaratorChunkAST*; - - [[nodiscard]] auto operator()(ArrayDeclaratorChunkAST* ast) - -> DeclaratorChunkAST*; - }; - - struct UnqualifiedIdVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(NameIdAST* ast) -> UnqualifiedIdAST*; - - [[nodiscard]] auto operator()(DestructorIdAST* ast) -> UnqualifiedIdAST*; - - [[nodiscard]] auto operator()(DecltypeIdAST* ast) -> UnqualifiedIdAST*; - - [[nodiscard]] auto operator()(OperatorFunctionIdAST* ast) - -> UnqualifiedIdAST*; - - [[nodiscard]] auto operator()(LiteralOperatorIdAST* ast) - -> UnqualifiedIdAST*; - - [[nodiscard]] auto operator()(ConversionFunctionIdAST* ast) - -> UnqualifiedIdAST*; - - [[nodiscard]] auto operator()(SimpleTemplateIdAST* ast) - -> UnqualifiedIdAST*; - - [[nodiscard]] auto operator()(LiteralOperatorTemplateIdAST* ast) - -> UnqualifiedIdAST*; - - [[nodiscard]] auto operator()(OperatorFunctionTemplateIdAST* ast) - -> UnqualifiedIdAST*; - }; - - struct NestedNameSpecifierVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(GlobalNestedNameSpecifierAST* ast) - -> NestedNameSpecifierAST*; - - [[nodiscard]] auto operator()(SimpleNestedNameSpecifierAST* ast) - -> NestedNameSpecifierAST*; - - [[nodiscard]] auto operator()(DecltypeNestedNameSpecifierAST* ast) - -> NestedNameSpecifierAST*; - - [[nodiscard]] auto operator()(TemplateNestedNameSpecifierAST* ast) - -> NestedNameSpecifierAST*; - }; - - struct FunctionBodyVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(DefaultFunctionBodyAST* ast) - -> FunctionBodyAST*; - - [[nodiscard]] auto operator()(CompoundStatementFunctionBodyAST* ast) - -> FunctionBodyAST*; - - [[nodiscard]] auto operator()(TryStatementFunctionBodyAST* ast) - -> FunctionBodyAST*; - - [[nodiscard]] auto operator()(DeleteFunctionBodyAST* ast) - -> FunctionBodyAST*; - }; - - struct TemplateArgumentVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(TypeTemplateArgumentAST* ast) - -> TemplateArgumentAST*; - - [[nodiscard]] auto operator()(ExpressionTemplateArgumentAST* ast) - -> TemplateArgumentAST*; - }; - - struct ExceptionSpecifierVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(ThrowExceptionSpecifierAST* ast) - -> ExceptionSpecifierAST*; - - [[nodiscard]] auto operator()(NoexceptSpecifierAST* ast) - -> ExceptionSpecifierAST*; - }; - - struct RequirementVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(SimpleRequirementAST* ast) -> RequirementAST*; - - [[nodiscard]] auto operator()(CompoundRequirementAST* ast) - -> RequirementAST*; - - [[nodiscard]] auto operator()(TypeRequirementAST* ast) -> RequirementAST*; - - [[nodiscard]] auto operator()(NestedRequirementAST* ast) -> RequirementAST*; - }; - - struct NewInitializerVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(NewParenInitializerAST* ast) - -> NewInitializerAST*; - - [[nodiscard]] auto operator()(NewBracedInitializerAST* ast) - -> NewInitializerAST*; - }; - - struct MemInitializerVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(ParenMemInitializerAST* ast) - -> MemInitializerAST*; - - [[nodiscard]] auto operator()(BracedMemInitializerAST* ast) - -> MemInitializerAST*; - }; - - struct LambdaCaptureVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(ThisLambdaCaptureAST* ast) - -> LambdaCaptureAST*; - - [[nodiscard]] auto operator()(DerefThisLambdaCaptureAST* ast) - -> LambdaCaptureAST*; - - [[nodiscard]] auto operator()(SimpleLambdaCaptureAST* ast) - -> LambdaCaptureAST*; - - [[nodiscard]] auto operator()(RefLambdaCaptureAST* ast) - -> LambdaCaptureAST*; - - [[nodiscard]] auto operator()(RefInitLambdaCaptureAST* ast) - -> LambdaCaptureAST*; - - [[nodiscard]] auto operator()(InitLambdaCaptureAST* ast) - -> LambdaCaptureAST*; - }; - - struct ExceptionDeclarationVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(EllipsisExceptionDeclarationAST* ast) - -> ExceptionDeclarationAST*; - - [[nodiscard]] auto operator()(TypeExceptionDeclarationAST* ast) - -> ExceptionDeclarationAST*; - }; - - struct AttributeSpecifierVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(CxxAttributeAST* ast) - -> AttributeSpecifierAST*; - - [[nodiscard]] auto operator()(GccAttributeAST* ast) - -> AttributeSpecifierAST*; - - [[nodiscard]] auto operator()(AlignasAttributeAST* ast) - -> AttributeSpecifierAST*; - - [[nodiscard]] auto operator()(AlignasTypeAttributeAST* ast) - -> AttributeSpecifierAST*; - - [[nodiscard]] auto operator()(AsmAttributeAST* ast) - -> AttributeSpecifierAST*; - }; - - struct AttributeTokenVisitor { - ASTRewriter& rewrite; - - [[nodiscard]] auto arena() const -> Arena* { return rewrite.arena(); } - - [[nodiscard]] auto operator()(ScopedAttributeTokenAST* ast) - -> AttributeTokenAST*; - - [[nodiscard]] auto operator()(SimpleAttributeTokenAST* ast) - -> AttributeTokenAST*; - }; + struct UnitVisitor; + struct DeclarationVisitor; + struct StatementVisitor; + struct ExpressionVisitor; + struct TemplateParameterVisitor; + struct SpecifierVisitor; + struct PtrOperatorVisitor; + struct CoreDeclaratorVisitor; + struct DeclaratorChunkVisitor; + struct UnqualifiedIdVisitor; + struct NestedNameSpecifierVisitor; + struct FunctionBodyVisitor; + struct TemplateArgumentVisitor; + struct ExceptionSpecifierVisitor; + struct RequirementVisitor; + struct NewInitializerVisitor; + struct MemInitializerVisitor; + struct LambdaCaptureVisitor; + struct ExceptionDeclarationVisitor; + struct AttributeSpecifierVisitor; + struct AttributeTokenVisitor; + private: + TypeChecker* typeChecker_ = nullptr; + const std::vector& templateArguments_; TranslationUnit* unit_ = nullptr; }; diff --git a/src/parser/cxx/type_checker.cc b/src/parser/cxx/type_checker.cc new file mode 100644 index 00000000..199b2621 --- /dev/null +++ b/src/parser/cxx/type_checker.cc @@ -0,0 +1,223 @@ +// Copyright (c) 2025 Roberto Raggi +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include + +// cxx +#include + +namespace cxx { + +struct TypeChecker::Visitor { + TypeChecker& check; + + void operator()(GeneratedLiteralExpressionAST* ast); + void operator()(CharLiteralExpressionAST* ast); + void operator()(BoolLiteralExpressionAST* ast); + void operator()(IntLiteralExpressionAST* ast); + void operator()(FloatLiteralExpressionAST* ast); + void operator()(NullptrLiteralExpressionAST* ast); + void operator()(StringLiteralExpressionAST* ast); + void operator()(UserDefinedStringLiteralExpressionAST* ast); + void operator()(ThisExpressionAST* ast); + void operator()(NestedStatementExpressionAST* ast); + void operator()(NestedExpressionAST* ast); + void operator()(IdExpressionAST* ast); + void operator()(LambdaExpressionAST* ast); + void operator()(FoldExpressionAST* ast); + void operator()(RightFoldExpressionAST* ast); + void operator()(LeftFoldExpressionAST* ast); + void operator()(RequiresExpressionAST* ast); + void operator()(VaArgExpressionAST* ast); + void operator()(SubscriptExpressionAST* ast); + void operator()(CallExpressionAST* ast); + void operator()(TypeConstructionAST* ast); + void operator()(BracedTypeConstructionAST* ast); + void operator()(SpliceMemberExpressionAST* ast); + void operator()(MemberExpressionAST* ast); + void operator()(PostIncrExpressionAST* ast); + void operator()(CppCastExpressionAST* ast); + void operator()(BuiltinBitCastExpressionAST* ast); + void operator()(BuiltinOffsetofExpressionAST* ast); + void operator()(TypeidExpressionAST* ast); + void operator()(TypeidOfTypeExpressionAST* ast); + void operator()(SpliceExpressionAST* ast); + void operator()(GlobalScopeReflectExpressionAST* ast); + void operator()(NamespaceReflectExpressionAST* ast); + void operator()(TypeIdReflectExpressionAST* ast); + void operator()(ReflectExpressionAST* ast); + void operator()(UnaryExpressionAST* ast); + void operator()(AwaitExpressionAST* ast); + void operator()(SizeofExpressionAST* ast); + void operator()(SizeofTypeExpressionAST* ast); + void operator()(SizeofPackExpressionAST* ast); + void operator()(AlignofTypeExpressionAST* ast); + void operator()(AlignofExpressionAST* ast); + void operator()(NoexceptExpressionAST* ast); + void operator()(NewExpressionAST* ast); + void operator()(DeleteExpressionAST* ast); + void operator()(CastExpressionAST* ast); + void operator()(ImplicitCastExpressionAST* ast); + void operator()(BinaryExpressionAST* ast); + void operator()(ConditionalExpressionAST* ast); + void operator()(YieldExpressionAST* ast); + void operator()(ThrowExpressionAST* ast); + void operator()(AssignmentExpressionAST* ast); + void operator()(PackExpansionExpressionAST* ast); + void operator()(DesignatedInitializerClauseAST* ast); + void operator()(TypeTraitExpressionAST* ast); + void operator()(ConditionExpressionAST* ast); + void operator()(EqualInitializerAST* ast); + void operator()(BracedInitListAST* ast); + void operator()(ParenInitializerAST* ast); +}; + +void TypeChecker::Visitor::operator()(GeneratedLiteralExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(CharLiteralExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(BoolLiteralExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(IntLiteralExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(FloatLiteralExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(NullptrLiteralExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(StringLiteralExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()( + UserDefinedStringLiteralExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(ThisExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(NestedStatementExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(NestedExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(IdExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(LambdaExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(FoldExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(RightFoldExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(LeftFoldExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(RequiresExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(VaArgExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(SubscriptExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(CallExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(TypeConstructionAST* ast) {} + +void TypeChecker::Visitor::operator()(BracedTypeConstructionAST* ast) {} + +void TypeChecker::Visitor::operator()(SpliceMemberExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(MemberExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(PostIncrExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(CppCastExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(BuiltinBitCastExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(BuiltinOffsetofExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(TypeidExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(TypeidOfTypeExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(SpliceExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(GlobalScopeReflectExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(NamespaceReflectExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(TypeIdReflectExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(ReflectExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(UnaryExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(AwaitExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(SizeofExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(SizeofTypeExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(SizeofPackExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(AlignofTypeExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(AlignofExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(NoexceptExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(NewExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(DeleteExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(CastExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(ImplicitCastExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(BinaryExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(ConditionalExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(YieldExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(ThrowExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(AssignmentExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(PackExpansionExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(DesignatedInitializerClauseAST* ast) {} + +void TypeChecker::Visitor::operator()(TypeTraitExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(ConditionExpressionAST* ast) {} + +void TypeChecker::Visitor::operator()(EqualInitializerAST* ast) {} + +void TypeChecker::Visitor::operator()(BracedInitListAST* ast) {} + +void TypeChecker::Visitor::operator()(ParenInitializerAST* ast) {} + +TypeChecker::TypeChecker(TranslationUnit* unit) : unit_(unit) {} + +void TypeChecker::operator()(ExpressionAST* ast) { + if (!ast) return; + visit(Visitor{*this}, ast); +} + +void TypeChecker::check(ExpressionAST* ast) { + if (!ast) return; + visit(Visitor{*this}, ast); +} + +} // namespace cxx diff --git a/src/parser/cxx/type_checker.h b/src/parser/cxx/type_checker.h new file mode 100644 index 00000000..8863ff5c --- /dev/null +++ b/src/parser/cxx/type_checker.h @@ -0,0 +1,44 @@ +// Copyright (c) 2025 Roberto Raggi +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +#include + +namespace cxx { + +class TranslationUnit; + +class TypeChecker { + public: + explicit TypeChecker(TranslationUnit* unit); + + [[nodiscard]] auto translationUnit() const -> TranslationUnit* { + return unit_; + } + + void operator()(ExpressionAST* ast); + void check(ExpressionAST* ast); + + private: + struct Visitor; + + TranslationUnit* unit_; +}; + +} // namespace cxx