IntelliJ IDEA + Pascal

Обсуждаются как существующие проекты (перевод документации, информационная система и т.п.), так и создание новых.

Модератор: Модераторы

Re: IntelliJ IDEA + Pascal

Сообщение Mirage » 24.03.2015 01:01:20

С помощью одного владельца OSX таки отладили создание и настройку SDK на оном. :D
В плагине появились подсказки названий юнитов в uses, переименование юнитов и файлов (синхронно).
Еще про форматирование кода не говорил вроде.
А также поиск объявления идентификатора и связанная с этим функциональность (поиск ссылок, переименование) должно работать корректно, за исключением with и некоторых частных случаев в выражениях.
Ну и по мелочи: шаблоны при создании файлов, багфиксы и т.п.
Производительность тоже улучшилась, хотя оптимизацией пока не занимался.
Еще надо кэш Идеи подружить со своими кэшеподобными структурами данных...
А так, можно работать уже полноценно.
UPD: ссылку свежую забыл. :D
Mirage
энтузиаст
 
Сообщения: 732
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: IntelliJ IDEA + Pascal

Сообщение sign » 24.03.2015 07:18:56

В чём отличия от Ctrl-Shift-F?

В Лазаре, как правило, всего два действия - нажал комбинацию клавиш, нажал Enter. Всё. Список использований в окне.
Как оно у вас?
sign
энтузиаст
 
Сообщения: 848
Зарегистрирован: 30.08.2009 09:20:53

Re: IntelliJ IDEA + Pascal

Сообщение hinst » 24.03.2015 17:39:39

Ctrl-Shift-F это чтобы искать по тексту! Значит у тебя найдутся и использования этого идентификатора, и всех других идентификаторов с таким же именем! А идентификаторов с таким же именем может быть огромное количество! У меня может быть в 100500 тыщ процедурах переменная с таким названием, и в 100500 тыщ классов поле с таким названием, а так же метод и свойство, и глобальная переменная! а каждый паскальмодуль - это отдельное пространство имён, и у тебя может быть в 100500 тыщ модулях класс с таким названием! Конешн когда у тебя проект три файла то это не имеет особого значения и можно обойтись, но в больших коммерческих или эпических проектах это очень важно!
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: IntelliJ IDEA + Pascal

Сообщение Mirage » 25.03.2015 01:23:39

В Lazarus есть аналог - ctrl+shift+I. Почему-то сразу с переименованием идет.
В Идее find usages похожим образом работает, плюс еще есть show usages - выдает результаты в виде быстрого меню.
А просто поиск должен быть инкрементальный и с regexp'ами. В Delphi есть довольно жалкая попытка такой реализовать (без регекспов конечно), хотя казалось бы - чего сложного?
Mirage
энтузиаст
 
Сообщения: 732
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: IntelliJ IDEA + Pascal

Сообщение sign » 25.03.2015 06:56:47

Mirage писал(а):В Lazarus есть аналог - ctrl+shift+I. Почему-то сразу с переименованием идет.

Кстати, да.
А переименование можно игнорировать, если нужно просто найти все использования.
И всего два действия - комбинация клавиш и Enter.

hinst, так в чём преимущество вашего поиска использований?
sign
энтузиаст
 
Сообщения: 848
Зарегистрирован: 30.08.2009 09:20:53

Re: IntelliJ IDEA + Pascal

Сообщение hinst » 25.03.2015 14:23:05

Mirage, кажется твой плагин наконец-то работает у меня в Idea №14 на Windows, а до этого всё чёт глючило как-т

Добавлено спустя 5 минут 56 секунд:
Mirage, попробовал с твоим плагином открыть свой рабочий проект с 1000 модулями, и что-то он сразу приуныл, показывает "Can not find declaration to go to", "No suggestions"...... :( :( :(

Добавлено спустя 2 минуты 43 секунды:
А потом ещё оно зависло и CPU 100% все четыре ядра. Lazarus хотя бы показывает, что ему не нравится, если он не может распарсить код

Добавлено спустя 18 минут 32 секунды:
Mirage, а да вот нашёл показывается ошибка: где у меня unit, пишет <module> expected, got 'unit'
Перед unit у меня есть один {$INCLUDE} и один {$DEFINE}

Добавлено спустя 1 минуту 27 секунд:
причём, файл которые {$INCLUDE} лежит в другой подпапке
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: IntelliJ IDEA + Pascal

Сообщение Mirage » 26.03.2015 02:15:29

sign: Преимущество в юзабельности всех фич. В том числе и этой. По фичам Лазарь неплох, но юзабилити и мимо не ходило. Даже Дельфи кажется удобнее. Хотя это наверное в силу привычки.

hinst:
Mirage, попробовал с твоим плагином открыть свой рабочий проект с 1000 модулями, и что-то он сразу приуныл, показывает "Can not find declaration to go to", "No suggestions"......

Надо дать ему время проиндексировать все.

А зависон это плохо. Наверное долго парсит что-то.
Большие юниты есть? Количество по барабану.

Mirage, а да вот нашёл показывается ошибка: где у меня unit, пишет <module> expected, got 'unit'
Перед unit у меня есть один {$INCLUDE} и один {$DEFINE}


Это значит не смог распарсить юнит. Без инклуда парсит?
Из инклуда пока только дефайны берутся.
Будет здорово, если можешь прислать этот юнит.
Mirage
энтузиаст
 
Сообщения: 732
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: IntelliJ IDEA + Pascal

Сообщение sign » 26.03.2015 06:30:46

Mirage писал(а):Даже Дельфи кажется удобнее. Хотя это наверное в силу привычки.

Мне Лазарус удобнее Дельфей.
sign
энтузиаст
 
Сообщения: 848
Зарегистрирован: 30.08.2009 09:20:53

Re: IntelliJ IDEA + Pascal

Сообщение hinst » 26.03.2015 14:22:25

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

Mirage, не знаю есть ли смысл скидывать весь модуль если парсер показывает ошибку на первое же слово в модуле, unit. Могу скинуть модуль и include-файл в приват, тольк не кидай никуда больше, а то меня с работы уволят.

Мне кажется что проблема в том, что этот мой долбанутый проект очень специфичный:
1. В нём куча модулей
2. Среди них есть очень длинные
3. Кучи {$IFDEF} которые если игнорировать то код не распарсится
Пример:
Код: Выделить всё
begin
{$IFDEF A}
end
{$ELSE}
end
{$ENDIF}

И тому подобное...
4. В структуре есть модули с одинаковыми именами, типа client/foo.pas и server/foo.pas
5. Потому, что в структуре есть несколько .dpr проектных файлов, типа client.dpr и server.dpr. Какие модули будут использоваться, задаётся в Search Paths
5. То же самое с include-файлами, есть какой-нибудь client/defines.inc и server/defines.inc, какой файл будет использоваться тоже будет зависеть от Search Paths проекта
6. Но строго разбить на client и server нельзя потому, что модули все между собой сильно перемешаны, на самом деле папок client и server там нет, а есть какие-то хитрожопые папки, многие из которых задействуются везде, то есть есть куча общего и куча индивидуального. В общем, прост взять разбить на два отдельных проекта нельзя (на самом деле их где-то 10).

Вот не знаю как миражевский IDEA-плагин действует в таких случаях. Например, когда два модуля с одинаковыми именами, что будет делаться. Когда два include-файла с одинаковыми именами в разных папках, что будет делаться. Как-нибудь search paths можно задавать чтобы только определённые каталоги были видны или нет

Добавлено спустя 53 секунды:
Mirage можешь прокомментировать плз

Добавлено спустя 5 минут 36 секунд:
Mirage писал(а):Из инклуда пока только дефайны берутся.

Можешь сделать чтобы у тебя в месте где include-директива, чтобы просто подставлялся весь текст в то место, то есть, чтобы парсер дальше шёл прямо в include-файл не прерываясь, я так делал когда свой парсер делал, чтобы парсер не прерывался в месте где include-директива, для этого нужно чтобы состояние парсера полностью было в отдельной структуре (а не в локальных переменных, скажем), тогда из Parse(text: string) прост вызываешь рекурсивно тот же Parse(), но с другим текстом, и так как у тебя всё состояние парсера определяется полями класса, то он должен продолжить а потом так же выйти и так далее, ну я думаю ты понял
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: IntelliJ IDEA + Pascal

Сообщение Mirage » 27.03.2015 00:18:10

hinst писал(а):в Delphi проблема в том что рефакторинг и поиск использований там тупо не работает потому что там парсер валится, его так и не починили даже в последних версиях, хоть сколько нибудь сложный проект не распарсится.


Удивительно. Я думал они эти фичи на дотнете написали с нуля и они работают хотя бы.
А без рефакторинга, хотя бы переименования, грустно как-то.
Надо плагин продвигать на Delphi ресурсах. :D

hinst писал(а):Mirage, не знаю есть ли смысл скидывать весь модуль если парсер показывает ошибку на первое же слово в модуле, unit. Могу скинуть модуль и include-файл в приват, тольк не кидай никуда больше, а то меня с работы уволят.


Смысл есть. На первое слово показывает потому что не может распарсить модуль даже частично. Ваще не модуль типа.
Можешь повырезать оттуда куски кода, которые не влияют на результат. Там скорее всего в одном месте затык.
Конфиденциальность гарантирую.

hinst писал(а):Мне кажется что проблема в том, что этот мой долбанутый проект очень специфичный:
1. В нём куча модулей
2. Среди них есть очень длинные
3. Кучи {$IFDEF} которые если игнорировать то код не распарсится


Практики, конечно, не очень хорошие, особенно с инклудами, но я не Embarcadero и считаю, что любой код должен правильно парситься.:)
{$IFDEF} и т.п. не игнорируются, даже в инклудах. Они учитываются и даже код помечается как закомментированный в неактивных ветках.

hinst писал(а):Вот не знаю как миражевский IDEA-плагин действует в таких случаях. Например, когда два модуля с одинаковыми именами, что будет делаться. Когда два include-файла с одинаковыми именами в разных папках, что будет делаться. Как-нибудь search paths можно задавать чтобы только определённые каталоги были видны или нет


В рамках одно идеевского модуля дублирующихся имен быть не должно, будет просто использован первый попавшийся файл.
В данном случае надо сделать два модуля, с одним content root, но с разными папками отмеченными как source. Они попадают в search path. Удобно кстати.

hinst писал(а):Можешь сделать чтобы у тебя в месте где include-директива, чтобы просто подставлялся весь текст в то место, то есть, чтобы парсер дальше шёл прямо в include-файл не прерываясь,


Я так и собирался делать. Это само собой разумеется. Я вообще хотел сделать так, чтобы инклуды можно было разворачивать и редактировать прямо в инклудящем файле. Потом думал обойтись без редактирования.
Проблема в том, что Идея этого не поддерживает от слова никак. Парсер там работает на основе токенов, которые предоставил лексер. Лексер работает на основе текста, который содержится в т.н. документе. Если попытаться подложить лексеру что-то левое, не содержащееся в исходном файле, то все падает и это заложено архитектурно.
Максимум что удалось (с извращениями), это прогонять инклуд лексером и подкидывать полученные токены на выход лексеру инклудящего файла. Это позволит обработать случай, когда код без инклуда не парсится, но, например, названия идентификаторов так не передашь. В итоге идентификаторы, объявленные в инклуде ресолвиться не будут. А у меня есть такие, так что буду думать.
Mirage
энтузиаст
 
Сообщения: 732
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: IntelliJ IDEA + Pascal

Сообщение hinst » 27.03.2015 13:52:09

По поводу парсера, вот интересно, как тогда у них среда разработки CLion работает, которая как IDEA, только для C++, ведь в C++ есть #include который включает содержимое файла в файл.

Прицепляю к сообщению архив с бажным модулем, я тебе пароль скинул приватным сообщением на этот же форум. Если ещё какая-нибудь информация по багу требуется, спроси

Добавлено спустя 7 минут 15 секунд:
Mirage писал(а):Практики, конечно, не очень хорошие, особенно с инклудами

У нас на работе весь проект это такое большое собрание плохих практик
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: IntelliJ IDEA + Pascal

Сообщение Mirage » 29.03.2015 00:15:43

Спасибо за пример. Баг нашел. И даже поправил.
Не совсем верно был прописан синтаксис оператора with. Должен быть список выражений в качестве операнда, а был список идентификаторов (чуть посложнее, но и не выражений).

Что касается CLion, то им, как разработчикам все же проще, чем мне, хоть код (платформы, не CLion) и открыт. Но думаю и я найду способ. Навскидку можно через виртуальную файловую систему, хотя это тяжеловато выйдет. Платформа мощная, но слабо документирована.
Mirage
энтузиаст
 
Сообщения: 732
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: IntelliJ IDEA + Pascal

Сообщение hinst » 13.04.2015 15:10:41

Скачал заново архив с плагином. Удалил старый плагин, установил новый. Теперь в том модуле у меня красное всё. Справа такая полоса рядом с полосой прокрутки, на которой ставятся красные чёрточки, так вот, она у меня теперь красная вся. Не найден модуль math (а должен?).

Кроме того, вот эти модули не найдены:
  • Windows, Messages, Graphics, Controls, Forms, Dialogs, StdCtrls
Если некоторые модули не найдены, то парсер останавливается или работает? Имеет ли смысл вписать путь к этим модулям, которые не найдены?

Ниже не найдены Integer, Boolean, Word, Pointer, PChar.

Кроме того, функции и типы самого проекта, объявленные в файлах проекта, они тоже не найдены, хинт "Undeclared Identifier"

Как лечить????? плз

Добавлено спустя 2 минуты 22 секунды:
Попробовал другой модуль, в нём вроде всё нормально :shock: :shock: :shock:

Добавлено спустя 20 секунд:
А, нет, не всё, он тоже весь покраснел, прост надо было подождать

Добавлено спустя 36 секунд:
Некоторые идентификаторы всё же разрешаются и переход работает, но их мало

Добавлено спустя 1 минуту 42 секунды:
Есть подозрение, что оно может заработать, если я укажу те source-папки про которые выше сказали, но с этим надо разбираться, я раньше этого не делал

Добавлено спустя 2 часа 47 минут 51 секунду:
можно в двух словах про то как разбить проект на подпроекты с помощью этих модулей?

Добавлено спустя 49 минут 8 секунд:
IniFiles не видит, SysUtils не видит, опять ничё не видитт.......

Добавлено спустя 2 минуты 2 секунды:
миня аж трисёт :twisted:

Добавлено спустя 5 минут 3 секунды:
в ClassPath нужные .ppu есть, но не распознаются. И опять IDEA завис намертво после того как я попытался в SDK в Source добавить путь к SysUtils

Добавлено спустя 14 минут 53 секунды:
В общем, SDK опять не работает почему-то. Не работает распознавание "системных" типов и модулей вообще. Оно иногда работает, а иногда не работает, уже несколько раз в прошлом так было с этим плагином, что оно работало, а иногда не работало, но из-за чего это зависит, я так и не понял

Добавлено спустя 11 минут 56 секунд:
Ctrl+B (перейти к объявлению метода) работает, но Ctrl+Alt+B (перейти к реализации) не работает, хотя такая кнопочка слева работает

Добавлено спустя 3 минуты 30 секунд:
в SDK два пути в ClassPath на месте, но модули оттуда не видятся

Добавлено спустя 1 минуту 48 секунд:
В Project Structure я настроил все каталоги для своего проекта (пока только для одного из нескольких), все нужные каталоги сделал Source, а все лишние могущие содержать модули с такими же именами сделал Exclude

Добавлено спустя 5 минут 3 секунды:
по-моему, после Search All (два раза Shift нажать) он тупанится и больше не раступляется
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Re: IntelliJ IDEA + Pascal

Сообщение Mirage » 14.04.2015 02:05:21

Архив я не уверен, что обновлял. А если обновлял, то какой версией.
Сейчас обновил текущей версией, которая умеет (пока не до конца) ресолвить идентификаторы в выражениях вида arr[0]^.field.
Вообще, если поставить плагин из репозитория, то будет предлагать обновляться сам.

Красным все быть определенно не должно.

Если некоторые модули не найдены, то парсер останавливается или работает? Имеет ли смысл вписать путь к этим модулям, которые не найдены?


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

Определения почти всех примитивных типов берутся из модуля system. Для этого должен найти system.ppu. Видимо, не находит rtl в SDK.
Посмотреть и добавить недостающее можно в свойствах SDK (открывается File -> Project structure, далее SDKs).
Все директории (не .ppu файлы), что добавлены в classpath, участвуют в поиске, как и помеченные как source. С поддиректориями!
При поиске у .pas приоритет над .ppu, но лучше директорию project compiler output, куда складываются скомпилированные файлы, сделать excude.
Может помочь прибить SDK и добавить заново. При этом автоматом добавляются несколько директорий с rtl. На винде, по идее, должен и директории с windows.ppu добавить.

Еще есть такой пункт в меню File - invalidate Caches / Restart. Полезно, когда что-то в исходниках самого проекта упорно не хочет ресолвиться. Хотя чаще всего достаточно что-то поменять в исходнике.

можно в двух словах про то как разбить проект на подпроекты с помощью этих модулей?


Все просто: IDEA module = Delphi project. В твоем случае стоит сделать два модуля. Content root указать корневую директорию для всех исходников, но как source помечать только те директории, которые относятся к данному модулю.

в ClassPath нужные .ppu есть, но не распознаются. И опять IDEA завис намертво после того как я попытался в SDK в Source добавить путь к SysUtils


В SDK Source пока не имеет смысла добавлять. В classpath достаточно директорию, где лежат .ppu. Да и врядли он исходники rtl правильно распарсит - часто инклуды там применяются.
Все поддиректории помечать как source не нужно, они сами считаются source. Можно пометить как exclude, чтобы не считались.

Насчет зависаний - было аж две причины: дедлок и увлечение парсера ложными путями. Последнее удалось починить только ограничив поддержку nested routines одним уровнем. Впрочем, больше все равно моветон.

К Ctrl+Alt+B переход не подцеплял пока. Вообще эти переходы пока так, proof of concept.

по-моему, после Search All (два раза Shift нажать) он тупанится и больше не раступляется


Чего-то не понял, где это?
Mirage
энтузиаст
 
Сообщения: 732
Зарегистрирован: 06.05.2005 20:29:07
Откуда: Russia

Re: IntelliJ IDEA + Pascal

Сообщение hinst » 14.04.2015 15:22:51

Обновлять IDEA до 14.1 ?
Насчёт SDK, в том и прикол что у меня нужные папки в ClassPath были.
Попробую новый архив с плагином

Добавлено спустя 3 минуты 51 секунду:
что-то мне не понятно, как поставить плагин из репозитория. Ты что ли опубликовал свой плагин в официальном списке?

Добавлено спустя 2 минуты 44 секунды:
Обновил плагин, для SDK ничего не помогает, модули не распознаются
Аватара пользователя
hinst
энтузиаст
 
Сообщения: 781
Зарегистрирован: 12.04.2008 18:32:38

Пред.След.

Вернуться в Разное

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Рейтинг@Mail.ru