PhpStorm 2020.2: объединенные типы PHP 8, новый движок потока управления, пул-реквесты GitHub, OpenAPI

8tz7-j6cfu5n4dg9k6iizsdnkt8.png

Привет, Хабр! Рады представить второй мажорный релиз PhpStorm в этом году!

Под катом подробный разбор всех заметных изменений и новых возможностей. Осторожно — много картинок.

Union types в PHP 8


В PHP 8 будет так много новых фич, что в какой-то степени это даже новый язык. Мы начали выкатывать поддержку восьмерки пораньше и первой большой фичей стали объединенные типы.

Объединенные типы T1|T2|... можно использованы везде, где типы можно указывать сейчас: в аргументах, свойствах и возвращаемых значениях. В этом случае переменная может принимать один из перечисленных типов.

Фактически объединенные типы давно используются в PHPDoc, но теперь интерпретатор действительно будет проверять их в рантайме.

Переключение версии языка


Чтобы увидеть все возможности, можно вручную переключить версию языка на PHP 8 в настройках Languages & Frameworks | PHP | PHP language level.

Или если в коде уже есть использование новых фич, то тогда переключиться можно с помощью квик-фикса (Alt+Enter).

А если версия PHP указана в composer.json, то PhpStorm подтянет ее автоматически.

lglb01opkkdqazbpsvjb_1kkw2m.gif

Конвертируем PHPDoc в нативные объединенные типы


На теге PHPDoc, в котором есть объединенный тип, можно вызвать квик-фикс (Alt+Enter).

2zsu_c8mfoducomw1whzg5gypmi.gif

Удаляем лишние PHPDoc


Если PHPDoc содержал только объявления типов, то теперь его можно удалить как избыточный квик-фиксом (Alt+Enter).

_qx3xwnwpngh_cxyphpt9-5a9oa.gif

Можно ли такое удаление всегда считать безопасным и делать автоматически перед коммитом? Мы рассматриваем добавление такой возможности.


Валидация типов


PhpStorm и раньше умел анализировать типы и находить нарушения по информации из тегов PHPDoc. С нативными декларациями эти возможности расширились.

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

zderpihsawlfce63mwtyy7mxh3k.png

Это особенно полезно в сложном коде, когда нарушения не очевидны с первого взгляда.

eb2xpmx7meawjqh04a243oaav84.png

Псевдотип false


Некоторые легаси функции могут возвращать false в случае ошибки. Например, так ведут себя strpos(), array_search() и еще 310 других стандартных функций.

В этом случае можно было бы указать возвращаемый тип как объединенный, например int|bool, но по факту true там никогда не будет.

Для таких случаев и введен псевдотип false. Его можно использовать только в объединениях. Иначе PhpStorm подсветит невалидный код.

nwqqvcmp95zoqvwqaipfzthnz9e.png

Дублирующиеся и избыточные типы


Многие комбинации в объединениях типов запрещены или просто лишние. Например:

  • bool|false — потому что false входит в bool;
  • Foo|Foo или int|string|INT— повторения;
  • object|User — object заведомо содержит все остальное;
  • iterable|array или iterable|Traversable — iterable включает array и Traversable;
  • void — может использоваться только в возвращаемом значении и только сам по себе;
  • false или null — только как часть объединения.

PhpStorm подсветит все такие нарушения.

k_nbmftevqnwu5wapidljqdm7ps.png

Nullable типы


Прежний синтаксис ?Type теперь рассматривается как сокращение для Type|null.

Но сокращенный вариант с ? нельзя использовать в объединениях, потому что возникает неразрешимая двусмысленность.

Для таких случаев в PhpStorm есть квик-фикс (Alt+Enter).

-eg1z8mulywg8rhvz5nxtc1uwhe.gif

Изменение типов при наследовании


Для методов действуют два правила:

Тип параметра контравариантен, то есть его можно расширять.

akudhxicm-zovtjqhfxropwotai.png

Возвращаемый тип ковариантен, то есть можно только сужать.

l0dvwuntw9bvx6vvqhsgdpwcra4.png

При этом порядок типов не имеет значения, и Type1|Type2 эквивалентно Type2|Type1.

Тип свойств изменять нельзя
Тип унаследованного свойства должен сводиться к родительскому, например:

dhvlwfo1wpqsazxkulkr114xaio.png

Новый движок потока управления


Обновление движка потока управления позволило добавить новые инспекции и исправить многие старые баги. Как следствие, PhpStorm понимает код еще лучше.

Кое-где можно будет заметить подсветку и предупреждения из новых инспекций. Некоторые из них могут потребовать вашего внимания как потенциальные источники багов. А исправление других просто сделает код чище.

Вот несколько примеров инспекций.

Переменная всегда true или false
Пример в файле Parser.php из doctrine/orm.

qhik3oic0inelp9cic3ulpbooh8.png

Условие всегда true
Пример в файле FormValidator.php из symfony/form.

tjsmizulowurs6l74j5cw2no-ro.png

Результат instanceof всегда true
Пример в файле Logger.php from symfony/monolog-bridge.

-qqabbewt3zzacagtbhb4uqaafo.png

$this всегда будет иметь тип ResetInterface, потому что тот находится выше по иерархии.

ipfc9wevquvje7vmdh6akdbgana.png

Выражение всегда null
Пример в файле ProcessUtils.php from symfony/process.

4mfy7gmlxtcghfrl7pobfwaxvv0.png

Новое действие: Type Info (⌃⇧P / Ctrl+Shift+P)
Можно навести каретку на любое выражение и вызвать это действие, чтобы посмотреть, какой тип PhpStorm вывел для выражения. Доступно из меню View | Type Info или по горячей клавише ⌃⇧P / Ctrl+Shift+P.

o__-tutgug1eirh6pbzcvjebzsw.gif

Улучшения для Composer


C версии 2020.1 все действия с зависимостями Composer можно производить непосредственно в PhpStorm в файле composer.json. В этом релизе есть несколько улучшений.

Поддержка кастомных репозиториев Satis/Packagist
Если указать кастомный источник в секции «repositories», то для всех пакетов из него будет доступно автодополнение кода. Информация о пакетах и версиях будет кешироваться в PhpStorm.

-ss9g2fwreodhunar7rhtqk0yla.gif

Дополнение, когда указано несколько версий
Если версии перечислены через запятую или пайп (||), то PhpStorm теперь корректно отработает и покажет доступные варианты.

h5geikqecmcib8d35njfbpltpe4.gif

Ссылка на код и сайт
У каждого пакета в попапе с информацией есть ссылки на сайты.

p-9is35syogcjprktdiy3sevv-g.png

Настройки инструментов качества кода
Если в списке зависимостей есть инструменты качества кода, которые поддерживаются в PhpStorm, то напротив них будет иконка гаечным ключом для перехода к настройкам.

c7phvi03av__ig0xgrzafgxai2q.png

Улучшения для инструментов качества кода


Кстати, об инструментах качества. В PhpStorm 2020.2 есть несколько полезных дополнений.

Поддержка Docker Compose
PHP_CodeSniffer, PHP CS Fixer и PHP Mess Detector можно запускать через docker compose.

xayitvogfiufeuipke5o3vq7cuo.gif

Списки исключения для PHP_CodeSniffer
Если в кастомном ruleset.xml есть секция "exclude-pattern", то теперь она будет учтена и файлы по указанным путям не будут анализироваться в IDE.

Форматирование через удаленный интерпретатор
PHP CS Fixer и PHPCBF можно запускать с интерпретатором через SSH, Docket, Docker Compose, Vagrant и прочие.

Инструменты командной строки


Все команды Symfony, Laravel Artisan, Drupal Drush, WP-CLI и скрипты Composer можно очень быстро запускать в PhpStorm, не открывая терминала.

Для этого нужно добавить соответствующий инструмент в настройках Tools | Command Line Tool Support.

Затем по нажатию Ctrl-Ctrl появится строка Run anything, в которой и доступны все команды с автодополнением.

Начиная с этого релиза для Symfony, Laravel и Drush даже ничего настраивать не надо. Достаточно открыть проект, нажать Ctrl-Ctrl и начать вводить команду.

ehmwl0t0pyr1j8_lmsknhhrtd74.gif

️ Для Laravel на macOS файл artisan должен быть исполняемым (chmod +x artisan).

Кроме того, инструменты теперь можно запускать через любые удаленные интерпретаторы (SSH, Docker, Docker Compose, Vagrant). Например, можно быстро протестировать приложение на PHP 8, добавив Docker-интерпретатор из образа php:rc-cli.

Новый рефакторинг: извлечение класса


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

Тут может помочь выделение пачки связанных методов и свойств в новый класс. Именно это и предлагает новый рефакторинг Extract Class.

Чтобы попробовать, внутри класса надо нажать Ctrl+T и выбрать Extract Class. PhpStorm предложит ввести имя нового класса, и тут же можно выбрать еще методы и классы для извлечения.

qnpt3rbf1wpxmztdwmrwjwx4eko.gif

Этот рефакторинг работает и для обычных функций.

И еще для PHP


Новая инспекция: Typed property might be unassigned


Если типизированное свойство объявлено, но не инициализировано, то при попытке его читать будет ошибка TypeError (если не определен магический __get()). PhpStorm подсветит чтение из неинициализированных свойств.

13-xuopg4os-0hg58msfqdduwsc.png

Новая инспекция: Array used only with write access


Пример из файла SchemaTool.php from doctrine/orm.

b2wtq5qcckl5xs3qeay6itvhtfk.png

Массив $pkColumns в методе gatherColumns() обновляется, но никогда не читается.

Кастомизация генерируемых геттеров и сеттеров


Теперь можно настроить именование методов, выбрав между camelCase() и snake_case().

А также настроить порядок, в котором они будут добавлены в класс.

Обе опции доступны в настройках Editor | Code Style | PHP на вкладке Code Generation.

byaumujhtqsdsjnb14guj88lfb0.png

Правильный резолв для множества проектов в одном окне


Если в одном окне открыть несколько проектов, то часто можно было видеть ошибки о том, что класс определен несколько раз. А при попытке перейти к определению класса нужно было еще выбрать к какому именно.

В PhpStorm 2020.2 этих ошибок нет, а переход работает как ожидается.

-c0isvjtdgrg8rewi7nhv9suzmw.gif

Более низкий приоритет для классов из vendor


В списке автодополнения приоритет будет отдавать классам непосредственно из проекта, и с более низким будут идти сущности из папки vendor и файлов PHAR.

Добавить курсор на все выделенные строки


Новое действие Add Caret Per Selected Line добавляет курсор в конце каждой выделенной строки и снимает выделение. Можно вызвать с помощью клавиш ⌥⇧G / Alt+Shift+G.

m82ab4-wa8wcqws9n7_sebwsov4.gif

Полная поддержка пул-реквестов GitHub


Базовая поддержка пул-реквестов появилась в PhpStorm 2018.3. C тех пор были обновления, но для многих действий все еще необходимо было переключаться в браузер.

В PhpStorm 2020.2 всю работу с пул-реквестами можно делать прямо в IDE!

eiflbtsl0jrfp5uiel1bzvdbm5e.gif

Перейти к пул-реквестам можно из меню VCS | Git | View Pull Requests, из тулбара или нажатием Alt+7. Первым будет виден список доступных реквестов с возможностью поиска и фильтрации.

По клику на пул-реквесте откроется подробная информация о нем: ревьюверы, теги, измененные файлы, таймлайн.

Весь флоу по ревью можно проделать тут же. Стартовать и запрашивать ревью, комментировать изменения на уровне строк или всего коммита, сабмитить ревью, мержить.

Результаты проверок, в том числе из CI, будут отображаться под таймлайном.

Раньше, чтобы смержить пул-реквест, нужно было создать локальную ветку. Теперь это не требуется и мержить можно по нажатию кнопки.

Поддержка OpenAPI


Плагин OpenAPI Specifications доступен для всех IDE от JetBrains и работает начиная с версии 2020.2. В файлах спецификаций Open API (openapi.yaml/openapi.json и swagger.yaml/swagger.json) он предоставляет подсветку, дополнение, валидацию и навигацию.

Кроме того, доступны следующие возможности:

  • Интеграция со Swagger UI — рендерится непосредственно в окне IDE.
  • Генерация кода.
  • Структурный diff для спек OpenAPI — позволяет быстро обнаружить значительные изменения.
  • Гаттер-иконки для быстрого создания запросов в HTTP-клиенте.
  • Дополнение ендпоинтов в HTTP-клиенте.
  • Rename-рефакторинг — если переименовать эндпойнт в спеке, то он автоматически переименуется и в запросе HTTP-клиента.

mgqx-w6chy9gujv5eac4o5esroo.gif

Новый виджет инспекций


В правом верхнем углу редактора теперь отображается виджет с числом проблем в текущем файле.

При помощи стрелок можно быстро перепрыгивать к следующей/предыдущей проблеме (раньше это можно было делать клавишами F2 / Shift+F2).

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

А по клику на виджете откроется новое окно Problems со списком всех обнаруженных проблем в файле.

iuesxr-k47wa03ntf5kofuq5w6s.gif

Контроль версий


Git из WSL 2


PhpStorm теперь умеет использовать бинарник Git из WSL. Более того, IDE сама определяет, установлен ли WSL и доступен ли Git в нем.

Настройки доступны в Preferences | Version Control | Git.

️ Git будет работать только с WSL2, потому что Git из WSL1 работает нестабильно и может приводить к неправильным результатам выполнения команд Git.

Улучшенный UI для сравнения веток


PhpStorm позволяет сравнить любые ветки и посмотреть, какие коммиты вошли в ту или другую. Для этого нужно выбрать любую ветку из доступных в попапе VCS | Branches и в контекстном меню выбрать Compare with Current.

В PhpStorm 2020.2 логи и разница коммитов отобразятся непосредственно в редакторе. Благодаря этому на экране помещается больше информации.

2czix6guvgoihzrrhqkbklcytls.png

Обновленные диалоги команд


Диалоги для команд Git Merge, Pull и Rebase были переделаны и унифицированы. Добавлены недостающие опции, и теперь можно видеть полную команду Git, которая будет выполнена.

Все команды доступны в меню VCS | Git.

_dopllvwwnl93mnnnflg1yiyvr8.png

Новое действие: удалить коммит


Лишний или временный локальный коммит теперь можно удалить прямо из лога в PhpStorm. Для этого в контекстном меню на коммите надо выбрать Drop Commit.

nwpcn6qsbqa8l1g8qnb72wwo0em.gif

Новое действие: объединить коммиты в один (squash)


Также можно объединить несколько коммитов в один. Например, это может быть удобно, чтобы очистить историю перед созданием пул-реквеста или перед пушем изменений.

В логе выделяем несколько коммитов и выбираем Squash Commits… из контекстного меню.

enevgmc-gc24ojjnukawz6l0ei8.gif

Для обоих действий за кадром выполняется git rebase.

Инструменты БД


PhpStorm «из коробки» включает в себя почти все возможности DataGrip, которые охвачены в обзоре релиза DataGrip 2020.2 от наших коллег.

Веб


И, как всегда, все обновления из WebStorm 2020.2 тоже входят в PhpStorm. Например, с помощью плагина, Prettier можно использовать в качестве дефолтного форматтера в том числе и для PHP-файлов.

Скачать PhpStorm 2020.2 можно на странице «What«s new».

А вот видеоролик (на английском) с демонстрацией главных фич релиза:

На этом всё на этот раз. Спасибо, что дочитали до конца! Будем рады вопросам, пожеланиям, баг-репортам и просто мыслям в комментариях.

Ваша команда JetBrains PhpStorm

© Habrahabr.ru