2015-03-12 13 views
6

Khi tôi nhấp chuột phải vào một biểu tượng và chạy lệnh Tìm Usages ReSharper, ReSharper thường sẽ dành hầu hết thời gian tìm kiếm các tệp resx. Phần lớn thời gian trong đó hộp thoại tiến trình hiển thị, tên tệp được hiển thị trong hộp thoại đó là các tệp .resx khác nhau trong giải pháp.Tại sao các tập tin tìm kiếm lệnh tìm kiếm lại tập tin ReSharper Find Usages?

screenshot

ReSharper có thực sự tìm kiếm tệp .resx không? Tại sao nó sẽ làm điều này, và tại sao phải mất quá lâu? Tôi có thể thay đổi hành vi này không?


Thiết lập: ReSharper 8.2.0.2160 C# Edition. Visual Studio 2013 Premium.

Những gì tôi đã cố gắng:

  • Thêm resx như một mặt nạ để Bộ Luật Thanh tra # sở thích Items To Skip R, nhưng điều đó không tạo sự khác biệt
  • Tìm Usages nâng cao, bỏ chọn Số lần xuất hiện văn bản. Không tạo sự khác biệt

Trả lời

8

Câu trả lời cho điều này là do kiến ​​trúc cơ bản của ReSharper. Khi xử lý các tệp, ReSharper sẽ xây dựng một cây cú pháp trừu tượng và mỗi nút trong cây có thể có một hoặc nhiều tham chiếu đến một phần tử trong mô hình ngữ nghĩa. Nói cách khác, Foo trong biểu thức new Foo(42) sẽ có tham chiếu đến phần tử ngữ nghĩa mô tả lớp có tên là Foo. Mỗi tệp sẽ có nhiều tham chiếu, vì bất kỳ việc sử dụng phần tử nào (biến, tham số, phương thức, thuộc tính, lớp CSS, màu HTML, đường dẫn hệ thống tệp và hơn thế nữa) có một hoặc nhiều tham chiếu đến khai báo phần tử đó.

Các tham chiếu này rất mạnh mẽ. Chúng cho phép Ctrl + Điều hướng nhấp chuột, bằng cách điều hướng đến (các) đích của tham chiếu. Họ có thể cung cấp mã hoàn thành bằng cách hiển thị các mục tiêu ứng cử viên sẽ đáp ứng một tham chiếu tại vị trí hiện tại trong mã.

Và tất nhiên, chúng cũng cấp nguồn cho Tìm Sử dụng, bằng cách tìm tất cả các tham chiếu nhắm mục tiêu đến một phần tử cụ thể. Nhưng điều này đòi hỏi phải làm việc ngược, từ mục tiêu đến tham chiếu. Cách tiếp cận bạo lực sẽ yêu cầu kiểm tra mục tiêu của mọi tham chiếu trong mọi tệp, cố gắng tìm mục tiêu. Điều này rõ ràng sẽ không quy mô và tập dữ liệu quá lớn để lưu vào bộ nhớ cache.

Để làm cho Tìm việc sử dụng trong một khoảng thời gian lành mạnh, ReSharper cũng duy trì chỉ mục từ, tất cả các từ được sử dụng trong tất cả các tệp (điều này cũng giúp điều hướng Go To bình thường). Khi bạn gọi Find Usages trên biểu tượng (chẳng hạn như EnterDate trong ảnh chụp màn hình trong câu hỏi), ReSharper sử dụng chỉ mục từ để thu hẹp các tệp cần tìm kiếm - nó sẽ tra cứu EnterDate và chỉ sử dụng các tệp đó bao gồm từ . Một khi nó có một tập hợp con của các tập tin để tìm kiếm, nó cần phải tìm bất kỳ tài liệu tham khảo nhắm mục tiêu phần tử gốc. Để làm điều này, nó đi cây cú pháp của mỗi tập tin trong tập hợp con. Mỗi nút được chọn cho các tham chiếu khớp với tên của biểu tượng mà chúng tôi đang tìm kiếm, ví dụ: EnterDate. Nếu nó khớp, tham chiếu được giải quyết và mục tiêu được kiểm tra để xem nó có khớp với cùng một phần tử hay không - lớp EnterDate hoặc thuộc tính hoặc bất kỳ thứ gì thực sự là. Nếu nó trỏ đến mục tiêu mong đợi, nó sẽ được thêm vào tập hợp các tập quán và được hiển thị cho người dùng.

(Mọi thứ hơi phức tạp hơn này, trong đó một tham chiếu có thể có nhiều tên, ví dụ như nếu bạn cố gắng và tìm tập quán trên [Pure], ReSharper cần phải tìm thấy bất kỳ tập quán của cả hai Pure hoặc PureAttribute. May mắn thay, những cái tên thay thế là cũng được lưu trữ trong chỉ mục từ và được sử dụng để giúp giảm bớt các tệp được tìm kiếm. Khi kiểm tra các tham chiếu, tất cả các tên thay thế đều được chọn)

Vì vậy, nếu bạn có tệp .resx chứa văn bản EnterDate, nó sẽ được tìm kiếm cho một tham chiếu đến các yếu tố EnterDate bạn đang tìm kiếm - ReSharper sẽ đi bộ cây cú pháp của tập tin .resx, và kiểm tra từng tài liệu tham khảo để xem nếu nó phù hợp với EnterDate.

Chúng tôi kiểm tra tất cả các tệp, ngay cả khi người dùng có vẻ không thể sử dụng phần tử đích trong tệp đó vì chúng tôi cho phép tham chiếu là ngôn ngữ chéo. Nghĩa là, một tệp VB có thể tham chiếu đến phần tử C# hoặc tệp HTML có thể tham chiếu đến phần tử CSS hoặc tệp XAML tham chiếu đến phần tử phương thức C#, v.v. Vì vậy, không có bộ lọc về việc sử dụng "hợp lý". Ví dụ: nếu EnterDate là một lớp, bạn là người dùng có thể nói rằng nó không có khả năng ở trong tệp .resx, nhưng ReSharper không có cách nào để biết điều đó. Sau khi tất cả, nó hoàn toàn tốt đẹp để sử dụng một tên lớp trong thuộc tính type của một tập tin web.config, hoặc như một tham số để typeof trong một tập tin VB. Hoặc một plugin có thể thêm một nhà cung cấp tham chiếu cho phép sử dụng các tên tập tin trong các tệp .resx. Vì vậy, chúng tôi giữ cho mọi thứ đơn giản và tìm kiếm tất cả các tham chiếu ứng cử viên, mặc dù nó có thể trông kỳ lạ trong hộp thoại tiến trình.

+0

Cảm ơn phản hồi cực kỳ chi tiết. Tôi đã tìm ra "AST" và "chỉ mục từ" sẽ được tham gia vào một giải thích cho lý do tại sao các tệp resx đang được kiểm tra. Có ý nghĩa. Tôi nghĩ giải pháp thực sự cho tình huống của tôi là tìm cách phá vỡ cơ sở mã lớn của chúng tôi, điều đó sẽ làm cho tất cả các công cụ của chúng tôi hoạt động tốt hơn. –

+0

Ồ, tôi quên mất hiệu suất bit :) Tôi không biết lý do nào tại sao nó phải chậm hơn với các tệp .resx hơn bất kỳ thứ gì khác - tìm kiếm tập quán nên khá nhanh, ngay cả trên các mã lớn. Thời gian duy nhất nó nên được làm chậm là khi bạn tìm kiếm một cái gì đó phổ biến để tải các tập tin, như "lớp". Bạn có thể tìm hồ sơ bằng cách sử dụng hồ sơ trong menu Trợ giúp và gửi nó, hoặc thử 9.1 EAP để xem nó có tốt hơn không - Tìm Usages có bản cập nhật trong 9.0. – citizenmatt

+1

Câu trả lời này không giải thích liệu người ta có thể thay đổi hành vi này (ví dụ: vô hiệu hóa xây dựng các cây AST cho các tệp '.resx' ...) và" chúng tôi kiểm tra tất cả các tệp "là quyết định mà tôi tin là nên để người dùng thực hiện. –

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