2009-10-22 3 views
9

異なるソースコード要素が異なる色で表示されるシンタックスカラーリングに夢中です。今日では、コードを読むことができるようになると、適切なインデントが付いています。Visual Studioでのシンタックスカラーリングの粒度

Tools/Customize/Fonts and Colorsを調べると、細かい粒度があることがわかります。文字列に異なる色を付けることができます。例えば、文字列をそのまま使用することもできます。ここ

しかしが、C#コードの典型的なラインです:今

Controls.Add(combo); 

Controls, Add, and combo彼らはすべてちょうど「識別子」であるため、物事のすべての異なる種類があり、まだ彼らはすべて同じ色でレンダリングされています。

確かにそれよりも粒度を増やす方法がありますか?少なくとも、オブジェクトとは異なる方法で色付けしますか?

+0

1を、それがより明白にする現在の行をハイライトするために出てグレーデッドコードのようないくつかの素晴らしいことを行います。なぜクラスの色を選択できないのですか?オブジェクト?方法? –

答えて

14

少し考えてください。

まず、機能はデフォルトでは実装されていません。機能を実装するためには、誰かがその機能について考える必要があります。それから、私たちはそれを設計し、それを特定し、実装し、テストし、文書化し、それに対する輸送手段を見つけ出し、ドアから出さなければなりません。それらの事のいずれかが起こらなければ、あなたはその特徴を手に入れません。私の知る限りでは、これらのことのどれもがこの機能のために起こっていません。

第2に、フィーチャは、純便益、すなわち顧客への総利益から、それらを実装する際の総費用を引いたものに基づいて優先順位が付けられます。ここには非常にリアルな「機会費用」があります。私たちが実装するすべての機能は、予算がない数十の機能です。そのため機能は機能を発揮させるだけの価値があるだけでなく、機能リクエストリストにある何千もの機能よりも有益でなければなりません。それは達成するための高いバーです。ほとんどの機能はそれを達成しません。

私の3番目のポイントを説明するには、言語の処理方法について少し知っておく必要があります。まず、ソースコードを取り出し、それを「トークン」 - 言葉に「レキシング」することから始めます。この時点で、すべての文字が数字、文字列、キーワード、識別子、コメント、プリプロセッサディレクティブなどの一部であるかどうかがわかります。レキシングはは信じられないほど速いです。私たちはキーストローク間でファイルを簡単に再レックスすることができます。

次に、一連のトークンを「抽象構文ツリー」に「解析」します。これは、コードのどの部分がクラス、式、ローカル変数宣言、名前、代入などであるかを決定します。構文解析も高速ですが、レキシングほど速くはありません。私たちは、誰かが実際にそれらを見ているまでメソッド本体を解析することをスキップするような、いくつかのトリックを行います。

最後に、抽象構文ツリーをとり、その意味解析を行います。これは、指定された名前が型、ローカル変数、名前空間、メソッドグループ、フィールドなどを参照するかどうかを決定します。我々は、プログラムのタイプ階層を決定するための "トップレベル"セマンティック分析と、あらゆるメソッドのあらゆる表現のタイプを決定するための "メソッドレベル"意味分析の両方を行います。 「トップレベル」のセマンティック分析は非常に高速で、個々のメソッド分析は非常に高速ですが、キーストローク間で完全なセマンティック分析を行うのは難しいです。

intellisenseの完全な意味解析を行う必要があることは明らかですが、現在入力している方法を把握し、トップレベルとそのメソッドの意味分析のみを行うことができます。

しかし、色付けはファイル全体で機能する必要があります。あなたはカーソルが今起こっている方法を色付けすることはできません。したがって、色彩化は非常に速くなければならないため、歴史的には主に字句情報に基づいて色付けされています。

時には、私たちは「このタイプはおそらくタイプですか?」というような特別なものを見つけることができます。それを別の色にする。しかし、特定のエンティティが、たとえばメソッドグループと、つまり、デリゲート型のフィールドとを比較すると、非常に豊富なレベルのセマンティック分析が必要です。これは、すべてのキーストロークで現在実行していないレベルです。

ここではできることがあります。トークンストリームの編集を理解し、ツリーの編集された部分の文法や意味解析を再実行するだけで、よりスマートになる可能性があります。私たちは今、この分野についていくつかの研究をしていますが、それは単なる研究です。実際には製品に実際にはないかもしれません。

+1

アクティブに編集されたファイルに使用されるASTは、コンパイラによって使用されるASTとは大きく異なります(「より柔軟」)。私はこれを言います。なぜなら、レキシングと構文解析を理解し、それをスマートなエディタに簡単に変換することができれば、それは真実に遠く離れたものではないと思う多くの人がいるからです。 :o –

+0

@エリック:広範な対応をありがとう。私はVSの機能が不足しているとは思っていませんでしたが、私は本当にUIで何かを逃したいと思っていました。私が後に色付けをする方法がありました。 (続き) –

+0

複数のコンパイラを自分で作成したので、難しい点はありがたいです。一方、完全なASTを必要とせずにこの分野で多くの改善が可能であるように思えます。私は、特定のシンボルを複数のコンテキストで使うことができるので、シンボルテーブルだけでは十分ではないということを認識しています。たとえば、私は今、このコード行を今日書きました: public CaseStyle CaseStyle {get;セット; } 最初のCaseStyleは列挙型です。 2番目はプロパティ名なので、そのシンボルとあいまいさがあります。 しかし、方法についてはどうですか?レキシカルレベルでメソッド呼び出しを検出できないのですか? –

2

ReSharperプラグインは、あなたが話しているようないくつかの強調された構文強調を提供すると信じています。同じものを(低コストで)提供するプラグインもありますが、それは単に私が使用するプラグインです。私は構文の強調表示が非常に便利であることに同意します。 ReSharperのも、私はこの答えを知りたいため、など

-Daniel

+0

私はReSharperの多くのヒアリングを聞いたことがあります。残念ながら、ほとんどのプロジェクトでは、プラグインを許可しないExpressを使用しています。 –