на этапе BeforeTypedMembers не удается получать информацию о классах или структурах в используемых DLL.
полученный обычным способом через typer.BindFixedType(t).TypeInfo приводится к ExternalTypeInfo, однако по
полям там пусто, а свойства-флаги неверны.
match(ty)
| estruct is LibraryReference.ExternalTypeInfo => estruct.GetFields(..) //пусто и неверно
способ есть?
Re: доступ к классам и структурам в Reference из макроса
Здравствуйте, _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 из макроса
Здравствуйте, hardcase, Вы писали:
H>Здравствуйте, _Claus_, Вы писали:
_C_>>на этапе BeforeTypedMembers не удается получать информацию о классах или структурах в используемых DLL.
H>Зачем?
мне нужно в зависимости от их типа и содержимого генерить классы и методы поддержки. для датабазы.
Re[2]: доступ к классам и структурам в Reference из макроса
Здравствуйте, _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 из макроса
Здравствуйте, 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 из макроса
Здравствуйте, _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 из макроса
Здравствуйте, 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 из макроса
VD>Дело в криво написанном имени типа (при объявлении псевдо-поля) или не указанном (указанном криво, не открытом) пространстве имен.
VD>Предлагаю отгадать как я смог об этом догадаться, при условии, что код этот я даже не видел.
все перепроверено 10 раз, еще до конкурса "Ану-ка парни", с которым была надежда получить заодно это решение.
вот скрин, который убедит, что имена в порядке, иначе там бы не было останова. (структуру перенес рядом).
Здравствуйте, _Claus_, Вы писали:
_C_>все перепроверено 10 раз, еще до конкурса "Ану-ка парни", с которым была надежда получить заодно это решение. _C_>вот скрин, который убедит, что имена в порядке, иначе там бы не было останова. (структуру перенес рядом). _C_>http://imageshost.ru/photo/235824/id1148761.html
Это тот же самый скрин. Он убеждает только том, что в type у тебя некорректный тип.
Обрати внимание на значение переменной ty. Там не тот тип что ты хотел, а object. "object" после связывания появляется когда тип неудалось связать. При этом еще должно было появиться сообщение об ошибке. Ты его благополучно пропустил.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[14]: доступ к классам и структурам в Reference из макроса
никаких ошибок не видел, в списке ошибок и предупреждений нет и компилируется.
на скрине видно же, что с типом не лажаю. и сам тип 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? отдам стандартному сериализатору и дело с концом.
или кого из ребят попросить, чтобы сказали, у них как у меня или как у тебя. и тогда списать на мою черную полосу.