доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 00:40
Оценка:
на этапе BeforeTypedMembers не удается получать информацию о классах или структурах в используемых DLL.
полученный обычным способом через typer.BindFixedType(t).TypeInfo приводится к ExternalTypeInfo, однако по
полям там пусто, а свойства-флаги неверны.


     match(ty)              
        | estruct is LibraryReference.ExternalTypeInfo => estruct.GetFields(..) //пусто и неверно


способ есть?
Re: доступ к классам и структурам в Reference из макроса
От: hardcase Пират http://nemerle.org
Дата: 15.12.11 12:51
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>на этапе BeforeTypedMembers не удается получать информацию о классах или структурах в используемых DLL.


Зачем?
/* иЗвиНите зА неРовнЫй поЧерК */
Re: доступ к классам и структурам в Reference из макроса
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.12.11 13:31
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>на этапе BeforeTypedMembers не удается получать информацию о классах или структурах в используемых DLL.

_C_>полученный обычным способом через typer.BindFixedType(t).TypeInfo приводится к ExternalTypeInfo, однако по
_C_>полям там пусто, а свойства-флаги неверны.

Это ты что-то накосячил. Информация о внешних типах доступна на самых ранних стадиях.

_C_>
_C_>     match(ty)              
_C_>        | estruct is LibraryReference.ExternalTypeInfo => estruct.GetFields(..) //пусто и неверно
_C_>


Приводить тип к ExternalTypeInfo бессмысленно и не верно. Он в будущем вообще будет недоступн. Приводи к TypeInfo.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 13:39
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Здравствуйте, _Claus_, Вы писали:


_C_>>на этапе BeforeTypedMembers не удается получать информацию о классах или структурах в используемых DLL.


H>Зачем?


мне нужно в зависимости от их типа и содержимого генерить классы и методы поддержки. для датабазы.
Re[2]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 14:11
Оценка:
VD>Приводить тип к ExternalTypeInfo бессмысленно и не верно.

надеялся что-то поможет.

VD> Он в будущем вообще будет недоступн. Приводи к TypeInfo.


с этого я начал. не работает. членов 0, из флагов для меня интересен IsValueType, всегда false.
проверил в фазе WithTypedMembers — результат тот же.

делаю так

def ty = typer.BindFixedType(fld_type)
def members = ty.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %| BindingFlags.Instance )
Re[3]: доступ к классам и структурам в Reference из макроса
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.12.11 14:51
Оценка:
Здравствуйте, _Claus_, Вы писали:

VD>> Он в будущем вообще будет недоступн. Приводи к TypeInfo.


_C_>с этого я начал. не работает. членов 0,


Значит ты где-то накосячил. Подобный код работает в сотни мест.

Скорее всего ты не верно флаги в GetMembers() задал. Это самая распространенная ошибка.
Так же, возможно, ты пытался вызвать GetMembers() у типа который с исходников собран.

_C_> из флагов для меня интересен IsValueType, всегда false.

_C_>проверил в фазе WithTypedMembers — результат тот же.

Точно что-то напутал.

_C_>делаю так


_C_>def ty = typer.BindFixedType(fld_type)

_C_>def members = ty.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %| BindingFlags.Instance )

А ты уверен, что в fld_type не находится тип собранный из исходников? В прочем на WithTypedMembers он должен был дать список членов.

Короче, воспроизведи это дело в отдельном маленьком макросе и пришли его код сюда или мне на мыло. Я погляжу что у тебя там не так.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 16:03
Оценка:
VD>Короче, воспроизведи это дело в отдельном маленьком макросе и пришли его код сюда или мне на мыло. Я погляжу что у тебя там не так.


 [MacroUsage(MacroPhase.BeforeTypedMembers, MacroTargets.Method)]\
  macro TEST(typeBuilder : TypeBuilder, _ : ClassMember.Function, expr : PExpr)\
  syntax ("TEST", expr)
  
    Test.Former(typeBuilder, expr, Macros.ImplicitCTX())
    
  module Test
    public Former(tb : TypeBuilder, e : PExpr, typer : Typer) : void
          
      match (e)
      
        | <[ $(name : name) : $type ]> =>           
           def ty = typer.BindFixedType(type).TypeInfo
           def s = ty.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %| BindingFlags.Instance )
           _ = s
        | _ =>  Message.Error(e.Location, <#Expected: name : type #>)


вызов


class dum
  f = ""
  g = 2  
  TEST z : OutType


OutType — любой внешний тип. особенно интересуют struct, для которого IsValueType false.
Re[5]: доступ к классам и структурам в Reference из макроса
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.12.11 17:27
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>
_C_>           def s = ty.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %| BindingFlags.Instance )
_C_>


Кажется я понял в чем дело. GetFields() отсекает недоступные из текущей сборки поля. А типов с публичными полями ты во всем фрэймворке не найдешь.

А что ты дальше будешь делать со знанием о том, что в типе есть недоступные тебе поля? Обратиться ты к ним не сможешь ведь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 17:54
Оценка:
VD>А что ты дальше будешь делать со знанием о том, что в типе есть недоступные тебе поля? Обратиться ты к ним не сможешь ведь.

да при чем тут. заведи свой класс или struct с public полями из внешней либы, вот добавь в макромодуль это


struct OutType
    public x : int
    public y : string


и увидишь проблему
Re[7]: доступ к классам и структурам в Reference из макроса
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.12.11 18:20
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>да при чем тут. заведи свой класс или struct с public полями из внешней либы, вот добавь в макромодуль это

_C_>
_C_>struct OutType
_C_>    public x : int
_C_>    public y : string
_C_>

_C_>и увидишь проблему

Завел... Попробовал. Проблем нет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[8]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 18:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, _Claus_, Вы писали:


_C_>>да при чем тут. заведи свой класс или struct с public полями из внешней либы, вот добавь в макромодуль это

_C_>>
_C_>>struct OutType
_C_>>    public x : int
_C_>>    public y : string
_C_>>

_C_>>и увидишь проблему

VD>Завел... Попробовал. Проблем нет.


код точно тот, который я разместил?
в GetFields есть поля?
в IsValueVisible == true?

если все да, у нас либо разные компиляторы, либо причина в том, что другой код, который болтается в проекте и никак не связал
логически, влияет на вычисления. В качестве эксперимента я могу сделать чистый проект с одним макросом. Стоит делать?
Re[9]: доступ к классам и структурам в Reference из макроса
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.12.11 19:50
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>код точно тот, который я разместил?


Да.

_C_>в GetFields есть поля?


Да.

_C_>в IsValueVisible == true?


Мой телепатер подсказывает, что речь видимо идет о:
field.GetMemType().IsValueType


Проверил и его:
using Nemerle;
using Nemerle.Collections;
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;
using Nemerle.Compiler.Typedtree;
using Nemerle.Text;
using Nemerle.Utility;

using System;
using System.Collections.Generic;
using System.Linq;


namespace MacroLibrary
{
  [MacroUsage(MacroPhase.BeforeTypedMembers, MacroTargets.Method)]
  macro TEST(typeBuilder : TypeBuilder, method : ClassMember.Function, expr : PExpr)
  syntax ("TEST", expr) 
  {
    TESTImpl.DoTransform(Macros.ImplicitCTX(), typeBuilder, method, expr)
  }
  
  module TESTImpl
  {
    public DoTransform(typer : Typer, _typeBuilder : TypeBuilder, _method : ClassMember.Function, expr : PExpr) : void
    {
      Macros.DefineCTX(typer);
      
      match (expr)
      {
        | <[ $(_ : name) : $type ]> =>           
          def ty = typer.BindFixedType(type).TypeInfo;
          def fields = ty.GetFields(BindingFlags.Public %| BindingFlags.NonPublic %| BindingFlags.Instance);
          foreach (field in fields)
            Message.Hint(expr.Location, $"Field: $(field.Name) IsValueVisible = $(field.GetMemType().IsValueType)");
           
        | e =>  Message.Error(e.Location, <#Expected: name : type #>)
      }
    } 
  }
}


Все, ОК. Выводит:

Main.n(14,8): warning : hint: Field: x IsValueVisible = True
Main.n(14,8): warning : hint: Field: y IsValueVisible = False


_C_>если все да, у нас либо разные компиляторы,


Это вряд ли.

_C_>либо причина в том, что другой код, который болтается в проекте и никак не связал логически, влияет на вычисления.


Причины могут быть разные. Одна из них чья-то невнимательность. Например, ты тип описал в том же проекте.
Я бы начал с проверки этого.

_C_>В качестве эксперимента я могу сделать чистый проект с одним макросом. Стоит делать?


Не думаю, что это что-то изменит. Но попробуй. По крайней мере будет ясно в чем проблема.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[10]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 21:36
Оценка:
VD>Причины могут быть разные. Одна из них чья-то невнимательность. Например, ты тип описал в том же проекте.
VD>Я бы начал с проверки этого.

Я написал тестовые типы в проекте макросов. они для компилируемого исходника внешние или внутренние?
я так подозревал, что внешние. может дело в этом?
Re[10]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 21:39
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, _Claus_, Вы писали:


_C_>>код точно тот, который я разместил?


VD>Да.


_C_>>в GetFields есть поля?


VD>Да.


_C_>>в IsValueVisible == true?


VD>Мой телепатер подсказывает, что речь видимо идет о:

VD>
VD>field.GetMemType().IsValueType
VD>


это откуда этот field вдруг взялся?
я имею ввиду:

def ty = typer.BindFixedType(type).TypeInfo

ty.IsValueType ??
Re[10]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 22:06
Оценка:
вот дебужный скрин. может глядя на него, особенно на окно Локальные, ты поймешь в чем дело?
http://imageshost.ru/photo/224883/id1148742.html
Re[11]: доступ к классам и структурам в Reference из макроса
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.12.11 22:31
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>Я написал тестовые типы в проекте макросов. они для компилируемого исходника внешние или внутренние?


Внешние, если сборка подключена через обычный референс, естественно.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[11]: доступ к классам и структурам в Reference из макроса
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.12.11 22:37
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>вот дебужный скрин. может глядя на него, особенно на окно Локальные, ты поймешь в чем дело?

_C_>http://imageshost.ru/photo/224883/id1148742.html

Ну, да. Так то оно понятно. Тут телепатия не нужна.

Дело в криво написанном имени типа (при объявлении псевдо-поля) или не указанном (указанном криво, не открытом) пространстве имен.

Предлагаю отгадать как я смог об этом догадаться, при условии, что код этот я даже не видел.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[12]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 22:50
Оценка:
VD>Дело в криво написанном имени типа (при объявлении псевдо-поля) или не указанном (указанном криво, не открытом) пространстве имен.

VD>Предлагаю отгадать как я смог об этом догадаться, при условии, что код этот я даже не видел.


все перепроверено 10 раз, еще до конкурса "Ану-ка парни", с которым была надежда получить заодно это решение.

вот скрин, который убедит, что имена в порядке, иначе там бы не было останова. (структуру перенес рядом).

http://imageshost.ru/photo/235824/id1148761.html
Re[13]: доступ к классам и структурам в Reference из макроса
От: VladD2 Российская Империя www.nemerle.org
Дата: 15.12.11 23:14
Оценка:
Здравствуйте, _Claus_, Вы писали:

_C_>все перепроверено 10 раз, еще до конкурса "Ану-ка парни", с которым была надежда получить заодно это решение.

_C_>вот скрин, который убедит, что имена в порядке, иначе там бы не было останова. (структуру перенес рядом).
_C_>http://imageshost.ru/photo/235824/id1148761.html

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

Обрати внимание на значение переменной ty. Там не тот тип что ты хотел, а object. "object" после связывания появляется когда тип неудалось связать. При этом еще должно было появиться сообщение об ошибке. Ты его благополучно пропустил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: доступ к классам и структурам в Reference из макроса
От: _Claus_  
Дата: 15.12.11 23:45
Оценка:
никаких ошибок не видел, в списке ошибок и предупреждений нет и компилируется.
на скрине видно же, что с типом не лажаю. и сам тип OutType тоже показан, что не глюк. перед этим пробовал другие типы, которые
у меня рядом описаны — то же самое.

я вижу что там object и также вижу, что там он видит таки, что это ExternalType (см. тип), и мой косяк я тут не вижу. привожу тебе Main:

#pragma warning disable 10005
#pragma indent
using System
...

using DBLib //там OutType и макросы
    
class dum
  f = ""
  g = 2  
  TEST z : OutType

...




может ну их эти external struct? отдам стандартному сериализатору и дело с концом.
или кого из ребят попросить, чтобы сказали, у них как у меня или как у тебя. и тогда списать на мою черную полосу.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.