2016-06-15 3 views
10

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

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

По этой причине я хотел бы использовать xcode. Я уже пытался передать флаг -dump-ast компилятору в настройках сборки> Swift Compiler - пользовательские флаги> другие быстрые флаги. Флаг действительно был передан компилятору (на выходе выводится сообщение о вызове 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 на некоторый файл, или заглушает его каким-то образом. Есть предположения?

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

ответ

17

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

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

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

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

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

Почему эти?

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

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

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

+0

Здравствуйте, Кит, спасибо за ваш ответ. Я смог (назад, когда я задал вопрос) сбросить AST, скомпилировав собственную инструментальную цепочку, которая всегда печатала дамп в выходной файл. Это служило мне хорошо. Однако ваше решение намного проще, работает для простого проекта (я только что сделал один тест, чтобы увидеть результат) и более стабилен (мне пришлось постоянно обновлять инструментальную цепочку с помощью быстрых изменений версии). Спасибо за помощь! –