나는 효율적으로 다음과 같은 방법을 구현하기 위해 찾고 있어요 :Roslyn : 단일 소스 행에 정확한 토큰 + 트리 비아 스팬을 열거 하시겠습니까?
IEnumerable<ColoredSpan> GetSyntaxHighlightedSpansOnLine(int lineNumber);
나는 Document
, SourceText
, SyntaxTree
등이있다. ColoredSpan
은 일부 색상 및 문자열 (또는 char
초의 다른 소스)의 튜플이라고 가정합니다. 예를 들어,이 코드의 세 번째 줄의 경우 :
namespace Foo
{ /* Badly formatted coment...
which continues here... */ class Bar : public IBaz // TODO: rename classes
{
...
나는 텍스트로 열거 결과를 제공하기 위해 찾고 있어요 :
" ", "which continues here... */", " ", "class", " ", "Bar", " ",
":", " ", "public", " ", "IBaz", " ", "// TODO: rename classes", "\r\n"
참고 공백 및 주석 퀴즈를 포함하고, 부분적인 여러 줄의 코멘트를.
Another answer은 AST의 전체 부분을 걷는 CSharpSyntaxWalker를 파생시키는 방법을 가리 킵니다. 그러나 효과적으로 단일 행의 노드로 탐색을 제한하지는 않습니다. 한 줄 단위로 이것은 효율적이지 못하며 어떤 하위 섹션을 쉽게 만들 수 없었습니다. Roslyn "퀴즈"(예 : 여러 줄 주석)가 반환됩니다. 또한 중첩 노드 (예 : 네임 스페이스)를 반환합니다. 내가 code as in this answer 시도
, 라 :
var lineSpan = sf.GetText().Lines[lineNumber].Span;
var nodes = syntaxTree.GetRoot()
.DescendantNodes()
.Where(x => x.Span.IntersectsWith(lineSpan))
하지만이 다시 비효율적이며, 또한 노드를 (예 : 네임 스페이스)을 중복 반환하고 처리하지 않습니다 전체 AST 하위 트리, 전순 주사를 반환 하찮은 일. 다른 샘플은 전체 문서/스크립트와 함께 작동합니다. 또한 0 옆에있는 API 설명서를 참조했습니다.
코드 분석 API가 효율적으로 이것을 허용합니까? 또는이 방법을 구현하기 위해 사전에 전체 AST를 통과해야하며 내 몸으로 평행 메모리를 소비하는 주관적으로 부피가 큰 데이터 구조를 저장할 필요가 있습니까? this answer?
여기에 추가해야 할 문서가 정확히 무엇인지 확실하지 않습니다.이 코드는 Visual Studio에서 사용하는 코드와 동일하지만 여기에 캐싱이 있습니다. 캐싱 질문은 까다 롭습니다. 솔직히 시나리오를 알지 못하면 대답하기가 어렵습니다. –
@JasonMalinowski 감사합니다. 적어도 여기 오른쪽 라인에 있습니다. 끝내주는 Roslyn 코드를 볼 수는 있지만 주석이 거의 없으므로 API 계약을 구현에서 추론하기가 어렵습니다. 따라서 API를 잘못 사용하거나 잘못된 트리를 짖는 것보다는 의도 된대로 API를 코딩하는 것이 어렵습니다. 미래의 자신을 위해 성 가실 성능 문제를 만듭니다. 덧붙여 Roslyn overview wiki에서 구문 강조와 분류 자에 대한 언급을 보는 것이 좋을 것입니다. 그러나 나는 기 스텁에 대해 그렇게 인상해야한다. –