Как я могу сгенерировать предупреждение при использовании определенных элементов языка RTL / VCL или Delphi

#delphi #delphi-2010

#delphi #delphi-2010

Вопрос:

Я хотел бы пометить определенные элементы, функции и классы как устаревшие, чтобы компилятор выдавал предупреждение.

Я намерен модернизировать некоторые аспекты исходного кода. Особенно при акцентировании внимания на большей независимости от платформы.

Например, пометив WinAPI и специальные классы Windows (такие как TRegistry) как «устаревшие», их можно заменить или, по крайней мере, переместить и сделать независимыми от платформы. Что касается языковых элементов, я бы особенно хотел отказаться with label goto от ключевых слов, и .

Я уже пытался сгенерировать предупреждение для функций и классов, вставив a {$IF DECLARED(...)}{$MESSAGE WARN...} в нижнюю часть файла модуля, но это, очевидно, приведет к сбою с основными блоками…

Кто-нибудь знает инструмент, который это делает?

Комментарии:

1. AFAIK, это невозможно. Вы можете использовать deprecated ключевое слово в своем собственном коде, где оно объявлено, но оно не влияет на основные модули или конструкции кода, подобные goto . Delphi уже в определенной степени предупреждает о специфичном для платформы коде; XE2 делает вещи относительно прозрачными при смене платформ (во всяком случае, насколько это возможно).

2. Спасибо, но именно поэтому я спрашиваю, есть ли инструмент, который выполняет эту работу. ToolsAPI должен предоставлять все, что необходимо для подключения к сборке и обмена сообщениями.

3. Ищите инструменты статического анализа кода, я уверен, что там будет один с вариантами для того, что вам нужно.

4. @TobiasR AFAIK ToolsAPI представляет собой набор классов и функций для расширения и улучшения среды разработки Delphi, а не компилятора Delphi. Просто чтобы упомянуть, что есть компилятор командной строки. Может быть интересно иметь подключаемую систему на уровне компилятора, но она определенно не будет частью ToolsAPI. Или вы можете использовать FreePascal и изменить исходный код, чтобы компилятор соответствовал вашим конкретным потребностям.

5. @ArnaudBouchez Я не очень разбираюсь в деталях ToolsAPI (пока), но, насколько я понимаю, вы можете добавить уведомитель после компиляции и получить доступ к службам обмена сообщениями IDE.

Ответ №1:

Вы не можете отказаться от таких ключевых with слов, как goto , и т.д. Если вы хотите модернизировать свой код, просто найдите эти слова как целое слово и, если вы их найдете, измените свой код.

То же самое верно для идентификаторов в Win.* основные единицы. Вы можете изменить RTL и перекомпилировать его, или вы можете загрузить заголовки API JEDI отсюда и назначить все процедуры и типы platform или только единицы. Я бы не рекомендовал перекомпилировать RTL. Что вы делаете, скажем, с юнитами из JEDI, зависит от вас.

За исключением единиц Win. *, большая часть RTL фактически не зависит от платформы и даже with и goto будет работать в 64-разрядной версии или на Mac.

Мой совет: найдите лучший способ модернизировать свой код. Не пытайтесь отказаться от того, что предлагает RTL.

Комментарии:

1. На самом деле, это беспокоило меня с момента введения директив hint — почему Windows unit никогда не был отмечен platform , хотя он определенно зависит от платформы, если в нем представлены все символы. Я знаю о более старом механизме псевдонимов единиц, используемом для кроссплатформенной компиляции, но, тем не менее, эта ситуация настолько неподходящая. / rant

Ответ №2:

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

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

Подключите приложение или статический анализатор кода в качестве шага в процессе сборки, и вы получите эквивалент предупреждений во время компиляции.

Комментарии:

1. Интересно. Кто-нибудь знает, могу ли я определить пользовательские аудиты в IDE?

2. Кажется, это самое быстрое решение (на данный момент). Конечно, RTL не зависит от платформы (по крайней мере, я надеюсь — я еще не полностью протестировал), но я думаю, что каждый разработчик время от времени хмурился, потому что RTL имеет небольшие ошибки здесь и там или может быть не в курсе текущих разработок ОС. Надеюсь, это изменится в будущем, но до тех пор я сохраню пару обходных путей и исправлений.

Ответ №3:

Вы не можете ставить предупреждение на основные языковые функции, такие как with , label и goto независимо от того, насколько вы их ненавидите.
Тот факт, что это зарезервированные слова, должен был подсказать вам об этом.

Этих функций нет ни в одном модуле, они являются особенностью языка Pascal (и были с самого начала) и встроены глубоко в компилятор.

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

Ответ №4:

Во-первых, я НЕ советую вам идти по тому маршруту, по которому вы хотите пойти, по всем причинам, указанным другими. НО, если вы чувствуете, что должны, то вот метод, который выполнит часть того, о чем вы просите.

Вы можете включить предупреждения для platform определенного кода в вашем проекте. Что касается других вещей, которые вы считаете устаревшими, но на самом деле не являются устаревшими в Delphi, у меня есть решение, которое потребует некоторой работы.

Создайте модуль, который повторно объявляет классы, которые вы хотите считать устаревшими, например, следующим образом:

 unit PleaseDeprecateThisStuff;

uses
  Registry;

interface

type
  TRegistry = class (Registry.TRegistry)
  end deprecated;

implementation

end;
  

РЕДАКТИРОВАНИЕ 2: я чувствую, что должен подробнее объяснить источник. Для каждого класса, как в TRegistry примере, вам нужно будет включить его одноименную версию в этот модуль и сделать ее идентичной версии в другом модуле. Убедитесь, что вы включили этот модуль в предложение uses этого модуля (duh) И добавили префикс к ссылке на класс в разделе type, как в примере Registry.TRegistry .

Включите все, что вы хотите, устаревшим, а затем включите этот модуль в конец предложения интерфейса uses КАЖДОГО модуля, который вы хотите «защитить».

РЕДАКТИРОВАТЬ: этот трюк поможет только с классами, переменными и константами… не зарезервированные слова.

Опять же, позвольте мне заявить, что это ужасная идея. : p

Комментарии:

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

2. Извините, это последнее «ужасно» было в основном по моему предложению, поскольку в лучшем случае это взлом и требует немало работы, чтобы сделать то, что вы просите.