Bash++
Bash++ compiler internal documentation
bpp_program.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2025 Andrew S. Rightenburg
3 * Bash++: Bash with classes
4 * SPDX-License-Identifier: GPL-3.0-or-later
5 */
6
7#pragma once
8
9#include <memory>
10#include <unordered_map>
11#include <string>
12#include <vector>
13#include <ranges>
14
15#include <include/EntityMap.h>
16#include <include/BashVersion.h>
17
18#include "bpp.h"
19#include "bpp_code_entity.h"
20
21namespace bpp {
22
28class bpp_program : public bpp_code_entity, public std::enable_shared_from_this<bpp_program> {
29 private:
30 uint64_t supershell_counter = 0;
31 uint64_t assignment_counter = 0;
32 uint64_t function_counter = 0;
34 uint64_t typeof_counter = 0;
35 uint64_t object_counter = 0;
36
38
39 std::string main_source_file;
40
41 // To ensure that the bpp_program **owns** its classes
42 // I.e., that those classes don't get destroyed before we're done with them
44
45 // Source file -> AST
46 // Used for advanced analysis, e.g. LSP features
47 std::unordered_map<std::string, std::shared_ptr<AST::Program>> source_file_asts;
48
49 // Source file -> EntityMap
50 std::unordered_map<std::string, EntityMap> entity_maps;
51 // s.t. requesting entity_maps["/path/to/file1.bpp"] returns an EntityMap
52 // which outlines for us which container entities are active at each point in the file
53
54 // Source file -> Diagnostics
55 std::unordered_map<std::string, std::vector<bpp::diagnostic>> diagnostics;
56 // Each 'diagnostic' contains a type (error, warning, etc), message, and position in the source file
57
58 // For debug info:
59 std::shared_ptr<std::vector<std::string>> include_paths;
60 public:
61 bpp_program() = default;
62 ~bpp_program() override = default;
63
64 bpp_program(const bpp_program& other) = default;
65 bpp_program& operator=(const bpp_program& other) = default;
66 bpp_program(bpp_program&& other) noexcept = default;
67 bpp_program& operator=(bpp_program&& other) noexcept = default;
68
69 bool set_containing_class(std::weak_ptr<bpp_class> containing_class) override;
70 void set_output_stream(std::shared_ptr<std::ostream> output_stream);
71
72 bool prepare_class(std::shared_ptr<bpp_class> class_);
73 bool add_class(std::shared_ptr<bpp_class> class_);
74
75 std::shared_ptr<bpp_class> get_class(const std::string& name, size_t max_visible_index = SIZE_MAX) override;
76
77 std::vector<std::shared_ptr<bpp_class>> get_all_known_classes() const override;
78 size_t number_of_known_classes() const override;
79
80 std::weak_ptr<bpp_program> get_containing_program() override;
81
82 void set_include_paths(std::shared_ptr<std::vector<std::string>> paths);
83 std::shared_ptr<std::vector<std::string>> get_include_paths() const;
84
86 uint64_t get_supershell_counter() const;
87
89 uint64_t get_assignment_counter() const;
90
92 uint64_t get_function_counter() const;
93
95 uint64_t get_dynamic_cast_counter() const;
96
98 uint64_t get_typeof_counter() const;
99
101 uint64_t get_object_counter() const;
102
105
106 void mark_entity(
107 const std::string& file,
108 uint32_t start_line, uint32_t start_column,
109 uint32_t end_line, uint32_t end_column,
110 std::shared_ptr<bpp::bpp_entity> entity
111 );
112
113 std::shared_ptr<bpp::bpp_entity> get_active_entity(
114 const std::string& file,
115 uint32_t line, uint32_t column
116 );
117
118 auto get_source_files() const { return entity_maps | std::views::keys; }
119 const std::string& get_main_source_file() const;
120 void set_main_source_file(const std::string& file);
121 void add_source_file(const std::string& file);
122
123 void set_source_file_ast(const std::string& file, std::shared_ptr<AST::Program> ast);
124 std::shared_ptr<AST::Program> get_source_file_ast(const std::string& file) const;
125
126 void add_diagnostic(
127 const std::string& file,
129 const std::string& message,
130 uint32_t start_line, uint32_t start_column,
131 uint32_t end_line, uint32_t end_column
132 );
133
134 std::vector<bpp::diagnostic> get_diagnostics(const std::string& file) const;
135 void clear_diagnostics(const std::string& file);
136};
137
138} // namespace bpp
Definition bpp.h:151
An entity which can contain code.
Definition bpp_code_entity.h:35
std::weak_ptr< bpp_class > type
Definition bpp_entity.h:33
std::string name
Definition bpp_entity.h:27
std::weak_ptr< bpp_class > containing_class
Definition bpp_entity.h:34
virtual std::shared_ptr< bpp_class > get_class()
Definition bpp_entity.cpp:30
The main program.
Definition bpp_program.h:28
uint64_t get_dynamic_cast_counter() const
Definition bpp_program.cpp:175
void add_diagnostic(const std::string &file, diagnostic_type type, const std::string &message, uint32_t start_line, uint32_t start_column, uint32_t end_line, uint32_t end_column)
Definition bpp_program.cpp:269
uint64_t assignment_counter
Definition bpp_program.h:31
uint64_t dynamic_cast_counter
Definition bpp_program.h:33
void set_main_source_file(const std::string &file)
Definition bpp_program.cpp:242
std::vector< std::shared_ptr< bpp_class > > get_all_known_classes() const override
Definition bpp_program.cpp:32
std::weak_ptr< bpp_program > get_containing_program() override
Definition bpp_program.cpp:24
bool set_containing_class(std::weak_ptr< bpp_class > containing_class) override
Definition bpp_program.cpp:16
uint64_t get_supershell_counter() const
Definition bpp_program.cpp:139
void increment_typeof_counter()
Definition bpp_program.cpp:179
std::shared_ptr< AST::Program > get_source_file_ast(const std::string &file) const
Definition bpp_program.cpp:261
void increment_function_counter()
Definition bpp_program.cpp:151
std::unordered_map< std::string, EntityMap > entity_maps
Definition bpp_program.h:50
std::string main_source_file
Definition bpp_program.h:39
uint64_t get_typeof_counter() const
Definition bpp_program.cpp:189
uint64_t get_assignment_counter() const
Definition bpp_program.cpp:147
uint64_t object_counter
Definition bpp_program.h:35
std::shared_ptr< bpp::bpp_entity > get_active_entity(const std::string &file, uint32_t line, uint32_t column)
Definition bpp_program.cpp:220
uint64_t supershell_counter
Definition bpp_program.h:30
std::vector< bpp::diagnostic > get_diagnostics(const std::string &file) const
Definition bpp_program.cpp:286
std::shared_ptr< std::vector< std::string > > get_include_paths() const
Definition bpp_program.cpp:122
uint64_t get_function_counter() const
Definition bpp_program.cpp:161
std::unordered_map< std::string, std::vector< bpp::diagnostic > > diagnostics
Definition bpp_program.h:55
bpp_program()=default
uint64_t typeof_counter
Definition bpp_program.h:34
uint64_t function_counter
Definition bpp_program.h:32
size_t number_of_known_classes() const override
Definition bpp_program.cpp:36
void set_target_bash_version(BashVersion target_bash_version)
Definition bpp_program.cpp:201
bpp_program(bpp_program &&other) noexcept=default
uint64_t get_object_counter() const
Definition bpp_program.cpp:197
void increment_dynamic_cast_counter()
Definition bpp_program.cpp:165
BashVersion get_target_bash_version() const
Definition bpp_program.cpp:205
bool prepare_class(std::shared_ptr< bpp_class > class_)
Prepare a class for addition to the program by adding it to the classes map.
Definition bpp_program.cpp:50
void add_source_file(const std::string &file)
Definition bpp_program.cpp:250
bool add_class(std::shared_ptr< bpp_class > class_)
Add a class to the program.
Definition bpp_program.cpp:62
bpp_program(const bpp_program &other)=default
void increment_supershell_counter()
Definition bpp_program.cpp:126
bpp_program & operator=(const bpp_program &other)=default
~bpp_program() override=default
std::shared_ptr< std::vector< std::string > > include_paths
Definition bpp_program.h:59
void increment_assignment_counter()
Definition bpp_program.cpp:143
auto get_source_files() const
Definition bpp_program.h:118
void mark_entity(const std::string &file, uint32_t start_line, uint32_t start_column, uint32_t end_line, uint32_t end_column, std::shared_ptr< bpp::bpp_entity > entity)
Definition bpp_program.cpp:209
void set_source_file_ast(const std::string &file, std::shared_ptr< AST::Program > ast)
Definition bpp_program.cpp:257
BashVersion target_bash_version
Definition bpp_program.h:37
void set_output_stream(std::shared_ptr< std::ostream > output_stream)
Definition bpp_program.cpp:20
void increment_object_counter()
Definition bpp_program.cpp:193
bpp_program & operator=(bpp_program &&other) noexcept=default
OwnedEntityList< bpp_class > owned_classes
Definition bpp_program.h:43
const std::string & get_main_source_file() const
Definition bpp_program.cpp:238
void clear_diagnostics(const std::string &file)
Definition bpp_program.cpp:294
void set_include_paths(std::shared_ptr< std::vector< std::string > > paths)
Definition bpp_program.cpp:118
std::unordered_map< std::string, std::shared_ptr< AST::Program > > source_file_asts
Definition bpp_program.h:47
Definition bash_case.cpp:9
diagnostic_type
Definition bpp.h:33
Represents a Bash version to target for code generation.
Definition BashVersion.h:23