Как включить ключевые слова и псевдонимы в рекомендованные символы Roslyn? - PullRequest
0 голосов
/ 08 февраля 2019

Я использую Roslyn для создания скриптового элемента управления C # с IntelliSense.

Как правило, я очень доволен полученными результатами, однако рекомендуемые символы не включают такие ключевые слова, как for иif и так далее, а также не содержат псевдонимов типа, например int, когда он включает Int32.

Более конкретно, я использую Microsoft.CodeAnalysis.Recommendations, то есть:

Recommender.GetRecommendedSymbolsAtPositionAsync(mySemanticModel, scriptPosition, myAdhocWorkspace);

Мой SemanticModel объект получен из компиляции C #, которая всегда имеет ссылку на mscorlib.dll, по крайней мере.

На всех позициях в моем сценарии рекомендуемые завершения всегда верны.Однако я бы сказал, что они неполные, если в них отсутствуют ключевые слова, такие как if, else и for и т. Д.

Я вижу, что было бы легко включить псевдонимы общих типовв моем IntelliSense вручную.То есть, если Int32 является возможным завершением, тогда я мог бы вручную добавить int.

Однако, это менее очевидно, когда оператор if или оператор for или даже is/ as было бы уместно в данной области.

Есть ли способ включить эти ключевые слова при получении рекомендованных символов таким образом?

Есть ли способ автоматического включения псевдонимов типов

1 Ответ

0 голосов
/ 11 февраля 2019

Кажется, что Recommender.GetRecommendedSymbolsAtPositionAsync обеспечивает только завершение символов.Это означает, что Методы, Типы и т. Д. (ISymbol реализации).

Если вы хотите keywords или snippets завершение, вы можете использовать Microsoft.CodeAnalysis.Completion.CompletionService

void CompletionExample()
{
    var code = @"using System;

namespace NewConsoleApp
{
class NewClass
{
    void Method()
    {
fo // I want to get 'for' completion for this
    }
}
}";

    var completionIndex = code.LastIndexOf("fo") + 2;
    // Assume you have a method that create a workspace for you
    var workspace = CreateWorkspace("newSln", "newProj", code);
    var doc = workspace.CurrentSolution.Projects.First().Documents.First();

    var service = CompletionService.GetService(doc);
    var completionItems = service.GetCompletionsAsync(doc, completionIndex).Result.Items;

    foreach (var result in completionItems)
    {
        Console.WriteLine(result.DisplayText);
        Console.WriteLine(string.Join(",", result.Tags));
        Console.WriteLine();
    }
}

Вы можете игратьвокруг, чтобы выяснить, как настроить его для ваших нужд (правила, фильтры).

Обратите внимание, что каждый результат приходит от определенного поставщика завершения (item.Properties["Provider"]), и вы можете создать пользовательский CompletionProvider (впо крайней мере, вы должны быть в состоянии).

Вы также можете взглянуть на C # для кода VS (который работает на OmniSharp ), чтобы увидеть, как они работали.

...