Использование roslyn для наведения курсора на данные для символов исходного дерева

ВОПРОС: Как мне применить мой личный 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 по умолчанию.

Спасибо!


person ReckerDan    schedule 13.07.2015    source источник
comment
Что не так со стандартным провайдером?   -  person SLaks    schedule 14.07.2015
comment
Какие символы не работают?   -  person SLaks    schedule 14.07.2015
comment
Мы хотим предоставить документацию через quickinfo в нашем редакторе intellisense. Проблема в том, что наш исходный код динамически генерируется из шаблонного языка (например, ASP.NET) и, следовательно, содержит кучу синтетических пространств имен, имен классов и других вещей, которые не должны быть доступны конечному пользователю, который кодирует оригинал. шаблонный источник.   -  person ReckerDan    schedule 14.07.2015


Ответы (1)


Не удается найти все нужные символы,Как найти дополнительные символы с помощью Roslyn API

Еще один вопрос, который я задал, когда я решил эту проблему, решил проблему, с которой я столкнулся здесь. Проблема была в том, что я думал

_workspace.CurrentSolution.AddMetadataReferences(_currentProject.Id,_compilation.References);

обновил рабочую область, в которой я работал. но она не возвращает решение с добавленными ссылками. мне нужно было использовать

_workspace.TryApplyChanges(referenceSolution);

чтобы сохранить его. Спасибо Джейсону за ответ на мой другой вопрос, найденный по ссылке. Если вы опубликуете здесь, я отмечу это как ответ.

person ReckerDan    schedule 21.07.2015