2016-06-15 13 views
10

Robiłem trochę pracy przy analizie projektów Swift przy użyciu ich AST i chciałbym wiedzieć, czy jest możliwe wygenerowanie go w jakiś sposób podczas budowania projektu Swift z Xcode.Czy można zrzucić AST podczas budowania projektu Xcode?

W tej chwili jestem w stanie wydrukować AST na terminalu podczas uruchamiania polecenia swiftc -dump-ast dla pojedynczych plików i prostych projektów. Jednak korzystanie z niego w bardziej złożonych projektach staje się trudniejsze.

Z tego powodu chciałbym użyć xcode. Próbowałem już przekazać flagę -dump-ast do kompilatora w Ustawieniach kompilacji> Kompilator Swift - Flagi niestandardowe> Inne flagi Swift. Flaga rzeczywiście została przekazana do kompilatora (wyjście informuje o wywołaniu swiftc z flagą -dump-ast podczas budowania). Próbowałem zbudować projekt zarówno za pomocą kodu xcode, jak i za pomocą poniższej komendy xcodebuild, ale ani nie odrzucono ast.

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

Teraz jestem rozumując, że proces budowania obu stanowisk Xcode za przekierowania wyjścia swiftc do jakiegoś pliku, lub wycisza go jakoś. jakieś pomysły?

Każda pomoc zostanie bardzo doceniona.

Odpowiedz

17

Nie można zmienić ustawienia AST aplikacji, zmieniając tylko ustawienia kompilacji Xcode . Głównym powodem tego jest to, że Xcode robi wiele decyzji dotyczących flag kompilatorów, które mają przejść do swiftc, które nie są kompatybilne z odrzucaniem AST i nie można zatrzymać Xcode z robiącego to.

Ale to to możliwe do zrobienia poza Xcode za pomocą Xcode'a (lub w Xcode za pomocą mojego skryptu wymienionego poniżej). Aby to zrobić, musisz wykonać przechwycić polecenie Xcode dla swojego projektu, a następnie zmienić nieco, aby zrzucić AST.

Najpierw skonstruuj projekt, a następnie przejdź do Nawigatora raportów w Xcode (ostatnia zakładka w panelu nawigatora po lewej stronie). Stamtąd zapisz cały dziennik kompilacji za pomocą przycisku zapisu u góry lub skopiuj polecenie bezpośrednio z Xcode. Poszukujesz komendy o nazwie "Kompiluj źródła Swift" dla celu aplikacji (UWAGA: to tylko zawiera komendę kompilacji dla jednego celu, jeśli chcesz używać wielu celów AST, aby wykonać te kroki wiele razy). Jeśli nie można znaleźć tego kroku, może być konieczne wyczyszczenie projektu i ponowne kompilowanie (lub obejrzenie starszego dziennika kompilacji).

Po skopiowaniu całego polecenia swiftc z Xcode, potrzebujesz , aby przejść do wiersza poleceń i nieco zmienić komendę.Oto co trzeba zrobić:

  1. Usuń -emit-dependencies
  2. Usuń -emit-module -emit-module-path FILEPATH
  3. Usuń -emit-objc-header -emit-objc-header-path FILEPATH
  4. Usuń -c (tuż przed -jN oraz listę plików)
  5. Usuń -parseable-output
  6. Dodaj -dump-ast
  7. Dodaj > output.ast 2>&1 do polecenia powłoki

Dlaczego te?

  • numerami 1, 2, 3 i 4 muszą zostać usunięte, ponieważ gdy dumping AST nie można również wydzielać inny typ pliku. Logikę można zobaczyć wokół tych błędów w kompilatorze Swift z otwartym kodem źródłowym here. Numer 4 jest tego przykładem, ponieważ -c jest aliasem -emit-object.
  • Numer 5 ułatwia przekierowanie wyjścia AST, a także zatrzymanie swiftc przed wysyłaniem innych informacji o tym poleceniu swiftc. Jeśli zamierzasz parsować dane wyjściowe tego polecenia AST z innego programu zamiast przekierować wyjście w powłoce, możesz chcieć zostawić tę opcję (otrzymujesz JSON).
  • Numer 6 powoduje, że polecenie wyprowadza AST. W zależności od tego, do czego chcesz użyć tego wyjścia, możesz również użyć również rozważyć użycie -print-ast, które drukuje bardziej stylowe wyjście niż bardziej szczegółowe, klasyczne przetwarzalne wyjście AST z -dump-ast.
  • Numer 7 jest prostym przekierowaniem powłoki, dzięki czemu możesz przekierować wyjście AST z (prawdopodobnie ogromnego) do pojedynczego pliku. Zmień output.ast na dowolny plik, który chcesz. Będziesz potrzebował 2>&1, ponieważ AST jest zrzucany na stderr zamiast standardowe wyjście. Zamówienie ma również znaczenie tutaj: .

Należy również zauważyć, że dziennik kompilacji Xcode wymyka się spacjom, ale nie innym znakom, które mogą nie podobać się muszle. Na przykład, jeśli masz & w dowolnej ścieżce katalogu/katalogu , będziesz musiał uciec z tego ręcznie.

Jeśli wszystko to brzmi zbyt mocno, zrzuciłem skrypt do , wykonując to przetwarzanie dla ciebie i możesz ustawić je w Xcode. Możesz znaleźć it on GitHub.

+0

Witaj Keith, dzięki za odpowiedź. Byłem w stanie (z powrotem, kiedy zadałem to pytanie) zrzucić AST, kompilując własny toolchain, który zawsze drukował zrzut do pliku wyjściowego. To mi dobrze służyło. Twoje rozwiązanie jest jednak znacznie prostsze, działało dla prostego projektu (właśnie wykonałem jeden test, aby zobaczyć wynik) i jest bardziej stabilne (musiałem stale aktualizować toolchain poprzez szybkie zmiany wersji). Dzięki za pomoc! –

Powiązane problemy