__>def q = <#
__>my string
__>#>;
__>def p = linq <# from i in a select i #>;
__>def u = "string";
__>
__>Все три строки подсвечиваются одинаково.
В общем случае, подсветку строки в зависимости от того, какой макрос её использует, невозможно реализовать на уровне лексера.
То есть подсветка $-подвыражений внутри $-строк и linq внутри linq-строк будет реализована уже в "следующей версии", когда будут анализироваться PExpr-ы.
Хотя именно для $-строк и linq-строк наверное стоит добавить отдельную поддержку, потому что они часто используются в маленьких сниппетах, где using-и не прописуются.
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, _nn_, Вы писали:
__>>Вначале текст выглядит четко, а к концу очень бледно.
C>Бледно выглядит код, помещенный в квазицитату. В вашем примере несбалансированная скобка помещает в квазицитату весь код дальше её самой.
Она закрывается после foreach, или я что-то проглядел?
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, _nn_, Вы писали:
__>>Вначале текст выглядит четко, а к концу очень бледно.
C>Бледно выглядит код, помещенный в квазицитату. В вашем примере несбалансированная скобка помещает в квазицитату весь код дальше её самой.
Поместите весь файл core.n , на каком-то моменте вы увидите , что текст бледнеет.
C>Собственно, "бледность" — один из вариантов Внешний вид кода задается CSS.
Здравствуйте, catbert, Вы писали:
C>Здравствуйте, _nn_, Вы писали:
__>>Поместите весь файл core.n , на каком-то моменте вы увидите , что текст бледнеет.
C>Долго втыкал на подсветку, так и не смог найти места, где она неправильная. Не исключено, что проблема связана с этой — http://rsdn.ru/forum/nemerle/3835775.1.aspx
ViewState у текст-бокса можно отключить, он там не нужен. Просто явно записывай текст туда, а можно даже не показывать исходный текст пока в целях экономии траффика. А в идеале бы тут прикрутить сжатие и с сервером общаться через аякс, чтобы он возвращал только собственно сгенерированный код.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>Такое можно только специально написать На строку в 200 килобайт (хотя там генерится максимум 100) 40 тыс. перевыделений — это несколько крутовато.
Такое элементарно получается когда некоторые не очень опытные товарищи начинают формировать строки из мелких фрагментов.
ВВ>Короче, в порядке борьбы за истину, запустил я хттп дебуггер — тот показывает, что практически все время ожидания идет ответ, т.е. "байты капают". А тут два варианта — или там ручками делается флаш или таки канал.
Ну, тады ой. Надо переносить на более шустрй хостинг.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, catbert, Вы писали:
C>То есть подсветка $-подвыражений внутри $-строк и linq внутри linq-строк будет реализована уже в "следующей версии", когда будут анализироваться PExpr-ы.
Ага. И вообще типы нужно подсвечивать только на основании информации из TExpr-шенов.
C>Хотя именно для $-строк и linq-строк наверное стоит добавить отдельную поддержку, потому что они часто используются в маленьких сниппетах, где using-и не прописуются.
Не стоит. Лексер интеграции изгаляется по этому поводу, потому что анализировать TExpr дороговато для реалтайма. У тебя проблемы времени нет, так что ты можешь подкрасить код "честно".
Так что спеуиальных решений делать не надо.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, catbert, Вы писали:
C>Бледно выглядит код, помещенный в квазицитату. В вашем примере несбалансированная скобка помещает в квазицитату весь код дальше её самой.
А нельзя подсвечивать квази-цитаты так же как в интеграции, добавление серого фона?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Воронков Василий, Вы писали:
ВВ>ViewState у текст-бокса можно отключить, он там не нужен. Просто явно записывай текст туда, а можно даже не показывать исходный текст пока в целях экономии траффика. А в идеале бы тут прикрутить сжатие и с сервером общаться через аякс, чтобы он возвращал только собственно сгенерированный код.
Здравствуйте, VladD2, Вы писали:
VD>Такое элементарно получается когда некоторые не очень опытные товарищи начинают формировать строки из мелких фрагментов.
HTML формируется StringBuilder’ом.
VD>Ну, тады ой. Надо переносить на более шустрй хостинг.
Nemerle.Compiler использует рефлексию, так что еще не всякий хостинг подойдет. Нужен Full Trust.
Здравствуйте, VladD2, Вы писали:
VD>Ага. И вообще типы нужно подсвечивать только на основании информации из TExpr-шенов.
Это так, но надо ещё учитывать, что не всегда дело доходит до TExpr-ов, ведь подсвечиваемый код необязательно должен вообще компилироваться без ошибок.
Кроме того, я боюсь, что в некоторых TExpr'ах может быть напутано с локейшнами (в том же $""-макросе), в результате собьется подсветка.
Имея "карту" пространств имен и типов, можно все идентификаторы правильно подсвечивать на основе PExpr где-то на 90%. Но для некоторых фич (например тултип для переменных) анализ TExpr-ов все равно обязателен.
VD>Не стоит. Лексер интеграции изгаляется по этому поводу, потому что анализировать TExpr дороговато для реалтайма. У тебя проблемы времени нет, так что ты можешь подкрасить код "честно".
VD>Так что спеуиальных решений делать не надо.
Есть проблема контекста. Если подсвечивается целый файл в контексте проекта, тогда можно (и следует) пользоватся TExpr-ами. Если подсвечивается сниппет:
Здравствуйте, catbert, Вы писали:
C>Это так, но надо ещё учитывать, что не всегда дело доходит до TExpr-ов, ведь подсвечиваемый код необязательно должен вообще компилироваться без ошибок.
Это критично для IDE, но не для подсветки закомиченых исходниках. В них наличие ошибок компиляции — это не штатная ситуация. К тому же компилятор немерла пытается до последнего типизироват даже код с ошибками, так что что-то да будет.
C>Кроме того, я боюсь, что в некоторых TExpr'ах может быть напутано с локейшнами (в том же $""-макросе), в результате собьется подсветка.
Такого тоже быть не должно. Иначе не будет работать хинты и комплит. Так что это тоже ошибка. Можешь закладываться на то, что все должно быть ОК даже в случае с кодом сгенерированным макросами.
C>Имея "карту" пространств имен и типов, можно все идентификаторы правильно подсвечивать на основе PExpr где-то на 90%.
Нельзя. Потом "правильно на 90%" — это означает не правильно.
Компилятор делает множество хитрых вычислений (вывод типов, разрешение перегрузки и т.п.) все они влияют на типы объектов. Чтобы вычислить правильную информацию, тебе придется повторить код компилятора, что сложно и бессмысленно.
C>Но для некоторых фич (например тултип для переменных) анализ TExpr-ов все равно обязателен.
Вот именно! Кроме того еще нужна навигация (гиперссылки как в Рефлекторе). Их тоже нельзя без типизации не выявить. А раз информация о типах все равно используется, то почему бы ее не использовать и для подсветки?
Короче, твой код должен выглядеть примерно так:
def currentPExpr = ...;
match (currentPExpr.TypedObject)
{
| TExpr.Xxx => анализиурем информацию о типах для получения подсветки, ссылок и подсказок.
...
}
C>Есть проблема контекста. Если подсвечивается целый файл в контексте проекта, тогда можно (и следует) пользоватся TExpr-ами. Если подсвечивается сниппет:
C>
Здравствуйте, VladD2, Вы писали:
VD>Универсально можно сделать все. Только есть две проблемы: VD>1. Чем универсальнее делаешь, тем больше работы. VD>2. Чем универсальнее, тем менее функционально.
VD>В АСТ немерла есть вся нужная информация. А вот как ты сделаешь тоже самое универсально, я представить себе не могу.
Ну, цель у нас конкретная:
VD>Мне кажется самым правильным подходом для такого как у тебя решения было бы сделать плагин к компилятору, который после завершения компиляции прошелся бы по конечному АСТ и собрал бы всю необходимую информацию для подсветки типов и генерации перекрестных ссылок.
Вот эта информация и нужна. По сути, описанный плагин можно представить как функцию: TExpr -> ProjectInfo, где ProjectInfo — структура данных, в которой собрана нужная информация. Универсальность лишь в том, чтобы сделать ProjectInfo не специфичным для Немерле.
Здравствуйте, catbert, Вы писали:
C>Ну, это же демка, оптимизировать её нету смысла.
Как сказать. Если добавить кнопочку "Скопировать HTML" для сгенерированного кода, то и в таком виде весьма полезно. Например, если надо в какой-нибудь блог вставить раскрашенный код на Немерле.
Здравствуйте, catbert, Вы писали:
C>Вот эта информация и нужна. По сути, описанный плагин можно представить как функцию: TExpr -> ProjectInfo, где ProjectInfo — структура данных, в которой собрана нужная информация. Универсальность лишь в том, чтобы сделать ProjectInfo не специфичным для Немерле.
1. Лучше все же анализировать PExpr. В нем есть свойство TypedObject в которое после типизации записывается ссылка на соответствующий TExpr (или другой объект описывающий типы).
2. Кроме PExpr и TExpr еще нужно анализировать и дерево типов.
3. TExpr и есть необходимая тебе информация.
Я бы описал процесс генерации "активной подсветки" (назовем это так) следующим образом.
1. Прогоняем процесс компиляции до стадии на которой начинается типизация тел методв. Запоминаем ссылки на PExpr-оны этих методов.
2. Выполняем типизацию тел методов. После этого у свойствах TypedObject у PExpr-ешонов будут содержаться объекты описывающие типы.
3. Проходим по нетипизированному АСТ и генерируем текст со ссылками и т.п.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.