Открыть сервис

IntelliSense

IntelliSense — это технология автодополнения кода и контекстных подсказок, интегрированная в среду разработки Microsoft Visual Studio. Предоставляет разработчику список возможных завершений вводимых символов (методов, свойств, ключевых слов, переменных) по мере набора текста, а также отображает краткую справочную информацию (сигнатуры функций, типы параметров, документацию) в интерактивном режиме. В отличие от более ранних систем автодополнения, IntelliSense анализирует не только синтаксис языка, но и семантику кода, используя данные компилятора или анализатора на основе языкового сервера.

История

Предшественником IntelliSense считается функция автозавершения, впервые реализованная в Microsoft Visual Basic 1.0 (1991 год). Она предлагала список свойств и методов объектов ActiveX. В 1996 году с выходом Visual Basic 5.0 и Visual C++ 5.0 корпорация Microsoft внедрила переработанную версию под названием IntelliSense. Первоначально технология работала только с языками C++ и Visual Basic, используя предварительную компиляцию (обход AST-деревьев).

В 2002 году, с выпуском Visual Studio .NET, IntelliSense была адаптирована для языков платформы .NET (C#, Visual Basic .NET и C++/CLI). Для работы с каждым языком требовалась отдельная реализация парсера. В 2015 году Microsoft начала интеграцию IntelliSense с открытым протоколом Language Server Protocol (LSP), что позволило технологию для языков, поддерживающих LSP (например, Python, TypeScript, JavaScript, Go), через единый интерфейс.

В 2017 году IntelliSense была портирована на кроссплатформенные редакторы Visual Studio Code (VS Code), где реализована как расширение, использующее LSP. По состоянию на 2024 год IntelliSense доступна для большинства популярных языков программирования, включая C#, C++, Python, Java, JavaScript, TypeScript, SQL, PHP, Go и Rust.

Архитектура и принцип работы

Компоненты

IntelliSense состоит из нескольких уровней:

Этапы обработки

  1. Пользователь набирает символ. Среда разработки передаёт текущее состояние буфера (с учётом позиции курсора) языковому серверу.
  2. Языковой сервер (например, Roslyn для C#, tsserver для TypeScript, Python LSP Server для Python) создаёт частичное дерево разбора для незаконченного выражения.
  3. Выполняется поиск допустимых завершений: сначала — ключевые слова (например, if, for, while), затем — члены текущего объекта, пространства имён, локальные переменные.
  4. Для каждого варианта извлекается краткое описание (сигнатура метода, возвращаемый тип, файл и строка определения).
  5. Список отправляется обратно в редактор, где отображается в выпадающем меню.

Возможности и виды подсказок

Автодополнение

После ввода части имени IntelliSense выводит список возможных завершений. Выбор может производиться клавишами Enter, Tab, двойным щелчком мыши. Фильтрация осуществляется по подстроке, по началу слова, по шаблону типа camelCase (например, fbf найдёт fooBar).

Список членов

При вводе точки после имени объекта (или при наведении на него) появляется список доступных полей, свойств, методов и событий. Для методов отображаются перегрузки.

Информация о параметрах

При вводе открывающей скобки после имени метода IntelliSense показывает сигнатуру метода: имена параметров, их типы, значения по умолчанию. При переключении между перегрузками список обновляется.

Быстрая информация

Всплывающая подсказка при наведении курсора на идентификатор: тип переменной, тип возвращаемого значения, краткое описание XML-документации.

Автоматическая вставка

IntelliSense может автоматически вставлять закрывающие скобки, кавычки, фигурные скобки, а также завершать объявления (например, foreach — шаблон цикла).

Умное автодополнение (Smart Completion)

Настройки и управление

Пользователь может конфигурировать поведение IntelliSense через настройки среды разработки (Tools — Options — Text Editor — [язык] — IntelliSense). Основные параметры:

Языки и редакторы

IntelliSense встроена в следующие продукты:

Альтернативные технологии

Критика и ограничения

Источники

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →