Използване на 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