Pull to refresh

Comments 23

Зачем все эти фичи, если среда зависает намертво и ресурсы жрет хуже хрома!
Серьёзно… Просто попытался воспроизвести первую гифку — и аппкод зависает намертво.

а так задумка, конечно же, хорошая…
Серьёзно… Просто попытался воспроизвести первую гифку — и аппкод зависает намертво.

Давайте понимать, почему так случилось. Виснет — значит «фриз» или прогресс какой-нибудь крутится долго? Подсветка файла прошла? Сколько памяти у IDE, не забита ли (Preferences | Appearance & Behavior | Appearance | внизу в Window Options — Show Memory Indicator → OK)? Если там все 2GB забиты, надо дать больше через правку Xmx в Help | Edit Custom VM Options.
Вот, к сожалению, жаль, что у такого хорошего инструмента нет автоматического отслеживания подобных вещей. Всё работает, подсветка есть, индекс собран, по файлам прыгает. Но в какой-то момент при попытке перейти на определение по cmd+b — фриз полностью главного потока. И висит оно так минут 10.

Спасибо за пути возможного решения.
Инструмент-то есть, просто всегда хочется попробовать более простой вариант перед сбором всех логов. В общем, нужно содержимое директории, открывающейся по Help | Show Log in Finder целиком — включая все поддиректории. Там должны быть дампы после фризов, попробуем разобраться. Лучше всего их — сразу в трекер.
822 мегабайта из 2гигов занято — полный фриз во время сохранения символов.
На том же компьютере андроид студия на такой же яве при схожем обновлении индекса прекрасно шуршит в бэкграунде, позволяя что-то делать с интерфейсом.
Спасибо, пользуюсь 2019.1, но мне кажется 2018 версия была шустрее. После следующих изменений стало, вроде, лучше:
1. Добавил некоторые JVM флаги ( stackoverflow.com/questions/5651538/speedup-intellij-idea). После настроек сделал max 2Gb и min 1Gb и это оказалось лучше чем я когда выставлял max 7Gb, все равно AppCode всегда показывает использование памяти ок 800Мб.
2. Комплишен оооочень медленный, в итоге убрал галочки на smart и base completion, мне важно чтобы комплит появлялся, то что он мне помогал бы не совсем важно, иначе с этими галочками приходится по 5 — 10 секунд ждать первые подсказки, а без них всего пару секунд. Еще есть хак, если нужно вызвать метод или переменную из локального скоупа (class/struct/etc) то нужно всегда писать self. тогда видимо отсекаются глобальные области поиска и комплит почти сразу работает. Для глобальных функций/переменных как долго работал так и работает, проще дописать руками или открыть Xcode и там написать и потом обратно переключиться.

Буквально на днях заметил странную штуку, сборка в AppCode намного дольше чем на Xcode. Тесты проводились следующим образом.
Xcode:
1. Закрыл Xcode
2. Почистил DerivedData (Library/.../Xcode/DerivedData)
3. Открыл Xcode и сразу нажал запустить проект на симуляторе (то есть полная сборка + запуск)
Время на всё ушло 3:50-4:00 минуты в Xcode

AppCode, тоже самое, только чистил его DerivedData (../Caches/../AppCode 2019/../DerivedData/) и AppCode мне выдавал больше 5 минут (нажимал на жука чтобы включить отладку я так понимаю).

Еще мне очень сильно не нравится в 2019 после 2018 версии, что довольно часто после изменения кода (например изменить имя приватной функции, добавить дополнительный параметр в функцию) всё перестает работать секунд на 10-20, то есть IDE UI не блокирован, но если попробовать посмотреть описание любой переменной или функции в классе (да хочь чего) через cmd+touchpad то ничего не показывает, если нажать на любой (тут я подчеркиваю, что работа с другой нетронутой функцией, а не которая была переименована) вызов функции то не переходит в ее дефенишен и более того эта функция даже не подсвечивается (что по ней можно перейти).

Еще замечаю (любая версия IDE), что бывают выражения, которые программа с другом вывозит. Вот например внутри функции был код
let obj1 // CoreData объект из другого модуля
let obj2 // еще CoreData объект из другого модуля
let ratio = 100 * obj1.price1 / obj2.price2

вот после того как написал знак деления сразу стали видны лаги UI причем постоянные толи пока курсор не убрал с этой линии, толи пока выражение не дописал, но суть в том, что после знака деления комплит наотрез отказался работать (ну или ждать минуту надо). Подобное поведение встречается в сложных выражениях и автокомплит работает после полуминуты ожидания. Ужас.

Очень плохо резолвится chaining, прям проблема
guard let obj = object?.array.first?.innerObject?.someFireld else { return }

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

2019 версия стала подсвечивать больше кода, конечно есть участки где IDE не может понять, но их стало меньше — за это спасибо.

Уже не помню, но вроде компишен дженериков тоже очень плохо работает
class A {
    private let relay = RxSwift.BehaviorRelay</* с этого места комплит не работает */User?>(value: nil)
}

Вот всегда при объявлении подобных переменных тип приходится писать руками, автокомплит молчит.
в итоге убрал галочки на smart и base completion

Галочки там стоят на «Automatically insert single suggestion», так что оно влиять на скорость никак не может. Даже если показалось, что что-то изменилось — это не так. По быстродействию автодополнения — проблема известная, будем отсматривать.
Буквально на днях заметил странную штуку, сборка в AppCode намного дольше чем на Xcode.
то есть полная сборка + запуск

Так все таки только сборка, или сборка плюс запуск занимают больше времени? Это два разных процесса, причины замедления там тоже принципиально разные. Чтобы нормально понять — нужны измерения после ⌥F9 в AppCode (Build) и ⌘B в Xcode, с предварительно очищенной DerivedData.
довольно часто после изменения кода (например изменить имя приватной функции, добавить дополнительный параметр в функцию) всё перестает работать секунд на 10-20

У вас в этот момент код подсвечивается, в правом верхнем углу отображается серый «глаз»? Если код не подсветился и глаз отображается — значит, идет перепарсинг и перерезолв, пока не окрасится код — остальное тоже не отработает. Тут бы снэпшот надо.
Еще замечаю (любая версия IDE), что бывают выражения, которые программа с другом вывозит.

И тут тоже бы надо снэпшот.
Тут всегда даже подсветка не работает, я уже не говорю, что не может вывести тип. Такое часто когда тип объекта object из другого модуля.

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

class MyObject {
    var innerObject: String?
}

class Test {
    var array: Array<MyObject>?
    func test() {
        var t = Test()
        guard let obj = t.array?.first?.innerObject?.count else {
           
        }
    }
}


то здесь все подсвечивается. Поэтому проблема не в chaining, как таковом, а, скорее всего, в сочетании generics в ваших объектах. Понять точно было бы полезно.
Уже не помню, но вроде компишен дженериков тоже очень плохо работает

По дженерикам, к сожалению, еще надо пройтись по площадям. Пока не прошлись.
UFO just landed and posted this here
OC-18316 пока не исправили, но в 2019.2 будем работать над скоростью автодополнения целенаправленно. Про компиляцию бы подробнее посмотреть. У нас с Xcode разные DerivedData, если переключаетесь и билдите то там, то там, то вполне может быть.
UFO just landed and posted this here
и компиляция с необновленными подами заканчивается не очень информативно
Error:Build failed with 0 errors
Лог сборки можете переслать в личку? В окне Messages слева есть кнопка «Show build log».
А можно, в двух словах для начинающих, чем это от XCode отличается?..
Ибо на офф сайте я такой информации не вижу (
В двух словах: «Альтернативная IDE». Написана иначе, на другом языке, обладает тонной интересных плюшек (не всем они нужны, но есть — и хорошо), по производительности и багам — где-то лучше Xcode, где-то AppCode. Я пока так и не смог перейти на AppCode, в основном, из-за тормозов с автокомплитом и «java-style» внешности и отклика управления. Не знаю, как объяснить последний свой пункт, но вот как-то прям чувствуется, это приложение работает иначе, чем привык в Xcode, скролл не такой плавный, выравнивание элементов другое (по отступам слева), и т.д. Вкусовщина.
Спасибо большое. Последний релиз отличный.
Скажите пожалуйста, в чем основная проблема такого скромного наборы рефакторингов в AppCode. Это касается как разницы между кол-вом в Swift относительно Objective-C так в целом между AppCode и ReSharper например. Перешел с .NET на iOS, думал, что достаточно будет просто сидеть в праильной IDE, но половину (как минимум) рефакторингов просто нет и это печалит. Если вдруг нужны примеры, то приведу парочку (прошу прощения за русский, не помню точный названий): сделать локальную переменную аргументом метода, extract Interface/Superclass. Какие вообще у JetBrains планы относительно рефакторинга в AppCode? Просто не хватает рук или ждёте стабилизации Swift?
Еще очень хотелось бы иметь фичу как в ReSharper (наверное есть и в IntelliJ IDEA) — отформатировать весь файл хотя бы в таком виде: отступы + группировка методов по области видимости + сортировка импортов. Понимаю, что теоретически можно это самому написать, поэтому был бы рад ссылочкам с чего начать)
Заранее спасибо!
P.S. Как мне кажется, основные аспекты хорошей IDE для большинства разработчику — UI без фризов, быстрый autocomplete, побольше рефакторингов, ну и всё в целом).
Промахнулся веткой, ответил ниже.
Это касается как разницы между кол-вом в Swift относительно Objective-C так в целом между AppCode и ReSharper например.

Ну, если коротко, то рук не хватает и мы постоянно ищем разработчиков. К слову, их количество неуклонно растет.

Если более подробно, то нельзя сравнивать Swift и какой-либо другой язык. Для начала, не существует просто Swift. Есть связка Swift + Objective-C/C++, mixed code. Либо это библиотеки, либо еще крайне многое. В итоге мы тут решаем задачу, которую ни один другой продукт JetBrains не решает — делаем кроссязыковое взаимодействие не в виде приятного бонуса, а как часть функциональности, без которой IDE просто бесполезна. Любой C-подобный язык сразу же вызывает рост сложности реализации любой фичи, потому что нельзя так просто взять и распарсить код с текстовыми подстановками в виде #define. То есть на самом деле — это крайне непростая задача, и делать ее крайне долго, когда речь идет о рефакторингах, работающих в контексте всего проекта. С локальными проще, и их мы понемногу реализуем.

Идем дальше. Раз в год выходит Xcode. Выход Xcode — это сразу же поддержка изменений в нем, о которых не знает никто. Поэтому часть времени всегда уходит на это. Допустим, с Xcode 8 пару раз сменился формат, в котором хранится документация кода. Один раз полностью изменился, большой кусок пришлось переписывать, а казалось бы, просто документацию отобразить. Тот же ReSharper работает с API плагинов, там ситуация, по-моему более предсказуема.

Смотрим дальше. Есть проблемы в поддержке языка, и в этом смысле мало кому нужны новые фичи, пока имеющееся работает хорошо не всегда. Кроме того, любой рефакторинг завязан на то, насколько корректно работает движок по анализу кода. Плохо работает движок — рефакторинг не гарантирует корректности, в итоге он никому не нужен. Поэтому у нас пока основной фокус на поддержку языка и так будет до тех пор, пока не добьем до состояния, когда действительно будет иметь смысл взяться за рефакторинги.

Еще — по сути весь предыдущий год мы сместили фокус с «примерно пополам исправления и фичи, но фич чуть больше» в сторону «максимум исправлений по самым больным вопросам, а фичи если останется время». Потому что быстродействие и корректность важнее. Почти каждое из реализованных крупных исправлений заметно не сразу, но решает проблемы «по площадям», и среднее время реализации — где-то от полугода. Плюс изменения настолько масштабные, что война с регрессиями тоже отнимает приличное время.

Ну и с фичами если смотреть, тут всегда приходится выбирать. Вот есть Code Coverage, который мы точно можем сделать хорошо. Его используют вообще все. Важнее ли он, допустим, Inline-рефакторинга? С точки зрения пользователей — важнее, это четко видно по трекеру.

Понимаю, что теоретически можно это самому написать, поэтому был бы рад ссылочкам с чего начать)

Я бы рекомендовал попробовать для начала запустить вот этот плагин, а потом творчески переосмыслить это руководство. Плагин хорош, чтобы освоиться с простейшими принципами написания плагинов, руководство хорошо, чтобы копать глубже. К слову, там все не так сложно, как кажется.
Большое спасибо за исчерпывающий ответ! А можно еще чуточку подробнее про
Плохо работает движок — рефакторинг не гарантирует корректности, в итоге он никому не нужен
О каком движке идет речь?
И еще вопрос про непосредственное взаимодействие с языком… Насколько я слышал из разных докладов ваших коллег работа с моделью кода/проектов идет совершенно по разному в Rider и IntelliJ например. У идеи есть своё API для модели кода (AST-деревьев и т.д), в то время как в Rider все модели хранятся на стороне ReSharper, а идея используется только как GUI frontend. Как обстоят дела в AppCode? Что используется для получения «модели кода» (не знаю как назвать лучше)? SourceKit или SwiftSyntax или что-то еще?
Речь о нашем собственном парсере и resolve engine, который является расширением модели IntelliJ. Они у нас свои, потому что SourceKit нужных нам возможностей не дает. Я вот тут достаточно подробно рассказывал, почему. Основное там — нет нормальных кэшей. Без кэшей ни одно сложное преобразование, работающее в контексте проекта или workspace невозможно. Ни одно из сторонних решений эту задачу пока не решило.

SourceKit мы используем для показа ошибок/предупреждений и чтобы получить часть преобразований кода, которые он дает (fix-it), то есть по сути как линтер.

В будущем, посмотрим, к чему приведет движение CLion к clang и возможно, переиспользуем тот же подход для части задач.
Большое спасибо! Доклад очень интересно было послушать. Почаще рассказывайте о том как у вас все устроено!)
Sign up to leave a comment.