2016-09-10 4 views
2

Я смотрю на Рослин-х CompletionService и ShouldTriggerCompletion определяется какКаков наиболее эффективный способ использования CompletionSevice Roslyn при наборе текста?

public virtual bool ShouldTriggerCompletion(
    SourceText text, 
    int caretPosition, 
    CompletionTrigger trigger, 
    ImmutableHashSet<string> roles = null, 
    OptionSet options = null 
) { … } 

где CompletionTrigger является оболочкой для одного char Character.

Это, кажется, подразумевает, я должен назвать ShouldTriggerCompletion на каждый полукокс при вводе - однако это будет означать, мне нужно обновить SourceText на каждый полукокс, который выделяет массив TextChange, новые SourceText и потенциально другие вещи, в зависимости от его внутренней структуры ,

Правильно ли я понял этот API? Каков наиболее эффективный способ его использования при наборе текста?


Edit: Чтобы уточнить, я знаю, что могу предугадывать его и только назвать его, скажем, .. Но моя цель - использовать API так, как он предназначен для использования, без каких-либо оптимизаций, кроме тех, которые уже были предоставлены.

ответ

1

однако это означало бы, мне нужно обновить SourceText на каждом полукокса, который выделяет массив TextChange, новый SourceText и потенциально другие вещи, в зависимости от его внутренней структуры

Да, на каждом нажатии клавиши в Visual Studio мы создаем новый SourceText и новый моментальный снимок Document/Project/Solution. Мы должны это сделать с . Все функции зависят от того экземпляра Document.

Для нас такая операция дешевая. Компонент текстового редактора в Visual Studio уже создает дешевый ITextSnapshot для каждого редактирования, который он выполняет через очень причудливые структуры данных (думаю, бинарные деревья строк), так что это так же дешево, как это может быть. Когда мы создаем SourceTexts для файлов в редакторе, вместо этого создаем наш own derived type of SourceText, и мы просто пересылаем запросы на данные в редактор ITextSnapshot API. Совсем не случайно, что в SourceText есть подмножество ITextSnapshot, потому что мы проектировали именно этот шаблон!

1

Это зависит от того, что вы пытаетесь сделать.

Если вы уверены, что знаете триггеры завершения для своего текста, вы можете избежать необходимости звонить ShouldTriggerCompletion, инициируя завершение самостоятельно, когда захотите. Но преждевременная оптимизация не является хорошей причиной для ее переопределения. (Вы будете нарушать совместимость с другими узлами, играющих в песочнице Рослин, вы можете пропустить крайний случай, вы не будете получать обновления, когда язык будет обновлен, и др)


Кроме того, если «Вы вызывающий абонент, вы, вероятно, не должны напрямую ссылаться на ShouldTriggerCompletion: GetCompletionsAsync кажется более вероятным, чем вы хотите.

+0

Спасибо. Я уточню вопрос, чтобы уточнить, но моя цель - представить стандартное поведение Roslyn настолько близко, насколько это возможно, поэтому я не хочу угадывать API. Я просто привык к настройке операций ввода, поэтому я удивлен, увидев несколько распределений, не вызывающих никаких проблем здесь (хотя, конечно, я должен измерить фактическое воздействие). –

+0

Задать вопрос по этому вопросу [Как правильно обновить документ Рослина при наборе текста?] (http://stackoverflow.com/questions/39422126/whats-the-right-way-to-update-roslyns-document-while-typing), так как мне это понадобится для 'GetCompletionsAsync'. –

Смежные вопросы