ฉันกำลังเขียน COM add-in ที่ขยาย IDE ที่ต้องการอย่างยิ่ง มีคุณสมบัติหลายอย่างที่เกี่ยวข้อง แต่ให้แคบลงเป็น 2 เพื่อประโยชน์ของโพสต์นี้:
- มีเครื่องมือExplorer ในหน้าต่างที่แสดงมุมมองแบบต้นไม้ที่ช่วยให้ผู้ใช้นำทางโมดูลและสมาชิกของพวกเขา
- มีเครื่องมือตรวจสอบรหัสหน้าต่างที่แสดงDataGridviewที่ให้ผู้ใช้สำรวจปัญหารหัสและแก้ไขให้โดยอัตโนมัติ
เครื่องมือทั้งสองมีปุ่ม "รีเฟรช" ที่เริ่มงานแบบอะซิงโครนัสที่แยกวิเคราะห์รหัสทั้งหมดในโครงการที่เปิดอยู่ทั้งหมด รหัส Explorer ที่ใช้ผลการแจงการสร้างTreeViewและรหัสการตรวจสอบการใช้ผลการแจงที่จะพบปัญหารหัสและแสดงผลลัพธ์ในของDataGridView
สิ่งที่ฉันพยายามที่จะทำที่นี่คือการแบ่งปันผลแยกระหว่างคุณสมบัติเพื่อที่ว่าเมื่อรหัส Explorer ในการรีเฟรชแล้วรหัสการตรวจสอบรู้เกี่ยวกับมันและสามารถฟื้นฟูตัวเองได้โดยไม่ต้องทำซ้ำการทำงานแยกว่ารหัส Explorer ที่ก็ไม่ได้ .
ดังนั้นสิ่งที่ฉันทำฉันทำให้ parser class เป็นผู้ให้บริการเหตุการณ์ที่คุณสมบัติสามารถลงทะเบียนได้ที่:
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);
}
});
}
และมันใช้งานได้ ปัญหาที่ฉันมีก็คือ ... มันใช้งานได้ - ฉันหมายถึงเมื่อการตรวจสอบโค้ดได้รับการฟื้นฟูตัวแยกวิเคราะห์จะบอกโค้ดสำรวจ " - และเมื่อการวิเคราะห์คำเสร็จสมบูรณ์โปรแกรมแยกวิเคราะห์จะบอกผู้ฟังว่า "คนฉันมีผลการแยกวิเคราะห์ใหม่สำหรับคุณทุกสิ่งที่คุณต้องการทำเกี่ยวกับมัน"
ให้ฉันแนะนำคุณผ่านตัวอย่างเพื่ออธิบายปัญหาที่เกิดขึ้น:
- ผู้ใช้เปิดตัว Code Explorer ซึ่งจะบอกผู้ใช้ว่า "หยุดฉันทำงานที่นี่"; ผู้ใช้ยังคงทำงานใน IDE, Code Explorer วาดตัวเองใหม่, ชีวิตมีความสวยงาม
- จากนั้นผู้ใช้จะเปิดตัวการตรวจสอบโค้ดซึ่งบอกผู้ใช้ว่า "หยุดฉันทำงานที่นี่"; โปรแกรมแยกวิเคราะห์บอก Code Explorer ว่า "เพื่อนการแยกวิเคราะห์ของใครบางคนคุณต้องการทำอะไรกับมัน" - Code Explorer บอกผู้ใช้ว่า "หยุดฉันทำงานที่นี่"; ผู้ใช้ยังคงสามารถทำงานใน IDE ได้ แต่ไม่สามารถนำทาง Code Explorer ได้เนื่องจากมันกำลังรีเฟรช และเขากำลังรอการตรวจสอบโค้ดให้เสร็จสมบูรณ์ด้วย
- ผู้ใช้เห็นปัญหารหัสในผลลัพธ์การตรวจสอบที่พวกเขาต้องการที่อยู่ พวกเขาคลิกสองครั้งเพื่อนำทางไปยืนยันว่ามีปัญหากับรหัสและคลิกปุ่ม "แก้ไข" โมดูลได้รับการแก้ไขและจำเป็นต้องมีการวิเคราะห์คำซ้ำดังนั้นการตรวจสอบโค้ดจะดำเนินการต่อไป Code Explorer บอกผู้ใช้ว่า "หยุดฉันทำงานที่นี่" ...
ดูว่าจะเกิดอะไรขึ้น? ฉันไม่ชอบและฉันพนันได้เลยว่าผู้ใช้จะไม่ชอบ ฉันกำลังคิดถึงอะไร ฉันควรจะไปเกี่ยวกับการแบ่งปันผลการแยกระหว่างคุณสมบัติ แต่ยังคงปล่อยให้ผู้ใช้ในการควบคุมของเมื่อคุณลักษณะควรทำการทำงานของมัน ?
เหตุผลที่ฉันถามคือเพราะฉันคิดว่าถ้าฉันเลื่อนการทำงานจริงจนกว่าผู้ใช้จะตัดสินใจรีเฟรชและ "แคช" ผลการแยกวิเคราะห์ตามที่พวกเขาเข้ามา ... แล้วฉันจะรีเฟรชมุมมองต้นไม้และ การค้นหาปัญหารหัสในผลลัพธ์การแยกวิเคราะห์ที่อาจเป็นไปได้ ... ซึ่งแท้จริงนำฉันกลับไปที่ Square หนึ่งซึ่งแต่ละคุณลักษณะทำงานร่วมกับผลลัพธ์การแยกวิเคราะห์ของตัวเอง: มีวิธีฉันสามารถแบ่งปันผลการแยกวิเคราะห์ระหว่างคุณสมบัติและมี UX ที่น่ารัก?
รหัสC #แต่ฉันไม่ได้มองหารหัสฉันกำลังมองหาแนวคิด
VBAParser
สร้างขึ้นโดย ANTLR และให้ต้นไม้การแยกวิเคราะห์ แต่คุณลักษณะไม่ใช้สิ่งนั้น RubberduckParser
ใช้เวลาต้นไม้แยกที่เดินมันและปัญหาVBProjectParseResult
ที่มีDeclaration
วัตถุที่มีทั้งหมดของพวกเขาReferences
ได้รับการแก้ไข - ว่าสิ่งที่มีคุณสมบัติใช้สำหรับการป้อนข้อมูล .. เพื่อใช่ก็สวยมากทุกสถานการณ์หรือไม่มีอะไร RubberduckParser
ฉลาดพอที่จะไม่โมดูลใหม่แจงที่ยังไม่ได้รับการแก้ไข แต่ แต่ถ้ามีคอขวดไม่ได้อยู่ในการแยกวิเคราะห์ก็คือการตรวจสอบโค้ด