Delphi: то, как автоматически удалить неиспользованный Вар (“Переменная 'x' объявляется, но никогда не использовало” подсказку),

Я не думаю, что можно вернуть Stream в контекст оркестровки, поскольку в документации Bindings говорится, что возвращаемые значения должны быть сериализуемыми в JSON:

[114 ] Возвращаемые значения - Возвращаемые значения сериализуются в JSON и сохраняются в таблице истории оркестровки в хранилище таблиц Azure. Эти возвращаемые значения могут быть запрошены связыванием клиента оркестровки, описанным позже.

blockquote>

Я обошел это, создав Dto, чтобы обернуть необработанный байтовый массив:

public class StreamDto
{
    public string Name { get; set; }
    public byte[] Contents { get; set; }
}

и вернуть его вместо этого. Поскольку он сериализуем для Json, я могу передавать его туда и обратно и воссоздавать поток в функции Activity.

5
задан Mark Bradford 10 February 2009 в 11:11
поделиться

4 ответа

Я вижу Вашу точку и полностью соглашаюсь, что такой инструмент был бы полезен при работе с унаследованным кодом. К сожалению, я не знаю ни о каком существующем инструменте (я должен добавить бесплатно распространяемый инструмент здесь, статические analyis инструменты должны, конечно, смочь сделать это легко, но я не знаю ни о каком свободном статическом инструменте анализа кода), который является способным выполнением это.

Но я предполагаю, что Вы могли легко записать такой инструмент через несколько минут. Маленький GUI с заметкой и кнопкой должен быть достаточно. Затем просто скопируйте подсказки компилятора в заметку и нажмите кнопку. Инструмент затем анализирует каждую строку. Это может легко проверить, содержит ли строка подсказку, Вы ищете, и каждая такая строка имеет ту же структуру, таким образом анализирование должно быть относительно легким. Это может затем извлечь имя файла и номер строки, открыть файл и удалить объявление переменной. Это может быть немного хитро в случае нескольких объявлений переменной в одной строке, но я думаю, что это выполнимо.

Я не знаю, является ли это слишком большим усилием для Вас по сравнению с задачей удаления всех объявлений переменной самих. Но я хотел бы видеть такой инструмент, поэтому не стесняйтесь писать это :)

Надеюсь, что помог по крайней мере немного.

Хорошо, я действительно не вижу проблем здесь. Для части парсинга:

function ParseHint (const HintText : String; out HintInfo : THintInfo) : Boolean;
var
  I, J     : Integer;
  HintName : String;
begin
  Result := False;
  for I := 1 to Length (HintText) do
  begin
    if (HintText [I] = '(') then
    begin
      J := I + 1;
      while (HintText [J] <> ')') do Inc (J);
      HintInfo.LineNumber := StrToInt (MidStr (HintText, I+1, J-(I+1)));
      HintInfo.SourceFile := MidStr (HintText, 12, I-12);
      HintName := MidStr (HintText, J+3, 5);
      if (HintName <> 'H2164') then Exit (False);
    end;
    if (HintText [I] = '''') then
    begin
      J := I + 1;
      while (HintText [J] <> '''') do Inc (J);
      HintInfo.VarName := MidStr (HintText, I+1, J-(I+1));
      Exit (True);
    end;
  end;
end;

Ну, чтение исходного файла должно быть легким, таким образом, единственная remaing часть удаляет переменную из своей строки объявления. Мы можем просто искать происшествия HintInfo. VarName в строке и проверке, если символ прежде и после того, как происшествие не является никакими буквами, но только '''', или ':'. Если это верно, мы можем просто удалить его. Это покрывает все эти случаи:

var UnusedVar : Integer;
var
  UnusedVar,
  AnotherVar : Integer;
var
  UnusedVar, AnotherVar : Integer;

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

4
ответ дан 13 December 2019 в 22:18
поделиться

Вы уверены, что переменные не должны использоваться? Я знаю, что компилятор выясняет, что они не используются прямо сейчас, но это корректно, возможно, многие из них должны использоваться, но разработчик использовал x2 вместо x1, например, копии и вставки?

В то время как Вы могли бы хотеть удалить все те нетщательно исследуемые переменные, я не буду настолько поспешным, они могли бы быть признаками ошибок в Вашем коде, что требуется зафиксировать.

Пример:

procedure PlotPixelAtCenter(rect: Rectangle)
var
    x, y: Integer;
begin
    x := (rect.Left + rect.Right) div 2;
    x := (rect.Top + rect.Bottom) div 2; // <-- bug here, should be y :=
    PlotPixel(x, y);
end;

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

2
ответ дан 13 December 2019 в 22:18
поделиться

Решение просто, но требует в те часы, чтобы быть уверенным, что Вы не делаете ошибку. Прежде всего можно использовать Alt-F8 для продвижения через каждый отчет один за другим (и Alt-F7 для продвижения назад). Это делает определение местоположения их очень легким. Курсор помещается на строку для Вас. Затем просто нажмите '/' ключ дважды, чтобы прокомментировать его. Не удаляйте его, комментируйте его. Таким образом, если Вы делаете ошибку, Вы не потеряли информации. Присутствие переменной и ее типа данных все еще зарегистрировано. Можно убрать его позже в какой-то момент.

Один протест ко всему этому: Условная компиляция может представить некоторые переменные, неиспользованные, когда создано различные пути. Если это происходит, то просто не комментируют переменную снова и помещают условие вокруг объявления также.

2
ответ дан 13 December 2019 в 22:18
поделиться

Если нет такого инструмента, и у Вас есть некоторое терпение, я создаю инструмент анализа и восстановления Delphi. И удаление неиспользованных символов находится в списке. Это - низкий proirity проект, таким образом, я не могу дать оценку на когда его готовое.

Только для объяснения, почему это не тривиальная задача:

  1. считайте источник
  2. создайте модель, которая содержит достаточно информации для каждого использования символа.
  3. отметьте все неиспользованные символы.
  4. перепишите источник без ненужных символов.

Задача 1 и 2 трудна (к счастью для меня, они уже сделаны). Язык Delphi довольно сложен. И Вам нужны все элементы языка, чтобы смочь воссоздать источник.

Задача 3 проста. Просто отметьте все символы, которые не использованы. Но остерегайтесь символов в интерфейсном разделе единицы. Они возможно не используются, но нуждались позже (или некоторым другим проектом).

Задача 4 зависит.

Aproach использование промежуточный формат (например, stringlist), можно затем использовать модель для нахождения объявления каждого неиспользованного символа (вверх дном еще, Вы возможно изменяете номера строки). Вы удаляете всех не нужных. И не забывайте удалять ключевое слово var, если это - последний var в списке!

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

2
ответ дан 13 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: