Visual Studioのシンタックスカラーリングの粒度
-
05-07-2019 - |
質問
さまざまなソースコード要素がさまざまな色で表示される構文の色付けに夢中です。最近では、コードを読む能力に関しては、適切なインデントで適切な色付けが行われています。
Tools / Customize / Fonts and Colors
を見ると、場合によってはきめ細かなことがわかります。たとえば、文字列や逐語的な文字列に異なる色を付けることができます。
ただし、C#コードの典型的な行は次のとおりです。
Controls.Add(combo);
現在、コントロール、追加、およびコンボ
はすべて異なる種類のものですが、それらはすべて「識別子」であるため、すべて同じ色でレンダリングされます。
確かにそれ以上の粒度を得る方法はありますか?少なくとも色の方法はオブジェクトとは異なりますか?
解決
いくつかの考え。
最初に、機能は「実装されていません」」デフォルトで。機能を実装するには、誰かがその機能について考える必要があります。次に、設計、指定、実装、テスト、文書化、出荷用の車両の検索、ドアからの取り出しを行う必要があります。これらのいずれかが発生しない場合、機能を取得できません。私の知る限り、この機能ではこれらのことは起きていません。
第二に、機能はその純利益、つまり顧客への総利益から実装の総費用を差し引いたものに基づいて優先順位が付けられます。非常に現実的な「機会費用」があります。ここでプレイします。私たちが実装しているすべての機能は、予算がない数十の機能です。そのため、機能はそれらを実現するための作業に値するだけでなく、機能要求リストにある何千もの機能のどれよりも有益である必要があります。それは達成すべき高い水準です。ほとんどの機能では実現できません。
3番目のポイントを説明するには、言語の処理方法について少し知る必要があります。まず、ソースコードを取得し、「字句解析」を行います。 「トークン」に入れます。 -言葉。この時点で、すべての文字が数字、文字列、キーワード、識別子、コメント、プリプロセッサディレクティブなどの一部であるかどうかがわかります。字句解析は非常に高速です。キーストローク間でファイルを簡単に再作成できます。
次に、一連のトークンを取得して「解析」します。それらを「抽象構文ツリー」に入れます。これにより、コードのどの部分がクラス、式、ローカル変数宣言、名前、割り当てなどであるかが決まります。解析も高速ですが、字句解析ほど高速ではありません。誰かが実際にそれらを見ているまでメソッド本体の解析をスキップするなど、いくつかのトリックを行います。
最後に、抽象構文ツリーを取得し、その意味分析を行います。これにより、指定された名前が型、ローカル変数、名前空間、メソッドグループ、フィールドなどを参照しているかどうかが決まります。私たちは両方の「トップレベル」を行いますプログラムの型階層を決定するためのセマンティック分析、および「メソッドレベル」セマンティック分析。すべてのメソッドのすべての式のタイプを決定します。 "トップレベル"セマンティック分析は非常に高速であり、個々のメソッド分析は非常に高速ですが、キーストローク間で完全なセマンティック分析を行うことは困難です。
明らかにインテリセンスの完全なセマンティック分析を行う必要がありますが、現在入力しているメソッドを把握し、トップレベルとそのメソッドのセマンティック分析のみを行うことで問題を回避できます。
ただし、色付けはファイル全体で機能する必要があります。現在カーソルがたまたまあるメソッドを色付けすることはできません。したがって、色付けは非常に高速でなければならないので、歴史的には主に語彙情報に基づいて色付けしました。
「これはおそらく型ですか?」などの特別なものを見つけることができます。別の色を与えるために。ただし、特定のエンティティが、たとえばメソッドグループと、たとえばデリゲートタイプのフィールドであるかどうかを判断するには、非常に豊富なレベルのセマンティック分析が必要です。これは現在、すべてのキーストロークで実行されるわけではありません。 >
今、ここでできることがあります。トークンストリームの編集を理解し、ツリーの編集された部分で文法的および意味的分析のみを再実行することについて、より賢くすることができます。現在、この分野の調査を行っていますが、それは単なる調査です。実際に製品に組み込まれることはないかもしれません。
他のヒント
ReSharperプラグインは、あなたが話しているように、いくつかの強化された構文強調表示を提供すると信じています。私が使用しているものと同じものを(低コストで)提供する他のプラグインもあります。構文の強調表示は非常に便利です。 ReSharperは、デッドコードをグレーアウトするなど、いくつかの優れた機能を使用して、より明確にしたり、現在の行を強調表示したりします。
-ダニエル