Снегопат

Обсуждение Снегопата
Текущее время: 22 дек 2024, 11:39

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2, 3  След.
Автор Сообщение
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 19 сен 2013, 09:54 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
Да, регистрация на форумах возможна только для приобретших снегопат.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 19 сен 2013, 15:23 
Лично хочу тебе сказать огромное спасибо за этот проект и за то что сделал демо версию без ограничений. Но купить пока не готов.
По компиляции не подскажешь - можно к этому процессу из снегопата подключиться или не стоит и думать в этом направлении?


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 20 сен 2013, 10:55 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
quest писал(а):
не. хочу просто что бы
//@assert(x=1)
раскрывалось не в текст как сейчас, а уже в дерево разбора и подменялось на попытку/исключение
как-то так короче.

А если сразу после ввода строки выполнять замену?
Фактически у тебя в любом случае должна происходить подмена строки-утверждения на необходимый код.
Зачем ждать компиляции?

PS тема интересна, сам постоянно пользуюсь утверждениями типа
Тесты.ПроверитьРавенство(а,б, "описание") или Тесты.ПроверитьТип(док, "ДокументСсылка.ПКО", "приходник")


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 20 сен 2013, 14:13 
У меня сейчас так


$engine JScript
$uname assert__rewrite
$dname assert
$addin global
$addin stdlib
$addin stdcommands

stdlib.require('TextWindow.js', SelfScript);
stdlib.require('SyntaxAnalysis.js', SelfScript);
global.connectGlobals(SelfScript);

// из formAutoVersion.s
function onFileSave(cmd)
{
if(cmd.isBefore) // Обработчик вызван перед выполнением команды
{
// Получим объект метаданных текущего окна
var mdObj, av = windows.getActiveView()
if(!av || !(mdObj = av.mdObj))
return
// Посмотрим, не внешний ли отчет/обработка сохраняется.
if(mdObj.container != mdObj.container.masterContainer)
rewriteAssert();
}
}

function rewriteAssert(){
var tw = GetTextWindow();
//debugger;
if (!tw) return;

var prgText = tw.text().replace(/\/\/\{\<assert assertCode=\"([^\/])+\/\/\<\/assert assertCode=\"([^\}])+\}\n/g,'');
var parser = snegopat.parseSources(prgText)
var assertPos = [];
var curScope = "";
for(var i = 0, c = parser.lexemCount; i < c; i++)
{
var lex = parser.lexem(i)
if(lex.type==1 && lex.text.indexOf("//@assert")==0)
assertPos.push({'scopeName':curScope,'start':lex.start, 'data':lex.text, 'line':lex.line})
if(lex.type==40 )
curScope = parser.lexem(i+1).text;
}

var last = prgText.length;
var result = "";
var accum = 0;
while (assertPos.length !=0)
{
lex = assertPos.pop();
result = prgText.substring(lex.start+lex.data.length,last) + result;
last = lex.start;
result = prgText.substring(lex.start,lex.start+lex.data.length)+'\n'+writeAssert(lex) + result;
}
result = prgText.substring(0,last) + result;
Message(result);
tw.SetSelection(1, 1, tw.linesCount(), tw.GetLine(tw.linesCount()).length + 1);
tw.SetSelectedText(result);
}

function writeAssert(lex){
var data = lex.data.replace("//@assert","");
var scopeName = lex.scopeName;
var line = new String(lex.line);
var tmpt = '//{<assert assertCode="@1"> \ntry if not (@1) then raise "Не выполнено условие assert @1 в @2 (строка @3)"; endif; except raise "Не выполнено условие assert @1 в @2 (строка @3)"; endtry;\n//</assert assertCode="@2">}'
return tmpt.replace(/@1/g,data).replace(/@2/g,scopeName).replace(/@3/g,line);
}

// Добавим обработчик команды сохранения файла
stdcommands.Frame.FileSave.addHandler(SelfScript.self, "onFileSave")



Проблема в том что после сохранения выгляди некрасиво код
например
//@assert(Кнопка=Неопределено)
раскрывается в
//@assert(Кнопка=Неопределено)
//{<assert assertCode="(Кнопка=Неопределено)">
try if not ((Кнопка=Неопределено)) then raise "Не выполнено условие assert (Кнопка=Неопределено) в КнопкаВыполнитьНажатие1 (строка 4)"; endif; except raise "Не выполнено условие assert (Кнопка=Неопределено) в КнопкаВыполнитьНажатие1 (строка 4)"; endtry;
//</assert assertCode="КнопкаВыполнитьНажатие1">}

при этом еще ломаются отступы :(

а вот если вписаться в компиляцию, то во первых не будет уродливого текста, во ввторых - макросы это не только assert :)


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 20 сен 2013, 18:24 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
Интересный код.
Ты не хочешь, чтоб код разворачивался в блок попытки?
Если в тексте не будет такого блока, как он выполнится?

Сам давно думаю о подобном раскрытии для своих утверждений, но так и не сделал :)
А ты молодец, сделал!


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 20 сен 2013, 18:40 
Не в сети
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:36
Сообщения: 1085
quest писал(а):
во-вторых - макросы это не только assert :)

Расскажешь? :)


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 21 сен 2013, 15:02 
Не, не так. Я хочу что бы он разворачивался в блок попытки, но не хочу что бы это отображалось в коде. Вот если посмтреть на нормальные языки (вские там лиспы, с++ и прочие кложуры) то процес получения инетрпретируемого (компилируемого) кода делиться на 2 части - препроцессорная обработка и собственно компиляция. В 1С препроцессор вроде как и есть (все эти #Если и &НаКлиенте) но они не расширяемы. Что делает моя реализация ассерт сейчас? она тупо берет строку начинающуюся на //@assert и утвержение проверки раскрывает в код (и код этот видит пользователь). В С этого не происходит потому как это разные вещи - единица транслировани и единица компиляции. Та происходит так - сперва работает препроцессор убирая все макросы, формируется файл для компиляции, компилируется файл. В 1С - такого нет :( Хотя сделать - не сложно было же.
Что такое макрос вообще - это возможность изменить AST на (в лиспе и перед в С) этаае компиляции. Самый простой пример - реализация того же юниттестирования на макросах - http://lisper.ru/pcl/practical-building ... -framework - лисповый код замени только на аналогичный 1С ный. Но вот тлько что бы такое работало - нужен доступ к ast по которому идет компиялция


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 21 сен 2013, 15:03 
>> А ты молодец, сделал!
Там делать то нефиг - сам же видишь - 4 строчки кода.


Вернуться к началу
  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 25 сен 2013, 09:54 
Не в сети
Администратор
Аватара пользователя

Зарегистрирован: 24 авг 2011, 15:04
Сообщения: 2052
К компиляции же тогда надо подключаться в режиме Предприятия, а Снегопат в него не лезет.
Так что :(
Опять же разворот макроса поломает нумерацию строк для отладки.


Вернуться к началу
 Профиль  
Ответить с цитатой  
 Заголовок сообщения: Re: Как сворачивать текст?
СообщениеДобавлено: 26 сен 2013, 03:35 
Ну облом так облом. В приницпе ничего страшного, до этого вообще без перезаписи текста жил. А так - сйчас по тихому логер допишу, потом еще что нибудь прикручу.
Кстати, вот вопрос еще -
1 какие-то требования к формату комментария для функций есть у снегопата? типа как в doxygene, писать параметры через @ ?
2 как-то получить AST а не поток лексем можно?
3 а почему к компиляции подключаться в предприятии? вот например зашифрованный модуль - он же сохраняет компилированный образ волне себе так нормально без предприятия (только в конфигураторе)
4 окошко в демо версии только у меня выскакивает? так и задумано?
5 сложно другой скриптовый язык подключить? хотялось бы ракетку для простоты разработки
6 удобался вводить капчу - вот без покупки - никак нельзя получить регистрацию?


Вернуться к началу
  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 21 ]  На страницу Пред.  1, 2, 3  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 25


Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB