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
37
38 std::string main_source_file;
39
40 // To ensure that the bpp_program **owns** its classes
41 // I.e., that those classes don't get destroyed before we're done with them
43
44 // Source file -> AST
45 // Used for advanced analysis, e.g. LSP features
46 std::unordered_map<std::string, std::shared_ptr<AST::Program>> source_file_asts;
47
48 // Source file -> EntityMap
49 std::unordered_map<std::string, EntityMap> entity_maps;
50 // s.t. requesting entity_maps["/path/to/file1.bpp"] returns an EntityMap
51 // which outlines for us which container entities are active at each point in the file
52
53 // Source file -> Diagnostics
54 std::unordered_map<std::string, std::vector<bpp::diagnostic>> diagnostics;
55 // Each 'diagnostic' contains a type (error, warning, etc), message, and position in the source file
56
57 // For debug info:
58 std::shared_ptr<std::vector<std::string>> include_paths;
59 public:
60 bpp_program() = default;
61 ~bpp_program() override = default;
62
63 bpp_program(const bpp_program& other) = default;
64 bpp_program& operator=(const bpp_program& other) = default;
65 bpp_program(bpp_program&& other) noexcept = default;
66 bpp_program& operator=(bpp_program&& other) noexcept = default;
67
68 bool set_containing_class(std::weak_ptr<bpp_class> containing_class) override;
69 void set_output_stream(std::shared_ptr<std::ostream> output_stream);
70
71 bool prepare_class(std::shared_ptr<bpp_class> class_);
72 bool add_class(std::shared_ptr<bpp_class> class_);
73
74 std::shared_ptr<bpp_class> get_class(const std::string& name, size_t max_visible_index = SIZE_MAX) override;
75
76 std::vector<std::shared_ptr<bpp_class>> get_all_known_classes() const override;
77 size_t number_of_known_classes() const override;
78
79 std::weak_ptr<bpp_program> get_containing_program() override;
80
81 void set_include_paths(std::shared_ptr<std::vector<std::string>> paths);
82 std::shared_ptr<std::vector<std::string>> get_include_paths() const;
83
85 uint64_t get_supershell_counter() const;
86
88 uint64_t get_assignment_counter() const;
89
91 uint64_t get_function_counter() const;
92
94 uint64_t get_dynamic_cast_counter() const;
95
97 uint64_t get_typeof_counter() const;
98
101
102 void mark_entity(
103 const std::string& file,
104 uint32_t start_line, uint32_t start_column,
105 uint32_t end_line, uint32_t end_column,
106 std::shared_ptr<bpp::bpp_entity> entity
107 );
108
109 std::shared_ptr<bpp::bpp_entity> get_active_entity(
110 const std::string& file,
111 uint32_t line, uint32_t column
112 );
113
114 auto get_source_files() const { return entity_maps | std::views::keys; }
115 const std::string& get_main_source_file() const;
116 void set_main_source_file(const std::string& file);
117 void add_source_file(const std::string& file);
118
119 void set_source_file_ast(const std::string& file, std::shared_ptr<AST::Program> ast);
120 std::shared_ptr<AST::Program> get_source_file_ast(const std::string& file) const;
121
122 void add_diagnostic(
123 const std::string& file,
125 const std::string& message,
126 uint32_t start_line, uint32_t start_column,
127 uint32_t end_line, uint32_t end_column
128 );
129
130 std::vector<bpp::diagnostic> get_diagnostics(const std::string& file) const;
131 void clear_diagnostics(const std::string& file);
132};
133
134} // 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:261
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:234
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:253
void increment_function_counter()
Definition bpp_program.cpp:151
std::unordered_map< std::string, EntityMap > entity_maps
Definition bpp_program.h:49
std::string main_source_file
Definition bpp_program.h:38
uint64_t get_typeof_counter() const
Definition bpp_program.cpp:189
uint64_t get_assignment_counter() const
Definition bpp_program.cpp:147
std::shared_ptr< bpp::bpp_entity > get_active_entity(const std::string &file, uint32_t line, uint32_t column)
Definition bpp_program.cpp:212
uint64_t supershell_counter
Definition bpp_program.h:30
std::vector< bpp::diagnostic > get_diagnostics(const std::string &file) const
Definition bpp_program.cpp:278
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:54
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:193
bpp_program(bpp_program &&other) noexcept=default
void increment_dynamic_cast_counter()
Definition bpp_program.cpp:165
BashVersion get_target_bash_version() const
Definition bpp_program.cpp:197
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:242
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:58
void increment_assignment_counter()
Definition bpp_program.cpp:143
auto get_source_files() const
Definition bpp_program.h:114
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:201
void set_source_file_ast(const std::string &file, std::shared_ptr< AST::Program > ast)
Definition bpp_program.cpp:249
BashVersion target_bash_version
Definition bpp_program.h:36
void set_output_stream(std::shared_ptr< std::ostream > output_stream)
Definition bpp_program.cpp:20
bpp_program & operator=(bpp_program &&other) noexcept=default
OwnedEntityList< bpp_class > owned_classes
Definition bpp_program.h:42
const std::string & get_main_source_file() const
Definition bpp_program.cpp:230
void clear_diagnostics(const std::string &file)
Definition bpp_program.cpp:286
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:46
Definition bash_case.cpp:9
diagnostic_type
Definition bpp.h:33
Represents a Bash version to target for code generation.
Definition BashVersion.h:23