2009-02-10 10 views
5

Czy istnieje jakieś narzędzie (najlepiej bezpłatne), które może analizować składnię Pascal/Delphi i automatycznie usuwać nieużywane vary?Delphi: jak automatycznie usunąć nieużywane vars ("Zmienna" x "jest zadeklarowana, ale nigdy nie używana" podpowiedź)

W moim przypadku pracuję z bardzo dużą bazą kodu Delphi, a raport wskazówek kompilatora ponad tysiąc przypadków "Zmienna" x "jest zadeklarowana, ale nigdy nie używana".

Poświęciłbym godziny, aby usunąć je ręcznie, a ja mógłbym popełnić błędy, ale właściwe narzędzie powinno być w stanie to zrobić bezpiecznie i automatycznie.

Szukałem w Internecie, ale nie znalazłem żadnego ... czy ktoś wie o takim narzędziu?

Dzięki ...

Mark Brarford

Odpowiedz

4

widzę punktu i całkowicie zgadzam się, że takie narzędzie będzie przydatne podczas pracy z kodem starszych. Niestety nie znam żadnego istniejącego narzędzia (powinienem dodać tutaj darmowe narzędzie, statyczne narzędzie analityczne powinno oczywiście być w stanie to zrobić z łatwością, ale nie znam żadnego narzędzia do darmowej analizy statycznej), które jest w stanie to zrobić .

Ale myślę, że można łatwo napisać takie narzędzie w ciągu kilku minut. Mały GUI z notatką i przyciskiem powinien wystarczyć. Następnie po prostu skopiuj wskazówki kompilatora do notatki i naciśnij przycisk. Narzędzie analizuje następnie każdą linię. Może łatwo sprawdzić, czy linia zawiera wskazówkę, której szukasz, i każda taka linia ma taką samą strukturę, więc parsowanie powinno być stosunkowo łatwe. Następnie może wyodrębnić nazwę pliku i numer linii, otworzyć plik i usunąć deklarację zmiennej. Może to być nieco trudne w przypadku wielu deklaracji zmiennych w jednym wierszu, ale myślę, że jest to wykonalne.

Nie wiem, czy to dla ciebie za duży wysiłek, w porównaniu z zadaniem samodzielnego usunięcia wszystkich deklaracji zmiennych. Ale chciałbym zobaczyć takie narzędzie, więc zapraszam do napisania :)

Nadzieję, że pomógł choć trochę.

Okej, naprawdę nie widzę tutaj żadnych problemów. Dla części analizy składniowej:

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; 

Cóż, czytając plik źródłowy powinien być łatwy, więc tylko część remaing jest usunięcie zmiennej z jej linii deklaracji. Możemy po prostu wyszukać wystąpienia HintInfo.VarName w linii i sprawdzić, czy znak przed i po wystąpieniu nie jest literą, ale tylko ",", "lub": ". W takim przypadku możemy po prostu go usunąć. Obejmuje to wszystkie te przypadki:

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

Powiadom mnie, jeśli się mylę lub jeśli zapomniałem przypadki, ale myślę, że to będzie działać i woulde rozwiązać problem usuwania nieużywanych zmiennych z plików źródłowych Delphi za pomocą wygenerowany przez kompilator poradnik.

+0

Kilka minut będzie bardzo dużym błędem, ponieważ nie jest to banalny problem. –

+0

Cóż, może mógłbyś wskazać, jakie są twoje problemy? Dla jasności: nie mówię o wyszukiwaniu nieużywanych zmiennych, ale interpretowaniu wskazówek kompilatora Delphi. – jpfollenius

+0

OK, interpretowanie podpowiedzi nie powinno być takie trudne. Ale to nie jest główna część problemu. Proszę spojrzeć na moją odpowiedź poniżej: –

2

Jeśli nie ma takiego narzędzia i masz trochę cierpliwości, buduję narzędzie do analizy i naprawy Delphi. I usunięcie nieużywanych symboli znajduje się na liście. Jest to projekt o niskim potencjale, więc nie mogę oszacować kiedy jest gotowy.

Wystarczy, aby wyjaśnić, dlaczego nie jest to trywialne zadanie:

  1. czytaj źródła
  2. stworzyć model, który zawiera wystarczającą ilość informacji dla każdego użycia symboli.
  3. zaznacz wszystkie nieużywane symbole.
  4. przepisać źródło bez niepotrzebnych symboli.

Zadanie 1 i 2 są trudne (na szczęście dla mnie zostały już wykonane). Język Delphi jest dość złożony. I potrzebujesz wszystkich elementów językowych, aby móc odtworzyć źródło.

Zadanie 3 jest proste. Po prostu oznacz wszystkie nieużywane symbole. Ale uważaj na symbole w sekcji interfejsu jednostki. Prawdopodobnie nie są używane, ale potrzebne później (lub przez jakiś inny projekt).

Zadanie 4 zależy.

Aproach A używa formatu pośredniego (na przykład listy napisów), następnie można użyć modelu do znalezienia deklaracji każdego nieużywanego symbolu (od dołu do góry, ewentualnie zmieniając numery linii). Usuniesz wszystkie niepotrzebne. I nie zapomnij usunąć słowa kluczowego var, jeśli jest to ostatni var na liście!

Aproach B całkowicie przepisuje plik źródłowy. W takim przypadku musisz zachować wszystkie komentarze, co nie jest zabawne (ale mój model też tego potrzebuje). Po prostu usuwa nieużywane symbole z modelu i przepisuje je ponownie. Zawsze należy utworzyć kopię zapasową, ponieważ może to skończyć się katastrofą.

+0

I istnieje możliwość, że wiele vars zostanie zadeklarowanych w jednej linii, co ponownie komplikuje usunięcie. Lub deklaracja var może zostać podzielona na dwie linie ("a" w pierwszej, ": liczba całkowita" w drugiej). Zgadzam się - trudno jest napisać stabilne rozwiązanie problemu. – gabr

+0

Aha, i jeśli potrzebujesz beta testera ... – gabr

+0

I niektóre części kodu mogą zależeć od dyrektywy kompilatora ({$ ifdef ...}), ale odpowiednie zmienne mogą nie być, tak aby kompilator mógł wykryć niektóre zmienne są nieużywane, chociaż są używane z innymi dyrektywami kompilatora – Name

2

Czy na pewno zmiennych nie należy używać? Wiem, że kompilator domyśla się, że nie są one teraz używane, ale czy to prawda, być może wiele z nich powinno być użytych, ale programista używał na przykład x2 zamiast x1, kopiowanie i wklejanie?

Chociaż można usunąć wszystkie te zmienne bez kontroli, nie byłbym tak pochopny, mogą to być wskazania błędów w kodzie, które chciałbyś naprawić.

Przykład:

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; 

W tym przykładzie dostaniesz błąd o nieużywanej zmiennej, ale jest to błąd czai. Oczywiście w tym przykładzie błąd powinien być łatwy do znalezienia, ponieważ spisek prawdopodobnie zniknie, ale inne podobne błędy mogą być trudniejsze do wykrycia.

+0

> Wiem, że kompilator domyśla się, że nie są one teraz używane, ale czy to prawda, Dowolny przykład? – inzKulozik

+0

Dobra uwaga. Nie chciałbym, aby narzędzie ślepo usuwało wszystkie warianty, ale aby przejść przez każdy z nich, jak globalne wyszukiwanie i zastąpić je potwierdzeniem przed każdym działaniem, więc mogę rzucić okiem i sprawdzić, czy jest zaangażowany {$ ifdef} lub coś takiego jak ty pokazałeś powyżej. –

2

Rozwiązanie jest proste, ale wymaga tych godzin, aby upewnić się, że się nie pomylisz. Po pierwsze, możesz użyć Alt-F8, aby przejrzeć każdy raport jeden po drugim (i Alt-F7, aby cofnąć się). To sprawia, że ​​lokalizowanie ich jest bardzo łatwe. Kursor jest ustawiony dla ciebie. Następnie naciśnij dwukrotnie klawisz "/", aby skomentować. Nie usuwaj go, komentuj. W ten sposób, jeśli popełnisz błąd, nie straciłeś żadnych informacji. Obecność zmiennej i jej typ danych jest nadal rejestrowana. Możesz to później uporządkować w pewnym momencie.

Jedna uwaga do tego wszystkiego: Kompilacja warunkowa może spowodować, że niektóre zmienne nie będą używane, gdy są budowane na różne sposoby. Jeśli tak się stanie, po prostu odkomentuj ponownie zmienną i ustaw warunek również wokół deklaracji.

+0

dzięki za punkt dotyczący sprawdzania definicji warunkowych, to coś, co z pewnością nastąpi od czasu do czasu. –

+0

Dzięki za skróty Alt-F8 Alt-F7. To zaoszczędzę mi trochę czasu. +1 – lkessler

+0

Generalnie usuwam nieużywane zmienne, kontrolę źródła lub historię kodu, aby odzyskać od błędów. Komentując je, oznacza to, że musisz wrócić i usunąć komentarze w innym czasie. – Alister

Powiązane problemy