Bash++
Bash++ compiler internal documentation
bpp.h
Go to the documentation of this file.
1
6#pragma once
7
8#include <string>
9#include <sstream>
10#include <vector>
11#include <unordered_map>
12#include <list>
13#include <memory>
14
15#include "replace_all.h"
16
17#include <include/EntityMap.h>
18#include <include/BashVersion.h>
19#include <AST/Nodes/Program.h>
20
21namespace bpp {
22
29
35
42
50struct diagnostic {
52 std::string message;
53 uint32_t start_line;
54 uint32_t start_column;
55 uint32_t end_line;
56 uint32_t end_column;
57};
58
59// Forward declarations
60
61class bpp_entity;
62class bpp_code_entity;
63class bpp_string;
64class bpp_method;
66class bpp_class;
67class bpp_object;
68class bpp_datamember;
69class bpp_program;
70
71// Statement types
74class bash_if;
75class bash_if_branch;
76class bash_case;
79class bash_function;
82class bpp_pointer_dereference;
86class bpp_object_address;
87
92inline const std::shared_ptr<bpp_entity> inaccessible_entity = std::make_shared<bpp_entity>();
93
98inline const std::shared_ptr<bpp_datamember> inaccessible_datamember = std::make_shared<bpp_datamember>();
99
104inline const std::shared_ptr<bpp_method> inaccessible_method = std::make_shared<bpp_method>();
105
110static const char bpp_nullptr[] = "0";
111
116inline constexpr const char* protected_keywords[] = {
117 "class", "constructor", "delete", "destructor",
118 "dynamic_cast", "include", "include_once", "local", "method",
119 "new", "nullptr", "primitive", "private",
120 "protected", "public", "super", "this",
121 "typeof", "virtual"
122 };
123
128inline bool is_protected_keyword(const std::string& keyword) {
129 for (const char* protected_keyword : protected_keywords) {
130 if (keyword == protected_keyword) {
131 return true;
132 }
133 }
134 return false;
135}
136
142inline bool is_valid_identifier(const std::string& identifier) {
143 // Verify it's not empty, and not a reserved keyword
144 if (identifier.empty() || is_protected_keyword(identifier)) {
145 return false;
146 }
147
148 // Verify it doesn't contain two consecutive underscores
149 if (identifier.find("__") != std::string::npos) {
150 return false;
151 }
152
153 // Verify it starts with a letter or underscore, and contains only letters, digits, and underscores
154 if (!isalpha(identifier[0]) && identifier[0] != '_') {
155 return false;
156 }
157
158 for (char c : identifier) {
159 if (!isalnum(c) && c != '_') {
160 return false;
161 }
162 }
163
164 // If all checks passed, it's a valid identifier
165 return true;
166}
167
169 std::string file;
170 uint64_t line;
171 uint64_t column;
172
174 SymbolPosition(const std::string& file, uint64_t line, uint64_t column)
175 : file(file), line(line), column(column) {}
176};
177
186 protected:
187 std::string name = "";
192 std::unordered_map<std::string, std::weak_ptr<bpp_class>> classes;
193
198 std::unordered_map<std::string, std::weak_ptr<bpp_object>> objects;
199
206 std::unordered_map<std::string, std::shared_ptr<bpp_object>> local_objects;
207 std::shared_ptr<bpp_class> type = nullptr;
208 std::weak_ptr<bpp_class> containing_class;
209 std::weak_ptr<bpp_program> containing_program;
210 std::vector<std::weak_ptr<bpp_class>> parents;
211 std::weak_ptr<bpp_method> overridden_method;
213 std::list<bpp::SymbolPosition> references;
214 public:
215 virtual ~bpp_entity() = default;
216 virtual bool add_class(std::shared_ptr<bpp_class> class_);
217 virtual bool add_object(std::shared_ptr<bpp_object> object, bool make_local = false);
218
219 virtual std::shared_ptr<bpp_class> get_class();
220 virtual std::string get_address() const;
221 virtual void set_name(const std::string& name);
222 virtual std::string get_name() const;
223 virtual std::weak_ptr<bpp::bpp_class> get_containing_class();
224 virtual std::weak_ptr<bpp_program> get_containing_program();
225 virtual bool set_containing_class(std::weak_ptr<bpp::bpp_class> containing_class);
226
227 void inherit(std::shared_ptr<bpp_entity> parent);
228 void inherit(std::shared_ptr<bpp_program> program);
229 virtual void inherit(std::shared_ptr<bpp_class> parent);
230
231 void set_definition_position(const std::string& file, uint64_t line, uint64_t column);
232 void add_reference(const std::string& file, uint64_t line, uint64_t column);
233
235 std::list<bpp::SymbolPosition> get_references() const;
236
237 std::unordered_map<std::string, std::shared_ptr<bpp_class>> get_classes() const;
238 std::unordered_map<std::string, std::shared_ptr<bpp_object>> get_objects() const;
239 std::shared_ptr<bpp_class> get_class(const std::string& name);
240 std::shared_ptr<bpp_object> get_object(const std::string& name);
241
242 std::shared_ptr<bpp_class> get_parent() const;
243};
244
263 protected:
264 std::shared_ptr<std::ostream> code = std::make_shared<std::ostringstream>();
265 std::string nextline_buffer = "";
266 std::string postline_buffer = "";
267 bool buffers_flushed = false;
268
275 public:
277
278 virtual void add_code(const std::string& code, bool add_newline = true);
279 virtual void add_code_to_previous_line(const std::string& code);
280 virtual void add_code_to_next_line(const std::string& code);
281
282 bool add_object(std::shared_ptr<bpp_object> object, bool make_local = false) override;
283
284 virtual void flush_nextline_buffer();
285 virtual void flush_postline_buffer();
286 virtual void flush_code_buffers();
287
288 virtual void clear_all_buffers();
289
290 virtual std::string get_code() const;
291 virtual std::string get_pre_code() const;
292 virtual std::string get_post_code() const;
293
294 void set_requires_perfect_forwarding(bool require);
296};
297
360 public:
361 bpp_string();
362
363 void add_code(const std::string& code, bool add_newline = true) override;
364 void add_code_to_previous_line(const std::string& code) override;
365 void add_code_to_next_line(const std::string& code) override;
366
367 std::string get_code() const override;
368 std::string get_pre_code() const override;
369 std::string get_post_code() const override;
370};
371
392 protected:
393 std::string joined_code = "";
395
396 bool perfect_forwarding = false;
397
398 void join();
399 public:
401
402 void add_connective(bool is_and);
403
404 void add_code(const std::string& code, bool add_newline = true) override;
405
406 std::string get_code() const override;
407 std::string get_pre_code() const override;
408 std::string get_post_code() const override;
409
410 void set_perfect_forwarding(bool enable);
411};
412
419 private:
420 std::vector<std::shared_ptr<bpp_method_parameter>> parameters;
422 bool m_is_virtual = false;
423 bool m_is_overridable = false;
424 bool inherited = false;
425 bool add_object_as_parameter(std::shared_ptr<bpp_object> object);
426 std::string last_override; // Name of the latest class to override this virtual method
427 public:
428 bpp_method();
429 explicit bpp_method(const std::string& name);
430 bpp_method(const std::string& name, bool is_virtual);
431
432 virtual bool add_parameter(std::shared_ptr<bpp_method_parameter> parameter);
434 void set_virtual(bool is_virtual);
436 void set_inherited(bool is_inherited);
437 void set_last_override(const std::string& class_name);
438 void set_overridden_method(std::weak_ptr<bpp_method> method);
439 bool add_object(std::shared_ptr<bpp_object> object, bool make_local) override;
440
441 std::vector<std::shared_ptr<bpp_method_parameter>> get_parameters() const;
442 bpp_scope get_scope() const;
443 bool is_virtual() const;
444 bool is_overridable() const;
445 bool is_inherited() const;
446 std::string get_last_override() const;
447
448 void destruct_local_objects(std::shared_ptr<bpp_program> program);
449};
450
457 public:
458 explicit bpp_method_parameter(const std::string& name);
459
460 void set_type(std::shared_ptr<bpp_class>);
461 std::shared_ptr<bpp_class> get_type() const;
462};
463
469class bpp_class : public bpp_entity, public std::enable_shared_from_this<bpp_class> {
470 private:
471 std::vector<std::shared_ptr<bpp_method>> methods;
472 std::vector<std::shared_ptr<bpp_datamember>> datamembers;
474
477 public:
478 bpp_class();
479
480 std::weak_ptr<bpp_class> get_containing_class() override;
481 bool set_containing_class(std::weak_ptr<bpp::bpp_class> containing_class) override;
482
483 std::shared_ptr<bpp_class> get_class() override;
484
485 void set_name(const std::string& name) override;
486 bool add_method(std::shared_ptr<bpp_method> method);
487 bool add_datamember(std::shared_ptr<bpp_datamember> datamember);
488
489 std::vector<std::shared_ptr<bpp_method>> get_methods() const;
490 std::vector<std::shared_ptr<bpp_datamember>> get_datamembers() const;
491
492 std::shared_ptr<bpp_method> get_method(const std::string& name, std::shared_ptr<bpp_entity> context);
493 std::shared_ptr<bpp_method> get_method_UNSAFE(const std::string& name);
494 std::shared_ptr<bpp_datamember> get_datamember(const std::string& name, std::shared_ptr<bpp_entity> context);
495 std::shared_ptr<bpp_datamember> get_datamember_UNSAFE(const std::string& name);
496
498 void inherit(std::shared_ptr<bpp_class> parent) override;
499 std::shared_ptr<bpp::bpp_class> get_parent();
500};
501
507class bpp_object : public bpp_entity {
508 protected:
509 std::string address = "";
510 std::string assignment_value = "";
511 std::string pre_access_code = "";
512 std::string post_access_code = "";
513 bool m_is_pointer = false;
514 std::shared_ptr<bpp::bpp_object> copy_from = nullptr;
515 public:
516 bpp_object();
517 explicit bpp_object(const std::string& name);
518 bpp_object(const std::string& name, bool is_pointer);
519
520 void set_class(std::shared_ptr<bpp_class> object_class);
521 void set_pointer(bool is_pointer);
522 void set_address(const std::string& address);
523 void set_assignment_value(const std::string& assignment_value);
524 void set_pre_access_code(const std::string& pre_access_code);
525 void set_post_access_code(const std::string& post_access_code);
526 void set_nullptr();
527
528 std::string get_address() const override;
529 std::string get_assignment_value() const;
530 std::shared_ptr<bpp_class> get_class() override;
531 std::string get_pre_access_code() const;
532 std::string get_post_access_code() const;
533 std::shared_ptr<bpp::bpp_object> get_copy_from() const;
534
535 bool is_pointer() const;
536};
537
544 private:
545 std::string default_value = "";
547 bool array = false;
548 public:
550
551 void set_default_value(const std::string& default_value);
553 void set_array(bool is_array);
554
555 std::string get_address() const override;
556 std::string get_default_value() const;
557 bpp_scope get_scope() const;
558 bool is_array() const;
559};
560
566class bpp_program : public bpp_code_entity, public std::enable_shared_from_this<bpp_program> {
567 private:
568 std::shared_ptr<bpp_class> primitive_class;
569 uint64_t supershell_counter = 0;
570 uint64_t assignment_counter = 0;
571 uint64_t function_counter = 0;
573 uint64_t typeof_counter = 0;
574 uint64_t object_counter = 0;
575
577
578 std::string main_source_file;
579
580 // To ensure that the bpp_program **owns** its classes
581 // I.e., that those classes don't get destroyed before we're done with them
582 std::unordered_map<std::string, std::shared_ptr<bpp::bpp_class>> owned_classes;
583
584 // Source file -> AST
585 // Used for advanced analysis, e.g. LSP features
586 std::unordered_map<std::string, std::shared_ptr<AST::Program>> source_file_asts;
587
588 // Source file -> EntityMap
589 std::unordered_map<std::string, EntityMap> entity_maps;
590 // s.t. requesting entity_maps["/path/to/file1.bpp"] returns an EntityMap
591 // which outlines for us which container entities are active at each point in the file
592
593 // Source file -> Diagnostics
594 std::unordered_map<std::string, std::vector<bpp::diagnostic>> diagnostics;
595 // Each 'diagnostic' contains a type (error, warning, etc), message, and position in the source file
596
597 // For debug info:
598 std::shared_ptr<std::vector<std::string>> include_paths;
599 public:
600 bpp_program();
601
602 bool set_containing_class(std::weak_ptr<bpp_class> containing_class) override;
603 void set_output_stream(std::shared_ptr<std::ostream> output_stream);
604
605 bool prepare_class(std::shared_ptr<bpp_class> class_);
606 bool add_class(std::shared_ptr<bpp_class> class_) override;
607
608 std::shared_ptr<bpp_class> get_primitive_class() const;
609
610 std::weak_ptr<bpp_program> get_containing_program() override;
611
612 void set_include_paths(std::shared_ptr<std::vector<std::string>> paths);
613 std::shared_ptr<std::vector<std::string>> get_include_paths() const;
614
616 uint64_t get_supershell_counter() const;
617
619 uint64_t get_assignment_counter() const;
620
622 uint64_t get_function_counter() const;
623
625 uint64_t get_dynamic_cast_counter() const;
626
628 uint64_t get_typeof_counter() const;
629
631 uint64_t get_object_counter() const;
632
635
636 void mark_entity(
637 const std::string& file,
638 uint32_t start_line, uint32_t start_column,
639 uint32_t end_line, uint32_t end_column,
640 std::shared_ptr<bpp::bpp_entity> entity
641 );
642
643 std::shared_ptr<bpp::bpp_entity> get_active_entity(
644 const std::string& file,
645 uint32_t line, uint32_t column
646 );
647
648 std::vector<std::string> get_source_files() const;
649 std::string get_main_source_file() const;
650 void set_main_source_file(const std::string& file);
651 void add_source_file(const std::string& file);
652
653 void set_source_file_ast(const std::string& file, std::shared_ptr<AST::Program> ast);
654 std::shared_ptr<AST::Program> get_source_file_ast(const std::string& file) const;
655
656 void add_diagnostic(
657 const std::string& file,
659 const std::string& message,
660 uint32_t start_line, uint32_t start_column,
661 uint32_t end_line, uint32_t end_column
662 );
663
664 std::vector<bpp::diagnostic> get_diagnostics(const std::string& file) const;
665 void clear_diagnostics(const std::string& file);
666};
667
683 private:
684 std::shared_ptr<bpp::bash_while_or_until_condition> condition;
685 public:
687
688 void set_condition(std::shared_ptr<bpp::bash_while_or_until_condition> condition);
689 std::shared_ptr<bpp::bash_while_or_until_condition> get_condition() const;
690
691 std::string get_code() const override;
692 std::string get_pre_code() const override;
693 std::string get_post_code() const override;
694};
695
704 public:
706};
707
726class bash_if : public bpp_string {
727 private:
728 std::vector<std::pair<std::string, std::string>> conditional_branches = {};
729 public:
730 bash_if();
731
732 void new_branch();
733 void add_condition_code(const std::string& condition_code);
734 void add_branch_code(const std::string& branch_code);
735 const std::vector<std::pair<std::string, std::string>>& get_conditional_branches() const;
736};
737
749 private:
750 std::shared_ptr<bpp::bash_if> if_statement;
751 public:
753
754 void set_if_statement(std::shared_ptr<bpp::bash_if> if_statement);
755 std::shared_ptr<bpp::bash_if> get_if_statement() const;
756
757 std::string get_code() const override;
758 std::string get_pre_code() const override;
759 std::string get_post_code() const override;
760};
761
771class bash_case : public bpp_string {
772 private:
773 std::string cases = "";
774 public:
775 bash_case();
776
777 void add_case(const std::string& case_);
778
779 const std::string& get_cases() const;
780};
781
792 private:
793 std::string pattern = "";
794 std::shared_ptr<bpp::bash_case> containing_case;
795 public:
797
798 void set_pattern(const std::string& pattern);
799 void set_containing_case(std::shared_ptr<bpp::bash_case> containing_case);
800
801 const std::string& get_pattern() const;
802 std::shared_ptr<bpp::bash_case> get_containing_case() const;
803};
804
815 private:
816 std::string header_pre_code = "";
817 std::string header_post_code = "";
818 std::string header_code = "";
819 public:
821
822 void set_header_pre_code(const std::string& pre_code);
823 void set_header_post_code(const std::string& post_code);
824 void set_header_code(const std::string& code);
825
826 const std::string& get_header_pre_code() const;
827 const std::string& get_header_post_code() const;
828 const std::string& get_header_code() const;
829};
830
841 public:
843};
844
857 private:
858 std::shared_ptr<bpp::bpp_object> object_to_delete;
859 public:
861
862 void set_object_to_delete(std::shared_ptr<bpp::bpp_object> object);
863 std::shared_ptr<bpp::bpp_object> get_object_to_delete() const;
864};
865
878 private:
879 std::string cast_to;
880 public:
882
883 void set_cast_to(const std::string& cast_to);
884 std::string get_cast_to() const;
885};
886
900 public:
902};
903
912 private:
914 std::shared_ptr<bpp_entity> nonprimitive_object;
916 bool array_assignment = false;
917 bool adding = false;
918 public:
920
921 void set_nonprimitive_assignment(bool is_nonprimitive);
922 void set_nonprimitive_object(std::shared_ptr<bpp_entity> object);
923 void set_lvalue_nonprimitive(bool is_nonprimitive);
924 void set_array_assignment(bool is_array);
925 void set_adding(bool is_adding);
926
927 bool is_nonprimitive_assignment() const;
928 std::shared_ptr<bpp_entity> get_nonprimitive_object() const;
929 bool lvalue_is_nonprimitive() const;
930 bool is_array_assignment() const;
931 bool is_adding() const;
932};
933
942 private:
943 std::string lvalue = "";
944 std::string rvalue = "";
947 std::shared_ptr<bpp_entity> lvalue_object;
948 std::shared_ptr<bpp_entity> rvalue_object;
949 bool adding = false;
950 bool rvalue_array = false;
951 public:
953
954 void set_lvalue(const std::string& lvalue);
955 void set_rvalue(const std::string& rvalue);
956 void set_lvalue_nonprimitive(bool is_nonprimitive);
957 void set_rvalue_nonprimitive(bool is_nonprimitive);
958 void set_lvalue_object(std::shared_ptr<bpp_entity> object);
959 void set_rvalue_object(std::shared_ptr<bpp_entity> object);
960 void set_adding(bool is_adding);
961 void set_rvalue_array(bool is_array);
962
963 std::string get_lvalue() const;
964 std::string get_rvalue() const;
965 bool lvalue_is_nonprimitive() const;
966 bool rvalue_is_nonprimitive() const;
967 std::shared_ptr<bpp_entity> get_lvalue_object() const;
968 std::shared_ptr<bpp_entity> get_rvalue_object() const;
969 bool is_adding() const;
970 bool rvalue_is_array() const;
971};
972
981 private:
983 std::string array_index = "";
984 public:
986
988 void set_array_index(const std::string& array_index);
990 std::string get_array_index() const;
991 bool has_array_index() const;
992};
993
994} // namespace bpp
A pattern for a case statement in Bash++.
Definition bpp.h:791
std::string pattern
Definition bpp.h:793
void set_containing_case(std::shared_ptr< bpp::bash_case > containing_case)
Definition bash_case_pattern.cpp:16
const std::string & get_pattern() const
Definition bash_case_pattern.cpp:20
void set_pattern(const std::string &pattern)
Definition bash_case_pattern.cpp:12
bash_case_pattern()
Definition bash_case_pattern.cpp:10
std::shared_ptr< bpp::bash_case > containing_case
Definition bpp.h:794
std::shared_ptr< bpp::bash_case > get_containing_case() const
Definition bash_case_pattern.cpp:24
A case statement in Bash++.
Definition bpp.h:771
std::string cases
Definition bpp.h:773
bash_case()
Definition bash_case.cpp:10
const std::string & get_cases() const
Definition bash_case.cpp:16
void add_case(const std::string &case_)
Definition bash_case.cpp:12
A sequence of bash commands connected by '&&' and '||'.
Definition bpp.h:391
std::string joined_code
Definition bpp.h:393
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition bash_command_sequence.cpp:104
void set_perfect_forwarding(bool enable)
Definition bash_command_sequence.cpp:108
bool perfect_forwarding
Definition bpp.h:396
void add_connective(bool is_and)
Add a connective to the command sequence, finalizing the previously-received pipeline....
Definition bash_command_sequence.cpp:72
void join()
Definition bash_command_sequence.cpp:10
void add_code(const std::string &code, bool add_newline=true) override
Add code to the code entity.
Definition bash_command_sequence.cpp:85
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition bash_command_sequence.cpp:100
bool contains_multiple_commands
Definition bpp.h:394
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition bash_command_sequence.cpp:96
A for loop or select statement in Bash++.
Definition bpp.h:814
const std::string & get_header_post_code() const
Definition bash_for_or_select.cpp:28
void set_header_post_code(const std::string &post_code)
Definition bash_for_or_select.cpp:16
const std::string & get_header_code() const
Definition bash_for_or_select.cpp:32
std::string header_pre_code
Definition bpp.h:816
bash_for_or_select()
Definition bash_for_or_select.cpp:10
std::string header_post_code
Definition bpp.h:817
std::string header_code
Definition bpp.h:818
const std::string & get_header_pre_code() const
Definition bash_for_or_select.cpp:24
void set_header_pre_code(const std::string &pre_code)
Definition bash_for_or_select.cpp:12
void set_header_code(const std::string &code)
Definition bash_for_or_select.cpp:20
A normal Bash function.
Definition bpp.h:840
bash_function()
Definition bash_function.cpp:10
A branch of an if statement in Bash++.
Definition bpp.h:748
void set_if_statement(std::shared_ptr< bpp::bash_if > if_statement)
Definition bash_if_branch.cpp:12
std::shared_ptr< bpp::bash_if > get_if_statement() const
Definition bash_if_branch.cpp:16
bash_if_branch()
Definition bash_if_branch.cpp:10
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition bash_if_branch.cpp:24
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition bash_if_branch.cpp:32
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition bash_if_branch.cpp:20
std::shared_ptr< bpp::bash_if > if_statement
Definition bpp.h:750
An if statement in Bash++.
Definition bpp.h:726
std::vector< std::pair< std::string, std::string > > conditional_branches
Definition bpp.h:728
void new_branch()
Definition bash_if.cpp:12
void add_branch_code(const std::string &branch_code)
Definition bash_if.cpp:20
void add_condition_code(const std::string &condition_code)
Definition bash_if.cpp:16
bash_if()
Definition bash_if.cpp:10
const std::vector< std::pair< std::string, std::string > > & get_conditional_branches() const
Definition bash_if.cpp:24
The condition for a while/until loop in Bash++.
Definition bpp.h:703
A while/until loop in Bash++.
Definition bpp.h:682
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition bash_while_or_until_loop.cpp:20
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:24
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:32
std::shared_ptr< bpp::bash_while_or_until_condition > condition
Definition bpp.h:684
void set_condition(std::shared_ptr< bpp::bash_while_or_until_condition > condition)
Definition bash_while_or_until_loop.cpp:12
bash_while_or_until_loop()
Definition bash_while_or_until_loop.cpp:10
std::shared_ptr< bpp::bash_while_or_until_condition > get_condition() const
Definition bash_while_or_until_loop.cpp:16
A class in Bash++.
Definition bpp.h:469
void set_name(const std::string &name) override
Definition bpp_class.cpp:63
bool set_containing_class(std::weak_ptr< bpp::bpp_class > containing_class) override
Definition bpp_class.cpp:59
bpp_class()
Definition bpp_class.cpp:11
std::shared_ptr< bpp_class > get_class() override
Definition bpp_class.cpp:55
void inherit(std::shared_ptr< bpp_class > parent) override
Inherit from a parent class.
Definition bpp_class.cpp:266
bool add_method(std::shared_ptr< bpp_method > method)
Add a method to the class.
Definition bpp_class.cpp:71
std::vector< std::shared_ptr< bpp_datamember > > get_datamembers() const
Definition bpp_class.cpp:155
void add_default_toPrimitive()
Add the default toPrimitive method.
Definition bpp_class.cpp:37
std::vector< std::shared_ptr< bpp_datamember > > datamembers
Definition bpp.h:472
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:227
bool has_custom_toPrimitive
Definition bpp.h:473
void remove_default_toPrimitive()
Remove the default toPrimitive method.
Definition bpp_class.cpp:19
std::shared_ptr< bpp::bpp_class > get_parent()
Definition bpp_class.cpp:298
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:172
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:205
std::shared_ptr< bpp_datamember > get_datamember_UNSAFE(const std::string &name)
Definition bpp_class.cpp:250
std::vector< std::shared_ptr< bpp_method > > get_methods() const
Definition bpp_class.cpp:151
std::weak_ptr< bpp_class > get_containing_class() override
Get the class which contains this entity.
Definition bpp_class.cpp:51
bool add_datamember(std::shared_ptr< bpp_datamember > datamember)
Add a datamember to the class.
Definition bpp_class.cpp:130
std::vector< std::shared_ptr< bpp_method > > methods
Definition bpp.h:471
An entity which can contain code.
Definition bpp.h:262
void set_requires_perfect_forwarding(bool require)
Definition bpp_code_entity.cpp:183
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:58
bpp_code_entity()
Definition bpp_code_entity.cpp:11
std::shared_ptr< std::ostream > code
Definition bpp.h:264
std::string postline_buffer
Definition bpp.h:266
virtual void flush_code_buffers()
Definition bpp_code_entity.cpp:83
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:50
virtual void flush_postline_buffer()
Definition bpp_code_entity.cpp:73
virtual std::string get_post_code() const
Return the contents of the post-code buffer as a string.
Definition bpp_code_entity.cpp:179
virtual std::string get_pre_code() const
Return the contents of the pre-code buffer as a string.
Definition bpp_code_entity.cpp:172
virtual void flush_nextline_buffer()
Definition bpp_code_entity.cpp:63
virtual void clear_all_buffers()
Definition bpp_code_entity.cpp:89
bool requires_perfect_forwarding
Signals to bash_command_sequence entities whether they should operate in perfect forwarding mode I....
Definition bpp.h:274
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:109
bool get_requires_perfect_forwarding() const
Definition bpp_code_entity.cpp:187
virtual void add_code(const std::string &code, bool add_newline=true)
Add code to the code entity.
Definition bpp_code_entity.cpp:23
virtual std::string get_code() const
Return the contents of the main code buffer as a string.
Definition bpp_code_entity.cpp:161
std::string nextline_buffer
Definition bpp.h:265
bool buffers_flushed
Definition bpp.h:267
A data member in a class.
Definition bpp.h:543
bool is_array() const
Definition bpp_datamember.cpp:36
bool array
Definition bpp.h:547
void set_scope(bpp_scope scope)
Definition bpp_datamember.cpp:16
std::string get_default_value() const
Definition bpp_datamember.cpp:28
void set_default_value(const std::string &default_value)
Definition bpp_datamember.cpp:12
std::string get_address() const override
Definition bpp_datamember.cpp:24
bpp_scope scope
Definition bpp.h:546
std::string default_value
Definition bpp.h:545
bpp_scope get_scope() const
Definition bpp_datamember.cpp:32
bpp_datamember()
Definition bpp_datamember.cpp:10
void set_array(bool is_array)
Definition bpp_datamember.cpp:20
A delete statement in Bash++.
Definition bpp.h:856
std::shared_ptr< bpp::bpp_object > get_object_to_delete() const
Definition bpp_delete_statement.cpp:14
void set_object_to_delete(std::shared_ptr< bpp::bpp_object > object)
Definition bpp_delete_statement.cpp:10
std::shared_ptr< bpp::bpp_object > object_to_delete
Definition bpp.h:858
A dynamic_cast statement in Bash++.
Definition bpp.h:877
void set_cast_to(const std::string &cast_to)
Definition bpp_dynamic_cast_statement.cpp:12
std::string get_cast_to() const
Definition bpp_dynamic_cast_statement.cpp:16
bpp_dynamic_cast_statement()
Definition bpp_dynamic_cast_statement.cpp:10
std::string cast_to
Definition bpp.h:879
The target of a dynamic_cast in Bash++.
Definition bpp.h:899
The base class for all entities in the Bash++ compiler.
Definition bpp.h:185
std::shared_ptr< bpp_class > get_parent() const
Definition bpp_entity.cpp:175
std::unordered_map< std::string, std::shared_ptr< bpp_object > > get_objects() const
Definition bpp_entity.cpp:142
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:192
virtual void set_name(const std::string &name)
Definition bpp_entity.cpp:53
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:206
virtual std::weak_ptr< bpp::bpp_class > get_containing_class()
Get the class which contains this entity.
Definition bpp_entity.cpp:66
std::string name
Definition bpp.h:187
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:29
virtual ~bpp_entity()=default
std::unordered_map< std::string, std::shared_ptr< bpp_class > > get_classes() const
Definition bpp_entity.cpp:133
std::vector< std::weak_ptr< bpp_class > > parents
Definition bpp.h:210
void add_reference(const std::string &file, uint64_t line, uint64_t column)
Definition bpp_entity.cpp:88
bpp::SymbolPosition get_initial_definition() const
Definition bpp_entity.cpp:84
std::weak_ptr< bpp_program > containing_program
Definition bpp.h:209
virtual std::weak_ptr< bpp_program > get_containing_program()
Definition bpp_entity.cpp:70
std::weak_ptr< bpp_method > overridden_method
Definition bpp.h:211
std::shared_ptr< bpp_object > get_object(const std::string &name)
Definition bpp_entity.cpp:163
std::shared_ptr< bpp_class > type
Definition bpp.h:207
virtual std::string get_address() const
Definition bpp_entity.cpp:49
std::list< bpp::SymbolPosition > references
Definition bpp.h:213
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:198
std::weak_ptr< bpp_class > containing_class
Definition bpp.h:208
virtual bool set_containing_class(std::weak_ptr< bpp::bpp_class > containing_class)
Definition bpp_entity.cpp:74
virtual std::string get_name() const
Definition bpp_entity.cpp:57
std::list< bpp::SymbolPosition > get_references() const
Definition bpp_entity.cpp:99
void inherit(std::shared_ptr< bpp_entity > parent)
Inherit from a parent entity.
Definition bpp_entity.cpp:110
virtual bool add_class(std::shared_ptr< bpp_class > class_)
Add a class to this entity's list of classes.
Definition bpp_entity.cpp:15
void set_definition_position(const std::string &file, uint64_t line, uint64_t column)
Definition bpp_entity.cpp:79
virtual std::shared_ptr< bpp_class > get_class()
Definition bpp_entity.cpp:45
bpp::SymbolPosition initial_definition
Definition bpp.h:212
A parameter in a method.
Definition bpp.h:456
std::shared_ptr< bpp_class > get_type() const
Definition bpp_method_parameter.cpp:18
void set_type(std::shared_ptr< bpp_class >)
Definition bpp_method_parameter.cpp:14
A method in a class.
Definition bpp.h:418
bool inherited
Definition bpp.h:424
void set_last_override(const std::string &class_name)
Definition bpp_method.cpp:99
bool add_object(std::shared_ptr< bpp_object > object, bool make_local) override
Add an object to the code entity.
Definition bpp_method.cpp:151
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:23
bpp_method(const std::string &name, bool is_virtual)
virtual bool add_parameter(std::shared_ptr< bpp_method_parameter > parameter)
Add a parameter to the method.
Definition bpp_method.cpp:54
bool is_virtual() const
Definition bpp_method.cpp:115
void set_scope(bpp_scope scope)
Definition bpp_method.cpp:82
bpp_scope scope
Definition bpp.h:421
void set_overridden_method(std::weak_ptr< bpp_method > method)
Definition bpp_method.cpp:103
bool m_is_overridable
Definition bpp.h:423
std::vector< std::shared_ptr< bpp_method_parameter > > get_parameters() const
Definition bpp_method.cpp:107
std::string last_override
Definition bpp.h:426
bpp_method()
Definition bpp_method.cpp:11
std::string get_last_override() const
Definition bpp_method.cpp:127
void set_virtual(bool is_virtual)
Definition bpp_method.cpp:86
bpp_scope get_scope() const
Definition bpp_method.cpp:111
void set_inherited(bool is_inherited)
Definition bpp_method.cpp:95
void destruct_local_objects(std::shared_ptr< bpp_program > program)
Destruct all local objects.
Definition bpp_method.cpp:138
std::vector< std::shared_ptr< bpp_method_parameter > > parameters
Definition bpp.h:420
void set_overridable(bool is_overridable)
Definition bpp_method.cpp:91
bool is_inherited() const
Definition bpp_method.cpp:123
bool m_is_virtual
Definition bpp.h:422
bool is_overridable() const
Definition bpp_method.cpp:119
An object assignment statement in Bash++.
Definition bpp.h:941
void set_rvalue_array(bool is_array)
Definition bpp_object_assignment.cpp:40
bool rvalue_array
Definition bpp.h:950
bool rvalue_is_array() const
Definition bpp_object_assignment.cpp:72
void set_adding(bool is_adding)
Definition bpp_object_assignment.cpp:36
bool adding
Definition bpp.h:949
std::shared_ptr< bpp_entity > lvalue_object
Definition bpp.h:947
void set_rvalue_nonprimitive(bool is_nonprimitive)
Definition bpp_object_assignment.cpp:24
bool rvalue_nonprimitive
Definition bpp.h:946
bpp_object_assignment()
Definition bpp_object_assignment.cpp:10
std::shared_ptr< bpp_entity > get_lvalue_object() const
Definition bpp_object_assignment.cpp:60
void set_lvalue(const std::string &lvalue)
Definition bpp_object_assignment.cpp:12
bool rvalue_is_nonprimitive() const
Definition bpp_object_assignment.cpp:56
void set_lvalue_object(std::shared_ptr< bpp_entity > object)
Definition bpp_object_assignment.cpp:28
std::string get_rvalue() const
Definition bpp_object_assignment.cpp:48
std::string get_lvalue() const
Definition bpp_object_assignment.cpp:44
void set_lvalue_nonprimitive(bool is_nonprimitive)
Definition bpp_object_assignment.cpp:20
void set_rvalue(const std::string &rvalue)
Definition bpp_object_assignment.cpp:16
std::shared_ptr< bpp_entity > rvalue_object
Definition bpp.h:948
std::string lvalue
Definition bpp.h:943
bool lvalue_is_nonprimitive() const
Definition bpp_object_assignment.cpp:52
std::string rvalue
Definition bpp.h:944
bool lvalue_nonprimitive
Definition bpp.h:945
bool is_adding() const
Definition bpp_object_assignment.cpp:68
std::shared_ptr< bpp_entity > get_rvalue_object() const
Definition bpp_object_assignment.cpp:64
void set_rvalue_object(std::shared_ptr< bpp_entity > object)
Definition bpp_object_assignment.cpp:32
An object reference in Bash++.
Definition bpp.h:980
void set_array_index(const std::string &array_index)
Definition bpp_object_reference.cpp:16
bool has_array_index() const
Definition bpp_object_reference.cpp:28
bpp::reference_type get_reference_type() const
Definition bpp_object_reference.cpp:20
bpp::reference_type reference_type
Definition bpp.h:982
bpp_object_reference()
Definition bpp_object_reference.cpp:10
std::string array_index
Definition bpp.h:983
std::string get_array_index() const
Definition bpp_object_reference.cpp:24
void set_reference_type(bpp::reference_type reference_type)
Definition bpp_object_reference.cpp:12
An object in Bash++.
Definition bpp.h:507
std::string get_pre_access_code() const
Definition bpp_object.cpp:61
bool is_pointer() const
Definition bpp_object.cpp:69
void set_pre_access_code(const std::string &pre_access_code)
Definition bpp_object.cpp:35
void set_pointer(bool is_pointer)
Definition bpp_object.cpp:23
void set_address(const std::string &address)
Definition bpp_object.cpp:27
std::string address
Definition bpp.h:509
void set_post_access_code(const std::string &post_access_code)
Definition bpp_object.cpp:39
std::shared_ptr< bpp_class > get_class() override
Definition bpp_object.cpp:57
std::string get_post_access_code() const
Definition bpp_object.cpp:65
std::string get_assignment_value() const
Definition bpp_object.cpp:53
void set_assignment_value(const std::string &assignment_value)
Definition bpp_object.cpp:31
std::string pre_access_code
Definition bpp.h:511
void set_nullptr()
Definition bpp_object.cpp:43
std::string post_access_code
Definition bpp.h:512
bpp_object()
Definition bpp_object.cpp:10
bool m_is_pointer
Definition bpp.h:513
std::string assignment_value
Definition bpp.h:510
std::shared_ptr< bpp::bpp_object > get_copy_from() const
Definition bpp_object.cpp:73
std::string get_address() const override
Definition bpp_object.cpp:49
void set_class(std::shared_ptr< bpp_class > object_class)
Definition bpp_object.cpp:19
std::shared_ptr< bpp::bpp_object > copy_from
Definition bpp.h:514
The main program.
Definition bpp.h:566
uint64_t get_dynamic_cast_counter() const
Definition bpp_program.cpp:180
std::vector< std::string > get_source_files() const
Definition bpp_program.cpp:243
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:282
uint64_t assignment_counter
Definition bpp.h:570
std::shared_ptr< bpp_class > primitive_class
Definition bpp.h:568
uint64_t dynamic_cast_counter
Definition bpp.h:572
void set_main_source_file(const std::string &file)
Definition bpp_program.cpp:255
std::unordered_map< std::string, std::shared_ptr< bpp::bpp_class > > owned_classes
Definition bpp.h:582
std::weak_ptr< bpp_program > get_containing_program() override
Definition bpp_program.cpp:36
bool set_containing_class(std::weak_ptr< bpp_class > containing_class) override
Definition bpp_program.cpp:24
uint64_t get_supershell_counter() const
Definition bpp_program.cpp:144
std::string get_main_source_file() const
Definition bpp_program.cpp:251
void increment_typeof_counter()
Definition bpp_program.cpp:184
std::shared_ptr< AST::Program > get_source_file_ast(const std::string &file) const
Definition bpp_program.cpp:274
void increment_function_counter()
Definition bpp_program.cpp:156
std::unordered_map< std::string, EntityMap > entity_maps
Definition bpp.h:589
std::string main_source_file
Definition bpp.h:578
uint64_t get_typeof_counter() const
Definition bpp_program.cpp:194
uint64_t get_assignment_counter() const
Definition bpp_program.cpp:152
uint64_t object_counter
Definition bpp.h:574
std::shared_ptr< bpp_class > get_primitive_class() const
Definition bpp_program.cpp:32
std::shared_ptr< bpp::bpp_entity > get_active_entity(const std::string &file, uint32_t line, uint32_t column)
Definition bpp_program.cpp:225
uint64_t supershell_counter
Definition bpp.h:569
std::vector< bpp::diagnostic > get_diagnostics(const std::string &file) const
Definition bpp_program.cpp:299
std::shared_ptr< std::vector< std::string > > get_include_paths() const
Definition bpp_program.cpp:127
uint64_t get_function_counter() const
Definition bpp_program.cpp:166
std::unordered_map< std::string, std::vector< bpp::diagnostic > > diagnostics
Definition bpp.h:594
uint64_t typeof_counter
Definition bpp.h:573
uint64_t function_counter
Definition bpp.h:571
bool add_class(std::shared_ptr< bpp_class > class_) override
Add a class to the program.
Definition bpp_program.cpp:65
void set_target_bash_version(BashVersion target_bash_version)
Definition bpp_program.cpp:206
uint64_t get_object_counter() const
Definition bpp_program.cpp:202
void increment_dynamic_cast_counter()
Definition bpp_program.cpp:170
bpp_program()
Definition bpp_program.cpp:12
BashVersion get_target_bash_version() const
Definition bpp_program.cpp:210
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:263
void increment_supershell_counter()
Definition bpp_program.cpp:131
std::shared_ptr< std::vector< std::string > > include_paths
Definition bpp.h:598
void increment_assignment_counter()
Definition bpp_program.cpp:148
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:214
void set_source_file_ast(const std::string &file, std::shared_ptr< AST::Program > ast)
Definition bpp_program.cpp:270
BashVersion target_bash_version
Definition bpp.h:576
void set_output_stream(std::shared_ptr< std::ostream > output_stream)
Definition bpp_program.cpp:28
void increment_object_counter()
Definition bpp_program.cpp:198
void clear_diagnostics(const std::string &file)
Definition bpp_program.cpp:307
void set_include_paths(std::shared_ptr< std::vector< std::string > > paths)
Definition bpp_program.cpp:123
std::unordered_map< std::string, std::shared_ptr< AST::Program > > source_file_asts
Definition bpp.h:586
The practical difference between bpp_code_entity and bpp_string is how we handle the code buffers.
Definition bpp.h:359
std::string get_pre_code() const override
Return the contents of the pre-code buffer as a string.
Definition bpp_string.cpp:40
void add_code(const std::string &code, bool add_newline=true) override
Add code to the primary buffer.
Definition bpp_string.cpp:18
void add_code_to_previous_line(const std::string &code) override
Add code to the pre-code buffer.
Definition bpp_string.cpp:25
void add_code_to_next_line(const std::string &code) override
Add code to the post-code buffer.
Definition bpp_string.cpp:32
bpp_string()
Definition bpp_string.cpp:10
std::string get_code() const override
Return the contents of the main code buffer as a string.
Definition bpp_string.cpp:36
std::string get_post_code() const override
Return the contents of the post-code buffer as a string.
Definition bpp_string.cpp:48
A value assignment statement in Bash++.
Definition bpp.h:911
bool is_array_assignment() const
Definition bpp_value_assignment.cpp:44
std::shared_ptr< bpp_entity > nonprimitive_object
Definition bpp.h:914
bool nonprimitive_assignment
Definition bpp.h:913
bool is_nonprimitive_assignment() const
Definition bpp_value_assignment.cpp:32
bpp_value_assignment()
Definition bpp_value_assignment.cpp:10
bool array_assignment
Definition bpp.h:916
std::shared_ptr< bpp_entity > get_nonprimitive_object() const
Definition bpp_value_assignment.cpp:36
bool lvalue_nonprimitive
Definition bpp.h:915
void set_adding(bool is_adding)
Definition bpp_value_assignment.cpp:28
void set_lvalue_nonprimitive(bool is_nonprimitive)
Definition bpp_value_assignment.cpp:20
void set_array_assignment(bool is_array)
Definition bpp_value_assignment.cpp:24
void set_nonprimitive_assignment(bool is_nonprimitive)
Definition bpp_value_assignment.cpp:12
bool lvalue_is_nonprimitive() const
Definition bpp_value_assignment.cpp:40
bool is_adding() const
Definition bpp_value_assignment.cpp:48
void set_nonprimitive_object(std::shared_ptr< bpp_entity > object)
Definition bpp_value_assignment.cpp:16
bool adding
Definition bpp.h:917
Definition bash_case.cpp:8
const std::shared_ptr< bpp_method > inaccessible_method
A placeholder for an inaccessible method of a class (scope handling)
Definition bpp.h:104
const std::shared_ptr< bpp_datamember > inaccessible_datamember
A placeholder for an inaccessible data member of a class (scope handling)
Definition bpp.h:98
static const char bpp_nullptr[]
The secret internal value of '@nullptr' in Bash++.
Definition bpp.h:110
const std::shared_ptr< bpp_entity > inaccessible_entity
A placeholder for an inaccessible entity (scope handling)
Definition bpp.h:92
bool is_valid_identifier(const std::string &identifier)
Check if a string is a valid identifier in Bash++.
Definition bpp.h:142
constexpr const char * protected_keywords[]
A list of keywords that are reserved and cannot be used as identifiers in Bash++.
Definition bpp.h:116
diagnostic_type
Definition bpp.h:36
@ DIAGNOSTIC_INFO
Definition bpp.h:39
@ DIAGNOSTIC_ERROR
Definition bpp.h:37
@ DIAGNOSTIC_WARNING
Definition bpp.h:38
@ DIAGNOSTIC_HINT
Definition bpp.h:40
bool is_protected_keyword(const std::string &keyword)
Check if a string matches any of our protected keywords.
Definition bpp.h:128
bpp_scope
Definition bpp.h:23
@ SCOPE_PUBLIC
Definition bpp.h:24
@ SCOPE_INACCESSIBLE
Definition bpp.h:27
@ SCOPE_PRIVATE
Definition bpp.h:26
@ SCOPE_PROTECTED
Definition bpp.h:25
reference_type
Definition bpp.h:30
@ ref_method
Definition bpp.h:32
@ ref_object
Definition bpp.h:33
@ ref_primitive
Definition bpp.h:31
Represents a Bash version to target for code generation.
Definition BashVersion.h:20
Definition bpp.h:168
std::string file
Definition bpp.h:169
SymbolPosition()
Definition bpp.h:173
uint64_t column
Definition bpp.h:171
SymbolPosition(const std::string &file, uint64_t line, uint64_t column)
Definition bpp.h:174
uint64_t line
Definition bpp.h:170
Represents a diagnostic message (error, warning, info, hint)
Definition bpp.h:50
uint32_t start_line
Definition bpp.h:53
uint32_t end_line
Definition bpp.h:55
diagnostic_type type
Definition bpp.h:51
std::string message
Definition bpp.h:52
uint32_t end_column
Definition bpp.h:56
uint32_t start_column
Definition bpp.h:54