IDE для статически напечатанного LUA Development.
Получен из Эммилуа.

self - настоящий тип@shape@not типа бросает@type аннотации в обратных заявлениях 






Последний релиз доступен для загрузки в Intellij или на веб -сайте плагинов Jetbrains.
Луанализ получен из Emmylua и поддерживает все базовые функции редактирования и рефакторирования, предоставляемые Emmylua.
Помимо базовых возможностей редактирования LUA, Luanalysis поддерживает значительный объем дополнительной функциональности, необходимой для статического типа расширенных кодовых баз.
*ПРИМЕЧАНИЕ*: Особенности примерно перечислены в том порядке, в котором они были реализованы, ни в коем случае не порядок.
Отличный способ увидеть, что возможно с точки зрения статического набора, - это проверить демонстрационный проект Luanalysis.

В дополнение к определению новых типов, тег @type теперь также можно использовать для того, чтобы выбрать результат выражения LUA.
Это наиболее полезно с недавно добавленной поддержкой комментариев блоков Emmydoc, поскольку мы можем легко указать встроенные типовые листы:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/type_casts.lua
Emmylua пытается определить, является ли тип назначенным другим типам, просто проверяя, является ли первый «подтип» последнего, однако правильная дисперсия сложных типов не реализована. Например, функции могут быть ковариатными или противоречивыми других типов функций, в зависимости от параметров и типов возвращаемых значений:

Emmylua не сообщает о вышеуказанной ошибке.
Кроме того, обнаружение дисперсии профсоюзов было зафиксировано:

Как указано выше, текущий выпуск Emmylua не поймает эту ошибку.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/string_literals.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics_scope.lua
Т.е. Проверка типа теперь работает внутри функции «лямбдас», назначенная переменной с определением Emmydoc.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/lambda_params.lua
Различные улучшения, например, Emmydoc «массивы» теперь назначаются для совместимых типов таблиц, например,

Текущий релиз Emmylua сообщит здесь об ошибке, хотя это звучит.
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/tables.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l226-l249
Текущий выпуск Emmylua не может правильно вывести дженерики в нескольких ситуациях и, таким образом, сообщает о ошибках типа, где не существует ошибок, а также пропускает ошибки, где должны существовать ошибки, например, EG
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/function_generics.lua#l154-l181
По умолчанию ошибки безопасности типа теперь сообщаются как ошибки вместо предупреждений. Это сделано возможным на три вещи:
Многие улучшения в способности определять сложные типы
Тип исправления ошибок в безопасности
Кастинг
В частности, кастинг означает, что, если пользователь делает что -то, система типа считает небезопасной, но он знает, что во время выполнения будет в порядке, он может просто добавить актерский состав, чтобы обозначить это, и ошибка исчезнет.

Задержка общего параметра запрещено и отчеты об ошибках:

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_scope.lua

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_class_fields.lua#l44-l45
self - настоящий тип Улучшенная проверка типов для self , например, self может быть назначена переменной, которая соответствует родительскому типу метода. Однако этот родительский тип не может быть назначен self , так как класс может быть подкладывается (в этом случае self относится к более конкретному типу).

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/self.lua

Текущий выпуск Emmylua позволит это недействительное назначение.
Когда функция возвращает несколько значений, текущий выпуск Emmylua будет выводить значения и поместить их в кэш. Это неточно, так как общий анализ типов может привести к тому, что тот же общий параметр будет решать по -разному на основе назначенного значения, поэтому кэш не может быть использован в этом обстоятельстве. В настоящее время это приводит как к отсутствующим ошибкам, так и к дополнительным неточным ошибкам, в зависимости от назначения.
@shapeФорма может быть определена аналогично классу, за исключением того, что противополучия определяется совместимостью членов , а не иерархией наследования.
Это наиболее полезно при работе с «структурами» (например, JSON), а не с классами ООП.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua
Что делает формы особенно полезными, так это то, что они поддерживают дженерики и наследство (во время определения, а не назначение), как классы:
https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/shape.lua#l36-l74
Более того , инспекции типов сообщаются не только на несовместимой «таблице» как целый, но и проверки знают, как пройти литералы с таблицами и предоставлять подробные аннотации несовместимости между двумя формами, например

Псевдонимы теперь могут принимать общие параметры, как класс или форма.

https://github.com/benjamin-dobell/luanalysistypesdemo/blob/cfea19c9fd744078f50f61e74e620b7505b58c65/src/generic_alys.lua
Типы функций теперь могут использовать …: T в качестве альтернативы vararg T :

Теперь мы поддерживаем вариационные возвратные значения:

Внутренне, TyTuple был заменен TyMultipleResults чтобы отразить тот факт, что эта конструкция не является фиксированным размером. Кроме того, несколько результатов теперь обрабатываются в большем количестве мест.
Различные улучшения в типинге LUA встроенных встроенных вручительских, пользующихся вариальными возвратными значениями и т. Д.
Теперь мы можем ввести все свойства таблиц, а не только константы строки. Учитывая, что Luanalysis также добавляет поддержку примитивных буквальных типов, мы можем использовать это множество различных способов, например, например,

Здесь у нас есть регулярные поля идентификатора строки, цифры буквальных полей [1] , [2] и [3] и [boolean] поле. Этот последний действительно мощный, потому что он не постоянный, это реальный тип.
Мы можем напечатать пользовательские структуры данных, например
--- @class Dictionary < K , V >
--- @field [ K] V Это будет работать правильно для любого K , и все будет проверено статически, как и следовало ожидать.
Есть также синтаксис для типов таблиц, он работает для табличных литералов и анонимных классов (т.е. таблицы, которые не напечатаны явно):

Теперь мы поддерживаем fun типы с дополнительными списками параметров и дополнительными возвратными значениями, то есть fun: boolean и fun(arg: boolean) . fun (без указания) также работает для потомков, но функционально эквивалентно существующему типу function .
Частично напечатанные функции чрезвычайно полезны для реализации обратного вызова и обработчиков. Например, довольно распространено иметь расширяемую систему событий, в которой каждое событие имеет уникальные аргументы, но обработчик должен вернуть true чтобы указать, что событие было обработано:

Это еще одна действительно полезная функция. Теперь мы можем правильно указать, что объект является вызовом (т.е. представляет собой table , у которого Metateable имеет метод __call ).

Это делается с использованием существующего ключевого слова @overload emmyDoc, и работает так же, т.е. мы можем указать много перегрузки, и проверка типов и завершение будет работать, как и следовало ожидать:

КУТУ могут быть реализованы в виде форм с литературными индексами:

или в качестве псевдонимов буквальных типов:

Как видно выше, когда кортеж совместим с массивом, его можно назначить одному, но не наоборот.
Аннотация @type поддерживает список типов. Это можно использовать при объявлении переменных:

или для отмена нескольких результатов, возвращаемых выражением (например, вызов функции):

@not типа бросает Актеры типа @not устраняют типы из союза. Это полезно в различных обстоятельствах, наиболее простым из которых является устранение nil :

Как @type , также поддержает списки типов для составления нескольких возвратных значений функции, и сам может устранить профсоюзы:

Если вы просто хотите исключить типы из союза, обычно безопаснее использовать @not актерский состав, чем актер @type потому что актер @type по сути, отключает проверку всех типов для задания, где, как @not , просто исключает определенные типы.
@type аннотации в обратных заявленияхОтветные операторы теперь принимают аннотации типа, которые являются типовым способом ввода возвращаемого значения анонимных лямбда.

В отличие от актеров, это безопасные типа:

Типы псевдонимов в настоящее время лениво разрешены, что позволяет нам печатать рекурсивные структуры данных. Например, JSON:

API функций может вернуть неизвестное количество результатов. Однако, вызывая эти функции, вы склонны знать, сколько результатов вы ожидаете обратно.
Вариальное возвратное значение можно поднять в список конкретных типов по @not отбрасывая nil :

Один варидический тип также может быть поднят на другой:

Теперь мы поддерживаем дополнительные параметры как в определениях типа коротких и длинных функций, например,

Важно отметить, что необязательно не является коротким руком для nil | type .

Вы не можете предоставить nil , если не дополнительный тип параметра не включает nil как часть объединения в его определении типа. Это желательно для целей правильности при реализации функций в LUA, скажем, например, если реализация использует [ select('#', …) ] (https://www.lua.org/manual/5.3/manual.html#pdf-select). Тем не менее, помимо этого, LUA регулярно используется в качестве языка сценариев, связывая вызовы функций LUA к реализациям на других языках, которые имеют поддержку для перегрузки и т. Д., где важны число и тип аргументов.
Также были реализованы инспекции, которые предотвращают неверный дополнительный порядок параметров:
Создайте плагин с помощью:
./gradlew buildДля получения более подробной информации о платформе JetBrains SDK, пожалуйста, обратитесь к официальной документации.
Результирующий плагин .zip в конечном итоге окажется в каталоге ./build/distributions/ .
Чтобы установить .zip который вы построили, вам нужно перейти к Intellij ...
Предпочтения -> Плагины -> Настройки Cog Icon -> Установить плагин с диска ...

Выберите .zip , а затем, когда его подсказывают, перезапустите Intellij.
Луанализ: Бенджамин Добелл
Emmylua by: @tangzx 阿唐
Участники
Пожалуйста, обратитесь к GitHub для полного списка участников.
Спасибо спонсорам и сторонникам Luanalysis, которые помогают обеспечить дальнейшее развитие Luanalysis.