Навігація по коду в IDE від JetBrains з використанням REST API і командного рядка

image
При розробці додатків часто доводиться стикатися з необхідністю перегляду виведення exception stack trace (в логах або при debug-інге). Хотілося б мати можливість автоматично потрапляти в потрібне місце коду, прямо кліком по рядку у висновку stack trace в браузері або в терміналі.
Якщо ви є користувачем одного з останніх продуктів компанії JetBrains (зокрема PhpStorm), ви можете використовувати для цих цілей внутрішнє REST API (для навігації з браузера) і command line launcher (для навігації в терміналі).
Навігацію в браузері
Часткове опис методів REST API IDE від JetBrains можна подивитися тут:
» http://develar.org/idea-rest-api/
Одним з методів цього API є можливість відкрити файл проекту і переміститися на довільну позицію в цьому файлі всередині самої IDE.
Звернення до викликів методів API здійснюється через виклик за адресою
http://localhost:63342/

Приклад виклику API для відкриття файлу виглядає як:
http://localhost:63342/api/file?file=src/path/to/file.php&line=100&column=34

де:
file — відносний або абсолютний шлях до файлу
line — рядок у файлі, куди потрібно перемістити курсор
column — позиція на вказаному рядку
alert
Для того, щоб вилучити повідомлення, яке щоразу з'являється при виклику API в IDE, можна в налаштуваннях:
Build, Execution, Deployment → Debugger
поставити галочку "Allow unsigned request" (або кожен раз доведеться в діалозі натиснути на кнопку Ok).
Settings
Приклад обробки стандартного виводу getTraceAsString() в php
Нижче показаний Regexp, обробний стандартний висновок stack trace у Exception через getTraceAsString()
try {
// some code
}(\Exception $e){
$traceAsString = preg_replace('/#(\d+) (.+?\.php)\((\d+)\):/', '#$1 <a href="#" onclick="_goToEditorCodeLine(\'$2\', \'$3\'); return false;">$2($3):</a>', $e->getTraceAsString() );
// some code
}

Кожен рядок Exception стає посиланням, натискання на яку відкриває в IDE файл на потрібному рядку.
Також необхідно підключити JS функцію, яка буде безпосередньо "смикати" метод API.
function _goToEditorCodeLine(file, line){ 
var xmlhttp = new XMLHttpRequest(); 
xmlhttp.open("GET", "http://localhost:63342/api/file?file=" + file + "&line=" + line, true);
xmlhttp.send(); 
}

Приклад реалізації на прикладі обробки Exception в Symfony 3
Оскільки в даний момент я працюю з Symfony, я на конкретному прикладі покажу як модифікувати сторінку зі стандартним Exception щоб реалізувати відкриття в IDE файлу.
Для того, щоб перевизначити шматочок шаблону, який відповідає за висновок сторінки Exception необхідно в папці
app/Resources/TwigBundle/views/Exception/
створити два файли
  • exception.html.twig
  • trace.html.twig
У файлі exception.html.twig додати найпростішу функцію
_goToEditorCodeLine()
, код якої описано вище.
У файлі trace.html.twig знайдемо місце виводу рядка і додамо в кінець стрілку, натискання на яку буде здійснювати відкриття файлу в IDE.
in {{ trace.file|format_file(trace.line) }} <a href="#" onclick="_goToEditorCodeLine('{{ trace.file }}', '{{ trace.line }}'); return false;">&rarr;</a>&nbsp;

Після цього в рядку stack trace з'являється стрілка, натискання на яку відкриває в IDE файл і переміщує курсор на потрібну позицію.
Symfony Exception
Підсумковий варіант двох файлів для Symfony 3 можна подивитися тут.
Інтеграція з командним рядком у iTerm2
Якщо ви працюєте в MacOS і використовуєте iTerm2, можна провести інтеграцію iTerm2 і Command Line Launcher відповідної IDE, що дозволить відкривати файли в IDE прямо з терміналу.
Для установки launcher-а необхідно в IDE викликати меню
Tool → Create Command-line Launcher...
та в діалоговому вікні підтвердити шлях, куди launcher встановлено. У моєму випадку це
/usr/local/bin/phpstorm
або
/usr/local/bin/pstorm
для більш ранніх версій) для IntelliJ IDEA це
/usr/local/bin/idea
.
Даний launcher дозволяє, при виклику з командного рядка, відкривати файл і переходити на потрібну рядок у ньому.
Приклад виклику:
/usr/local/bin/phpstorm --line 40 /path/to/file

або
/usr/local/bin/phpstorm /path/to/file:40

В обох випадках буде відкритий файл
/path/to/file
на 40 рядку.
Тепер зробимо інтеграцію command line launcher і iTerm2. Йдемо в Edit Session → Advanced.
iTerm
В секції
Semantic History
, з випадаючого списку вибираємо
run command...
і вводимо:
/usr/local/bin/phpstorm --line \2 \1

Тепер якщо натиснути Cmd і навести стрілку курсору на будь-який файл в терміналі — він стане посиланням і клік по ньому здійснить його відкриття в IDE.
Якщо у вас логи мають вигляд
/path/to/file/:40
, тобто номер рядка, зазначений через двокрапку після файлу — тоді IDE буде відкривати файл прямо на цій рядку.
Проблема c логами php-exception в тому, що висновок має вигляд
/path/to/file/(40)
, тобто рядок у файлі стоїть в дужках. В результаті цього файл відкривається, але на потрібний рядок не переходить.
Для вирішення цієї проблеми можна перетворити висновок лода в потрібний нам формат, використовуючи потоковий редактор sed.
sed -E 's/#([0-9]+) (.+\.php)\(([0-9]+)\):/#\1 \2:\3/g'

Приклад обробки висновку функції tail
tail test.log | sed -E 's/#([0-9]+) (.+\.php)\(([0-9]+)\):/#\1 \2:\3/g'

У висновку ще раз хотів би підкреслити, що дана схема працює практично з будь-якою мовою і будь IDE від JetBrains.
Джерело: Хабрахабр

0 коментарів

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