Some checks failed
Release / Bump Homebrew formula (push) Has been cancelled
Release / Build Linux amd64 (push) Has been cancelled
Release / Build Linux arm64 (push) Has been cancelled
Release / Build macOS arm64 (.app) (push) Has been cancelled
Release / Create GitHub Release (push) Has been cancelled
- Implemented runtime API for registering custom highlighters. - Added optional Tree-sitter integration for advanced syntax parsing (disabled by default). - Updated buffer initialization and copying to support dynamic highlighter configuration. - Introduced `NullHighlighter` as a fallback for unsupported filetypes. - Enhanced CMake configuration with `KTE_ENABLE_TREESITTER` option.
49 lines
1.6 KiB
C++
49 lines
1.6 KiB
C++
// TreeSitterHighlighter.h - optional adapter for Tree-sitter (behind KTE_ENABLE_TREESITTER)
|
|
#pragma once
|
|
|
|
#ifdef KTE_ENABLE_TREESITTER
|
|
|
|
#include <memory>
|
|
#include <string>
|
|
#include <vector>
|
|
|
|
#include "LanguageHighlighter.h"
|
|
|
|
// Forward-declare Tree-sitter C API to avoid hard coupling in headers if includes are not present
|
|
extern "C" {
|
|
struct TSLanguage;
|
|
struct TSParser;
|
|
struct TSTree;
|
|
}
|
|
|
|
namespace kte {
|
|
|
|
// A minimal adapter that uses Tree-sitter to parse the whole buffer and then, for now,
|
|
// does very limited token classification. This acts as a scaffold for future richer
|
|
// queries. If no queries are provided, it currently produces no spans (safe fallback).
|
|
class TreeSitterHighlighter : public LanguageHighlighter {
|
|
public:
|
|
explicit TreeSitterHighlighter(const TSLanguage* lang, std::string filetype);
|
|
~TreeSitterHighlighter() override;
|
|
|
|
void HighlightLine(const Buffer &buf, int row, std::vector<HighlightSpan> &out) const override;
|
|
|
|
private:
|
|
const TSLanguage* language_{nullptr};
|
|
std::string filetype_;
|
|
// Lazy parser to avoid startup cost; mutable to allow creation in const method
|
|
mutable TSParser* parser_{nullptr};
|
|
mutable TSTree* tree_{nullptr};
|
|
|
|
void ensureParsed(const Buffer& buf) const;
|
|
void disposeParser() const;
|
|
};
|
|
|
|
// Factory used by HighlighterRegistry when registering via RegisterTreeSitter.
|
|
std::unique_ptr<LanguageHighlighter> CreateTreeSitterHighlighter(const char* filetype,
|
|
const void* (*get_lang)());
|
|
|
|
} // namespace kte
|
|
|
|
#endif // KTE_ENABLE_TREESITTER
|