ВОПРОС: Как мне применить мой личный DocumentationProvider к символам исходного дерева? Какой тип символа я получаю, когда использую SymbolFinder.FindSymbolAtPosition()
В частности, я хочу переопределить функцию GetDocumentationForSymbol(). У меня это переопределено для моих символов автозаполнения, но не для символов, которые я получаю при наведении курсора.
ФОН:
Привет, я использую roslyn для сбора информации для текстового редактора, который я создаю. Одна из вещей, которые мне нужно сделать, это краткая информация или подсказки. У меня это работает для предложений автозаполнения. с помощью фрагмента, который выглядит так
compilation = CSharpCompilation.Create(
"MyIntellisense",
new[] { CSharpSyntaxTree.ParseText(dotNetCode) },
assemblies
.Select(i => MetadataReference
.CreateFromFile(i.Location, MetadataReferenceProperties.Assembly,
new DotNetDocumentationProvider(
new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary));
здесь используется мой собственный DotNetDocumentationProvider, который анализирует XML и документацию так, как мне нужно. Это работает для символов сборки, которые являются типами символов, которые у меня есть, когда я использую Recommender.GetRecommendedSymbolsAtPosition().
РЕДАКТИРОВАТЬ: Просто хотел дать больше информации :)
Я получаю символы двумя разными способами.
1) Один из способов, когда я звоню
var symbols = Recommender.GetRecommendedSymbolsAtPosition(semanticModel, offset, solution.Workspace);
Я использую это, когда пользователь запрашивает информацию об автозаполнении. С помощью этих символов я могу пройти и для каждого вызова:
var information = symbol.GetDocumentationCommentXml();
Это в конечном итоге вызывает функцию, которую я переопределил из класса DocumentationProvider:
protected override string GetDocumentationForSymbol(string documentationMemberID, CultureInfo preferredCulture, CancellationToken cancellationToken = default(CancellationToken))
2) Второй способ, когда пользователь наводит курсор
var symbol = SymbolFinder.FindSymbolAtPosition(semanticModel, offset, workspace, cancellationToken);
Я вызываю ту же самую функцию (фактически из той же строки кода, оставляя ее СУХОЙ)
var information = symbol.GetDocumentationCommentXml();
Но это не вызывает мой переопределенный GetDocumentationCommentXml(), вместо этого вызывается Roslyn по умолчанию.
Спасибо!