web-dev-qa-db-ja.com

Generic Intellisenseの新しい完全な実装

SQLおよびC#用の一般的なIntellisense対応エディターを作成することに興味があります(可能な場合など)。これを、オーバーライドまたは拡張されたWPF richTextBoxタイプのコントロールとしてC#で実行したいと思います。私は多くのサンプルプロジェクトが利用可能であることを知っており、自分のbasicバージョンを実装しました。しかし、私が出会ったほとんどの例(そして実際に私自身のもの)は、まさにbasicです。

いくつかのコード例は次のとおりです。

  1. DIY Intellisense By yetanotherchris

  2. CodeTextBox-構文の強調表示とIntellisense By Tamas Honfiを使用した別のRichTextBoxコントロール

しかし、私はIntellisenseを備えたSQLエディタの素晴らしい例を見つけました QueryCommander SQL Editor By MikaelHåkansson これはうまくいくようです。マイクロソフトは、コマンドキーワードのXMLライブラリを使用する必要がありますが、私の質問は次のとおりです。


Edit A:1年が経ち、主に自分の「楽しみ」のために、基本的なインテリセンスを備えた独自のエディターコントロールを開発することができました。自由に利用できる.NETプロジェクトのリストを提供して、自分の開発を支援し、すぐに使用でき、無料で使用できると思いました:

  1. ICSharpCode(WinForms)

  2. AvalonEdit(WPF)

  3. ScintillaNET(WinForms)

  4. クエリコマンダー[インテリセンス実装の例](WinForms)


Edit B:質問の15か月後、私はまだ新しい改良されたエディターを探しています。これはいいですね...

  1. RoslynPAD かっこいい!

編集C:2年以上の質問から、WPFを使用し、AvalonEditが支援する以下のプロジェクトを見つけました。

  1. AvalonEditのCodeCompletion NRefactoryを使用。このプロジェクトは本当にすてきで、NRefactoryを使用したインテリセンスの完全な実装があります。

  2. ScriptCS ScriptCSを使用すると、シンプルなテキストエディターでC#を簡単に記述して実行できます。

61
MoonKnight

マイクロソフトは(詳細に)入力したままのIntelliSenseをどのように実装しますか?

canは、あなたが名前を付けたい詳細なレベルで説明しますが、簡単な説明以上の時間はありません。 Roslynでどのように行うかを説明します。

まず、editsを効率的に表すことができるデータ構造を使用して、トークンストリームの不変のモデルを構築します。

永続的な再利用を効率的にするための重要な洞察は、トークンの文字の長さを表すことですが、編集バッファー内の文字位置は表しません。ファイルの最後にあるトークンは、すべての編集で位置を変更しますが、トークンの長さは変更されないことに注意してください。 非常に大きなファイルで効率を上げたい場合は、すべてのコストでリレクシングの合計数を最小限に抑える必要があります。

挿入と削除を処理して、ファイル全体を毎回再解析することなく不変トークンストリームを構築できる不変モデルを作成したら、文法分析のために同じことを行う必要があります。 これは実際にはかなり難しい問題です。コンピューターサイエンスの学部または大学院の学位を取得することをお勧めします。パーサー理論に重点を置いて、まだ取得していない場合はこれを行います。この特定のアルゴリズムを設計するために、パーサー理論で論文を作成した博士号を持つ人々の助けを得ました。

次に、明らかに、C#を分析できる文法アナライザーを構築します。 正しい C#ではなく、broken C#を分析する必要があることを忘れないでください。 IntelliSenseは、プログラムがコンパイルされていない状態で動作している必要があります。そのため、エラー回復特性が良好な文法の修正を考え出すことから始めます。

これで、ほとんどの場合、編集された領域以外を再解析または再解析することなく、効率的に文法分析を実行できるパーサーが得られました。つまり、キーストローク間で作業を行うことができます。言及するのを忘れましたが、もちろん、分析が2つのキーストローク間の時間よりも長くかかる場合、これらの分析をすべて実行するときにIスレッドをブロックしないのメカニズムを考え出す必要があります。 C#5の新しい「async/await」機能がそれを支援するはずです。 (個人的な経験から言えます。タスクとキャンセルトークンの増殖に注意してください。不注意な場合、キャンセルされたタスクが数万件保留されている状態になる可能性があり、それは速くない。)

文法分析ができたので、セマンティックアナライザーを作成する必要があります。 IntelliSenseのみを実行しているため、特に高度なセマンティックアナライザーである必要はありません。 (セマンティックアナライザーは、正しいプログラムからコードを生成し、誤ったプログラムから正しいエラー分析を行うのに適した分析を行う必要があります。)もちろん、壊れたプログラムに対して適切なセマンティック分析を行う必要があります。

私のアドバイスは、「トップレベル」のセマンティックアナライザーを作成することから始めることです。この場合も、ソースコードで宣言された型の状態を編集から編集まで持続できる不変モデルを使用します。トップレベルアナライザは、型宣言、ディレクティブ、名前空間、メソッド宣言、コンストラクタ、デストラクタなど、ステートメントまたは式であるnotであるものをすべて処理します。コンパイラがメタデータを生成するときにプログラムの「形状」を構成するもの。

メタデータ!メタデータを忘れました。メタデータリーダーが必要です。明らかに、ライブラリ内の型を参照する式でIntelliSenseを生成できる必要があります。 Reflectionではなく、CCIライブラリをメタデータリーダーとして使用することをお勧めします。 IntelliSenseを実行するだけなので、明らかにメタデータライターは必要ありません。

とにかく、トップレベルのセマンティックアナライザーを作成したら、特定のステートメントの式のタイプを分析するステートメントと式のセマンティックアナライザーを作成できます。 名前検索およびオーバーロード解決アルゴリズムに特に注意してください。メソッドタイプの推論は特に注意が必要です。特にLINQクエリ内

すべてを入手したら、IntelliSenseエンジンは簡単になります。現在のカーソル位置で式のタイプを調べ、ドロップダウンを適切に表示するだけです。

同じ標準を自分で作成するのはどれくらい難しいでしょうか?

まあ、私たちにはチームがあり、10人と呼んでいます。最初から最後まですべてを成し遂げるには、おそらく5年をかけましょう。しかし、IntelliSenseエンジンだけでなく、やるべきことがたくさんあります。それはたぶん仕事のわずか40%です。ああ、私はそれについて考えているので、それらの人々の半分はVBに取り組んでいます。しかし、これらの人々は平均してこの種の仕事をするのに平均5年か10年の経験を持っているので、あなたがこれをやったことがない場合よりも速いでしょう。

だから、キーストロークの間の時間で大規模なプログラムをほぼ正確に分析できるC#用のRoslyn品質のIntelliSenseエンジンを構築するには、約10年から20年のフルタイムの作業が必要です。

最初に博士号を取得する必要がある場合は、明らかに長くなります。

または、単純にRoslynを使用することもできます。それがの目的だからです。おそらく数時間かかりますが、自分でやる楽しさは得られません。そして楽しいです!

プレビューリリースはこちらからダウンロードできます。

http://www.Microsoft.com/download/en/details.aspx?id=27746

122
Eric Lippert

これは、Microsoftが通常素晴らしい結果を生み出す分野です-Microsoft開発者ツールは本当に素晴らしいです。また、開発者向けツールの販売とWindowsの販売には、最高のインテリセンスを持っていることには明らかな商業的利点があるため、エリックが驚くほど詳細な答えで説明している種類のリソースを費やすのは理にかなっています。それでも、いくつかのことを指摘する価値があると思います。

  1. 顧客は、Microsoftの実装が提供するすべての機能を実際には必要としないかもしれません。マイクロソフトのソリューションは、yoyourの顧客/ユーザーに提供する必要がある機能の点で非常に過剰に設計されている場合があります。 Visual Studioと競合することを目的とした一般的なコーディング環境を実際に実装している場合を除き、問題を単純化するか、Microsoftが感じるソリューションを妥協できるようにする使用目的の側面がある可能性があります彼らは作ることができません。マイクロソフトは、数百ミリ秒単位で既に測定されている応答時間の短縮にリソースを費やす可能性があります。それはあなたがする必要があるものではないかもしれません。 Microsoftは、コード分析に使用するAPIを他の人に提供することに時間を費やしています。それはおそらくあなたの計画の一部ではありません。機能に優先順位を付けて、あなたと顧客にとって「十分な」外観を決定し、それを実装するコストを見積もります。

  2. 実際にはないかもしれない要件を実装するための明らかな費用を負担することに加えて、マイクロソフトはまた、チームで働いていなかった場合には明らかではないかもしれないいくつかの費用を負担します。チームに関連する膨大な通信コストがあります。実際、5人の賢い人がソリューションを作成するのにかかる時間は、一人の賢い人が同等のソリューションを作成するのにかかる時間よりも非常に簡単です。このシナリオをより可能にするMicrosoftの雇用慣行と組織構造の側面があります。エゴを持つたくさんの賢い人を雇って、全員が意思決定を行えるようにすると、500%のコストで5%の優れたソリューションを得ることができます。その5%優れたソリューションは、Microsoftにとって有益ですが、小さな会社にとっては致命的かもしれません。

  3. 1人のソリューションから5人のソリューションに移行するとコストが増加しますが、それはチーム内の開発コストにすぎません。 Microsoftにはseparateチームがあり、単一の機能であっても(大まかに)設計、開発、およびテストに専念しています。これらの境界を越えたピア間のプロジェクト関連のコミュニケーションは、各分野内よりも摩擦が大きくなります。これにより、個人間の通信コストが増加するだけでなく、チームの規模が大きくなります。さらに、12人で構成される単一のチームではなく、5人で構成される3つのチームであるため、3倍のコミュニケーション費用がかかります。マイクロソフトが負担することを選択したより多くのコストは、他の企業にとって同様のコストに変換されない可能性があります。

ここでの私のポイントは、Microsoftを非効率的な会社として説明することではありません。私の要点は、Microsoftは、採用からチーム編成、収益性とリスクに関する仮定から始まる設計と実装に至るまで、Microsoft以外の企業には当てはまらないすべてのことについて、多くの決定を下すということです。

インテリセンスに関しては、問題についてさまざまな考え方があります。マイクロソフトは、インテリセンスを解決するだけでなく、コードナビゲーション、リファクタリング、およびコード分析の他のさまざまな用途を対象とする、非常に汎用的で再利用可能なソリューションを開発しています。開発者が入力しなくてもコードを簡単に入力できるようにすることが唯一の目標である場合、同じ方法で行う必要はありません。その機能をターゲットにするのに何年も努力する必要はありません。APIを提供するだけでなく、実際にUIを制御する場合にも、あらゆる種類の創造的なことができます。

16
Ajs