Deutsch
Germany.ruФорумы → Архив Досок→ Программирование

Доступ к сессии?

893  1 2 все
Murr патриот26.03.22 15:41
Murr
26.03.22 15:41 

Доступ к сессии?


Есть ХОСТ для процесса компиляции. Получается имплементацией интерфеса:


    public interface ITextTemplatingEngineHost
    {
        IList<string> StandardAssemblyReferences { get; }
        IList<string> StandardImports { get; }
        string TemplateFile { get; }
        object GetHostOption(string optionName);
        bool LoadIncludeText(string requestFileName, out string content, out string location);
        void LogErrors(CompilerErrorCollection errors);
        AppDomain ProvideTemplatingAppDomain(string content);
        string ResolveAssemblyReference(string assemblyReference);
        Type ResolveDirectiveProcessor(string processorName);
        string ResolveParameterValue(string directiveId, string processorName, string parameterName);
        string ResolvePath(string path);
        void SetFileExtension(string extension);
        void SetOutputEncoding(Encoding encoding, bool fromOutputDirective);
    }
    

Есть способ передать информацию об ХОСТе в обработчик директив шаблона.

        public override void Initialize(ITextTemplatingEngineHost host)
        {
            //we do not need to do any initialization work
        }
    

Однако в процессе обработки встроенных директив результаты складываются не на ХОСТ, а в СЕССИЮ.

        private static void ProcessTemplateDirective(Directive directive, TemplateProcessingSession session, TErrorsLog errors, ITelemetryScope scope)
        {
            session.Language            = GetLanguage();
            session.HostSpecific        = GetHostSpecific();
            session.BaseClassName        = GetBaseClassName();
            session.Debug                = GetDebug();
            session.FormatProvider        = GetFormatProvider();
            session.CompilerOptions        = GetCompilerOptions();
            session.IsPublic            = GetVisibility();
            session.LinePragmas            = GetLinePragmas();
            return;
        }
    


Вопрос на засыпку - как из просессора директивы получить доступ к этой сессии?

П.С. Та Сессия, которая доступна при генерации кода это другая сессия. Меня интересует сессия времени компиляции.

#1 
AlexNek патриот26.03.22 21:39
AlexNek
NEW 26.03.22 21:39 
в ответ Murr 26.03.22 15:41
как из процессора директивы получить доступ к этой сессии

ты опять завис в своей проблеме и считаешь, что и остальные плавают где то рядом.

Скажу по секрету, что не понимаю абсолютно ничего, что именно ты делаешь. Не то что бы примерно, а вообще ничего.

#2 
Murr патриот26.03.22 22:21
Murr
NEW 26.03.22 22:21 
в ответ AlexNek 26.03.22 21:39, Последний раз изменено 26.03.22 22:29 (Murr)

не понимаю абсолютно ничего, что именно ты делаешь

-----

Унифицирую в компиляторе "шаблонов Т4" обработку директив в "шаблонах Т4". спок

Я знаю что понятнее не стало. Чтобы стало понятнее - надо посидеть над созданием своего хоста... ээээ... имплементацией указанного выше интерфейса и его использованием и обработчиками директив.

Если все еще непонятно - директивы в шаблонах обрабатываются внешними обработчиками. Кроме - предопределенных. Предопределенные обрабатываются внутри и не заменяются. Хочу вынести их во внешние и обрабатывать как все остальные.

Думаю что чтобы влезть с нуля нужен месяц-полтора до понимания деталей...


Ладушки - в той постановке задачи которая дана выше решения просто нет - требуемая сессия болтается сама по себе и к хосту никак не привязывается.


Так что возможное решение будет следующим:

- написать интерфейс доступа к требуемой сессии

- имплементить хост с двумя интерфейсами и местом под ссылку на сессию

- на месте создания сессии проверять наличие хоста с поддержкой второго интерфейса и помещать сессию в хост если возможно

- по месту потребления - получать интерфейс и через него - сессию.

Вроде так...


непонятно как это будет работать со Студией - там обрабатывается только доступ сессии времени генерации... да и хост заменить не получится - встроенный... и Я его пока не смотрел...

#3 
AlexNek патриот26.03.22 22:38
AlexNek
NEW 26.03.22 22:38 
в ответ Murr 26.03.22 22:21
Унифицирую в компиляторе

Выходи еще наверх. Что это плагин к студии или что то еще?

Есть интерфейс, а когда создается его имплементация? Может там можно передать сессию?

#4 
Murr патриот27.03.22 01:32
Murr
NEW 27.03.22 01:32 
в ответ AlexNek 26.03.22 22:38

когда создается его имплементация?

-----

Где-то в недрах Студии. Пока не копал где и что именно создается. Но знаю, что там несколько версий.

Можно и свою написать...не шибко сложно... и подсунуть компилятору... вроде... Я пока не смотрел - ковыряю "движек" компилятора - там точно можно - один из обязательных параметров.


Может там можно передать сессию?

------

Отдельно сессию передать нельзя - нет метода/параметра/проперти для передачи, а менять списки параметров мне сильно не хочется - совместимость пропадет.

Даже над тем куда поместить дополнительный интерфейс надо сильно подумать.

#5 
AlexNek патриот27.03.22 11:21
AlexNek
NEW 27.03.22 11:21 
в ответ Murr 27.03.22 01:32
Отдельно сессию передать нельзя

Если я делаю свою имплементацию интерфейса то добавить проперть в имплементацию должно быть совершенно безопасно.


Но я так и не понимаю, на каком этапе ты влазишь в студию

#6 
Murr патриот27.03.22 14:05
Murr
NEW 27.03.22 14:05 
в ответ AlexNek 27.03.22 11:21

добавить проперть в имплементацию должно быть совершенно безопасно

-----

Ээээ... добавить - да, беспроблемно.

Осталось передать интерфейс хоста... и обратится к проперти... через интерфейс... потому как по-другому - низзя, несовместимо будет...

Интерфейс хоста, если что, приведен выше. Лежит в Microsoft.VisualStudio.TextTemplating.Interfaces.10.0.dll. Переопределятся, естественно, не будет.


на каком этапе ты влазишь в студию

-----

Студия, при вызове компилятора, передает ему свой хост.

Должна. Где, когда и какой именно создается - не знаю.

Есть отдельный компилятор - надо смотреть что там за хост.

Если есть интерес - еще один хост есть в DSL...

Но у Студии - другой... Знаю, что сильно повязан на Студию... типа internal для нее...


Что интересно - ни одной полноценной реализации хоста не приводится.

Все что удалось нарыть - частичные, иллюстративные...


Редко требующиеся моментики....

#7 
AlexNek патриот27.03.22 16:05
AlexNek
NEW 27.03.22 16:05 
в ответ Murr 27.03.22 14:05
и обратится к проперти... через интерфейс

Это может означать только то, что для того, что ты хочешь система не предназначена.

#8 
Murr патриот27.03.22 16:46
Murr
NEW 27.03.22 16:46 
в ответ AlexNek 27.03.22 16:05

того, что ты хочешь система не предназначена

-----

Ну так в посте #3 так и написано... спок

А чуть выше написал как можно решить... смущ


Самое смешное - обработка одной из встроенных директив написана именно как Процессор Директив...

Но там манипуляция только с хостом...


В принципе, уже слепил расширенный хост и начал выносить код обработки в Процессора Директив...

Только это на пару дней... если голова не разболится...

#9 
Murr патриот05.04.22 14:26
Murr
NEW 05.04.22 14:26 
в ответ Murr 27.03.22 16:46

Написалось так:


определены два интерфейса:


    [CLSCompliant(true)]
    public interface ITextTemplatingTemplateProcessingSessionHost
    {
        ITemplateProcessingSession TemplateProcessingSession { get; set; }
    }

    [CLSCompliant(true)]
    public interface ITemplateProcessingSession
    {
        bool ProcessedOutputDirective { get; set; }
    }

Далее пишется имплементация в хосте


    public class TTextTemplatingTemplateProcessingSessionHost 
        : MarshalByRefObject
        , ITextTemplatingEngineHost
        , ITextTemplatingSessionHost
        , ITextTemplatingTemplateProcessingSessionHost
    {
        .....

        ITemplateProcessingSession ITextTemplatingTemplateProcessingSessionHost.TemplateProcessingSession { get; set; }
    }

Имплементация ITemplateProcessingSession аналогична и тоже в порядке.


и наконец простой код


    ITextTemplatingTemplateProcessingSessionHost host = PassedHost as ITextTemplatingTemplateProcessingSessionHost;     
    host?.TemplateProcessingSession?.ProcessedOutputDirective = true;

Вопрос в следующем.

Интеллисенсе показывает, что ProcessedOutputDirective имеет геттер и сеттер.

А в ошибках появляется:

Error CS0131 The left-hand side of an assignment must be a variable, property or indexer

...\OutputDirectiveProcessor.cs 117 Active


Вот сижу и чешу репу - что за хрень?


#10 
AlexNek патриот05.04.22 17:46
AlexNek
NEW 05.04.22 17:46 
в ответ Murr 05.04.22 14:26
Error CS0131 The left-hand side of an assignment must be a variable, property or indexer...\OutputDirectiveProcessor.cs 117 Active

Вот сижу и чешу репу - что за хрень? бебе (OutputDirectiveProcessor.cs 117)


#11 
Murr патриот05.04.22 19:09
Murr
NEW 05.04.22 19:09 
в ответ AlexNek 05.04.22 17:46

Это вроде как последние лет 20 не менялось:

Severity Code Description Project File Line Suppression State безум


#12 
Murr патриот05.04.22 19:23
Murr
NEW 05.04.22 19:23 
в ответ AlexNek 05.04.22 17:46

аааа.... потер лишку - имя проекта... А оно какую-то ролЮ играет?

Ну тогда такое будет Microsoft.VisualStudio.TextTemplating.15.0.A


Полный путь к филеЮ тожА нужОн?

C:\Projects\Ms.Vs.TextTemplating\Microsoft.VisualStudio.TextTemplating.15.0.A\VisualStudio.TextTemplating\DirectiveProcessor\OutputDirectiveProcessor.cs


По сути вопроса то хоть что-то сможешь сказать?

#13 
AlexNek патриот05.04.22 20:33
AlexNek
NEW 05.04.22 20:33 
в ответ Murr 05.04.22 19:23

https://www.nuget.org/packages/Microsoft.VisualStudio.Text...

Если длл-ка то ее значит можно собрать на нормальной машине. Где то что у тебя не так.

#14 
Murr патриот05.04.22 23:35
Murr
NEW 05.04.22 23:35 
в ответ AlexNek 05.04.22 20:33

Где то что у тебя не так.

------

Ну так Я и спрашиваю - какие есть идеи по поводу того, почему проперти, у которой имплементированы геттер и сеттер (пусть и дефолтные), нельзя присвоить значение?!... Что Я МОГ напутать? Там ОДНА строка... она либо есть и тогда не должно быть ошибки, либо нет и тогда есть другая ошибка - не имплементирован интерфейс...

#15 
AlexNek патриот06.04.22 18:09
AlexNek
NEW 06.04.22 18:09 
в ответ Murr 05.04.22 23:35

Думаешь понятно, что именно ты делаешь?

А если подключить готовую ДЛЛ-ку тоже самое?

#16 
Murr патриот06.04.22 19:11
Murr
NEW 06.04.22 19:11 
в ответ AlexNek 06.04.22 18:09

А если подключить готовую ДЛЛ-ку тоже самое?

-----

Ээээ... подключить готовую дллку в проект этой самой дллки?

Хммм... нее, мне к доктору то ли еще рано, то ли уже поздно... смущ

#17 
AlexNek патриот06.04.22 20:26
AlexNek
NEW 06.04.22 20:26 
в ответ Murr 06.04.22 19:11
подключить готовую дллку в проект этой самой дллки?

Так ты что не можешь создать Длл-ку из исходников?

Это я уже говорил - у тебя где-то что то не так, причем совершенно не там где ты думаешь.

Только непонятно - зачем самому ее собирать?

#18 
Murr патриот07.04.22 11:17
Murr
NEW 07.04.22 11:17 
в ответ AlexNek 06.04.22 20:26

Так ты что не можешь создать Длл-ку из исходников?

-----

Ээээ... а у тебя получается их создавать при наличии синтаксических ошибок?

А вот откуда там появляется ошибка Я как раз и не могу понять - вроде все правильно...


Зачем самому ее собирать?

------

Создай пустой проектик в Студии.

Добавь визардом Runtime Text Template шаблончик в проект.

Посмотри на сгенерированный код.

Теперь надо сделать следующее:

- на сгенерированный класс надо повесить дополнительный аттрибут с данными автора, пока можно просто залогиненного юзера

- добавить два метода - статический Call() и виртуальный Prim2(). Обоим нужен список параметров из директив Parameters. Параметры через сессию передавать не нужно.

Это - для каждого обрабатываемого шаблона.

пока хватит - позднее, разумеется, надо будет добавлять что-то еще.

Ааа... вот еще задачка - шаблоны поделить на шаблоны и суб-шаблоны... Разница - "вызов" шаблона выполняется из вне, а суб-шаблона - из другого (суб-)шаблона. Тут рекурсию надо ограничить...

Ах, да... забыл... ручной работы с шаблоном быть не должно - максимум - поменять параметры компилятора шаблонов. Это где-то в targets'ах или другой Custom tools...


Вопрос решается довольно просто, если подменить обработчики директив.

Но!.. встроенные обработчики не заменяются - они впихнуты в компилятор шаблонов... биллина поделка - в документации прописано как должно быть... и сделано как получилось...

Вот Я и занимаюсь вытаскиванием обработчиков директив и генерации кода во вне компилятора, чтобы их можно было поменять на нужные...

Выделил, перенес, добавил что необходимо... и получил непонятную ошибку по которой задал вопрос... пока непонятно что за проблема.


#19 
AlexNek патриот07.04.22 21:56
AlexNek
NEW 07.04.22 21:56 
в ответ Murr 07.04.22 11:17

Хочешь значит свое что то добавить...


Не нашел я оригинала только форк

https://github.com/SubSonic-Core/SubSonic.Core.TextTemplat...

И раньше что то от тебя было

https://github.com/mono/t4.git

Могу попробовать скомпилить, если ссылку кинешь

#20 
1 2 все