1
0
mirror of https://github.com/salexdv/bsl_console.git synced 2025-09-16 09:06:17 +02:00

Добавлены скрипты для отладки подсветки синтаксиса BSL кода. Создан файл debug_syntax.js для тестирования токенизации незавершенного и завершенного кода. Также добавлен тестовый скрипт test_debug.js для проверки токенизации процедур. Обновлен index.html для подключения нового скрипта отладки.

This commit is contained in:
AlexanderYekat
2025-03-22 18:23:46 +05:00
parent b99c531257
commit 2370ae0c3b
4 changed files with 179 additions and 57 deletions

51
debug_syntax.js Normal file
View File

@@ -0,0 +1,51 @@
// Скрипт для отладки подсветки синтаксиса BSL кода
// Добавьте его в ваш HTML после загрузки основных скриптов
(function() {
// Проверяем, загружен ли monaco
if (typeof monaco === 'undefined') {
console.error('Monaco еще не загружен!');
return;
}
// Функция для сравнения токенизации с разными вариантами завершения функции
function compareTokenization() {
// Код без конца функции
const incompleteCode = `
Функция ТестоваяФункция()
Перем а;
а = 10;
Возврат а;
`;
// Код с завершенной функцией
const completeCode = incompleteCode + `КонецФункции`;
console.log('=== ТЕСТ ТОКЕНИЗАЦИИ ===');
console.log('1. Токенизация незавершенного кода:');
const tokensIncomplete = debugTokenization(incompleteCode, 'bsl');
console.log('2. Токенизация завершенного кода:');
const tokensComplete = debugTokenization(completeCode, 'bsl');
// Анализируем последнюю строку с КонецФункции
if (tokensComplete && tokensComplete.length > 0) {
const lastLineTokens = tokensComplete[tokensComplete.length - 1];
console.log('Токены последней строки (КонецФункции):', lastLineTokens);
// Проверяем, правильно ли токенизируется слово "КонецФункции"
if (lastLineTokens && lastLineTokens.length > 0) {
const keywordToken = lastLineTokens[0];
console.log('Тип токена "КонецФункции":', keywordToken.type);
if (keywordToken.type !== 'keyword.bsl') {
console.error('ПРОБЛЕМА: "КонецФункции" не распознается как ключевое слово!');
console.log('Это может быть причиной поломки подсветки синтаксиса.');
}
}
}
}
// Запускаем тест при загрузке страницы
setTimeout(compareTokenization, 1000); // Даем время на инициализацию
})();

View File

@@ -1,5 +1,39 @@
define([], function () {
// Функция для отладки токенизации
function debugTokenization(content, languageId) {
console.log("[DEBUG] Отладка токенизации для языка:", languageId);
try {
const tokens = monaco.editor.tokenize(content, languageId);
console.log("[DEBUG] Получены токены:", tokens.length, "строк");
for (let i = 0; i < Math.min(tokens.length, 3); i++) {
console.log(`[DEBUG] Пример токенов строки ${i}:`, JSON.stringify(tokens[i].slice(0, 3)));
}
return tokens;
} catch (error) {
console.error("[DEBUG] Ошибка при токенизации:", error);
return null;
}
}
// Функция для отладки API методов
function debugMonacoVersion() {
console.log("[DEBUG] Версия Monaco Editor:", monaco.version);
console.log("[DEBUG] Проверка наличия API методов:");
try {
const model = editor.getModel();
if (model) {
console.log("[DEBUG] model.getWordUntilPosition:", typeof model.getWordUntilPosition === 'function' ? "доступен" : "недоступен");
console.log("[DEBUG] model.getWordAtPosition:", typeof model.getWordAtPosition === 'function' ? "доступен" : "недоступен");
console.log("[DEBUG] model.findMatchingBracketUp:", typeof model.findMatchingBracketUp === 'function' ? "доступен" : "недоступен");
} else {
console.log("[DEBUG] Модель недоступна для проверки API методов");
}
} catch (error) {
console.error("[DEBUG] Ошибка при проверке API методов Monaco:", error);
}
}
function deepCopyArray(sourceArray, destinationArray) {
sourceArray.forEach(value => {
@@ -432,7 +466,7 @@ define([], function () {
{token: 'query'},
{token: 'query'}
]],
[/([a-zA-Z\u0410-\u044F_][a-zA-Z\u0410-\u044F_0-9]+)(\.)([a-zA-Z\u0410-\u044F_][a-zA-Z\u0410-\u044F_0-9]+)/, 'query'],
[/([a-zA-Z\u0410-\u044F_][a-zA-Z\u0410-\u044F_0-9]+)(\.)([a-zA-Z\u0410-\u044F_0-9]+)/, 'query'],
[/[a-zA-Z\u0410-\u044F_][a-zA-Z\u0410-\u044F_0-9]*/, {
cases: {
'@queryWords': 'query.keyword',
@@ -653,11 +687,26 @@ define([], function () {
completionProvider: {
triggerCharacters: ['.', '"', ' ', '&'],
provideCompletionItems: function (model, position, context, token) {
resetSuggestWidgetDisplay();
let bsl = new bslHelper(model, position);
let completion = bsl.getCompletion(context, token);
bsl.onProvideCompletion(context, completion);
return completion;
try {
console.log("[DEBUG] provideCompletionItems в bsl_language.js вызвана", { position, context, token });
resetSuggestWidgetDisplay();
// Создаем экземпляр bslHelper и проверяем, что создание прошло успешно
let bsl = new bslHelper(model, position);
console.log("[DEBUG] bslHelper создан успешно");
// Вызываем метод получения подсказок и передаем context и token
let completion = bsl.getCompletion(context, token);
console.log("[DEBUG] getCompletion выполнен", completion);
bsl.onProvideCompletion(context, completion);
console.log("[DEBUG] onProvideCompletion выполнен успешно");
return completion;
} catch (error) {
console.log("[DEBUG] Ошибка в provideCompletionItems:", error);
return { suggestions: [] };
}
},
resolveCompletionItem: function (model, position, item) {
let bsl = new bslHelper(model, position);

View File

@@ -1,52 +1,53 @@
<!DOCTYPE html>
<html>
<head>
<title>BSL-editor</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<link href="./decorations.css" rel="stylesheet">
<link href="./tree/tree.css" rel="stylesheet">
<link href="./tingle.css" rel="stylesheet">
<script src="./tingle.js"></script>
<style>
html,
body {
height: 100%;
margin: 0px;
}
#container {
height: 100%;
}
</style>
</head>
<body>
<div id="container"></div>
<div id="display">
<div id="display-header">
<div id="display-title"></div>
<div id="display-close"></div>
</div>
<div id="variables-display">
<div id="variables-tree"></div>
</div>
</div>
<button id="event-button"></button>
<script>
function getCode() {
return '';
}
</script>
<script src="./vs/loader.js"></script>
<script src="./parsers.js"></script>
<script src="./finder.js"></script>
<script src="./bsl_helper.js"></script>
<script src="./init.js"></script>
<script src="./tree/tree.js"></script>
</body>
<!DOCTYPE html>
<html>
<head>
<title>BSL-editor</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta http-equiv="Content-Type" content="text/html;charset=utf-8">
<link href="./decorations.css" rel="stylesheet">
<link href="./tree/tree.css" rel="stylesheet">
<link href="./tingle.css" rel="stylesheet">
<script src="./tingle.js"></script>
<style>
html,
body {
height: 100%;
margin: 0px;
}
#container {
height: 100%;
}
</style>
</head>
<body>
<div id="container"></div>
<div id="display">
<div id="display-header">
<div id="display-title"></div>
<div id="display-close"></div>
</div>
<div id="variables-display">
<div id="variables-tree"></div>
</div>
</div>
<button id="event-button"></button>
<script>
function getCode() {
return '';
}
</script>
<script src="./vs/loader.js"></script>
<script src="./parsers.js"></script>
<script src="./finder.js"></script>
<script src="./bsl_helper.js"></script>
<script src="./init.js"></script>
<script src="./tree/tree.js"></script>
<script src="../debug_syntax.js"></script>
</body>
</html>

21
test_debug.js Normal file
View File

@@ -0,0 +1,21 @@
// Тестовый скрипт для отладки проблем с подсветкой синтаксиса
document.addEventListener("DOMContentLoaded", function() {
// Используем существующую функцию отладки токенизации
const testCode = `
Процедура ТестоваяПроцедура()
// Тестовый код
Если Истина Тогда
Сообщить("Тест");
КонецЕсли;
КонецПроцедуры
`;
// Отладка токенизации
const tokens = debugTokenization(testCode, 'bsl');
console.log("Токены тестовой процедуры:", tokens);
// Проверим конкретно токенизацию конца функции
const endFuncTest = `КонецПроцедуры`;
const endFuncTokens = debugTokenization(endFuncTest, 'bsl');
console.log("Токены конца процедуры:", endFuncTokens);
});