TextMateLib 1.0
Modern C++ implementation of the TextMate syntax highlighting engine
Loading...
Searching...
No Matches
rawGrammar.cpp
1#include "rawGrammar.h"
2#include <iostream>
3
4namespace tml {
5
6// IRawCapturesMap destructor
7IRawCapturesMap::~IRawCapturesMap() {
8 for (auto& pair : captures) {
9 delete pair.second;
10 }
11 captures.clear();
12}
13
14// IRawRule destructor
15IRawRule::~IRawRule() {
16 deleteIfNotNull(id);
17 deleteIfNotNull(include);
18 deleteIfNotNull(name);
19 deleteIfNotNull(contentName);
20 deleteIfNotNull(match);
21 deleteIfNotNull(captures);
22 deleteIfNotNull(begin);
23 deleteIfNotNull(beginCaptures);
24 deleteIfNotNull(end);
25 deleteIfNotNull(endCaptures);
26 deleteIfNotNull(whilePattern);
27 deleteIfNotNull(whileCaptures);
28 deleteIfNotNull(applyEndPatternLast);
29
30 if (patterns != nullptr) {
31 for (IRawRule* rule : *patterns) {
32 delete rule;
33 }
34 delete patterns;
35 patterns = nullptr;
36 }
37
38 deleteIfNotNull(repository);
39}
40
41// IRawRepositoryMap destructor
42IRawRepositoryMap::~IRawRepositoryMap() {
43 for (auto& pair : rules) {
44 delete pair.second;
45 }
46 rules.clear();
47
48 // IMPORTANT: Only delete selfRule. DO NOT delete baseRule!
49 // When baseRule != selfRule, baseRule points to an external grammar's rule
50 // that is owned by that grammar. Deleting it here would cause a double-free
51 // when the external grammar is destroyed.
52
53 deleteIfNotNull(selfRule);
54
55 // baseRule is NOT owned by this repository, so we don't delete it
56 baseRule = nullptr; // Just nullify the pointer
57
58}
59
60// Helper method to get a rule by name
61IRawRule* IRawRepositoryMap::getRule(const std::string& name) const {
62 if (name == "$self") {
63 return selfRule;
64 }
65 if (name == "$base") {
66 return baseRule;
67 }
68 auto it = rules.find(name);
69 if (it != rules.end()) {
70 return it->second;
71 }
72 return nullptr;
73}
74
75// IRawGrammar destructor
76IRawGrammar::~IRawGrammar() {
77
78 deleteIfNotNull(repository);
79
80 // patterns is now a pointer (inherited from IRawRule)
81 if (patterns != nullptr) {
82 for (size_t i = 0; i < patterns->size(); i++) {
83 delete (*patterns)[i];
84 }
85 delete patterns;
86 patterns = nullptr;
87 }
88
89 if (injections != nullptr) {
90 for (auto& pair : *injections) {
91 delete pair.second;
92 }
93 delete injections;
94 injections = nullptr;
95 }
96
97 deleteIfNotNull(injectionSelector);
98 deleteIfNotNull(fileTypes);
99 deleteIfNotNull(name);
100 deleteIfNotNull(firstLineMatch);
101}
102
103} // namespace tml