AppCode 2016.2: нові рефакторинги та інспекції, live templates, поліпшення автодоповнення коду, і все це — про Swift

Привіт, Хабр!

Нещодавно вийшов AppCode 2016.2, новий реліз нашої IDE для розробки під iOS/OSX. Під катом багато гифок і роздумів про автоматизованих рефакторингах в Objective-C і Swift.



Swift
Introduce Variable
Introduce Variable (він же Extract Variable) — це локальний рефакторинг, який дозволяє автоматично вилучити частину складного вираження в локальну змінну. Звичайно, це можна зробити і вручну. Надрукувати назву змінної, проставити її тип, присвоїти їй потрібний вираз, вручну поправити всі в коді, проконтролювати, що не забув виправити кожне входження… Хороша звичка, і з власного досвіду пам'ятаю, при розробці під iOS вона виробляється досить швидко.

Правда в тому, що ця рутинна робота, а рутинні завдання завжди краще автоматизувати. Для Objective-C цей рефакторинг був реалізований в AppCode досить давно. До речі, цікавим ефектом його частого використання стає небажання самому писати назви змінних і взагалі починати рядок коду з звичного «тип змінної — назва змінної».

Адже можна спочатку написати вираз — а потім автоматично виділити його в змінну, вибравши підказку для її назви або надрукувавши своє:



Для реалізації Introduce Variable для Swift довелося навчитися обробляти величезну кількість конструкцій мови — адже для вилучення змінної нам необхідно знати її тип, і це всього лише одна з умов.

За замовчуванням завжди витягується константа, а змінити let var можна у спливаючому вікні:



Ну і щоб стало ще простіше — опціонально можна автоматично підставити тип змінної:



До речі, і руками замінити всі входження в коді не потрібно — AppCode це зробить сам:



Помилки та попередження у вікні редактора коду
Коли пишеш код, всі помилки та попередження хочеться бачити відразу ж. І в жодному разі не після компіляції. У цій версії ми вирішили інтегрувати SourceKit для відображення помилок і попереджень у редакторі:



А також дати можливість нашим користувачам використовувати ті ж самі швидкі виправлення, які видає Xcode:



Фактично, в AppCode SourceKit використовується як зовнішній лінтер для коду, а ми тим часом продовжуємо працювати над новими можливостями кодогенерации, що використовують платформу IntelliJ.

Перевірка правопису
Здавалося б, помилки у вихідному коді або коментарях не так важливі — адже на працездатність бібліотеки або програми вони не мають абсолютно ніякого впливу. Але що якщо проект стає публічним і всі ці помилки потрапляють автоматично згенеровану на основі вихідного коду документацію? У цьому разі виникає необхідність уникати їх, а перевіряти вручну великий обсяг коду — невдячне заняття.

Тепер AppCode шукає помилки як у коментарях до коду на Swift, так і в самому вихідному коді — назвах змінних, класів і навіть їх частинах, допомагаючи швидко внести виправлення:



В Objective-C, як і в C++, така можливість теж є. Більш того, це один з механізмів платформи IntelliJ, адаптований під конкретний мова програмування. Докладніше про те, як в AppCode влаштована робота з інспекціями коду, можна прочитати тут.

Live Templates
Live Templates — це наші шаблони вихідного коду. Суть — дати можливість швидко вставити фрагмент вихідного коду по абревіатурі, аналог фрагментів в XCode. У чому відмінність? Наприклад, з допомогою Live Templates можна зробити ось так:



До речі, для Objective-C аналогом є вбудований шаблон з абревіатурою each:



У чому магія? У тому, що поля введення значень AppCode можна сприптовать. Наприклад, скопіювати значення введеного значення з одного поля в інше. Або — як у шаблоні for — зробити так, щоб поле вводу шукало у своїй околиці масиви, за якими можна проитерировать. Можливості не безмежні, але вони є — а детальніше про них можна прочитати ось тут.

Друга базова відмінність — можливість обернути виділений фрагмент вихідного коду в будь-який вираз (Surround With templates):



У AppCode 2016.2 ми додали підтримку всіх цих механізмів для Swift і зробили базовий набір шаблонів, аналогічний сниппетам в Xcode.

Поля введення значень при автодополнении
У коді на Objective-C і Swift є назви параметрів — така специфіка мови. Вручну вставляти їх незручно, тому ще одна базова можливість, додана в цей реліз — це автоматична вставка назв параметрів і полів для введення значень при автодополнении функцій і методів в Swift:



Objective-C
Complete Statement
Серед типів автодоповнення коду в продуктах JetBrains є можливість швидко завершити конкретну конструкцію у коді: вставити крапку з комою (навіть якщо курсор стоїть аж ніяк не в кінці виразу), круглі або фігурні дужки і відразу ж перейти до набору наступного виразу. У цій версії ми грунтовно доопрацювали цей тип автодоповнення, і тепер він працює ось так:



Документація
Нас дуже давно просили зробити генерацію документаційних коментарів для методів і функцій в Objective-C, і більшість запитів обмежувалося проханням дати функціональність, аналогічну VVDocumenter. І якщо б у нашому розумінні «правильно зроблена підтримка документації для Objective-C AppCode» обмежувалася б дію «вставити шаблон коментаря з предзаполненным параметрами», то ми б давно це зробили — ось так:



До речі, автодоповнення назв параметрів і документаційних тегів теж працює:



Але цього мало. Документацію необхідно оновлювати, і кожен, хто хоч одного разу документував свій проект цілком, знає, що змусити себе оновити одного разу написаний коментар значно складніше, ніж написати його в перший раз. Тому ми реалізували обробку коментарів в коді так, щоб Rename для назв параметрів (як нам здається, найбільш частий випадок змін) працював коректно:



Додатковий бонус — сильно покращилася відображення таких коментарів у вікні Quick Documentation.

Рефакторинг Rename в змішаному коді
Swift — новий, активно розвивається мова. Але ще довгий час він буде існувати пліч-о-пліч з Objective-C, і розробники будуть використовувати їх разом. Тому ми говоримо «рефакторинги в Swift», а в реальності у більшості випадків маємо на увазі «рефаторинги в змішаному коді». У AppCode вже досить давно є Rename і для Swift, і для сутностей Objective-C, використовуваних з Swift. У цій версії ми працювали над Rename для методів класів Swift, використовуваних з Objective-C.

Коли метод класу в Swift не містить ніяких додаткових атрибутів, перейменувати його просто, т. к. назва в Objective-C збігається з назвою методу в Swift:



Все стає набагато цікавіше, якщо у методу є псевдонім, зроблений за допомогою анотації @objc. У цьому разі при виклику Rename з Objective-C AppCode визначить ім'я функції Swift і міняти буде саме його:



Інший цікавий випадок — наявність зовнішнього назви параметра функції Swift. Наприклад, для функції
function(extParam param:String)
відповідає метод в Objective-C буде називатися
functionWithExtParam
. І такий випадок ми теж обробляємо коректно:



Поки ці можливості реалізовані тільки для методів і класів, в майбутньому плануємо зробити те ж саме для полів класів.

Форматування коду
Про настройки форматування коду в AppCode можна написати окрему статтю, але ми просто коротко зазначимо, що для Objective-C/C/C++ додані два нових зумовлених стилю форматування LLVM і LLDB.

Демо
Невелике демо (англійською) з демонстрацією нових можливостей:


Всі платформні зміни відмінно описані в пості anastasiak2512, в ньому ж можна прочитати про нові можливості генерації коду для C++ (Generate operators та Generate definitions). Традиційно всі вони доступні в AppCode.

На цьому все. Читайте про інших можливостях продукту у нас на сайті, слідкуйте за оновленнями на нашому англомовному блозі, і задавайте будь-які питання в коментарях до цього посту.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.