Tôi đang viết một bổ trợ COM đang mở rộng một IDE rất cần nó. Có nhiều tính năng liên quan, nhưng hãy thu hẹp nó xuống còn 2 vì lợi ích của bài đăng này:
- Có một công cụ Code Explorer hiển thị một treeview cho phép người dùng điều hướng các mô-đun và các thành viên của họ.
- Có một công cụ kiểm tra mã kiểm tra hiển thị một datagridview cho phép người dùng điều hướng các vấn đề về mã và tự động sửa chúng.
Cả hai công cụ đều có nút "Làm mới" để bắt đầu một tác vụ không đồng bộ, phân tích tất cả mã trong tất cả các dự án đã mở; các luật Explorer sử dụng các kết quả phân tích cú pháp để xây dựng TreeView , và Mã Kiểm tra sử dụng các kết quả phân tích để tìm các vấn đề mã và hiển thị kết quả trong của nó DataGridView .
Những gì tôi đang cố gắng làm ở đây là chia sẻ kết quả phân tích giữa các tính năng, để khi Code Explorer làm mới, thì Kiểm tra mã biết về nó và có thể tự làm mới mà không phải làm lại công việc phân tích cú pháp mà Code Explorer vừa làm .
Vì vậy, những gì tôi đã làm, tôi đã tạo cho lớp trình phân tích cú pháp của mình một nhà cung cấp sự kiện mà các tính năng có thể đăng ký:
private void _parser_ParseCompleted(object sender, ParseCompletedEventArgs e)
{
Control.Invoke((MethodInvoker) delegate
{
Control.SolutionTree.Nodes.Clear();
foreach (var result in e.ParseResults)
{
var node = new TreeNode(result.Project.Name);
node.ImageKey = "Hourglass";
node.SelectedImageKey = node.ImageKey;
AddProjectNodes(result, node);
Control.SolutionTree.Nodes.Add(node);
}
Control.EnableRefresh();
});
}
private void _parser_ParseStarted(object sender, ParseStartedEventArgs e)
{
Control.Invoke((MethodInvoker) delegate
{
Control.EnableRefresh(false);
Control.SolutionTree.Nodes.Clear();
foreach (var name in e.ProjectNames)
{
var node = new TreeNode(name + " (parsing...)");
node.ImageKey = "Hourglass";
node.SelectedImageKey = node.ImageKey;
Control.SolutionTree.Nodes.Add(node);
}
});
}
Và nó hoạt động. Vấn đề tôi gặp phải, đó là ... nó hoạt động - Ý tôi là, khi kiểm tra mã được làm mới, trình phân tích cú pháp báo cho trình thám hiểm mã (và mọi người khác) "anh bạn, phân tích cú pháp, bất cứ điều gì bạn muốn làm về nó? " - và khi quá trình phân tích cú pháp hoàn tất, trình phân tích cú pháp sẽ cho người nghe biết "các bạn, tôi có kết quả phân tích cú pháp mới cho bạn, bạn muốn làm gì về nó?".
Hãy để tôi dẫn bạn qua một ví dụ để minh họa vấn đề mà điều này tạo ra:
- Người dùng đưa lên Code Explorer, thông báo cho người dùng "chờ đã, tôi đang làm việc ở đây"; Người dùng tiếp tục làm việc trong IDE, Code Explorer tự vẽ lại, cuộc sống thật đẹp.
- Sau đó, người dùng sẽ đưa ra Kiểm tra mã, thông báo cho người dùng "chờ đã, tôi đang làm việc ở đây"; trình phân tích cú pháp nói với Code Explorer "anh bạn, đang phân tích cú pháp, bất cứ điều gì bạn muốn làm về nó?" - Code Explorer nói với người dùng "chờ đã, tôi đang làm việc ở đây"; Người dùng vẫn có thể làm việc trong IDE, nhưng không thể điều hướng Code Explorer vì nó rất mới mẻ. Và anh cũng đang chờ kiểm tra mã hoàn thành.
- Người dùng nhìn thấy một vấn đề mã trong kết quả kiểm tra mà họ muốn giải quyết; họ bấm đúp để điều hướng đến nó, xác nhận có vấn đề với mã và nhấp vào nút "Khắc phục". Mô-đun đã được sửa đổi và cần được phân tích lại, vì vậy việc kiểm tra mã tiến hành với nó; Code Explorer nói với người dùng "chờ đã, tôi đang làm việc ở đây", ...
Thấy nơi đang tới không? Tôi không thích nó và tôi cá là người dùng cũng sẽ không thích nó. Tôi đang thiếu gì? Tôi nên chia sẻ kết quả phân tích cú pháp giữa các tính năng như thế nào, nhưng vẫn để người dùng kiểm soát khi nào tính năng này hoạt động ?
Lý do tôi hỏi, là vì tôi đoán rằng nếu tôi hoãn công việc thực tế cho đến khi người dùng chủ động quyết định làm mới và "lưu trữ" kết quả phân tích khi họ đến ... thì tôi sẽ làm mới một lượt xem và định vị các vấn đề về mã trong kết quả phân tích cú pháp có thể cũ ... điều này thực sự đưa tôi trở lại hình vuông, trong đó mỗi tính năng hoạt động với kết quả phân tích cú pháp riêng: có cách nào tôi có thể chia sẻ kết quả phân tích giữa các tính năng và có UX đáng yêu không?
Mã là c # , nhưng tôi không tìm mã, tôi đang tìm khái niệm .
VBAParser
được tạo bởi ANTLR và cung cấp cho tôi một cây phân tích cú pháp, nhưng các tính năng không tiêu thụ điều đó. Cây RubberduckParser
lấy cây phân tích, đi ngang qua nó và đưa ra một đối tượng VBProjectParseResult
chứa Declaration
tất cả các đối tượng đã References
giải quyết xong - đó là những gì các tính năng đưa vào đầu vào .. vì vậy, đó là một tình huống hoàn toàn không có gì. Điều RubberduckParser
này đủ thông minh để không phân tích lại các mô-đun chưa được sửa đổi. Nhưng nếu có một nút cổ chai thì đó không phải là phân tích cú pháp, mà là với việc kiểm tra mã.