SemanticSyntaxHighlighter.h 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. /*
  2. * Copyright (c) 2022, Itamar S. <itamar8910@gmail.com>
  3. * Copyright (c) 2022, the SerenityOS developers.
  4. *
  5. * SPDX-License-Identifier: BSD-2-Clause
  6. */
  7. #pragma once
  8. #include "SyntaxHighlighter.h"
  9. #include "Token.h"
  10. #include <LibGUI/AutocompleteProvider.h>
  11. #include <LibSyntax/Highlighter.h>
  12. #include <LibThreading/Mutex.h>
  13. namespace Cpp {
  14. class SemanticSyntaxHighlighter final : public Syntax::Highlighter {
  15. public:
  16. SemanticSyntaxHighlighter() = default;
  17. virtual ~SemanticSyntaxHighlighter() override = default;
  18. virtual bool is_identifier(u64 token) const override;
  19. virtual bool is_navigatable(u64 token) const override;
  20. virtual Syntax::Language language() const override { return Syntax::Language::Cpp; }
  21. virtual Optional<StringView> comment_prefix() const override { return "//"sv; }
  22. virtual Optional<StringView> comment_suffix() const override { return {}; }
  23. virtual void rehighlight(Palette const&) override;
  24. void update_tokens_info(Vector<CodeComprehension::TokenInfo>);
  25. virtual bool is_cpp_semantic_highlighter() const override { return true; }
  26. protected:
  27. virtual Vector<MatchingTokenPair> matching_token_pairs_impl() const override { return m_simple_syntax_highlighter.matching_token_pairs_impl(); }
  28. virtual bool token_types_equal(u64 token1, u64 token2) const override { return m_simple_syntax_highlighter.token_types_equal(token1, token2); }
  29. private:
  30. void update_spans(Vector<CodeComprehension::TokenInfo> const&, Gfx::Palette const&);
  31. Cpp::SyntaxHighlighter m_simple_syntax_highlighter;
  32. Vector<CodeComprehension::TokenInfo> m_tokens_info;
  33. DeprecatedString m_saved_tokens_text;
  34. Vector<Token> m_saved_tokens;
  35. Threading::Mutex m_lock;
  36. };
  37. }
  38. template<>
  39. inline bool Syntax::Highlighter::fast_is<Cpp::SemanticSyntaxHighlighter>() const { return is_cpp_semantic_highlighter(); }