2009-02-10 28 views
5

Có công cụ nào (tốt nhất là phần mềm miễn phí) có thể phân tích cú pháp Pascal/Delphi và tự động loại bỏ các vars không sử dụng?Delphi: làm thế nào để tự động loại bỏ các vars chưa sử dụng ("Biến" x "được khai báo nhưng không bao giờ sử dụng" gợi ý)

Trong trường hợp của mình, tôi đang làm việc với một cơ sở mã Delphi rất lớn và báo cáo trình biên dịch báo cáo hơn một nghìn trường hợp "Biến" x "được khai báo nhưng không bao giờ được sử dụng".

Tôi sẽ mất nhiều giờ để xóa chúng bằng tay và tôi có thể mắc lỗi, nhưng công cụ thích hợp sẽ có thể thực hiện điều đó một cách an toàn và tự động.

Tôi đã tìm kiếm trực tuyến nhưng không tìm thấy một ... có ai ở đây biết về một công cụ như vậy không?

Thanks ...

Đánh dấu Brarford

Trả lời

4

tôi thấy quan điểm của bạn và hoàn toàn đồng ý rằng một công cụ như vậy sẽ có ích khi làm việc với mã di sản. Thật không may, tôi không biết bất kỳ công cụ hiện có nào (tôi nên thêm công cụ phần mềm miễn phí tại đây, các công cụ phân tích tĩnh nên tất nhiên có thể làm điều đó dễ dàng, nhưng tôi không biết bất kỳ công cụ phân tích mã tĩnh miễn phí nào) .

Nhưng tôi đoán bạn có thể dễ dàng viết một công cụ như vậy sau vài phút. Một GUI nhỏ với một bản ghi nhớ và một nút là đủ. Sau đó, chỉ cần sao chép các gợi ý trình biên dịch vào bản ghi nhớ và nhấn nút. Công cụ này sau đó phân tích mọi dòng. Nó có thể dễ dàng kiểm tra xem dòng có chứa gợi ý mà bạn đang tìm kiếm hay không và mỗi dòng đó có cấu trúc giống nhau, do đó việc phân tích cú pháp phải tương đối dễ dàng. Sau đó nó có thể trích xuất tên tệp và số dòng, mở tệp và xóa khai báo biến. Điều này có thể là một chút khó khăn trong trường hợp nhiều khai báo biến trong một dòng nhưng tôi nghĩ rằng nó là doable.

Tôi không biết liệu có quá nhiều nỗ lực cho bạn so với nhiệm vụ tự xóa tất cả các khai báo biến. Nhưng tôi muốn thấy một công cụ như vậy, vì vậy hãy thoải mái viết nó :)

Hy vọng rằng sẽ giúp ít nhất một chút.

OK, tôi thực sự không thể thấy bất kỳ vấn đề nào ở đây. Đối với phần phân tích cú pháp:

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; 

Vâng, việc đọc tệp nguồn phải dễ dàng, vì vậy phần chỉ remaing là xóa biến khỏi dòng khai báo của nó. Chúng tôi chỉ đơn giản có thể tìm kiếm sự xuất hiện của HintInfo.VarName trong dòng và kiểm tra xem ký tự trước và sau sự xuất hiện không phải là chữ cái mà chỉ là '', ',' hay ':'. Nếu đây là trường hợp chúng tôi chỉ có thể loại bỏ nó. Điều này bao gồm tất cả những trường hợp này:

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

Nói cho tôi nếu tôi sai hoặc nếu tôi quên bất kỳ trường hợp nhưng tôi nghĩ rằng điều này sẽ làm việc và woulde giải quyết vấn đề loại bỏ các biến không sử dụng từ các tập tin nguồn delphi sử dụng trình biên dịch tạo gợi ý.

+0

Một vài phút sẽ là một quan niệm sai lầm rất lớn, bởi vì đây không phải là vấn đề tầm thường. –

+0

Vâng, có lẽ bạn có thể chỉ ra những gì bạn nghĩ rằng vấn đề sẽ là gì? Chỉ cần được rõ ràng: Tôi không nói về việc tìm các biến không sử dụng nhưng giải thích các gợi ý trình biên dịch Delphi. – jpfollenius

+0

Ok, việc giải thích các gợi ý không quá khó. Nhưng đó không phải là phần chính của vấn đề. Xin hãy xem câu trả lời của tôi dưới đây: –

2

Nếu không có công cụ như vậy và bạn có một số kiên nhẫn, tôi đang xây dựng một công cụ phân tích và sửa chữa Delphi. Và loại bỏ các biểu tượng không sử dụng có trong danh sách. Đó là một dự án có tính chất thấp nên tôi không thể ước tính khi nào nó sẵn sàng.

Chỉ cần giải thích lý do tại sao đây không phải là một nhiệm vụ tầm thường:

  1. đọc nguồn
  2. tạo ra một mô hình có chứa đầy đủ thông tin cho từng sử dụng biểu tượng.
  3. đánh dấu tất cả các biểu tượng không sử dụng.
  4. viết lại nguồn mà không cần ký hiệu không cần thiết.

Nhiệm vụ 1 và 2 rất khó (may mắn cho tôi những điều đó đã được thực hiện). Ngôn ngữ Delphi khá phức tạp. Và bạn cần tất cả các yếu tố ngôn ngữ để có thể tạo lại nguồn.

Nhiệm vụ 3 rất đơn giản. Chỉ cần gắn cờ tất cả các ký hiệu không được sử dụng. Nhưng hãy cẩn thận với các biểu tượng trong phần giao diện của một đơn vị. Chúng có thể không được sử dụng nhưng cần thiết sau này (hoặc bởi một số dự án khác).

Nhiệm vụ 4 tùy thuộc.

Aproach A sử dụng định dạng trung gian (ví dụ: danh sách chuỗi), bạn có thể sử dụng mô hình để tìm khai báo của từng biểu tượng không sử dụng (từ dưới lên khác bạn có thể thay đổi số dòng). Bạn xóa tất cả không cần thiết. Và đừng quên xóa từ khóa var nếu nó là var cuối cùng trong danh sách!

Aproach B viết lại hoàn toàn tệp nguồn. Trong trường hợp này, bạn phải bảo toàn tất cả các bình luận không thực sự thú vị để làm (nhưng mô hình của tôi cũng cần điều đó). Bạn chỉ cần loại bỏ các biểu tượng không sử dụng từ mô hình và viết lại nó. Luôn đảm bảo tạo bản sao lưu, vì điều này có thể kết thúc trong thảm họa.

+0

VÀ có khả năng nhiều vars được khai báo trong một dòng, điều này lại làm phức tạp việc loại bỏ. Hoặc khai báo var có thể được chia thành hai dòng ('a' ở đầu tiên, ': số nguyên' trong giây). Tôi đồng ý - thật khó để viết một giải pháp ổn định cho vấn đề. – gabr

+0

Ồ, và nếu bạn cần thử nghiệm beta ... – gabr

+0

VÀ một số phần của mã có thể phụ thuộc vào chỉ thị của trình biên dịch ({$ ifdef ...}) nhưng các biến tương ứng có thể không được, để trình biên dịch có thể phát hiện một số biến như không sử dụng mặc dù chúng được sử dụng với chỉ thị trình biên dịch oher – Name

2

Bạn có chắc chắn các biến không nên được sử dụng không? Tôi biết các trình biên dịch con số ra rằng họ không được sử dụng ngay bây giờ, nhưng đó là chính xác, có lẽ nhiều người trong số này nên được sử dụng, nhưng một nhà phát triển sử dụng x2 thay vì x1 ví dụ, sao chép và dán?

Mặc dù bạn có thể muốn xóa tất cả các biến đó không bị rập khuôn, tôi sẽ không quá vội vàng, chúng có thể là dấu hiệu lỗi trong mã của bạn mà bạn muốn sửa.

Ví dụ:

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; 

Trong ví dụ này, bạn sẽ nhận được một lỗi về một biến không sử dụng, nhưng đây là một lỗi rình rập. Tất nhiên, trong ví dụ này, lỗi nên dễ tìm vì âm mưu có thể sẽ bị tắt, nhưng các lỗi tương tự khác có thể khó phát hiện hơn.

+0

> Tôi biết các số liệu của trình biên dịch rằng chúng không được sử dụng ngay bây giờ, nhưng có đúng không, Ví dụ nào? – inzKulozik

+0

Điểm tốt. Tôi sẽ không muốn một công cụ để loại bỏ tất cả các vars một cách mù quáng, mà phải từng bước một, như tìm kiếm toàn cầu và thay thế bằng một xác nhận trước mỗi hành động, vì vậy tôi có thể xem và xem liệu có {$ ifdef} liên quan hay không , hoặc một cái gì đó như bạn đã trình bày ở trên. –

2

Giải pháp rất đơn giản, nhưng yêu cầu những giờ đó để đảm bảo bạn không mắc lỗi. Trước hết, bạn có thể sử dụng Alt-F8 để đi qua từng báo cáo một cái khác (và Alt-F7 để lùi bước). Điều đó làm cho việc định vị chúng rất dễ dàng. Con trỏ được đặt trên dòng cho bạn. Sau đó, chỉ cần nhấn phím '/' hai lần để bình luận. Không xóa nó, bình luận nó. Bằng cách này, nếu bạn mắc lỗi, bạn không bị mất bất kỳ thông tin nào. Sự hiện diện của biến và kiểu dữ liệu của nó vẫn được ghi lại. Bạn có thể dọn dẹp nó sau này tại một số điểm.

Một lưu ý cho tất cả điều này: Việc biên dịch có điều kiện có thể khiến một số biến không được sử dụng khi xây dựng các cách khác nhau. Nếu điều này xảy ra, sau đó chỉ cần bỏ ghi chú một lần nữa, và đặt điều kiện xung quanh quá trình khai báo.

+0

cảm ơn cho các điểm về việc kiểm tra định nghĩa có điều kiện, đó là một cái gì đó mà chắc chắn sẽ xảy ra theo thời gian. –

+0

Cảm ơn các phím tắt Alt-F8 Alt-F7. Điều đó sẽ giúp tôi tiết kiệm thời gian. +1 – lkessler

+0

Tôi thường xóa các biến không sử dụng, kiểm soát nguồn hoặc lịch sử mã ở đó để khôi phục từ các lỗi. Bằng cách bình luận chúng ra nó chỉ có nghĩa là bạn cần phải quay trở lại và loại bỏ các ý kiến ​​một số thời gian khác. – Alister

Các vấn đề liên quan