Можно ли сбросить AST при создании проекта Xcode?

Я проделал определенную работу по анализу проектов Swift, используя их AST, и я хотел бы знать, можно ли как-то сгенерировать его при создании проекта Swift с помощью Xcode.

Сейчас я могу распечатать AST на терминале при запуске команды swiftc -dump-ast для одиночных файлов и простых проектов. Однако становится сложнее использовать его для более сложных проектов.

По этой причине я хотел бы использовать xcode. Я уже пытался передать флаг -dump-ast компилятору в настройках сборки > Swift Compiler - Custom Flags > Other Swift Flags. Флаг действительно был передан компилятору (на выходе выводится сообщение о вызове swiftc с флагом -dump-ast при создании). Я попытался построить проект как с xcode, так и с помощью команды xcodebuild ниже, но не сбрасывал ast.

xcodebuild -target 'CompilingTest.xcodeproj' -scheme 'CompilingTest' -
configuration "Debug" -sdk iphoneos -arch "armv7" 
CONFIGURATION_BUILD_DIR="TestBuild" ONLY_ACTIVE_ARCH=NO

Теперь я рассуждаю, что либо процесс сборки Xcode перенаправляет вывод swiftc в какой-либо файл, либо он каким-то образом его отключает. Любые мысли?

Любая помощь будет принята с благодарностью.

Ответ 1

Сбрасывание АСТ вашего приложения невозможно сделать только из-за изменения Настройки сборки Xcode. Основная причина этого заключается в том, что Xcode создает много решений о флажках компилятора передать swiftc, которые не все совместимы с сбросом AST, и вы не можете остановить Xcode от делая это.

Но можно делать вне Xcode с помощью справки Xcode (или в Xcode, используя мой script, указанный ниже). Для этого вам нужно будет захватить команду swiftc Xcode для вашего проекта, а затем немного измените его, чтобы сбросить AST.

Сначала создайте свой проект, затем перейдите в Навигатор отчетов в Xcode ( последней вкладке в панели "Навигатор" слева). Отсюда либо сохраните весь журнал сборки с кнопкой сохранения вверху или скопировать swiftc непосредственно из Xcode. Вы ищете команду "Скомпилируйте Swift Sources" для вашего целевого приложения (ПРИМЕЧАНИЕ: это только содержит команду компиляции для одной цели, если вы хотите, чтобы AST несколько целей вам потребуется выполнить эти шаги несколько раз). Если вы не можете найти этот шаг, вам может понадобиться очистить ваш проект и скомпилировать его снова (или посмотрите на старый журнал построения).

После того, как вы скопировали всю команду swiftc из Xcode, вам понадобится чтобы перейти в командную строку и немного изменить команду. Вот что вам нужно будет сделать:

  • Удалить -emit-dependencies
  • Удалить -emit-module -emit-module-path FILEPATH
  • Удалить -emit-objc-header -emit-objc-header-path FILEPATH
  • Удалите -c (прямо перед -jN и список файлов)
  • Удалить -parseable-output
  • Добавить -dump-ast
  • Добавить > output.ast 2>&1 в команду оболочки

Почему эти?

  • Номера 1, 2, 3 и 4 должны быть удалены, поскольку при сбросе AST вы также не можете генерировать другой тип файла. Вы можете видеть логику вокруг этих ошибок в компиляторе Swift с открытым исходным кодом здесь. Число 4 является случаем этого, так как -c является псевдонимом -emit-object.
  • Число 5 облегчает вам перенаправление выхода AST, а также останавливая swiftc от вывода другой информации об этом команда. Если вы планируете анализировать вывод этой команды AST из другая программа вместо перенаправления вывода в оболочку, которую вы может захотеть оставить эту опцию (вы в конечном итоге получаете JSON с ней).
  • Число 6 - это то, что вызывает команду для вывода AST. В зависимости от того, для чего вы хотите использовать этот вывод, вы можете также рассмотрите возможность использования -print-ast, который печатает больше class-dump вывод стиля vs более подробный, классический анализируемый вывод AST -dump-ast.
  • Номер 7 - это простое перенаправление оболочки, так что вы можете перенаправить (возможно, огромный) выход вашего АСТ в один файл. + Изменить output.ast в любой файл, который вы хотите. Вам понадобится 2>&1, потому что AST выгружается в stderr вместо stdout. Приказ также имеет значение здесь.

Также обратите внимание, что журнал сборки Xcode экранирует пробелы, но не другие символы что оболочки могут не нравиться. Например, если у вас есть & в любом из ваших путь к папке/каталогам, вам придется скрывать это вручную.

Если все это звучит как слишком много работы, я сбросил вместе script на сделайте эту обработку для вас, и вы можете настроить ее в Xcode. Ты можешь найти на GitHub.