Как установить Location?
От: catbert  
Дата: 13.12.10 10:53
Оценка:
Есть макрос, который генерирует PExpr (по секрету, это более крутая версия макроса with, которой я хочу заменить ту, что сейчас в сниппетах).

Вот его часть:

def createAssignment(elem)
{
| <[ $(prop : name) = $val ]>    => <[ $name.$(prop : name) =  $val ]>
| <[ $(prop : name) += $val ]>   => <[ $name.$(prop : name) += $val ]>
| <[ $(prop : name) -= $val ]>   => <[ $name.$(prop : name) -= $val ]>
| <[ $(prop : name) => $val ]>   => <[ $name.$(prop : name) += (_) => $val ]>
| <[ $(prop : name) ::= $val ]>  => <[ _ = $name.$(prop : name).AddRange($val) ]>
}


Если в коде, который генерируется, возникает ошибка компиляции (например, нету свойства в классе), то локейшен ошибки совпадает с локейшеном всего макроса, что мне не нравится. Я вручную проставляю локейшены (result.Location = elem.Location), но это почему-то ничего не меняет.

ЧЯДНТ?
Re: Как установить Location?
От: hardcase Пират http://nemerle.org
Дата: 13.12.10 11:24
Оценка:
Здравствуйте, catbert, Вы писали:

C>ЧЯДНТ?


Для этого есть макрос locate, он устанавливает в стеке локешонов требуемое значение, которое попадет в квазицитаты:

def createAssignment(elem)
{
  Util.locate(elem.Location, match(elem)
  {
    | <[ $(prop : name) = $val ]>    => <[ $name.$(prop : name) =  $val ]>
    | <[ $(prop : name) += $val ]>   => <[ $name.$(prop : name) += $val ]>
    | <[ $(prop : name) -= $val ]>   => <[ $name.$(prop : name) -= $val ]>
    | <[ $(prop : name) => $val ]>   => <[ $name.$(prop : name) += (_) => $val ]>
    | <[ $(prop : name) ::= $val ]>  => <[ _ = $name.$(prop : name).AddRange($val) ]>
  });
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: Как установить Location?
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.12.10 11:30
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Для этого есть макрос locate, он устанавливает в стеке локешонов требуемое значение, которое попадет в квазицитаты:


Это... Орлы! Добавьте к нему человеческий синтаксис, чтобы можно было писать так:
locate (location)
  someExpression;

Давно надо было это сделать. Не понимаю почему поляки это сразу не сделали.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Как установить Location?
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.12.10 11:33
Оценка:
Здравствуйте, catbert, Вы писали:

C>Если в коде, который генерируется, возникает ошибка компиляции (например, нету свойства в классе), то локейшен ошибки совпадает с локейшеном всего макроса, что мне не нравится. Я вручную проставляю локейшены (result.Location = elem.Location), но это почему-то ничего не меняет.


C>ЧЯДНТ?


Хардкейс уже подсказал решение. Поясню только ЧТДНТ. Дело в том, что локешнов в генерируемом, с помощью квази-цитирования, коде больше чем может показаться на первый взгляд. Например, ссылка на переменную или поле — это весьма сложный составной объект. И локешон надо задавать не только переменной верхнеуровневым конструкциям, но и тем, что лежат внутри. По уму это надо как-то автоматизировать (распространять локешоны вниз).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как установить Location?
От: catbert  
Дата: 13.12.10 14:36
Оценка:
Здравствуйте, hardcase, Вы писали:

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


C>>ЧЯДНТ?


H>Для этого есть макрос locate, он устанавливает в стеке локешонов требуемое значение, которое попадет в квазицитаты:


H>
H>def createAssignment(elem)
H>{
H>  Util.locate(elem.Location, match(elem)
H>  {
H>    | <[ $(prop : name) = $val ]>    => <[ $name.$(prop : name) =  $val ]>
H>    | <[ $(prop : name) += $val ]>   => <[ $name.$(prop : name) += $val ]>
H>    | <[ $(prop : name) -= $val ]>   => <[ $name.$(prop : name) -= $val ]>
H>    | <[ $(prop : name) => $val ]>   => <[ $name.$(prop : name) += (_) => $val ]>
H>    | <[ $(prop : name) ::= $val ]>  => <[ _ = $name.$(prop : name).AddRange($val) ]>
H>  });
H>}
H>


Ураа! Работает Приду домой — закоммичу новый with.
Re[3]: Как установить Location?
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.12.10 15:13
Оценка:
Здравствуйте, catbert, Вы писали:


C>Ураа! Работает Приду домой — закоммичу новый with.


Прежде чем комитить проверь работает ли рефакторинг в твоей реализации.

Там не все так просто.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Как установить Location?
От: catbert  
Дата: 13.12.10 18:56
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Прежде чем комитить проверь работает ли рефакторинг в твоей реализации.


VD>Там не все так просто.


Ого... работает... я только сейчас заметил эту функциональность вообще

Ну как, Rename работает, а Inline в моей ревизии вообще не фурычит.
Re: Как установить Location?
От: catbert  
Дата: 13.12.10 19:16
Оценка:
Вдогонку, как настроить Code Folding для своих макросов?
Re[5]: Как установить Location?
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.10 12:50
Оценка:
Здравствуйте, catbert, Вы писали:

C>Ого... работает... я только сейчас заметил эту функциональность вообще


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

Попрбуй следующее. После инициализации через свой макрос напиши присвоение одного из свойств/полей что были проинициализированы внутри макроса. Далее наведи курсор мыши на это поле (как внутри макроса, так и во внешнем присвоении). При этом это поле должно подсвечиваться в обоих случаях (синим), плюс должно подсвечиваться определение поля (розовым), если оно определено в этом же проекте.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Как установить Location?
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.10 13:04
Оценка:
Здравствуйте, catbert, Вы писали:

C>Вдогонку, как настроить Code Folding для своих макросов?


Никак. Фолдинг делается только по стандартным конструкциям. В следующей версии надо будет подумать над возможностью экспорта информации о фолдинге из макросов. Или тупо делать фолдинг ко скобкам (но это может начать тормозить).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Как установить Location?
От: catbert  
Дата: 14.12.10 13:27
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Я про ренейм и говрил. Если он работает, значит локешоны для переменных заданы верно.


VD>Попрбуй следующее. После инициализации через свой макрос напиши присвоение одного из свойств/полей что были проинициализированы внутри макроса. Далее наведи курсор мыши на это поле (как внутри макроса, так и во внешнем присвоении). При этом это поле должно подсвечиваться в обоих случаях (синим), плюс должно подсвечиваться определение поля (розовым), если оно определено в этом же проекте.


Для свойств и полей подсветка не работает... видимо где-то локейт не понимает мои махинации с неймами.

Можно конечно все PExpr'ы вручную конструировать, но куда тогда красота квазицитирования денется?
Re[7]: Как установить Location?
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.10 14:10
Оценка:
Здравствуйте, catbert, Вы писали:

C>Можно конечно все PExpr'ы вручную конструировать, но куда тогда красота квазицитирования денется?


Там всего лишь надо прописать локешноы. Найди описание мароса ?. и погляди как там все сделано. Ну и сделай по образцу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.