mirror of
https://github.com/textmate/textmate.git
synced 2026-04-28 03:00:34 -04:00
Presently buffer_t::wait_for_repair will use the grammar from the main thread (rather than wait for the parse thread to finish) which does cause a race condition since the parser will now mutate the grammar (graph coloring). Ideally buffer_t::wait_for_repeat would simply wait for the parser to finish, but I’d prefer to first switch the parser to use GCD.
76 lines
2.0 KiB
C++
76 lines
2.0 KiB
C++
#ifndef LOAD_GRAMMAR_H_FPR2TQML
|
|
#define LOAD_GRAMMAR_H_FPR2TQML
|
|
|
|
#include <bundles/bundles.h>
|
|
#include <oak/callbacks.h>
|
|
|
|
namespace parse
|
|
{
|
|
struct rule_t;
|
|
struct stack_t;
|
|
typedef std::shared_ptr<rule_t> rule_ptr;
|
|
typedef std::shared_ptr<stack_t> stack_ptr;
|
|
|
|
struct PUBLIC grammar_t
|
|
{
|
|
WATCH_LEAKS(grammar_t);
|
|
|
|
struct callback_t
|
|
{
|
|
virtual ~callback_t () { }
|
|
virtual void grammar_did_change () = 0;
|
|
};
|
|
|
|
grammar_t (bundles::item_ptr const& grammarItem);
|
|
~grammar_t ();
|
|
|
|
void set_item (bundles::item_ptr const& item);
|
|
|
|
oak::uuid_t const& uuid () const;
|
|
stack_ptr seed () const;
|
|
|
|
void add_callback (callback_t* cb) { _callbacks.add(cb); }
|
|
void remove_callback (callback_t* cb) { _callbacks.remove(cb); }
|
|
|
|
std::mutex& mutex () { return _mutex; }
|
|
|
|
private:
|
|
struct bundles_callback_t : bundles::callback_t
|
|
{
|
|
bundles_callback_t (grammar_t& grammar) : _grammar(grammar) { }
|
|
void bundles_did_change () { _grammar.bundles_did_change(); }
|
|
private:
|
|
grammar_t& _grammar;
|
|
};
|
|
|
|
struct rule_stack_t
|
|
{
|
|
rule_stack_t (rule_t const* rule, rule_stack_t const* parent = nullptr) : rule(rule), parent(parent) { }
|
|
|
|
rule_t const* rule;
|
|
rule_stack_t const* parent;
|
|
};
|
|
|
|
void setup_includes (rule_ptr const& rule, rule_ptr const& base, rule_ptr const& self, rule_stack_t const& stack);
|
|
rule_ptr find_grammar (std::string const& scope, rule_ptr const& base);
|
|
rule_ptr add_grammar (std::string const& scope, plist::any_t const& plist, rule_ptr const& base = rule_ptr());
|
|
std::vector<std::pair<scope::selector_t, rule_ptr>> injection_grammars ();
|
|
|
|
void bundles_did_change ();
|
|
|
|
bundles::item_ptr _item;
|
|
plist::dictionary_t _plist;
|
|
bundles_callback_t _bundles_callback;
|
|
oak::callbacks_t<callback_t> _callbacks;
|
|
rule_ptr _rule;
|
|
std::map<std::string, rule_ptr> _grammars;
|
|
std::mutex _mutex;
|
|
};
|
|
|
|
typedef std::shared_ptr<grammar_t> grammar_ptr;
|
|
PUBLIC grammar_ptr parse_grammar (bundles::item_ptr const& grammarItem);
|
|
|
|
} /* parse */
|
|
|
|
#endif /* end of include guard: LOAD_GRAMMAR_H_FPR2TQML */
|