필자는 IDE를 필사적으로 확장하는 COM 추가 기능을 작성 중입니다. 관련된 많은 기능이 있지만이 게시물을 위해 2로 좁 힙니다.
- 사용자가 모듈과 해당 멤버를 탐색 할 수 있는 트리 보기를 표시 하는 코드 탐색기 도구 창이 있습니다.
- 있다 코드 검사는 그 디스플레이한다 toolwindow DataGridView를 사용자 탐색 코드 문제를 수하고 자동으로 수정.
두 도구에는 열려있는 모든 프로젝트의 모든 코드를 구문 분석하는 비동기 작업을 시작하는 "새로 고침"버튼이 있습니다. 코드 탐색기를 빌드하기 위해 구문 분석 결과를 사용 트 리뷰를 하고, 코드 검사는 코드 문제를 발견하고 그것의 결과를 표시하는 구문 분석 결과를 사용 된 DataGridView를 .
내가 여기서하려고하는 것은 코드 탐색기가 새로 고쳐지면 코드 검사 가이를 알고 코드 탐색기가 방금 수행 한 구문 분석 작업을 다시 수행하지 않고도 자체적으로 새로 고칠 수 있도록 기능 간 구문 분석 결과를 공유하는 것입니다. .
그래서 내가 한 일은 파서 클래스를 기능이 등록 할 수있는 이벤트 공급자로 만들었습니다.
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);
}
});
}
그리고 작동합니다. 내가 겪고있는 문제는 ... 그것은 작동한다는 것입니다. 코드 검사가 새로 고쳐지면 파서는 코드 탐색기 (및 다른 모든 사람)에게 "친구, 누군가의 파싱, 당신이하고 싶은 일을하고 있습니까?"라고 말합니다. " -파싱이 완료되면 파서는 청취자에게 "얘들 아, 나는 당신을 위해 신선한 파싱 결과를 가지고있다.
이것이 만들어내는 문제를 설명하기 위해 예를 들어 보겠습니다.
- 사용자는 코드 탐색기를 열어 사용자에게 "잠깐만 요, 여기서 일하고 있습니다"라고 알려줍니다. 사용자는 IDE에서 계속 작업하고 코드 탐색기가 다시 그려지고 인생은 아름답습니다.
- 그런 다음 사용자는 코드 검사를 표시하여 사용자에게 "여기서 작업 중입니다"라고 알려줍니다. 파서는 코드 탐색기에 "친구, 누군가의 파싱, 당신이하고 싶은 일이 있습니까?" -코드 탐색기는 사용자에게 "잠깐만 요, 여기서 일하고 있습니다"라고 알려줍니다. 사용자는 여전히 IDE에서 작업 할 수 있지만 새로 고침되므로 코드 탐색기를 탐색 할 수 없습니다. 또한 코드 검사가 완료되기를 기다리고 있습니다.
- 사용자는 해결하려는 검사 결과에서 코드 문제를 보게됩니다. 두 번 클릭하여 코드를 탐색하고 코드에 문제가 있는지 확인한 다음 "수정"단추를 클릭하십시오. 모듈이 수정되었고 다시 구문 분석되어야하므로 코드 검사가 진행됩니다. 코드 탐색기는 사용자에게 "잠깐만 요, 여기서 일하고 있어요"라고 알려줍니다.
어디로 가는지 봅니까? 나는 그것을 좋아하지 않으며, 사용자가 그것을 좋아하지 않을 것입니다. 내가 무엇을 놓치고 있습니까? 어떻게 기능 사이의 구문 분석 결과를 공유 가야하지만, 여전히 기능이시기의 제어에 사용자를 떠나야한다 그 일을 ?
내가 묻는 이유는 사용자가 적극적으로 새로 고침을 결정할 때까지 실제 작업을 연기하고 구문 분석 결과가 "캐시"될 때까지 파악하면 트리 뷰를 새로 고칠 것입니다. 말 그대로 각 기능은 자신의 구문 분석 결과와 함께 작동 원점으로, 저를 다시 가져 오는 가능성이 오래된 구문 분석 결과 ... 코드 문제를 위치 : 나는 기능과 구문 분석 결과를 공유 할 수있는 방법이 와 사랑스러운 UX를 가지고는?
코드는 c # 이지만 코드를 찾지 않고 개념을 찾고 있습니다.
VBAParser
ANTLR에 의해 생성되고 구문 분석 트리를 제공하지만 기능은 그것을 소비하지 않습니다. 는 RubberduckParser
, 구문 분석 트리를 취를 산책하고, 발행 VBProjectParseResult
포함 된 Declaration
이 객체를 모든 References
해결 - 의 것이 특징은 입력을 가지고 무슨 일이 ... 그래서 그래, 그것은 꽤 많이 모 아니면도 상황이다. 는 RubberduckParser
하지만 수정되지 않았을 다시 구문 분석 모듈을 스마트 충분하다. 그러나 병목 현상이 발생하면 구문 분석이 아닌 코드 검사가 필요합니다.