私は、必死にそれを必要とするIDEを拡張するCOMアドインを書いています。関係する機能はたくさんありますが、この投稿のために2つに絞ってみましょう。
- ユーザーがモジュールとそのメンバーをナビゲートできるツリービューを表示するコードエクスプローラーツールウィンドウがあります。
- ユーザーがコードの問題をナビゲートして自動的に修正できるようにする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
は2つあります。ANTLR によって生成され、解析ツリーを提供しますが、機能はそれを消費しません。RubberduckParser
、解析木を受け取り、それを歩くと、問題VBProjectParseResult
含まれDeclaration
ていたオブジェクトを、すべての彼らのReferences
解決- のこと機能は、入力のために取る何が...そうええ、それはほとんどすべてか無かの状況です。RubberduckParser
かかわらず変更されていないいない再解析モジュールにスマート十分です。しかし、ボトルネックがある場合、それは解析ではなく、コード検査にあります。