は、私が効率的に次のメソッドを実装するために探しています:Roslyn:単一のソース行に正確なトークン+トリビアスパンを列挙しますか?
IEnumerable<ColoredSpan> GetSyntaxHighlightedSpansOnLine(int lineNumber);
私はDocument
、SourceText
、SyntaxTree
ら持っています。 ColoredSpan
は、ある色と文字列のタプル(またはその他のソースchar
)であるとします。例えば、このコードの3行の場合:
" ", "which continues here... */", " ", "class", " ", "Bar", " ",
":", " ", "public", " ", "IBaz", " ", "// TODO: rename classes", "\r\n"
注空白やコメントトリビアを含めると、部分的な複数行コメント:
namespace Foo
{ /* Badly formatted coment...
which continues here... */ class Bar : public IBaz // TODO: rename classes
{
...
私はテキストを列挙結果を提供するために探しています。
Another answerは、ASTの全部分を歩くためにCSharpSyntaxWalkerを導出する手段を指しますが、有効なトラバーサルを1行のノードに限定することはできません。行ごとにこれは効率的ではなく、私は容易にどのサブセクションをどのように動かすことができませんでした。返信するRoslyn "trivia"(複数行コメントなど)また、重複するノード(例えば名前空間)を返します。
私は、ラをcode as in this answerを試してみました:
var lineSpan = sf.GetText().Lines[lineNumber].Span;
var nodes = syntaxTree.GetRoot()
.DescendantNodes()
.Where(x => x.Span.IntersectsWith(lineSpan))
が、これは再び非効率的である全体ASTサブツリー、先行順走査を返し、また、重複したノード(例えば名前空間)を返し、処理しませんトリビア。他のサンプルはドキュメント/スクリプト全体で動作します。私はまた、ゼロの次にあるAPIドキュメントを参照しました。
コード解析APIはこれを効率的に許可していますか?または、この方法を実装するには、事前にAST全体をトラバースして、自分自身の主観的にかさばる並列メモリを消費するデータ構造をthis answerのように保存する必要がありますか?
ここに追加する必要があるドキュメントはっきりしていません。このコードはVisual Studioで使用するのと同じコードですが、その上にキャッシングがあります。キャッシングに関する質問は難しく、正直なところシナリオを知らなくても答えにくいです。 –
@JasonMalinowskiこれは、最高の安心です、ありがとう - 少なくともここで正しい行に。私たちは素晴らしいRoslynコードを見ることができますが、コメントはほとんどありませんので、実装からAPI契約を推測するのは難しいので、誤ったツリー/将来の自己のために厄介なパフォーマンスの問題を作り出します。ちなみに、Roslyn overview wikiのシンタックスハイライトとクラシファイアの言及を見てうれしいです。しかし、私はGithubで本当にそれを上げるべきです。 –