Bash++
Bash++ compiler internal documentation
bpp.h
Go to the documentation of this file.
1
7#pragma once
8
9#include <string>
10#include <sstream>
11#include <vector>
12#include <unordered_map>
13#include <list>
14#include <memory>
15
16#include <include/EntityMap.h>
17#include <include/BashVersion.h>
18#include <AST/Nodes/Program.h>
19
20namespace bpp {
21
28
34
41
49struct diagnostic {
51 std::string message;
52 uint32_t start_line;
53 uint32_t start_column;
54 uint32_t end_line;
55 uint32_t end_column;
56};
57
58// Forward declarations
59
60class bpp_entity;
61class bpp_code_entity;
62class bpp_string;
63class bpp_method;
65class bpp_class;
66class bpp_object;
67class bpp_datamember;
68class bpp_program;
69
70// Statement types
73class bash_if;
74class bash_if_branch;
75class bash_case;
78class bash_function;
81class bpp_pointer_dereference;
85class bpp_object_address;
86
91inline const std::shared_ptr<bpp_entity> inaccessible_entity = std::make_shared<bpp_entity>();
92
97inline const std::shared_ptr<bpp_datamember> inaccessible_datamember = std::make_shared<bpp_datamember>();
98
103inline const std::shared_ptr<bpp_method> inaccessible_method = std::make_shared<bpp_method>();
104
109static const char bpp_nullptr[] = "0";
110
115inline constexpr const char* protected_keywords[] = {
116 "class", "constructor", "delete", "destructor",
117 "dynamic_cast", "include", "include_once", "local", "method",
118 "new", "nullptr", "primitive", "private",
119 "protected", "public", "super", "this",
120 "typeof", "virtual"
121 };
122
127inline bool is_protected_keyword(const std::string& keyword) {
128 for (const char* protected_keyword : protected_keywords) {
129 if (keyword == protected_keyword) {
130 return true;
131 }
132 }
133 return false;
134}
135
141inline bool is_valid_identifier(const std::string& identifier) {
142 // Verify it's not empty, and not a reserved keyword
143 if (identifier.empty() || is_protected_keyword(identifier)) {
144 return false;
145 }
146
147 // Verify it doesn't contain two consecutive underscores
148 if (identifier.contains("__")) return false;
149
150 // Verify it starts with a letter or underscore, and contains only letters, digits, and underscores
151 if (!isalpha(identifier[0]) && identifier[0] != '_') {
152 return false;
153 }
154
155 for (char c : identifier) {
156 if (!isalnum(c) && c != '_') {
157 return false;
158 }
159 }
160
161 // If all checks passed, it's a valid identifier
162 return true;
163}
164
166 std::string file;
167 uint64_t line = 0;
168 uint64_t column = 0;
169
170 SymbolPosition() = default;
171 SymbolPosition(const std::string& file, uint64_t line, uint64_t column)
172 : file(file), line(line), column(column) {}
173};
174
183 protected:
184 std::string name;
189 std::unordered_map<std::string, std::weak_ptr<bpp_class>> classes;
190
195 std::unordered_map<std::string, std::weak_ptr<bpp_object>> objects;
196
203 std::unordered_map<std::string, std::shared_ptr<bpp_object>> local_objects;
204 std::weak_ptr<bpp_class> type;
205 std::weak_ptr<bpp_class> containing_class;
206 std::weak_ptr<bpp_program> containing_program;
207 std::vector<std::weak_ptr<bpp_class>> parents;
208 std::weak_ptr<bpp_method> overridden_method;
210 std::list<bpp::SymbolPosition> references;
211 public:
212 bpp_entity() = default;
213 virtual ~bpp_entity() = default;
214
215 bpp_entity(const bpp_entity& other) = default;
216 bpp_entity& operator=(const bpp_entity& other) = default;
217 bpp_entity(bpp_entity&& other) noexcept = default;
218 bpp_entity& operator=(bpp_entity&& other) noexcept = default;
219
220 virtual bool add_class(std::shared_ptr<bpp_class> class_);
221 virtual bool add_object(std::shared_ptr<bpp_object> object, bool make_local = false);
222
223 virtual std::shared_ptr<bpp_class> get_class();
224 virtual std::string get_address() const;
225 virtual void set_name(const std::string& name);
226 virtual std::string get_name() const;
227 virtual std::weak_ptr<bpp::bpp_class> get_containing_class();
228 virtual std::weak_ptr<bpp_program> get_containing_program();
229 virtual bool set_containing_class(std::weak_ptr<bpp::bpp_class> containing_class);
230
231 void inherit(std::shared_ptr<bpp_entity> parent);
232 void inherit(std::shared_ptr<bpp_program> program);
233 virtual void inherit(std::shared_ptr<bpp_class> parent);
234
235 void set_definition_position(const std::string& file, uint64_t line, uint64_t column);
236 void add_reference(const std::string& file, uint64_t line, uint64_t column);
237
239 std::list<bpp::SymbolPosition> get_references() const;
240
241 std::unordered_map<std::string, std::shared_ptr<bpp_class>> get_classes() const;
242 std::unordered_map<std::string, std::shared_ptr<bpp_object>> get_objects() const;
243 const std::unordered_map<std::string, std::shared_ptr<bpp_object>>& get_local_objects() const;
244 std::shared_ptr<bpp_class> get_class(const std::string& name);
245 std::shared_ptr<bpp_object> get_object(const std::string& name);
246
247 std::shared_ptr<bpp_class> get_parent() const;
248};
249
268 protected:
269 std::shared_ptr<std::ostream> code = std::make_shared<std::ostringstream>();
270 std::string nextline_buffer;
271 std::string postline_buffer;
272 bool buffers_flushed = false;
273
280 public:
281 virtual void add_code(const std::string& code, bool add_newline = true);
282 virtual void add_code_to_previous_line(const std::string& code);
283 virtual void add_code_to_next_line(const std::string& code);
284
285 bool add_object(std::shared_ptr<bpp_object> object, bool make_local = false) override;
286
287 virtual void flush_nextline_buffer();
288 virtual void flush_postline_buffer();
289 virtual void flush_code_buffers();
290
291 virtual void clear_all_buffers();
292
293 void destruct_local_objects(std::shared_ptr<bpp_program> program);
294
295 virtual std::string get_code() const;
296 virtual std::string get_pre_code() const;
297 virtual std::string get_post_code() const;
298
299 void set_requires_perfect_forwarding(bool require);
301
302 void adopt(std::shared_ptr<bpp_entity> entity);
303};
304
367 public:
368 void add_code(const std::string& code, bool add_newline = true) override;
369 void add_code_to_previous_line(const std::string& code) override;
370 void add_code_to_next_line(const std::string& code) override;
371
372 std::string get_code() const override;
373 std::string get_pre_code() const override;
374 std::string get_post_code() const override;
375};
376
397 protected:
398 std::string joined_code;
400
401 bool perfect_forwarding = false;
402
403 void join();
404 public:
405 void add_connective(bool is_and);
406
407 void add_code(const std::string& code, bool add_newline = true) override;
408
409 std::string get_code() const override;
410 std::string get_pre_code() const override;
411 std::string get_post_code() const override;
412
413 void set_perfect_forwarding(bool enable);
414};
415
422 private:
423 std::vector<std::shared_ptr<bpp_method_parameter>> parameters;
425 bool m_is_virtual = false;
426 bool m_is_overridable = false;
427 bool inherited = false;
428 bool add_object_as_parameter(std::shared_ptr<bpp_object> object);
429 std::string last_override; // Name of the latest class to override this virtual method
430 public:
431 virtual bool add_parameter(std::shared_ptr<bpp_method_parameter> parameter);
433 void set_virtual(bool is_virtual);
435 void set_inherited(bool is_inherited);
436 void set_last_override(const std::string& class_name);
437 void set_overridden_method(std::weak_ptr<bpp_method> method);
438 bool add_object(std::shared_ptr<bpp_object> object, bool make_local) override;
439
440 std::vector<std::shared_ptr<bpp_method_parameter>> get_parameters() const;
441 bpp_scope get_scope() const;
442 bool is_virtual() const;
443 bool is_overridable() const;
444 bool is_inherited() const;
445 std::string get_last_override() const;
446};
447
454 public:
455 explicit bpp_method_parameter(const std::string& name);
456
457 void set_class(std::shared_ptr<bpp_class>);
458};
459
465class bpp_class : public bpp_entity, public std::enable_shared_from_this<bpp_class> {
466 private:
467 std::vector<std::shared_ptr<bpp_method>> methods;
468 std::vector<std::shared_ptr<bpp_datamember>> datamembers;
470
473 public:
474 std::weak_ptr<bpp_class> get_containing_class() override;
475 bool set_containing_class(std::weak_ptr<bpp::bpp_class> containing_class) override;
476
477 std::shared_ptr<bpp_class> get_class() override;
478
479 void set_name(const std::string& name) override;
480 bool add_method(std::shared_ptr<bpp_method> method);
481 bool add_datamember(std::shared_ptr<bpp_datamember> datamember);
482
483 std::vector<std::shared_ptr<bpp_method>> get_methods() const;
484 std::vector<std::shared_ptr<bpp_datamember>> get_datamembers() const;
485
486 std::shared_ptr<bpp_method> get_method(const std::string& name, std::shared_ptr<bpp_entity> context);
487 std::shared_ptr<bpp_method> get_method_UNSAFE(const std::string& name);
488 std::shared_ptr<bpp_datamember> get_datamember(const std::string& name, std::shared_ptr<bpp_entity> context);
489 std::shared_ptr<bpp_datamember> get_datamember_UNSAFE(const std::string& name);
490
492 void inherit(std::shared_ptr<bpp_class> parent) override;
493 std::shared_ptr<bpp::bpp_class> get_parent();
494};
495
501class bpp_object : public bpp_entity {
502 protected:
503 std::string address;
504 std::string assignment_value;
505 std::string pre_access_code;
506 std::string post_access_code;
507 bool m_is_pointer = false;
508 std::shared_ptr<bpp::bpp_object> copy_from = nullptr;
509 public:
510 void set_class(std::shared_ptr<bpp_class> object_class);
511 void set_pointer(bool is_pointer);
512 void set_address(const std::string& address);
513 void set_assignment_value(const std::string& assignment_value);
514 void set_pre_access_code(const std::string& pre_access_code);
515 void set_post_access_code(const std::string& post_access_code);
516 void set_nullptr();
517
518 std::string get_address() const override;
519 std::string get_assignment_value() const;
520 std::string get_pre_access_code() const;
521 std::string get_post_access_code() const;
522 std::shared_ptr<bpp::bpp_object> get_copy_from() const;
523
524 bool is_pointer() const;
525};
526
533 private:
534 std::string default_value;
536 bool array = false;
537 public:
538 void set_default_value(const std::string& default_value);
540 void set_array(bool is_array);
541
542 std::string get_address() const override;
543 std::string get_default_value() const;
544 bpp_scope get_scope() const;
545 bool is_array() const;
546};
547
553class bpp_program : public bpp_code_entity, public std::enable_shared_from_this<bpp_program> {
554 private:
555 std::shared_ptr<bpp_class> primitive_class;
556 uint64_t supershell_counter = 0;
557 uint64_t assignment_counter = 0;
558 uint64_t function_counter = 0;
560 uint64_t typeof_counter = 0;
561 uint64_t object_counter = 0;
562
564
565 std::string main_source_file;
566
567 // To ensure that the bpp_program **owns** its classes
568 // I.e., that those classes don't get destroyed before we're done with them
569 std::unordered_map<std::string, std::shared_ptr<bpp::bpp_class>> owned_classes;
570
571 // Source file -> AST
572 // Used for advanced analysis, e.g. LSP features
573 std::unordered_map<std::string, std::shared_ptr<AST::Program>> source_file_asts;
574
575 // Source file -> EntityMap
576 std::unordered_map<std::string, EntityMap> entity_maps;
577 // s.t. requesting entity_maps["/path/to/file1.bpp"] returns an EntityMap
578 // which outlines for us which container entities are active at each point in the file
579
580 // Source file -> Diagnostics
581 std::unordered_map<std::string, std::vector<bpp::diagnostic>> diagnostics;
582 // Each 'diagnostic' contains a type (error, warning, etc), message, and position in the source file
583
584 // For debug info:
585 std::shared_ptr<std::vector<std::string>> include_paths;
586 public:
587 bpp_program();
588 ~bpp_program() override = default;
589
590 bpp_program(const bpp_program& other) = default;
591 bpp_program& operator=(const bpp_program& other) = default;
592 bpp_program(bpp_program&& other) noexcept = default;
593 bpp_program& operator=(bpp_program&& other) noexcept = default;
594
595 bool set_containing_class(std::weak_ptr<bpp_class> containing_class) override;
596 void set_output_stream(std::shared_ptr<std::ostream> output_stream);
597
598 bool prepare_class(std::shared_ptr<bpp_class> class_);
599 bool add_class(std::shared_ptr<bpp_class> class_) override;
600
601 std::shared_ptr<bpp_class> get_primitive_class() const;
602
603 std::weak_ptr<bpp_program> get_containing_program() override;
604
605 void set_include_paths(std::shared_ptr<std::vector<std::string>> paths);
606 std::shared_ptr<std::vector<std::string>> get_include_paths() const;
607
609 uint64_t get_supershell_counter() const;
610
612 uint64_t get_assignment_counter() const;
613
615 uint64_t get_function_counter() const;
616
618 uint64_t get_dynamic_cast_counter() const;
619
621 uint64_t get_typeof_counter() const;
622
624 uint64_t get_object_counter() const;
625
628
629 void mark_entity(
630 const std::string& file,
631 uint32_t start_line, uint32_t start_column,
632 uint32_t end_line, uint32_t end_column,
633 std::shared_ptr<bpp::bpp_entity> entity
634 );
635
636 std::shared_ptr<bpp::bpp_entity> get_active_entity(
637 const std::string& file,
638 uint32_t line, uint32_t column
639 );
640
641 std::vector<std::string> get_source_files() const;
642 std::string get_main_source_file() const;
643 void set_main_source_file(const std::string& file);
644 void add_source_file(const std::string& file);
645
646 void set_source_file_ast(const std::string& file, std::shared_ptr<AST::Program> ast);
647 std::shared_ptr<AST::Program> get_source_file_ast(const std::string& file) const;
648
649 void add_diagnostic(
650 const std::string& file,
652 const std::string& message,
653 uint32_t start_line, uint32_t start_column,
654 uint32_t end_line, uint32_t end_column
655 );
656
657 std::vector<bpp::diagnostic> get_diagnostics(const std::string& file) const;
658 void clear_diagnostics(const std::string& file);
659};
660
676 private:
677 std::shared_ptr<bpp::bash_while_or_until_condition> condition;
678 public:
679 void set_condition(std::shared_ptr<bpp::bash_while_or_until_condition> condition);
680 std::shared_ptr<bpp::bash_while_or_until_condition> get_condition() const;
681
682 std::string get_code() const override;
683 std::string get_pre_code() const override;
684 std::string get_post_code() const override;
685};
686
696
715class bash_if : public bpp_string {
716 private:
717 std::vector<std::pair<std::string, std::string>> conditional_branches;
718 public:
719 void new_branch();
720 void add_condition_code(const std::string& condition_code);
721 void add_branch_code(const std::string& branch_code);
722 const std::vector<std::pair<std::string, std::string>>& get_conditional_branches() const;
723};
724
736 private:
737 std::shared_ptr<bpp::bash_if> if_statement;
738 public:
739 void set_if_statement(std::shared_ptr<bpp::bash_if> if_statement);
740 std::shared_ptr<bpp::bash_if> get_if_statement() const;
741
742 std::string get_code() const override;
743 std::string get_pre_code() const override;
744 std::string get_post_code() const override;
745};
746
756class bash_case : public bpp_string {
757 private:
758 std::string cases;
759 public:
760 void add_case(const std::string& case_);
761
762 const std::string& get_cases() const;
763};
764
775 private:
776 std::string pattern;
777 std::shared_ptr<bpp::bash_case> containing_case;
778 public:
779 void set_pattern(const std::string& pattern);
780 void set_containing_case(std::shared_ptr<bpp::bash_case> containing_case);
781
782 const std::string& get_pattern() const;
783 std::shared_ptr<bpp::bash_case> get_containing_case() const;
784};
785
796 private:
797 std::string header_pre_code;
798 std::string header_post_code;
799 std::string header_code;
800 public:
801 void set_header_pre_code(const std::string& pre_code);
802 void set_header_post_code(const std::string& post_code);
803 void set_header_code(const std::string& code);
804
805 const std::string& get_header_pre_code() const;
806 const std::string& get_header_post_code() const;
807 const std::string& get_header_code() const;
808};
809
820};
821
834 private:
835 std::shared_ptr<bpp::bpp_object> object_to_delete;
836 public:
837 void set_object_to_delete(std::shared_ptr<bpp::bpp_object> object);
838 std::shared_ptr<bpp::bpp_object> get_object_to_delete() const;
839};
840
853 private:
854 std::string cast_to;
855 public:
856 void set_cast_to(const std::string& cast_to);
857 std::string get_cast_to() const;
858};
859
873};
874
883 private:
885 std::shared_ptr<bpp_entity> nonprimitive_object;
887 bool array_assignment = false;
888 bool adding = false;
889 public:
890 void set_nonprimitive_assignment(bool is_nonprimitive);
891 void set_nonprimitive_object(std::shared_ptr<bpp_entity> object);
892 void set_lvalue_nonprimitive(bool is_nonprimitive);
893 void set_array_assignment(bool is_array);
894 void set_adding(bool is_adding);
895
896 bool is_nonprimitive_assignment() const;
897 std::shared_ptr<bpp_entity> get_nonprimitive_object() const;
898 bool lvalue_is_nonprimitive() const;
899 bool is_array_assignment() const;
900 bool is_adding() const;
901};
902
911 private:
912 std::string lvalue;
913 std::string rvalue;
916 std::shared_ptr<bpp_entity> lvalue_object;
917 std::shared_ptr<bpp_entity> rvalue_object;
918 bool adding = false;
919 bool rvalue_array = false;
920 public:
921 void set_lvalue(const std::string& lvalue);
922 void set_rvalue(const std::string& rvalue);
923 void set_lvalue_nonprimitive(bool is_nonprimitive);
924 void set_rvalue_nonprimitive(bool is_nonprimitive);
925 void set_lvalue_object(std::shared_ptr<bpp_entity> object);
926 void set_rvalue_object(std::shared_ptr<bpp_entity> object);
927 void set_adding(bool is_adding);
928 void set_rvalue_array(bool is_array);
929
930 std::string get_lvalue() const;
931 std::string get_rvalue() const;
932 bool lvalue_is_nonprimitive() const;
933 bool rvalue_is_nonprimitive() const;
934 std::shared_ptr<bpp_entity> get_lvalue_object() const;
935 std::shared_ptr<bpp_entity> get_rvalue_object() const;
936 bool is_adding() const;
937 bool rvalue_is_array() const;
938};
939
948 private:
950 std::string array_index;
951 public:
953 void set_array_index(const std::string& array_index);
955 std::string get_array_index() const;
956 bool has_array_index() const;
957};
958
959} // namespace bpp
A pattern for a case statement in Bash++.
Definition bpp.h:774
std::string pattern
Definition bpp.h:776
void set_containing_case(std::shared_ptr< bpp::bash_case > containing_case)
Definition bash_case_pattern.cpp:15
const std::string & get_pattern() const
Definition bash_case_pattern.cpp:19
void set_pattern(const std::string &pattern)
Definition bash_case_pattern.cpp:11
std::shared_ptr< bpp::bash_case > containing_case
Definition bpp.h:777
std::shared_ptr< bpp::bash_case > get_containing_case() const
Definition bash_case_pattern.cpp:23
A case statement in Bash++.
Definition bpp.h:756
std::string cases
Definition bpp.h:758
const std::string & get_cases() const
Definition bash_case.cpp:15
void add_case(const std::string &case_)
Definition bash_case.cpp:11
A sequence of bash commands connected by '&&' and '||'.
Definition bpp.h:396
std::string joined_code
Definition bpp.h:398
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition bash_command_sequence.cpp:105
void set_perfect_forwarding(bool enable)
Definition bash_command_sequence.cpp:109
bool perfect_forwarding
Definition bpp.h:401
void add_connective(bool is_and)
Add a connective to the command sequence, finalizing the previously-received pipeline....
Definition bash_command_sequence.cpp:73
void join()
Definition bash_command_sequence.cpp:11
void add_code(const std::string &code, bool add_newline=true) override
Add code to the code entity.
Definition bash_command_sequence.cpp:86
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition bash_command_sequence.cpp:101
bool contains_multiple_commands
Definition bpp.h:399
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition bash_command_sequence.cpp:97
A for loop or select statement in Bash++.
Definition bpp.h:795
const std::string & get_header_post_code() const
Definition bash_for_or_select.cpp:27
void set_header_post_code(const std::string &post_code)
Definition bash_for_or_select.cpp:15
const std::string & get_header_code() const
Definition bash_for_or_select.cpp:31
std::string header_pre_code
Definition bpp.h:797
std::string header_post_code
Definition bpp.h:798
std::string header_code
Definition bpp.h:799
const std::string & get_header_pre_code() const
Definition bash_for_or_select.cpp:23
void set_header_pre_code(const std::string &pre_code)
Definition bash_for_or_select.cpp:11
void set_header_code(const std::string &code)
Definition bash_for_or_select.cpp:19
A normal Bash function.
Definition bpp.h:819
A branch of an if statement in Bash++.
Definition bpp.h:735
void set_if_statement(std::shared_ptr< bpp::bash_if > if_statement)
Definition bash_if_branch.cpp:11
std::shared_ptr< bpp::bash_if > get_if_statement() const
Definition bash_if_branch.cpp:15
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition bash_if_branch.cpp:23
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition bash_if_branch.cpp:31
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition bash_if_branch.cpp:19
std::shared_ptr< bpp::bash_if > if_statement
Definition bpp.h:737
An if statement in Bash++.
Definition bpp.h:715
std::vector< std::pair< std::string, std::string > > conditional_branches
Definition bpp.h:717
void new_branch()
Definition bash_if.cpp:11
void add_branch_code(const std::string &branch_code)
Definition bash_if.cpp:19
void add_condition_code(const std::string &condition_code)
Definition bash_if.cpp:15
const std::vector< std::pair< std::string, std::string > > & get_conditional_branches() const
Definition bash_if.cpp:23
The condition for a while/until loop in Bash++.
Definition bpp.h:694
A while/until loop in Bash++.
Definition bpp.h:675
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition bash_while_or_until_loop.cpp:19
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition bash_while_or_until_loop.cpp:23
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition bash_while_or_until_loop.cpp:31
std::shared_ptr< bpp::bash_while_or_until_condition > condition
Definition bpp.h:677
void set_condition(std::shared_ptr< bpp::bash_while_or_until_condition > condition)
Definition bash_while_or_until_loop.cpp:11
std::shared_ptr< bpp::bash_while_or_until_condition > get_condition() const
Definition bash_while_or_until_loop.cpp:15
A class in Bash++.
Definition bpp.h:465
void set_name(const std::string &name) override
Definition bpp_class.cpp:62
bool set_containing_class(std::weak_ptr< bpp::bpp_class > containing_class) override
Definition bpp_class.cpp:58
std::shared_ptr< bpp_class > get_class() override
Definition bpp_class.cpp:54
void inherit(std::shared_ptr< bpp_class > parent) override
Inherit from a parent class.
Definition bpp_class.cpp:265
bool add_method(std::shared_ptr< bpp_method > method)
Add a method to the class.
Definition bpp_class.cpp:70
std::vector< std::shared_ptr< bpp_datamember > > get_datamembers() const
Definition bpp_class.cpp:154
void add_default_toPrimitive()
Add the default toPrimitive method.
Definition bpp_class.cpp:36
std::vector< std::shared_ptr< bpp_datamember > > datamembers
Definition bpp.h:468
std::shared_ptr< bpp_datamember > get_datamember(const std::string &name, std::shared_ptr< bpp_entity > context)
Get a datamember by name.
Definition bpp_class.cpp:226
bool has_custom_toPrimitive
Definition bpp.h:469
void remove_default_toPrimitive()
Remove the default toPrimitive method.
Definition bpp_class.cpp:18
std::shared_ptr< bpp::bpp_class > get_parent()
Definition bpp_class.cpp:297
std::shared_ptr< bpp_method > get_method(const std::string &name, std::shared_ptr< bpp_entity > context)
Get a method by name.
Definition bpp_class.cpp:171
std::shared_ptr< bpp_method > get_method_UNSAFE(const std::string &name)
Get a method by name without checking the context.
Definition bpp_class.cpp:204
std::shared_ptr< bpp_datamember > get_datamember_UNSAFE(const std::string &name)
Definition bpp_class.cpp:249
std::vector< std::shared_ptr< bpp_method > > get_methods() const
Definition bpp_class.cpp:150
std::weak_ptr< bpp_class > get_containing_class() override
Get the class which contains this entity.
Definition bpp_class.cpp:50
bool add_datamember(std::shared_ptr< bpp_datamember > datamember)
Add a datamember to the class.
Definition bpp_class.cpp:129
std::vector< std::shared_ptr< bpp_method > > methods
Definition bpp.h:467
An entity which can contain code.
Definition bpp.h:267
void set_requires_perfect_forwarding(bool require)
Definition bpp_code_entity.cpp:206
virtual void add_code_to_next_line(const std::string &code)
Add code to the code entity's post-code buffer.
Definition bpp_code_entity.cpp:57
std::shared_ptr< std::ostream > code
Definition bpp.h:269
std::string postline_buffer
Definition bpp.h:271
virtual void flush_code_buffers()
Definition bpp_code_entity.cpp:82
virtual void add_code_to_previous_line(const std::string &code)
Add code to the code entity's pre-code buffer.
Definition bpp_code_entity.cpp:49
virtual void flush_postline_buffer()
Definition bpp_code_entity.cpp:72
virtual std::string get_post_code() const
Return the contents of the post-code buffer as a string.
Definition bpp_code_entity.cpp:202
virtual std::string get_pre_code() const
Return the contents of the pre-code buffer as a string.
Definition bpp_code_entity.cpp:195
virtual void flush_nextline_buffer()
Definition bpp_code_entity.cpp:62
virtual void clear_all_buffers()
Definition bpp_code_entity.cpp:88
bool requires_perfect_forwarding
Signals to bash_command_sequence entities whether they should operate in perfect forwarding mode I....
Definition bpp.h:279
bool add_object(std::shared_ptr< bpp_object > object, bool make_local=false) override
Add an object to the code entity.
Definition bpp_code_entity.cpp:108
bool get_requires_perfect_forwarding() const
Definition bpp_code_entity.cpp:210
virtual void add_code(const std::string &code, bool add_newline=true)
Add code to the code entity.
Definition bpp_code_entity.cpp:22
virtual std::string get_code() const
Return the contents of the main code buffer as a string.
Definition bpp_code_entity.cpp:184
void adopt(std::shared_ptr< bpp_entity > entity)
Take ownership of all local objects in another entity, by moving them into this entity's local object...
Definition bpp_code_entity.cpp:222
std::string nextline_buffer
Definition bpp.h:270
bool buffers_flushed
Definition bpp.h:272
void destruct_local_objects(std::shared_ptr< bpp_program > program)
Destruct all local objects in the code entity.
Definition bpp_code_entity.cpp:173
A data member in a class.
Definition bpp.h:532
bool is_array() const
Definition bpp_datamember.cpp:35
bool array
Definition bpp.h:536
void set_scope(bpp_scope scope)
Definition bpp_datamember.cpp:15
std::string get_default_value() const
Definition bpp_datamember.cpp:27
void set_default_value(const std::string &default_value)
Definition bpp_datamember.cpp:11
std::string get_address() const override
Definition bpp_datamember.cpp:23
bpp_scope scope
Definition bpp.h:535
std::string default_value
Definition bpp.h:534
bpp_scope get_scope() const
Definition bpp_datamember.cpp:31
void set_array(bool is_array)
Definition bpp_datamember.cpp:19
A delete statement in Bash++.
Definition bpp.h:833
std::shared_ptr< bpp::bpp_object > get_object_to_delete() const
Definition bpp_delete_statement.cpp:15
void set_object_to_delete(std::shared_ptr< bpp::bpp_object > object)
Definition bpp_delete_statement.cpp:11
std::shared_ptr< bpp::bpp_object > object_to_delete
Definition bpp.h:835
A dynamic_cast statement in Bash++.
Definition bpp.h:852
void set_cast_to(const std::string &cast_to)
Definition bpp_dynamic_cast_statement.cpp:11
std::string get_cast_to() const
Definition bpp_dynamic_cast_statement.cpp:15
std::string cast_to
Definition bpp.h:854
The target of a dynamic_cast in Bash++.
Definition bpp.h:872
The base class for all entities in the Bash++ compiler.
Definition bpp.h:182
std::shared_ptr< bpp_class > get_parent() const
Definition bpp_entity.cpp:180
std::unordered_map< std::string, std::shared_ptr< bpp_object > > get_objects() const
Definition bpp_entity.cpp:143
bpp_entity()=default
std::weak_ptr< bpp_class > type
Definition bpp.h:204
std::unordered_map< std::string, std::weak_ptr< bpp_class > > classes
A map of class names to class objects within this entity.
Definition bpp.h:189
virtual void set_name(const std::string &name)
Definition bpp_entity.cpp:54
std::unordered_map< std::string, std::shared_ptr< bpp_object > > local_objects
Like objects, but only for objects whose scope is local to this entity.
Definition bpp.h:203
virtual std::weak_ptr< bpp::bpp_class > get_containing_class()
Get the class which contains this entity.
Definition bpp_entity.cpp:67
std::string name
Definition bpp.h:184
virtual bool add_object(std::shared_ptr< bpp_object > object, bool make_local=false)
Add an object to this entity's list of objects.
Definition bpp_entity.cpp:30
virtual ~bpp_entity()=default
bpp_entity & operator=(bpp_entity &&other) noexcept=default
std::unordered_map< std::string, std::shared_ptr< bpp_class > > get_classes() const
Definition bpp_entity.cpp:134
std::vector< std::weak_ptr< bpp_class > > parents
Definition bpp.h:207
void add_reference(const std::string &file, uint64_t line, uint64_t column)
Definition bpp_entity.cpp:89
bpp::SymbolPosition get_initial_definition() const
Definition bpp_entity.cpp:85
bpp_entity(const bpp_entity &other)=default
const std::unordered_map< std::string, std::shared_ptr< bpp_object > > & get_local_objects() const
Definition bpp_entity.cpp:155
std::weak_ptr< bpp_program > containing_program
Definition bpp.h:206
virtual std::weak_ptr< bpp_program > get_containing_program()
Definition bpp_entity.cpp:71
std::weak_ptr< bpp_method > overridden_method
Definition bpp.h:208
std::shared_ptr< bpp_object > get_object(const std::string &name)
Definition bpp_entity.cpp:168
virtual std::string get_address() const
Definition bpp_entity.cpp:50
std::list< bpp::SymbolPosition > references
Definition bpp.h:210
std::unordered_map< std::string, std::weak_ptr< bpp_object > > objects
A map of object names to bpp_objects within this entity.
Definition bpp.h:195
std::weak_ptr< bpp_class > containing_class
Definition bpp.h:205
virtual bool set_containing_class(std::weak_ptr< bpp::bpp_class > containing_class)
Definition bpp_entity.cpp:75
virtual std::string get_name() const
Definition bpp_entity.cpp:58
std::list< bpp::SymbolPosition > get_references() const
Definition bpp_entity.cpp:100
void inherit(std::shared_ptr< bpp_entity > parent)
Inherit from a parent entity.
Definition bpp_entity.cpp:111
virtual bool add_class(std::shared_ptr< bpp_class > class_)
Add a class to this entity's list of classes.
Definition bpp_entity.cpp:16
void set_definition_position(const std::string &file, uint64_t line, uint64_t column)
Definition bpp_entity.cpp:80
bpp_entity(bpp_entity &&other) noexcept=default
bpp_entity & operator=(const bpp_entity &other)=default
virtual std::shared_ptr< bpp_class > get_class()
Definition bpp_entity.cpp:46
bpp::SymbolPosition initial_definition
Definition bpp.h:209
A parameter in a method.
Definition bpp.h:453
void set_class(std::shared_ptr< bpp_class >)
Definition bpp_method_parameter.cpp:15
A method in a class.
Definition bpp.h:421
bool inherited
Definition bpp.h:427
void set_last_override(const std::string &class_name)
Definition bpp_method.cpp:95
bool add_object(std::shared_ptr< bpp_object > object, bool make_local) override
Add an object to the code entity.
Definition bpp_method.cpp:127
bool add_object_as_parameter(std::shared_ptr< bpp_object > object)
Add a pointer to a non-primitive object as a parameter to the method.
Definition bpp_method.cpp:18
virtual bool add_parameter(std::shared_ptr< bpp_method_parameter > parameter)
Add a parameter to the method.
Definition bpp_method.cpp:49
bool is_virtual() const
Definition bpp_method.cpp:111
void set_scope(bpp_scope scope)
Definition bpp_method.cpp:78
bpp_scope scope
Definition bpp.h:424
void set_overridden_method(std::weak_ptr< bpp_method > method)
Definition bpp_method.cpp:99
bool m_is_overridable
Definition bpp.h:426
std::vector< std::shared_ptr< bpp_method_parameter > > get_parameters() const
Definition bpp_method.cpp:103
std::string last_override
Definition bpp.h:429
std::string get_last_override() const
Definition bpp_method.cpp:123
void set_virtual(bool is_virtual)
Definition bpp_method.cpp:82
bpp_scope get_scope() const
Definition bpp_method.cpp:107
void set_inherited(bool is_inherited)
Definition bpp_method.cpp:91
std::vector< std::shared_ptr< bpp_method_parameter > > parameters
Definition bpp.h:423
void set_overridable(bool is_overridable)
Definition bpp_method.cpp:87
bool is_inherited() const
Definition bpp_method.cpp:119
bool m_is_virtual
Definition bpp.h:425
bool is_overridable() const
Definition bpp_method.cpp:115
An object assignment statement in Bash++.
Definition bpp.h:910
void set_rvalue_array(bool is_array)
Definition bpp_object_assignment.cpp:39
bool rvalue_array
Definition bpp.h:919
bool rvalue_is_array() const
Definition bpp_object_assignment.cpp:71
void set_adding(bool is_adding)
Definition bpp_object_assignment.cpp:35
bool adding
Definition bpp.h:918
std::shared_ptr< bpp_entity > lvalue_object
Definition bpp.h:916
void set_rvalue_nonprimitive(bool is_nonprimitive)
Definition bpp_object_assignment.cpp:23
bool rvalue_nonprimitive
Definition bpp.h:915
std::shared_ptr< bpp_entity > get_lvalue_object() const
Definition bpp_object_assignment.cpp:59
void set_lvalue(const std::string &lvalue)
Definition bpp_object_assignment.cpp:11
bool rvalue_is_nonprimitive() const
Definition bpp_object_assignment.cpp:55
void set_lvalue_object(std::shared_ptr< bpp_entity > object)
Definition bpp_object_assignment.cpp:27
std::string get_rvalue() const
Definition bpp_object_assignment.cpp:47
std::string get_lvalue() const
Definition bpp_object_assignment.cpp:43
void set_lvalue_nonprimitive(bool is_nonprimitive)
Definition bpp_object_assignment.cpp:19
void set_rvalue(const std::string &rvalue)
Definition bpp_object_assignment.cpp:15
std::shared_ptr< bpp_entity > rvalue_object
Definition bpp.h:917
std::string lvalue
Definition bpp.h:912
bool lvalue_is_nonprimitive() const
Definition bpp_object_assignment.cpp:51
std::string rvalue
Definition bpp.h:913
bool lvalue_nonprimitive
Definition bpp.h:914
bool is_adding() const
Definition bpp_object_assignment.cpp:67
std::shared_ptr< bpp_entity > get_rvalue_object() const
Definition bpp_object_assignment.cpp:63
void set_rvalue_object(std::shared_ptr< bpp_entity > object)
Definition bpp_object_assignment.cpp:31
An object reference in Bash++.
Definition bpp.h:947
void set_array_index(const std::string &array_index)
Definition bpp_object_reference.cpp:15
bool has_array_index() const
Definition bpp_object_reference.cpp:27
bpp::reference_type get_reference_type() const
Definition bpp_object_reference.cpp:19
std::string array_index
Definition bpp.h:950
std::string get_array_index() const
Definition bpp_object_reference.cpp:23
void set_reference_type(bpp::reference_type reference_type)
Definition bpp_object_reference.cpp:11
An object in Bash++.
Definition bpp.h:501
std::string get_pre_access_code() const
Definition bpp_object.cpp:49
bool is_pointer() const
Definition bpp_object.cpp:57
void set_pre_access_code(const std::string &pre_access_code)
Definition bpp_object.cpp:27
void set_pointer(bool is_pointer)
Definition bpp_object.cpp:15
void set_address(const std::string &address)
Definition bpp_object.cpp:19
std::string address
Definition bpp.h:503
void set_post_access_code(const std::string &post_access_code)
Definition bpp_object.cpp:31
std::string get_post_access_code() const
Definition bpp_object.cpp:53
std::string get_assignment_value() const
Definition bpp_object.cpp:45
void set_assignment_value(const std::string &assignment_value)
Definition bpp_object.cpp:23
std::string pre_access_code
Definition bpp.h:505
void set_nullptr()
Definition bpp_object.cpp:35
std::string post_access_code
Definition bpp.h:506
bool m_is_pointer
Definition bpp.h:507
std::string assignment_value
Definition bpp.h:504
std::shared_ptr< bpp::bpp_object > get_copy_from() const
Definition bpp_object.cpp:61
std::string get_address() const override
Definition bpp_object.cpp:41
void set_class(std::shared_ptr< bpp_class > object_class)
Definition bpp_object.cpp:11
std::shared_ptr< bpp::bpp_object > copy_from
Definition bpp.h:508
The main program.
Definition bpp.h:553
uint64_t get_dynamic_cast_counter() const
Definition bpp_program.cpp:182
std::vector< std::string > get_source_files() const
Definition bpp_program.cpp:245
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:285
uint64_t assignment_counter
Definition bpp.h:557
std::shared_ptr< bpp_class > primitive_class
Definition bpp.h:555
uint64_t dynamic_cast_counter
Definition bpp.h:559
void set_main_source_file(const std::string &file)
Definition bpp_program.cpp:258
std::unordered_map< std::string, std::shared_ptr< bpp::bpp_class > > owned_classes
Definition bpp.h:569
std::weak_ptr< bpp_program > get_containing_program() override
Definition bpp_program.cpp:38
bool set_containing_class(std::weak_ptr< bpp_class > containing_class) override
Definition bpp_program.cpp:26
uint64_t get_supershell_counter() const
Definition bpp_program.cpp:146
std::string get_main_source_file() const
Definition bpp_program.cpp:254
void increment_typeof_counter()
Definition bpp_program.cpp:186
std::shared_ptr< AST::Program > get_source_file_ast(const std::string &file) const
Definition bpp_program.cpp:277
void increment_function_counter()
Definition bpp_program.cpp:158
std::unordered_map< std::string, EntityMap > entity_maps
Definition bpp.h:576
std::string main_source_file
Definition bpp.h:565
uint64_t get_typeof_counter() const
Definition bpp_program.cpp:196
uint64_t get_assignment_counter() const
Definition bpp_program.cpp:154
uint64_t object_counter
Definition bpp.h:561
std::shared_ptr< bpp_class > get_primitive_class() const
Definition bpp_program.cpp:34
std::shared_ptr< bpp::bpp_entity > get_active_entity(const std::string &file, uint32_t line, uint32_t column)
Definition bpp_program.cpp:227
uint64_t supershell_counter
Definition bpp.h:556
std::vector< bpp::diagnostic > get_diagnostics(const std::string &file) const
Definition bpp_program.cpp:302
std::shared_ptr< std::vector< std::string > > get_include_paths() const
Definition bpp_program.cpp:129
uint64_t get_function_counter() const
Definition bpp_program.cpp:168
std::unordered_map< std::string, std::vector< bpp::diagnostic > > diagnostics
Definition bpp.h:581
uint64_t typeof_counter
Definition bpp.h:560
uint64_t function_counter
Definition bpp.h:558
bool add_class(std::shared_ptr< bpp_class > class_) override
Add a class to the program.
Definition bpp_program.cpp:67
void set_target_bash_version(BashVersion target_bash_version)
Definition bpp_program.cpp:208
bpp_program(bpp_program &&other) noexcept=default
uint64_t get_object_counter() const
Definition bpp_program.cpp:204
void increment_dynamic_cast_counter()
Definition bpp_program.cpp:172
bpp_program()
Definition bpp_program.cpp:14
BashVersion get_target_bash_version() const
Definition bpp_program.cpp:212
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:52
void add_source_file(const std::string &file)
Definition bpp_program.cpp:266
bpp_program(const bpp_program &other)=default
void increment_supershell_counter()
Definition bpp_program.cpp:133
bpp_program & operator=(const bpp_program &other)=default
~bpp_program() override=default
std::shared_ptr< std::vector< std::string > > include_paths
Definition bpp.h:585
void increment_assignment_counter()
Definition bpp_program.cpp:150
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:216
void set_source_file_ast(const std::string &file, std::shared_ptr< AST::Program > ast)
Definition bpp_program.cpp:273
BashVersion target_bash_version
Definition bpp.h:563
void set_output_stream(std::shared_ptr< std::ostream > output_stream)
Definition bpp_program.cpp:30
void increment_object_counter()
Definition bpp_program.cpp:200
bpp_program & operator=(bpp_program &&other) noexcept=default
void clear_diagnostics(const std::string &file)
Definition bpp_program.cpp:310
void set_include_paths(std::shared_ptr< std::vector< std::string > > paths)
Definition bpp_program.cpp:125
std::unordered_map< std::string, std::shared_ptr< AST::Program > > source_file_asts
Definition bpp.h:573
The practical difference between bpp_code_entity and bpp_string is how we handle the code buffers.
Definition bpp.h:366
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition bpp_string.cpp:39
void add_code(const std::string &code, bool add_newline=true) override
Add code to the primary buffer.
Definition bpp_string.cpp:17
void add_code_to_previous_line(const std::string &code) override
Add code to the pre-code buffer.
Definition bpp_string.cpp:24
void add_code_to_next_line(const std::string &code) override
Add code to the post-code buffer.
Definition bpp_string.cpp:31
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition bpp_string.cpp:35
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition bpp_string.cpp:47
A value assignment statement in Bash++.
Definition bpp.h:882
bool is_array_assignment() const
Definition bpp_value_assignment.cpp:43
std::shared_ptr< bpp_entity > nonprimitive_object
Definition bpp.h:885
bool nonprimitive_assignment
Definition bpp.h:884
bool is_nonprimitive_assignment() const
Definition bpp_value_assignment.cpp:31
bool array_assignment
Definition bpp.h:887
std::shared_ptr< bpp_entity > get_nonprimitive_object() const
Definition bpp_value_assignment.cpp:35
bool lvalue_nonprimitive
Definition bpp.h:886
void set_adding(bool is_adding)
Definition bpp_value_assignment.cpp:27
void set_lvalue_nonprimitive(bool is_nonprimitive)
Definition bpp_value_assignment.cpp:19
void set_array_assignment(bool is_array)
Definition bpp_value_assignment.cpp:23
void set_nonprimitive_assignment(bool is_nonprimitive)
Definition bpp_value_assignment.cpp:11
bool lvalue_is_nonprimitive() const
Definition bpp_value_assignment.cpp:39
bool is_adding() const
Definition bpp_value_assignment.cpp:47
void set_nonprimitive_object(std::shared_ptr< bpp_entity > object)
Definition bpp_value_assignment.cpp:15
bool adding
Definition bpp.h:888
Definition bash_case.cpp:9
bpp_scope
Definition bpp.h:22
@ SCOPE_PUBLIC
Definition bpp.h:23
@ SCOPE_INACCESSIBLE
Definition bpp.h:26
@ SCOPE_PRIVATE
Definition bpp.h:25
@ SCOPE_PROTECTED
Definition bpp.h:24
const std::shared_ptr< bpp_method > inaccessible_method
A placeholder for an inaccessible method of a class (scope handling)
Definition bpp.h:103
const std::shared_ptr< bpp_datamember > inaccessible_datamember
A placeholder for an inaccessible data member of a class (scope handling)
Definition bpp.h:97
static const char bpp_nullptr[]
The secret internal value of '@nullptr' in Bash++.
Definition bpp.h:109
const std::shared_ptr< bpp_entity > inaccessible_entity
A placeholder for an inaccessible entity (scope handling)
Definition bpp.h:91
bool is_valid_identifier(const std::string &identifier)
Check if a string is a valid identifier in Bash++.
Definition bpp.h:141
constexpr const char * protected_keywords[]
A list of keywords that are reserved and cannot be used as identifiers in Bash++.
Definition bpp.h:115
bool is_protected_keyword(const std::string &keyword)
Check if a string matches any of our protected keywords.
Definition bpp.h:127
reference_type
Definition bpp.h:29
@ ref_method
Definition bpp.h:31
@ ref_object
Definition bpp.h:32
@ ref_primitive
Definition bpp.h:30
diagnostic_type
Definition bpp.h:35
@ DIAGNOSTIC_INFO
Definition bpp.h:38
@ DIAGNOSTIC_ERROR
Definition bpp.h:36
@ DIAGNOSTIC_WARNING
Definition bpp.h:37
@ DIAGNOSTIC_HINT
Definition bpp.h:39
Represents a Bash version to target for code generation.
Definition BashVersion.h:22
Definition bpp.h:165
std::string file
Definition bpp.h:166
SymbolPosition()=default
uint64_t column
Definition bpp.h:168
SymbolPosition(const std::string &file, uint64_t line, uint64_t column)
Definition bpp.h:171
uint64_t line
Definition bpp.h:167
Represents a diagnostic message (error, warning, info, hint)
Definition bpp.h:49
uint32_t start_line
Definition bpp.h:52
uint32_t end_line
Definition bpp.h:54
diagnostic_type type
Definition bpp.h:50
std::string message
Definition bpp.h:51
uint32_t end_column
Definition bpp.h:55
uint32_t start_column
Definition bpp.h:53