3#include "grammarDependencies.h"
10SyncRegistry::SyncRegistry(Theme* theme, IOnigLib* onigLib)
11 : _theme(theme), _onigLib(onigLib) {
14SyncRegistry::~SyncRegistry() {
18void SyncRegistry::dispose() {
19 for (
auto& pair : _grammars) {
21 pair.second->dispose();
31void SyncRegistry::setTheme(Theme* theme) {
35std::vector<std::string> SyncRegistry::getColorMap() {
36 return _theme->getColorMap();
39void SyncRegistry::addGrammar(IRawGrammar* grammar,
const std::vector<ScopeName>* injectionScopeNames) {
40 _rawGrammars[grammar->scopeName] = grammar;
42 if (injectionScopeNames) {
43 _injectionGrammars[grammar->scopeName] = *injectionScopeNames;
47IRawGrammar* SyncRegistry::lookup(
const ScopeName& scopeName) {
48 auto it = _rawGrammars.find(scopeName);
49 if (it != _rawGrammars.end()) {
55std::vector<ScopeName> SyncRegistry::injections(
const ScopeName& scopeName) {
56 auto it = _injectionGrammars.find(scopeName);
57 if (it != _injectionGrammars.end()) {
60 return std::vector<ScopeName>();
63StyleAttributes* SyncRegistry::themeMatch(ScopeStack* scopePath) {
64 return _theme->match(scopePath);
67StyleAttributes* SyncRegistry::getDefaults() {
68 return _theme->getDefaults();
71Grammar* SyncRegistry::grammarForScopeName(
72 const ScopeName& scopeName,
74 const EmbeddedLanguagesMap* embeddedLanguages,
75 const TokenTypeMap* tokenTypes,
76 BalancedBracketSelectors* balancedBracketSelectors) {
78 auto it = _grammars.find(scopeName);
79 if (it == _grammars.end()) {
80 IRawGrammar* rawGrammar = lookup(scopeName);
85 Grammar* grammar = createGrammar(
91 balancedBracketSelectors,
97 _grammars[scopeName] = grammar;
106Registry::Registry(
const RegistryOptions& options)
107 : _options(options) {
109 Theme* theme = Theme::createFromRawTheme(options.theme, options.colorMap);
110 _syncRegistry =
new SyncRegistry(theme, options.onigLib);
113Registry::~Registry() {
117void Registry::dispose() {
119 _syncRegistry->dispose();
120 delete _syncRegistry;
121 _syncRegistry =
nullptr;
125void Registry::setTheme(
const IRawTheme* theme,
const std::vector<std::string>* colorMap) {
126 Theme* newTheme = Theme::createFromRawTheme(theme, colorMap);
127 _syncRegistry->setTheme(newTheme);
130std::vector<std::string> Registry::getColorMap() {
131 return _syncRegistry->getColorMap();
134Grammar* Registry::loadGrammarWithEmbeddedLanguages(
135 const ScopeName& initialScopeName,
137 const EmbeddedLanguagesMap& embeddedLanguages) {
139 return _loadGrammar(initialScopeName, initialLanguage, &embeddedLanguages,
nullptr,
nullptr);
142Grammar* Registry::loadGrammarWithConfiguration(
143 const ScopeName& initialScopeName,
145 const IGrammarConfiguration& configuration) {
147 BalancedBracketSelectors* balancedBracketSelectors =
nullptr;
148 if (configuration.balancedBracketSelectors || configuration.unbalancedBracketSelectors) {
149 std::vector<std::string> balanced = configuration.balancedBracketSelectors ?
150 *configuration.balancedBracketSelectors : std::vector<std::string>();
151 std::vector<std::string> unbalanced = configuration.unbalancedBracketSelectors ?
152 *configuration.unbalancedBracketSelectors : std::vector<std::string>();
153 balancedBracketSelectors =
new BalancedBracketSelectors(balanced, unbalanced);
159 configuration.embeddedLanguages,
160 configuration.tokenTypes,
161 balancedBracketSelectors
165Grammar* Registry::loadGrammar(
const ScopeName& initialScopeName) {
166 return _loadGrammar(initialScopeName, 0,
nullptr,
nullptr,
nullptr);
169Grammar* Registry::addGrammar(
170 IRawGrammar* rawGrammar,
171 const std::vector<std::string>& injections,
173 const EmbeddedLanguagesMap* embeddedLanguages) {
175 _syncRegistry->addGrammar(rawGrammar, injections.empty() ?
nullptr : &injections);
181 return _grammarForScopeName(rawGrammar->scopeName, initialLanguage, embeddedLanguages);
184Grammar* Registry::_loadGrammar(
185 const ScopeName& initialScopeName,
187 const EmbeddedLanguagesMap* embeddedLanguages,
188 const TokenTypeMap* tokenTypes,
189 BalancedBracketSelectors* balancedBracketSelectors) {
191 ScopeDependencyProcessor dependencyProcessor(_syncRegistry, initialScopeName);
193 while (!dependencyProcessor.Q.empty()) {
195 std::vector<AbsoluteRuleReference> toProcess;
196 while (!dependencyProcessor.Q.empty()) {
197 toProcess.push_back(dependencyProcessor.Q.front());
198 dependencyProcessor.Q.pop();
202 for (
const auto& ref : toProcess) {
203 _loadSingleGrammar(ref.scopeName);
207 for (
const auto& ref : toProcess) {
208 dependencyProcessor.Q.push(ref);
212 dependencyProcessor.processQueue();
215 return _grammarForScopeName(
220 balancedBracketSelectors
224void Registry::_loadSingleGrammar(
const ScopeName& scopeName) {
225 if (_ensureGrammarCache.find(scopeName) != _ensureGrammarCache.end()) {
229 _ensureGrammarCache[scopeName] =
true;
230 _doLoadSingleGrammar(scopeName);
233void Registry::_doLoadSingleGrammar(
const ScopeName& scopeName) {
234 IRawGrammar* grammar = _options.loadGrammar(scopeName);
236 std::vector<ScopeName> injections;
237 if (_options.getInjections) {
238 injections = _options.getInjections(scopeName);
240 _syncRegistry->addGrammar(grammar, injections.empty() ?
nullptr : &injections);
243 for (
const auto& injectionScopeName : injections) {
244 _loadSingleGrammar(injectionScopeName);
249Grammar* Registry::_grammarForScopeName(
250 const ScopeName& scopeName,
252 const EmbeddedLanguagesMap* embeddedLanguages,
253 const TokenTypeMap* tokenTypes,
254 BalancedBracketSelectors* balancedBracketSelectors) {
256 return _syncRegistry->grammarForScopeName(
261 balancedBracketSelectors