08 сентября 2022

Выделение неактивного кода в редакторе кода Delphi 11.2

    Одной из мелких, но приятных "плюшек" редактора кода Delphi 11.2 Alexandria является цветовое выделения части исходного кода программы, который не будет скомпилирован из-за директив условной компиляции ($IFDEF, $IFNDEF, $IF, $ELSEIF, $IF Defined...). Конструкции из этих директив могут иметь сложную логику и вложенность до 32 уровней. Я таких комбинаций не видел, но иногда бывает трудно визуально понять, какой фрагмент кода будет сейчас компилироваться, а какой нет.
    Самый простой и доступный пример – это кроссплатформенный код. Он может содержать множество блоков кода, которые компилируется только для определенной платформы. Создадим новый проект на Delphi 11.2 и откроем какой-нибудь готовый модуль. Например, System.IOUtils. В данный момент активен проект под Windows и текст функции TPath.GetCachePath, который между директивами {$IFDEF POSIX}...{$ENDIF POSIX} выделяется своим серым цветом.
Неактивный код в редакторе кода Delphi 11.2 - Windows project
Как только мы делаем активным проект под Android, цвета в редакторе сразу меняются, и мы видим, что теперь ярко выделяются строки между директивами {$IFDEF ANDROID}...{$ENDIF ANDROID}:
Неактивный код в редакторе кода Delphi 11.2 - Windows project
Теперь активируем Linux:
Неактивный код в редакторе кода Delphi 11.2 - Windows project
Наглядно? Да! Мне кажется, что эта новая возможность DelphiLSP придется по вкусу не только мне.

2 комментария:

  1. Хорошая плюшка, но глючит :(

    В моем проекте (больше 1 млн строк) вообще нигде не становится темнее, ни в моих юнитах, ни в делфовых.
    Может кто-то знает где галочку поставить? :)

    А в новом проекте есть плюшка, но и на System.IOUtils глючит (строка 301, проект для MSWINDOWS):

    class function DoIsPathRooted(const Path: string; --- норм
    const ValidateParam, UseWildcards: Boolean): Boolean; static; --- норм
    class function DoMatchesPattern(const FileName, Pattern: string): Boolean; inline; static; --- темнее, но не должно
    {$IFDEF MACOS} --- темнее
    class function InternalGetMACOSPath(const SearchedPath: NSSearchPathDirectory; const SearchMask: NSSearchPathDomainMask): string; static; --- темнее
    {$ENDIF MACOS} --- темнее

    ОтветитьУдалить
  2. Еще сделали красивую подсветку синтаксиса в asm, но в x32 варианте отломали названия функций, остался только адрес:
    s:=an;
    00B09ED3 B82C69B100 mov eax,$00b1692c
    00B09ED8 8B152869B100 mov edx,[$00b16928]
    00B09EDE E88D1AF2FF call $00a2b970


    А при компиляции x64 нормально (UStrFromLStr):
    s:=an;
    0000000000BC055B 488D0D8EA20300 lea rcx,[rel $0003a28e]
    0000000000BC0562 488B157FA20300 mov rdx,[rel $0003a27f]
    0000000000BC0569 E8C214ECFF call @UStrFromLStr

    Может кто-то знает, как сделать нормально в x32?
    (Возможно так работает уже давно, не проверял :)

    ОтветитьУдалить