Files
z-bar-qt/Plugins/ZShell/Llm/codehighlighter.hpp
zach cd3da1941b
C++ / fmt (pull_request) Successful in 4s
C++ / build (pull_request) Failing after 2m6s
C++ / clang-tidy (pull_request) Failing after 2m5s
JS/TS / fmt (pull_request) Failing after 3m8s
Python / static (pull_request) Successful in 24s
Python / verify (pull_request) Successful in 1m21s
JS/TS / lint (pull_request) Successful in 5m10s
Rust / fmt (pull_request) Successful in 30s
Rust / build (pull_request) Successful in 56s
Rust / clippy (pull_request) Successful in 46s
fix: truncate context logic
2026-09-04 02:20:37 +02:00

76 lines
1.7 KiB
C++

#pragma once
#include <QMutex>
#include <QObject>
#include <QString>
#include <QVariantList>
#include <QtQml>
#include <cstdint>
#include <memory>
#include <vector>
class QQmlEngine;
class QJSEngine;
namespace ZShell::llm {
class CodeHighlighter : public QObject {
Q_OBJECT
QML_ELEMENT
QML_SINGLETON
public:
Q_INVOKABLE void highlight(
const QString& code,
const QString& language,
QObject* target,
int token);
static CodeHighlighter* create(QQmlEngine*, QJSEngine*);
struct Grammar {
std::vector<std::string> libs;
std::vector<std::string> symbols;
std::vector<const char*> queries;
};
private:
struct State {
bool bad = false;
void* lib = nullptr;
const void* lang = nullptr;
void* query = nullptr;
};
[[nodiscard]] static const QHash<QString, QString>& aliases();
[[nodiscard]] static uint8_t roleFor(const char* name, uint32_t length);
[[nodiscard]] static const char* roleName(uint8_t role);
[[nodiscard]] static QString resolveId(const QString& language);
[[nodiscard]] static QString cacheKey(
const QString& id, const QString& code);
[[nodiscard]] QVariantList doHighlight(
const QString& code, const QString& language) const;
[[nodiscard]] QVariantList lookupSpans(
const QString& code, const QString& language) const;
void storeSpans(
const QString& code,
const QString& language,
const QVariantList& spans) const;
struct SpanCacheEntry {
QString code;
QVariantList spans;
};
mutable QHash<QString, std::shared_ptr<const State>> m_states;
mutable QMutex m_stateMutex;
mutable QHash<QString, SpanCacheEntry> m_spanCache;
mutable QStringList m_spanCacheOrder;
mutable int m_spanCacheBytes = 0;
mutable QMutex m_cacheMutex;
static CodeHighlighter* s_instance;
};
} // namespace ZShell::llm