Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
46 changes: 39 additions & 7 deletions packages/cxx-gen-ast/src/new_ast_rewriter_cc.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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();
Expand Down Expand Up @@ -146,12 +173,17 @@ export function new_ast_rewriter_cc({

// cxx
#include <cxx/ast.h>
#include <cxx/translation_unit.h>
#include <cxx/control.h>
#include <cxx/translation_unit.h>
#include <cxx/type_checker.h>

namespace cxx {

${opName}::${opName}(TranslationUnit* unit) : unit_(unit) {}
${opName}::${opName}(TypeChecker* typeChcker,
const std::vector<TemplateArgument>& templateArguments)
: typeChecker_(typeChcker)
, unit_(typeChcker->translationUnit())
, templateArguments_(templateArguments) {}

${opName}::~${opName}() {}

Expand Down
22 changes: 9 additions & 13 deletions packages/cxx-gen-ast/src/new_ast_rewriter_h.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,35 +61,28 @@ 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}

#pragma once

#include <cxx/ast_fwd.h>
#include <cxx/names_fwd.h>

#include <vector>

namespace cxx {

class TranslationUnit;
class TypeChecker;
class Control;
class Arena;

class ${opName} {
public:
explicit ${opName}(TranslationUnit* unit);
explicit ${opName}(TypeChecker* typeChecker, const std::vector<TemplateArgument>& templateArguments);
~${opName}();

[[nodiscard]] auto translationUnit() const -> TranslationUnit* { return unit_; }
Expand All @@ -99,6 +92,9 @@ public:

${code.join("\n")}

private:
TypeChecker* typeChecker_ = nullptr;
const std::vector<TemplateArgument>& templateArguments_;
TranslationUnit* unit_ = nullptr;
};

Expand Down
10 changes: 7 additions & 3 deletions src/lsp/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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}
)

Expand Down
50 changes: 46 additions & 4 deletions src/parser/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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(
Expand Down
Loading