NeoPawn Helper
Расширение Visual Studio Code для NeoPawn Compiler и классического Pawn. Оно индексирует проект без отдельного языкового сервера, понимает новый ООП-синтаксис и продолжает работать с обычными .pwn, .inc и .module.
Преимущества
- Полная подсветка
class, extends, abstract, final, virtual, override, owned, модификаторов доступа, свойств и полей только для чтения.
- Переход к объявлению класса, базового класса, конструктора нужной арности, поля, свойства, метода и унаследованного члена.
- Переход из
base(...) к конструктору родителя.
- Поддержка
this.member, обращения к членам без this. внутри методов, object.Member(), Class.Member, Class.Is(...), Class.Cast(...).
- Свойства с аксессорами
property int Value get GetValue set SetValue;: подсветка и переход к методам get/set.
- Встроенные итераторы:
Iterator:Name<N>, Iterator:Name[M]<N>, foreach (new v : It), подсказки и описание всех Iter_*, ITER_NONE, #pragma neo_iterators.
- Хуки
hook, hook public, hook native, continue() и va_args<N>.
- Outline файла (классы с членами, функции, enum,
#define, итераторы) и поиск символов по всему проекту (Ctrl+T).
- Hover и подсказки параметров (
Ctrl+Shift+Space) для функций проекта, методов, конструкторов и встроенных Iter_*; hover показывает значение константы и цвет.
- Автодополнение функций, констант, классов, ключевых слов и сниппеты
foreach, class, hook.
- Диагностика конструкций, которые отвергает компилятор NeoPawn:
#define this. THIS__, hook before (355), хук на метод (356), new Class(...); (361), new Class name; (362), метод вне класса (363), property … { get } (334), множественное наследование и readonly-метод (300), поле через new, метод без тела и int[3] Method() (359), устаревший neo_iterators.inc.
- Подсказки членов после точки и классов после
new с учётом наследования.
- Hover с сигнатурой члена и указанием класса, от которого он унаследован.
- Индекс функций, глобальных переменных,
#define, enum, диалогов, global/foreign и пространств имён Namespace::Function.
- Переходы по
#include и ссылки между MySQL-запросами и callback-функциями.
- Подсветка цветов, SQL и спецификаторов
mysql_format.
- Диагностика количества аргументов
mysql_format.
- Встроенные значения простых
#define, const и элементов enum.
- Совместная работа NeoPawn и старого Pawn в одном проекте.
Поддерживаемый ООП-синтаксис
abstract class Entity[128] {
protected int id;
public property float Angle;
public readonly int Model;
public static int Count;
Entity(int id, int model)
{
this.id = id;
this.Model = model;
Entity.Count++;
}
abstract int GetValue();
~Entity()
{
}
}
final class Player extends Entity {
Player(int id, int model)
{
base(id, model);
}
override int GetValue()
{
return this.id;
}
}
stock System_Use()
{
owned Player player = new Player(10, 411);
Entity entity = Entity:player;
if (Player.Is(entity))
{
Player checked = Player.Cast(entity);
checked.GetValue();
}
}
Поддерживаются оба варианта наследования: class Player extends Entity и class Player : Entity. Перегруженные конструкторы, деструкторы, статические члены, public/protected/private, property, readonly, virtual/override, абстрактные и финальные классы индексируются как самостоятельные символы.
Итераторы, хуки и свойства с аксессорами:
new Iterator:Player<MAX_PLAYERS>;
class Counter[16] {
public property int Value get GetValue set SetValue;
int GetValue() { return 1; }
void SetValue(int value) { }
}
hook public OnPlayerConnect(playerid)
{
Iter_Add(Player, playerid);
foreach (new id : Player) {
printf("%d", id);
}
return continue();
}
Старый псевдо-ООП #define this. THIS__(Type) компилятор NeoPawn больше не принимает: расширение помечает такие места ошибкой, но переходы по ним в классическом Pawn продолжают работать. Для чисто классического Pawn-проекта диагностику NeoPawn можно отключить параметром neoPawnHelper.diagnostics.enabled.
Скорость
- Файл разбирается за один проход; результат разбора открытого документа кэшируется по версии и используется подсветкой, подсказками, переходами и диагностикой.
- Изменение файла обновляет индекс инкрементально — пересобираются только записи этого файла, а не весь проект.
- Файлы проекта читаются параллельно; изменения на диске подхватываются файловым наблюдателем без полной переиндексации.
Команды
Откройте палитру команд через Ctrl+Shift+P:
NeoPawn Helper: переиндексировать проект — полностью перестроить индекс;
NeoPawn Helper: создать enum из CREATE TABLE — преобразовать выделенный SQL CREATE TABLE в Pawn enum.
Настройки
| Параметр |
Назначение |
По умолчанию |
neoPawnHelper.colors.enabled |
Подсветка цветовых литералов и именованных цветов |
true |
neoPawnHelper.colors.variables.enabled |
Отдельная подсветка обращений к именованным цветам |
true |
neoPawnHelper.constants.valueHints.enabled |
Встроенные значения числовых констант |
true |
neoPawnHelper.definitions.enabled |
Переходы к определениям и поиск ссылок |
true |
neoPawnHelper.sql.highlighting.enabled |
Подсветка SQL внутри строк |
true |
neoPawnHelper.sql.diagnostics.enabled |
Проверка аргументов mysql_format |
true |
neoPawnHelper.diagnostics.enabled |
Диагностика конструкций, которые отвергает компилятор NeoPawn |
true |
neoPawnHelper.completion.enabled |
Автодополнение символов проекта и встроенных Iter_* |
true |
neoPawnHelper.index.include |
Glob-шаблоны индексируемых файлов |
**/*.{pwn,inc,module} |
neoPawnHelper.index.exclude |
Glob-шаблоны исключений |
служебные каталоги |
neoPawnHelper.index.maxFiles |
Максимальное число файлов в индексе |
20000 |
neoPawnHelper.index.debounceMs |
Задержка полной переиндексации |
1200 мс |
neoPawnHelper.index.documentDebounceMs |
Задержка обновления открытого файла |
250 мс |
Пример settings.json:
{
"neoPawnHelper.index.include": [
"gamemodes/**/*.{pwn,inc,module}",
"API/**/*.{pwn,inc,module}"
],
"neoPawnHelper.index.exclude": [
"**/.git/**",
"**/build/**"
],
"neoPawnHelper.sql.diagnostics.enabled": true
}
Установка VSIX
- Откройте раздел расширений VS Code.
- Выберите меню
… → Установить из VSIX….
- Укажите
neopawn-helper-1.1.0.vsix.
- Перезагрузите окно редактора.
Разработка
npm test
npm run check
npm run package
npm test проверяет разбор классов, наследования, модификаторов, конструкторов, деструкторов, owned, свойств с аксессорами, итераторов, foreach, инкрементальный индекс, диагностику NeoPawn и совместимый Pawn-синтаксис.
node test/workspace-index.test.js <каталог> индексирует реальный проект и выводит число файлов, символов и классов.
| |