Есть простая задачка для желающих
От: IT Россия linq2db.com
Дата: 06.09.06 04:05
Оценка:
Нужно доделать функцию Go To Definition.

Переход к объектам текущего проекта уже работает, в кишках компилятора сильно копаться не надо. Нужно сделать переход к объектам, которые находятся во внешних модулях. В качестве примера:

"".ToString();

Если в студии в C# нажать F12 на ToString, то студия сгенертрует заглушку для класса System.String и спозиционирует туда курсор.

Такую же функцию нужно сделать и нам. Для этого практически всё готово, сильно долго разбираться не надо, зато есть возможность реально потренироваться на N и посмотреть как работает VS SDK.

Если найдутся желающие, то смотреть файл Nemerle.Compiler.Utils -> Nemerle.Completion2 -> CodeModel -> GotoInfo.n.

В этом файле конструкторы принимают объекты и устанавливают Location, если после этого свойство класса HasLocation == false, то нужно посмотреть что у нас за объект и сгенертровать для него файл как это делает студия для C#.

Налетай
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re: Есть простая задачка для желающих
От: VladD2 Российская Империя www.nemerle.org
Дата: 06.09.06 11:45
Оценка:
Здравствуйте, IT, Вы писали:

IT>В этом файле конструкторы принимают объекты и устанавливают Location, если после этого свойство класса HasLocation == false, то нужно посмотреть что у нас за объект и сгенертровать для него файл как это делает студия для C#.


Если есть .pdb-хи и исходники, то желательно бы позиционироваться на исходники, а не генерировать фэйк-код. Так, например, для исходников компилятора и библиотеки Немерла хотелось бы прыгать на них.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Есть простая задачка для желающих
От: robot01  
Дата: 07.09.06 10:19
Оценка:
Здравствуйте, IT, Вы писали:

IT>Нужно доделать функцию Go To Definition.


IT>Переход к объектам текущего проекта уже работает, в кишках компилятора сильно копаться не надо. Нужно сделать переход к объектам, которые находятся во внешних модулях. В качестве примера:


IT>
IT>"".ToString();
IT>

IT>Если в студии в C# нажать F12 на ToString, то студия сгенертрует заглушку для класса System.String и спозиционирует туда курсор.

IT>Такую же функцию нужно сделать и нам. Для этого практически всё готово, сильно долго разбираться не надо, зато есть возможность реально потренироваться на N и посмотреть как работает VS SDK.


IT>Если найдутся желающие, то смотреть файл Nemerle.Compiler.Utils -> Nemerle.Completion2 -> CodeModel -> GotoInfo.n.


IT>В этом файле конструкторы принимают объекты и устанавливают Location, если после этого свойство класса HasLocation == false, то нужно посмотреть что у нас за объект и сгенертровать для него файл как это делает студия для C#.


IT>Налетай


Потратил несколько часов на знакомство с поставленной вами задачей.
Честно говоря нормального пути решения я не увидил (не нормальный путь это тупо сгенерировать файл с помощью String.Format).
Нормальный путь для решения сей задачи это: использовать NemerleCodeProvider и с помошью него сгенерить файл.
Все бы хорошо но кодпровайдер хочет стандартные классы из CodeDom, а все что я могу получить это Nemerle.Compiler.TypeInfo, что с этим классом делать ума не пролижу, переколбасить в CodeTypeDeclaration? чесно говоря не представляю как такое можно сделать....перелопачивать в лоб? тупо и на долго....
Может быть подскажите в каком направлении копать?
Re[2]: Есть простая задачка для желающих
От: IT Россия linq2db.com
Дата: 07.09.06 12:07
Оценка:
Здравствуйте, robot01, Вы писали:

R>Может быть подскажите в каком направлении копать?


Я бы посмотрел у полученного объекта DeclaringType для начала.
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Есть простая задачка для желающих
От: Аноним  
Дата: 07.09.06 12:59
Оценка:
Здравствуйте, IT, Вы писали:

IT>Я бы посмотрел у полученного объекта DeclaringType для начала.


Я на него и смотрю, у него тип Nemerle.Compiler.TypeInfo (на сколько я понял это класс описывающий тип со специфичными для немерле условиям). Ворос вот в чем: что бы с ним можно было работать средствами CodeProvider`а нужно привести его к типу CodeTypeDeclaration (из CodeDom), есть ли для этого какието штатные средства?
Или есть иные средства кодо генераци?
Или предпологаетс тупо в лоб нарубать файл выдергивая значения руками?

Наверное я задаю моного глупых вопросов, но документации ни по компилятору ни по плагину нет, так что единственный способ что то узнать это либо пытать более опытных товарищей либо биться об стену самому.... Надеюсь я не слишком парю
Re[3]: Есть простая задачка для желающих
От: robot01  
Дата: 07.09.06 13:03
Оценка:
Упс предыдущее сообщение от меня....
Re[2]: Есть простая задачка для желающих
От: VladD2 Российская Империя www.nemerle.org
Дата: 07.09.06 16:53
Оценка:
Здравствуйте, robot01, Вы писали:

R>Потратил несколько часов на знакомство с поставленной вами задачей.

R>Честно говоря нормального пути решения я не увидил (не нормальный путь это тупо сгенерировать файл с помощью String.Format).

R>Нормальный путь для решения сей задачи это: использовать NemerleCodeProvider и с помошью него сгенерить файл.


Будут проблемы. CodeDomProvider рассчитан на усредненный язык. В этом языке как минимум нет таких понятий как variant-ы. К тому же нет путей посторить CodeDom по сборке. Это прийдется делать вручную. А раз так, то не вижу особого смысла в промежеточном коде.

string.Format тоже не лучший инструмент. Нут нужно генерировать текст. Для этого лучше всего подходят нековые строковые шаблонные движки. Например, StringTemplate или XSLT. В принципе немерловые сплайсет-строки очень похожи на эти движки, но я бы их немного доработал. Так нужна поддержка вложенности (отступы).

R>Все бы хорошо но кодпровайдер хочет стандартные классы из CodeDom, а все что я могу получить это Nemerle.Compiler.TypeInfo, что с этим классом делать ума не пролижу, переколбасить в CodeTypeDeclaration? чесно говоря не представляю как такое можно сделать....перелопачивать в лоб? тупо и на долго....

R>Может быть подскажите в каком направлении копать?

Мне кажется нужно используя TypeInfo генерировать код на базе строковых шаблонов. В общем-то это не сложно если делать с гловой. Надо создать по шаблону жля каждого элемнта (класса, структуры, метода, свойства...) и вызвать их рекурсивно. Например, шаблон для класса может выглядить так:
Class:
$(Split(customAttributs, modifiers, " "))class $(typeInfo.Name) $(Super(typeInfo))
{
    $(Memebers(typeInfo))
}

далее точно так же насписываются все подшаблоны (Super и Memebers в данном случае).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Есть простая задачка для желающих
От: IT Россия linq2db.com
Дата: 07.09.06 19:45
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Я на него и смотрю, у него тип Nemerle.Compiler.TypeInfo (на сколько я понял это класс описывающий тип со специфичными для немерле условиям). Ворос вот в чем: что бы с ним можно было работать средствами CodeProvider`а нужно привести его к типу CodeTypeDeclaration (из CodeDom), есть ли для этого какието штатные средства?


С CodeProvider не слишком сложно получится?

А>Или есть иные средства кодо генераци?


TypeInfo сам уже умеет кое что показывать. Может быть его ToString вполне подойдёт.

А>Или предпологаетс тупо в лоб нарубать файл выдергивая значения руками?


Можно и нарубать. Ты попробуй, а там видно будет. За последующий рефакторинг/переделки ругать никто не будет

А>Наверное я задаю моного глупых вопросов, но документации ни по компилятору ни по плагину нет, так что единственный способ что то узнать это либо пытать более опытных товарищей либо биться об стену самому.... Надеюсь я не слишком парю


Не слишком. Я прежде чем начать что-то делать Влада по телефону часа четыре парил.
Если нам не помогут, то мы тоже никого не пощадим.
Re[4]: Есть простая задачка для желающих
От: IT Россия linq2db.com
Дата: 07.09.06 19:52
Оценка:
Здравствуйте, robot01, Вы писали:

Ещё хорошо бы не обновлять файлы на диске в случае ненадобности. А то студия может начать задавать глупые вопросы про файл изменился, бла-бла-бла. Так же студия умеет писать рядом с именем таких файлов [from metadata]. Тоже не понятно как это сделать. Хотя может они по имени каталога как-то вычисляют. У меня оно такое — C:\Temp\4040$CommonLanguageRuntimeLibrary$v2.0.50727

В общем, надо разбираться.
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Есть простая задачка для желающих
От: robot01  
Дата: 08.09.06 11:38
Оценка:
Спасибо за совет.

Возник еще вопрос: захотелось мне написать тесты ко всему этому добру но напоролся на проблему, самому создать объект типа TypeInfo почти не реально (куча гемора с зависимыми объектами и прочее), мокать тоже как то грустно, какие есть варианты?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Есть простая задачка для желающих
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.09.06 11:55
Оценка:
Здравствуйте, robot01, Вы писали:

R>Возник еще вопрос: захотелось мне написать тесты ко всему этому добру но напоролся на проблему, самому создать объект типа TypeInfo почти не реально (куча гемора с зависимыми объектами и прочее), мокать тоже как то грустно, какие есть варианты?


Смотри файлы:
Nemerle.VSIP\Nemerle.Compiler.Utils\Nemerle.Completion2\Tests\Content\Class1.n
Nemerle.VSIP\Nemerle.Compiler.Utils\Nemerle.Completion2\Tests\Content\Class1-2.n

это тестовый код (не код тестов, а код используемый тестами).

Далее, это:
Nemerle.VSIP\Nemerle.Compiler.Utils\Nemerle.Completion2\Tests\Tests.n
Nemerle.VSIP\Nemerle.Compiler.Utils\Nemerle.Completion2\Tests\Tests.Init.n

Код самих тестов.
Вызывать их можно или через NUnit (про версию тут рядом ветка есть):
Nemerle.VSIP\VSIntegartion.nunit

Или через специальный консольный проект Nemerle.VSIP\ConsoleTest\ConsoleTest.csproj (входит в основной солюшен). Этот проект удобен для отладки.

В файле Tests.Init.n находится небольшой фрэйворк для тесто. Думаю, что из его исходников и самого теста будет явно как что применять.

Далее тебе останется только найти какой-нибудь тип и писать тесты.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Есть простая задачка для желающих
От: robot01  
Дата: 08.09.06 12:17
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Далее, это:

VD>Nemerle.VSIP\Nemerle.Compiler.Utils\Nemerle.Completion2\Tests\Tests.n
VD>Nemerle.VSIP\Nemerle.Compiler.Utils\Nemerle.Completion2\Tests\Tests.Init.n

Я собственно смотрел их раньше, там тестируются функции полностью (т.е. это функиональные тесты) это не совсем то что мне нужно, мне бы хотелось взять какую нибудь штуку ( ) натравить ее на файл и что бы она его распарсила и выдала мне список TypeInfo (ну или дерево или не важно чего главное что бы я мог извлечь от туда информацию о типах описанных мною в файле) а я потом мог с помошью этого прогнать юнит тесты.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Есть простая задачка для желающих
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.09.06 16:55
Оценка:
Здравствуйте, robot01, Вы писали:

R>мне бы хотелось взять какую нибудь штуку ( ) натравить ее на файл и что бы она его распарсила и выдала мне список TypeInfo (ну или дерево или не важно чего главное что бы я мог извлечь от туда информацию о типах описанных мною в файле) а я потом мог с помошью этого прогнать юнит тесты.


Там тесты конкретных фич. Например, комплейшона или хинтов. Ты можешь добавить свои тесты в которых сделать все что хочешь. Лишь бы они выполнялись за разумное место.

Получить список типов довольно просто. Вот тест который это делает:
[Test]
public PrintTypes() : void
{
    def tree = _project.NamespaceTree;
    Assert.IsNotNull(tree, "result is null");
}

В tree будет дерево теипов. Из него правда еще нужно достать типы, но этот код легко найти. Там просто дерево.

То как выцепить сами классы можно подсмотреть в _project.GetActiveDecl(file, line, col).
Эта функция выдает типы полученные путем парсинга, но не трудно сделать ее клон и кострировать до нужного состояния.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Есть простая задачка для желающих
От: Nuald Россия http://nuald.blogspot.com
Дата: 09.09.06 02:16
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Или через специальный консольный проект Nemerle.VSIP\ConsoleTest\ConsoleTest.csproj (входит в основной солюшен). Этот проект удобен для отладки.


А как им пользоваться?
Если запускать из-под Visual Studio, то он просто падает с DirectoryNotFoundException "Could not find a part of the path 'D:\\Work\\Nemerle\\vs-plugin\\bin\\Debug\\Nemerle.Completion2\\Tests\\Content\\Class1.n'."
Если же его скопировать в Nemerle.Compiler.Utils и запустить, то он просто выводит:
===================================
public static method ClassExtension.Foo(s : string) : int

Nemerle.Completion2\Tests\Content\Class1.n:146:3:149:4:
public static method ClassExtension.Foo(s : string) : int

Nemerle.Completion2\Tests\Content\Class1.n:146:3:149:4:
public static method ClassExtension.Foo(s : string) : int

Nemerle.Completion2\Tests\Content\Class1.n:146:3:149:4:
public static method ClassExtension.Foo(s : string) : int

Nemerle.Completion2\Tests\Content\Class1.n:146:3:149:4:
public static method ClassExtension.Foo(s : string) : int

Nemerle.Completion2\Tests\Content\Class1.n:146:3:149:4:
===================================

WTF? С NUnit-ом еще более или менее понятно (хотя тесты из Nemerle.VsIntegration.Tests почему-то все Failed), то с ConsoleTest хотелось бы поближе разобраться, учитывая что он "удобен для отладки".
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: Есть простая задачка для желающих
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.09.06 08:55
Оценка:
Здравствуйте, Nuald, Вы писали:

N>А как им пользоваться?

N>Если запускать из-под Visual Studio, то он просто падает с DirectoryNotFoundException "Could not find a part of the path 'D:\\Work\\Nemerle\\vs-plugin\\bin\\Debug\\Nemerle.Completion2\\Tests\\Content\\Class1.n'."

Ну, это элементано, Ватсон!

Само сообщение говорит о том, что нужно делать.
Зайди в настройке проекта и на закладке Debug, в поле Working Directory укажи путь:
D:\MyProjects\RSDN\Nemerle\Nemerle.VSIP\Nemerle.Compiler.Utils\

естествнно начальная часть будет твоя.

N>Если же его скопировать в Nemerle.Compiler.Utils и запустить, то он просто выводит:

N>===================================
N>public static method ClassExtension.Foo(s : string) : int
N>...

А что бы ты хотел чтобы он выводил? Да и какое дело что он там выводит. Это тесты. Они вообще могут ничего не выводить.

Если тебе что-то надо, то пиши свой тест и из под отладчика с ним возись. За одно в будущем все твои тесты будут автоматом проверяться и если что-то где-то испортится, то это будет сразу видно.

N>WTF? С NUnit-ом еще более или менее понятно (хотя тесты из Nemerle.VsIntegration.Tests почему-то все Failed), то с ConsoleTest хотелось бы поближе разобраться, учитывая что он "удобен для отладки".


В Nemerle.VsIntegration.Tests я не суюсь. Это не мои тесты. Мои на сегодня все зеленинькие.

Что касается NUnit, то он прекрасен для быстрой проверки, но отладку из него не сделашь. Именно по этому появился ConsoleTest.

Идея его очень проста. Он позволяет запустить юнит-тесты из под отладчика (как обычные методы) и поглядеть что не ладно в датском королевстве. Он тупо загружает сборку Nemerle.Compiler.Utils.dll, создает класс Tests.Test1 и дергает его методы.

В Tests.Test1 есть мелкий фрэймворк по подему компиляторных функций. В методе Init() этого класса создается и инициализируется двумя файлами движок интелисенса (класс Nemerle.Completion2.Engine).
У него получается так называемый "проект". Через поля _engine и _project класа Test1 можно получить доступ к любой информации о коде и воспользоваться функциями интелисенса или компилятора.

Так что добавляй новый тест и делай в нем все что душе угодно. Есть только два условия. Ты не должен очень сильно занимать процессорное время и много выводить на консоль (все же тесты часто гоняются как напрямую так и через НЮнит).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Есть простая задачка для желающих
От: vdimas Россия  
Дата: 09.09.06 08:59
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Что касается NUnit, то он прекрасен для быстрой проверки, но отладку из него не сделашь. Именно по этому появился ConsoleTest.


VD>Идея его очень проста. Он позволяет запустить юнит-тесты из под отладчика (как обычные методы) и поглядеть что не ладно в датском королевстве. Он тупо загружает сборку Nemerle.Compiler.Utils.dll, создает класс Tests.Test1 и дергает его методы.


Сорри, что встреваю, а что не так с NUnit при запуске тестов на отладку?
Re[8]: Есть простая задачка для желающих
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.09.06 10:57
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Сорри, что встреваю, а что не так с NUnit при запуске тестов на отладку?


GUI которое на фиг не упало.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Есть простая задачка для желающих
От: IT Россия linq2db.com
Дата: 09.09.06 15:55
Оценка:
Здравствуйте, VladD2, Вы писали:

V>>Сорри, что встреваю, а что не так с NUnit при запуске тестов на отладку?


VD>GUI которое на фиг не упало.


А мне нравится
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[10]: Есть простая задачка для желающих
От: VladD2 Российская Империя www.nemerle.org
Дата: 09.09.06 19:06
Оценка:
Здравствуйте, IT, Вы писали:

VD>>GUI которое на фиг не упало.


IT>А мне нравится


А нафига оно при отладке? Лишние телодвижения при отладке вредны. Они вообще только для похудения нужны.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Есть простая задачка для желающих
От: Nuald Россия http://nuald.blogspot.com
Дата: 11.09.06 04:58
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Само сообщение говорит о том, что нужно делать.


Хм, сообшение об этом ничего не говорит, по-крайней мере, для непосвященного. В мире всеобщей рефлексии и эмита какой бы не был текст ошибки, нельзя сделать никакие выводы, предварительно не отладив тонны кода

VD>Зайди в настройке проекта и на закладке Debug, в поле Working Directory укажи путь:

VD>
VD>D:\MyProjects\RSDN\Nemerle\Nemerle.VSIP\Nemerle.Compiler.Utils\
VD>

VD>естествнно начальная часть будет твоя.

Думаю, проще было бы добавить такую проверку (или даже автоматическую настройку), чтобы люди не пугались, и не задавали глупые вопросы. Потом сделаю, но как только разберусь со следующей ошибкой — я запускаю ConsoleTest и у меня вылетает assert в Nemerle.Compiler.Utils\Nemerle.Completion2\Tests\Tests.n, line 55, "result is null", т.е. строчка
def result = _project.GetQuickTipInfo(file, line, col, GetTextFromFile(file, _, _, _, _));

выдает null (хотя все NUnit-тесты проходят нормально). По идее file должен находится и открываться (Working Dir в опциях проекта указан правильно). С чем это может быть связано?

VD>Если тебе что-то надо, то пиши свой тест и из под отладчика с ним возись. За одно в будущем все твои тесты будут автоматом проверяться и если что-то где-то испортится, то это будет сразу видно.


Мне проще это делать из под Решарпера — он умеет как просто запускать тесты, так их и отлаживать.

VD>В Nemerle.VsIntegration.Tests я не суюсь. Это не мои тесты. Мои на сегодня все зеленинькие.


Хм, а чьи? Может тогда проще их удалить, если никто не поддерживает. В принципе, могу привести в работоспособное состояние, если нужно.

VD>Так что добавляй новый тест и делай в нем все что душе угодно. Есть только два условия. Ты не должен очень сильно занимать процессорное время и много выводить на консоль (все же тесты часто гоняются как напрямую так и через НЮнит).


Мы как-то делали обработку графики, и там был такой стресс-тест — надо было загрузить большую-большую картинку и ее обработать без вылетов о нехватке памяти и уложиться в определенный интервал времени. Это было частью NUnit-теста и занимало около 4-5 минут
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.