Проблема устранения пробелов с помощью макроса внутри вызова метода

Я пытаюсь использовать Uncrustify в своем проекте, но у меня возникают некоторые проблемы с изменениями интервалов, которые он вносит, когда макрос используется в качестве получателя сообщения Objective-C. Например, учитывая следующий вызов макроса и метода, я ожидаю, что интервал останется точно таким же, как есть.

#define NilOrNotNSNull(val) ({id __val = (val); (__val == [NSNull null]) ? nil : __val;})

title_ = [NilOrNotNSNull([dict objectForKey:@"post_title"]) copy];

Однако это результат.

#define NilOrNotNSNull(val) ({id __val = (val); (__val == [NSNull null]) ? nil : __val;})

title_ = [NilOrNotNSNull ([dict objectForKey:@"post_title"])copy];

Похоже, что Uncrustify не распознает, что текст в круглых скобках является аргументом для макроса, но тогда я не совсем уверен, что, черт возьми, он думает. Мне это кажется ошибкой Uncrustify, но это может быть проблема с моей конфигурацией, поэтому я решил спросить здесь, а также зарегистрировать проблему на GitHub. Вот конфигурация, которую я использую: https://gist.github.com/812314

Если бы кто-нибудь мог предложить некоторое понимание, я был бы признателен.


person Bryan Henry    schedule 05.02.2011    source источник


Ответы (1)


Я не получаю ваш точный вывод, когда запускаю вашу конфигурацию. Какую версию ты используешь? Вывод моей версии выглядит следующим образом:

macbook-adamd:~ adamd$ uncrustify --version
uncrustify 0.56

Вывод, который я получаю, используя вашу конфигурацию, имеет обратную косую черту, которая переносит близкий родитель вашего макроса в новую строку:

#define NilOrNotNSNull(val) ({ id __val = (val); (__val == [NSNull null]) ? nil : __val; } \
                         )

title_ = [NilOrNotNSNull ([dict objectForKey:@"post_title"])copy];

Тем не менее, я смог устранить пробел между NilOrNotNSNull и открытым пареном, добавив set func_call_user NilOrNotNSNull в начало файла конфигурации. См. документацию для sp_func_call_user_paren для получения дополнительной информации. Кажется, у вас настроена опция удаления пробела, просто нет соответствующих определений.

Вот мой вывод с set func_call_user NilOrNotNSNull :

#define NilOrNotNSNull(val) ({ id __val = (val); (__val == [NSNull null]) ? nil : __val; } \
                             )

title_ = [NilOrNotNSNull([dict objectForKey:@"post_title"]) copy];

Я разветвил ваш список и обновил его: https://gist.github.com/815042

person Adam    schedule 07.02.2011
comment
А, отлично. На мой взгляд, это своего рода обходной путь, но, я полагаю, он работает. Надеюсь, кто-нибудь поднимет мою проблему на Github, чтобы прокомментировать, задумано это или нет. И да, вы правы, мой выходной пример был не совсем правильным. :) Я вытащил определение макроса из моего заголовка перед компиляцией, который не проходит через Uncrustify, поэтому я не понял, что он это сделал. - person Bryan Henry; 07.02.2011
comment
Если подумать, этот обходной путь будет означать добавление имени каждой отдельной функции и макроса в моем проекте вручную в конфигурацию uncrustify. Это не совсем удовлетворительное решение. - person Bryan Henry; 08.02.2011