[omochi@omochi-iMac-PC43 swift-format (format=)]$ swift build warning: invalid duplicate target dependency declaration 'swift-build' in target 'FunctionalPerformanceTests' warning: invalid duplicate target dependency declaration 'swift-package' in target 'FunctionalPerformanceTests' [omochi@omochi-iMac-PC43 swift-format (format=)]$ swift package generate-xcodeproj warning: invalid duplicate target dependency declaration 'swift-build' in target 'FunctionalPerformanceTests' warning: invalid duplicate target dependency declaration 'swift-package' in target 'FunctionalPerformanceTests' error: fatalError dependencies: [ .package(url: "https://github.com/apple/swift-syntax.git", .revision("xcode11-beta1")), ],dyld: Library not loaded: @rpath/lib_InternalSwiftSyntaxParser.dylib Referenced from: /Users/omochi/Library/Developer/Xcode/DerivedData/SwiftTypeInference-ctmynziujqzotxcamwbdvzlrnvfq/Build/Products/Debug/SwiftTypeInference Reason: image not found/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/usr/lib/swiftが存在する環境しかサポートしなくなったから、rpathにXcode.appバンドル内のswiftライブラリディレクトリを設定しなくなったのね。rpathを設定しなくなった」だけど、Xcode的には「元々そんな設定してない」かな。SwiftSyntax parser library isn't compatible たぶんパーサーのswiftparse_syntax_structure_versioning_identifier とSwiftSyntaxが一致してないんですが、masterのSwiftSyntaxがどのパーサーとcompatibleか調べる方法が分からない 環境: SwiftSyntaxはmaster, Xcode 11 beta 4 (edited)SyntaxNodes.swiftにあるハッシュが更新されてるか不明で困ったmasterとswift-5.1-branchのどちらも、ハッシュの元となってるgyb_syntax_supportは7/2~3以降更新されてないから、どちらのsnapshotでも動くかと。 https://github.com/apple/swift/commits/master/utils/gyb_syntax_support
https://github.com/apple/swift/commits/swift-5.1-branch/utils/gyb_syntax_support (edited)SyntaxTreeDeserializer が消えていたんですが、byte treeってどうなったんでしたっけ?SyntaxTreeDeserializer をSourceKitから引き抜いたbyte treeをデシリアライズするために使っていたので、代替になるようなAPIがあれば知りたいです。swift-compiler-version というのが指定できて、それがswiftc --versionに記載されてるっぽいswift-compiler-version というのが指定できて、それがswiftc --versionに記載されてるっぽい build-script って具体的にどのリポジトリの何を指してますか?utils/build-parser-lib 、ビルドできなかった。 $ utils/update-checkout --tag swift-5.4-RELEASE 環境でも駄目だった。 https://gist.github.com/omochi/cb9d4595761759df0355069cb9481d12 swift compiler自体はmainブランチでビルドできたのだけど・・・update-checkout succeeded cmake : skip cmark : 9c8096a23f44794bde297452d87c455fc4f76d42 icu : skip indexstore-db : bd2cf9468e5f81a65419c4b62da1663df83ebdb7 llbuild : eb56a00ed9dfd62c2ce4ec86183ff0bc0afda997 llvm-project : 439a44695a0534a26557cc34b4fe650dccb46aed ninja : e72d1d581c945c158ed68d9bc48911063022a2c6 sourcekit-lsp : 3df647c2f7d598b5dbad78a7c9c2f54fdbaf06dd swift : 3e4fab9bb6a56fc30d43e72eaff5b096cf160c55 swift-argument-parser : 986d191f94cec88f6350056da59c2e59e83d1229 swift-corelibs-foundation : b8c9b25e0bb50f4118f5bd9e53c14a8fa3fcf240 swift-corelibs-libdispatch : f13ea5dcc055e5d2d7c02e90d8c9907ca9dc72e1 swift-corelibs-xctest : 8ad2cec16133618af8d5da34bced263f44ac1159 swift-driver : 93e8b927225a62b963ebe13ab11e04192fa8a67b swift-format : fc3fab6bf6541e611830b122711af0bd750dec6f swift-integration-tests : 169ede0a8f440162042dd20c9912a20d74053296 swift-stress-tester : a4ca36e9c447b4a7cc7626b8b95e71e92236f0f9 swift-syntax : ce9020568227504e792d07839b91c5de18ed291a swift-tools-support-core : e95add83fc1042a0a0e260d342f9fc5608df9a84 swift-xcode-playground-support : 8f471406a4ffead2e734693ddb58b433e92ae3e1 swiftpm : 7cd58d6cc1945b14db1346792b39af609ce17fe9 yams : 51ef46468fda5a0fa1a201b8843791d0149d3c01 [omochi@omochi-iMacPro swift ((swift-5.4-RELEASE))]$ utils/build-parser-lib --release --no-assertions --build-dir ../tempUndefined symbols for architecture x86_64: "clang::Decl::getOwningModuleSlow() const", referenced from:[omochi@omochi-iMacPro swift-source]$ rm -rf clang clan [omochi@omochi-iMacPro swift-source]$ rm -rf clang [omochi@omochi-iMacPro swift-source]$ rm -rf clang-tools-extra/ [omochi@omochi-iMacPro swift-source]$ rm -rf compiler-rt/ [omochi@omochi-iMacPro swift-source]$ rm -rf lldb [omochi@omochi-iMacPro swift-source]$ rm -rf llvm [omochi@omochi-iMacPro swift-source]$ rm -rf swift-cryptoUndefined symbols for architecture x86_64: "clang::Decl::getOwningModuleSlow() const", referenced from:[omochi@omochi-iMacPro swift ((swift-5.4-RELEASE))]$ cd .. [omochi@omochi-iMacPro swift-source]$ cd llvm-project/ [omochi@omochi-iMacPro llvm-project ((swift-5.4-DEVELOPMENT-SNAPSHOT-2021-04-23-a) %)]$ git status HEAD detached at swift-5.4-RELEASE Untracked files: (use "git add <file>..." to include in what will be committed) swift nothing added to commit but untracked files present (use "git add" to track)lrwxr-xr-x 1 omochi staff 37 6 9 23:55 swift -> /Users/omochi/work/swift-source/swiftswift-5.4-RELEASE か、試したことないや。main でもだめってことです?[omochi@omochi-iMacPro install]$ tree . └── Applications └── Xcode.app └── Contents └── Developer └── Toolchains └── XcodeDefault.xctoolchain └── usr └── lib └── swift ├── _InternalSwiftSyntaxParser │ ├── SwiftSyntaxParser.h │ └── module.modulemap └── macosx └── lib_InternalSwiftSyntaxParser.dylibXcode 12.5 swift-5.4-RELEASE 0.50400.0 を使っているなら、 Xcode12.5に同梱されてる lib_InternalSwiftSyntaxParser を使えばいいですよね。 (edited)0.50400.0 は 5.4 向けでしょ。[omochi@omochi-iMacPro swift-syntax (main=)]$ swift build /Users/omochi/github/apple/swift-syntax/Sources/SwiftSyntax/RawSyntax.swift:120:45: error: value of type 'swiftparse_token_data_t' has no member 'range' let textSize = hasCustomText ? Int(data.range.length) : 0 ~~~~ ^~~~~ /Users/omochi/github/apple/swift-syntax/Sources/SwiftSyntax/RawSyntax.swift:157:34: error: value of type 'swiftparse_token_data_t' has no member 'range' let startOffset = Int(data.range.offset) ~~~~ ^~~~~ /Users/omochi/github/apple/swift-syntax/Sources/SwiftSyntax/RawSyntax.swift:158:29: error: value of type 'swiftparse_token_data_t' has no member 'range' let length = Int(data.range.length) ~~~~ ^~~~~ /Users/omochi/github/apple/swift-syntax/Sources/SwiftSyntax/RawSyntax.swift:161:41: error: referencing operator function '<=' on 'BinaryInteger' requires that 'SourceLength' conform to 'BinaryInteger' precondition(startOffset + length <= utf8.count) ^ Swift.BinaryInteger:1:11: note: where 'Self' = 'SourceLength' extension BinaryInteger { ^ /Users/omochi/github/apple/swift-syntax/Sources/SwiftSyntax/RawSyntax.swift:163:45: error: extra argument 'offsetBy' in call let end = utf8.index(begin, offsetBy: length) ^~~~~~ /Users/omochi/github/apple/swift-syntax/Sources/SwiftSyntax/RawSyntax.swift:893:41: error: value of type 'swiftparse_token_data_t' has no member 'range' byteLength = Int(cnode.token_data.range.length) ~~~~~~~~~~~~~~~~ ^~~~~ /Users/omochi/github/apple/swift-syntax/Sources/SwiftSyntax/SyntaxParser.swift:196:58: error: extra argument in call swiftparse_parse_string(c_parser, buf, source.utf8.count) ~~~~~~~~~~~~^~~~~ [41/44] Compiling SwiftSyntax SyntaxNodes.swift/Users/omochi/github/apple/swift-syntax/Sources/SwiftSyntax/RawSyntax.swift:120:45: error: value of type 'swiftparse_token_data_t' has no member 'range' let textSize = hasCustomText ? Int(data.range.length) : 0 ~~~~ ^~~~~@_implementationOnly import _InternalSwiftSyntaxParser import Foundation typealias CSyntaxNode = swiftparse_syntax_node_t typealias CTriviaPiece = swiftparse_trivia_piece_t typealias CSyntaxNodePtr = UnsafePointer<CSyntaxNode> typealias CTriviaPiecePtr = UnsafePointer<CTriviaPiece> typealias CSyntaxKind = swiftparse_syntax_kind_t typealias CTokenKind = swiftparse_token_kind_t typealias CTriviaKind = swiftparse_trivia_kind_t typealias CTokenData = swiftparse_token_data_t typealias CLayoutData = swiftparse_layout_data_t typealias CParseLookupResult = swiftparse_lookup_result_t typealias CClientNode = swiftparse_client_node_t typealias CDiagnostic = swiftparser_diagnostic_t typealias CFixit = swiftparse_diagnostic_fixit_t typealias CRange = swiftparse_range_t.unsafeFlags を指定するのは、 SwiftSyntaxのPackage.swiftにないと駄目だな。$ swift build だったら -Xswiftc か -Xcc あたりかな。ちゃんと優先されるんだろうか.framework の中にライブラリ自体とそれは別に依存する他のdylibをポン置きできるんだっけ。install_name_tool で隣見るようにしてやればいいのか<unknown>:0: error: module map file '/Users/omochi/github/omochi/BinarySwiftSyntax/build/GeneratedModuleMaps/_CSwiftSyntax.modulemap' not found <unknown>:0: error: module map file '/Users/omochi/github/omochi/BinarySwiftSyntax/build/GeneratedModuleMaps/_CSwiftSyntax.modulemap' not found <unknown>:0: error: missing required module 'SwiftShims'# strings /path/to/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/lib_InternalSwiftSyntaxParser.dylib | grep -E '[a-f0-9]{32}' 4f85168b3860f575ce60ac0d223fc89da37014df # cd swift-syntax # git log -S 4f85168b3860f575ce60ac0d223fc89da37014df とかで割り出すっていう笑# strings /path/to/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/macosx/lib_InternalSwiftSyntaxParser.dylib | grep -E '[a-f0-9]{32}' 4f85168b3860f575ce60ac0d223fc89da37014df # cd swift-syntax # git log -S 4f85168b3860f575ce60ac0d223fc89da37014df とかで割り出すっていう笑 git log -S で変更履歴達が出てくるんですね。 (edited)commit 1d0a2c1bd249daffd35a340e9482060121667f21 Author: Rintaro Ishizaki <rishizaki@apple.com> Date: Thu Apr 29 09:15:06 2021 -0700 Update for postfix '#if' expression diff --git a/Sources/SwiftSyntax/gyb_generated/Misc.swift b/Sources/SwiftSyntax/gyb_generated/Misc.swift index cc8ace1..73841bd 100644 --- a/Sources/SwiftSyntax/gyb_generated/Misc.swift +++ b/Sources/SwiftSyntax/gyb_generated/Misc.swift @@ -471,6 +471,12 @@ extension SyntaxNode { return ObjcSelectorExprSyntax(asSyntaxData) } + public var isPostfixIfConfigExpr: Bool { return raw.kind == .postfixIfConfigExpr } + public var asPostfixIfConfigExpr: PostfixIfConfigExprSyntax? { + guard isPostfixIfConfigExpr else { return nil } + return PostfixIfConfigExprSyntax(asSyntaxData) + } + public var isEditorPlaceholderExpr: Bool { return raw.kind == .editorPlaceholderExpr } public var asEditorPlaceholderExpr: EditorPlaceholderExprSyntax? { guard isEditorPlaceholderExpr else { return nil } @@ -1621,6 +1627,8 @@ extension Syntax { return node case .objcSelectorExpr(let node): return node + case .postfixIfConfigExpr(let node): + return node case .editorPlaceholderExpr(let node): return node case .objectLiteralExpr(let node): @@ -1952,6 +1960,6 @@ extension Syntax { extension SyntaxParser { static func verifyNodeDeclarationHash() -> Bool { return String(cString: swiftparse_syntax_structure_versioning_identifier()!) == - "468bcd348ceb5f9281692e63d4c80e3333a18211" + "4f85168b3860f575ce60ac0d223fc89da37014df" } }SE-0308 の対応のやつだSwiftSyntax.xcframework できた!動いた!$ xcodebuild archive... したら、勝手にされちゃった。CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO CODE_SIGNING_ALLOWED=NO こんなパラメータをつけるとOKだと思う。libInternalSyntaxSwiftParser.dylib のiOS用のものを作れば対応できるようです。Load command 26 cmd LC_RPATH cmdsize 40 path @loader_path/Frameworks (offset 12) [omochi@omochi-iMacPro A (main *+%=)]$ otool -L SwiftSyntax SwiftSyntax: @rpath/SwiftSyntax.framework/Versions/A/SwiftSyntax (compatibility version 1.0.0, current version 1.0.0) @rpath/lib_InternalSwiftSyntaxParser.dylib (compatibility version 1.0.0, current version 18010.0.0) ... [omochi@omochi-iMacPro A (main *+%=)]$ ls Frameworks Headers Modules Resources SwiftSyntax [omochi@omochi-iMacPro A (main *+%=)]$ ls Frameworks _CSwiftSyntax.framework lib_InternalSwiftSyntaxParser.dylib (edited)RPATH failed expanding @rpath/lib_InternalSwiftSyntaxParser.dylib to: /usr/lib/swift/lib_InternalSwiftSyntaxParser.dylib RPATH failed expanding @rpath/lib_InternalSwiftSyntaxParser.dylib to: /Applications/Xcode12.5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Xcode/Agents/../Frameworks/lib_InternalSwiftSyntaxParser.dylib dyld: loaded: <3D321011-1279-30C7-A9AE-FF13073508AD> /Users/omochi/Library/Developer/Xcode/DerivedData/SwiftTypeReader-eqfhomccxzrdaphbladexpydmlbp/Build/Products/Debug/SwiftSyntax.framework/Versions/A/Frameworks/lib_InternalSwiftSyntaxParser.dylib RPATH successful expansion of @rpath/lib_InternalSwiftSyntaxParser.dylib to: /Users/omochi/Library/Developer/Xcode/DerivedData/SwiftTypeReader-eqfhomccxzrdaphbladexpydmlbp/Build/Products/Debug/SwiftSyntax.framework/Versions/A/Frameworks/lib_InternalSwiftSyntaxParser.dylibdyld: loaded: <3D321011-1279-30C7-A9AE-FF13073508AD> /Users/omochi/github/omochi/SwiftTypeReader/.build/x86_64-apple-macosx/debug/SwiftSyntax.framework/Versions/A/Frameworks/lib_InternalSwiftSyntaxParser.dylibSwiftSyntaxParserTest/ClassificationTests.swift:9: Fatal error: 'try!' expression unexpectedly raised an error: The loaded '_InternalSwiftSyntaxParser' library is from a toolchain that is not compatible with this version of SwiftSyntax むむむ[omochi@omochi-iMacPro Toolchains]$ ls -alh total 0 drwxr-xr-x 6 root wheel 192B 8 23 14:28 . drwxr-xr-x 6 root admin 192B 6 6 2021 .. drwxr-xr-x 7 root wheel 224B 8 2 19:13 swift-5.7-DEVELOPMENT-SNAPSHOT-2022-07-23-a.xctoolchain drwxr-xr-x 7 root wheel 224B 5 19 15:40 swift-DEVELOPMENT-SNAPSHOT-2022-05-18-a.xctoolchain drwxr-xr-x 7 root wheel 224B 8 23 14:28 swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain lrwxr-xr-x 1 root wheel 81B 8 23 14:28 swift-latest.xctoolchain -> /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain [omochi@omochi-iMacPro Toolchains]$ export TOOLCHAINS=swift [omochi@omochi-iMacPro Toolchains]$ xcrun -find swift /Library/Developer/Toolchains/swift-5.7-DEVELOPMENT-SNAPSHOT-2022-07-23-a.xctoolchain/usr/bin/swiftTOOLCHAINS=swift が選択するやつが思ったのと違ったわ[omochi@omochi-iMacPro swift]$ swift/utils/build-tooling-libs --release --no-assertions --build-dir temp/tooling-libs-build これ使うの初めてだ-- Using Experimental String Processing library for libswift _RegexParser (/Users/omochi/github/apple/swift/swift-experimental-string-processing). CMake Error at /Users/omochi/github/apple/swift/swift/SwiftCompilerSources/CMakeLists.txt:274 (message): Outdated Swift compiler: building with host tools requires Swift 5.8 or newer. Please update your Swift toolchain or switch BOOTSTRAPPING_MODE to BOOTSTRAPPING(-WITH-HOSTLIBS)? or OFF. -- Configuring incomplete, errors occurred! See also "/Users/omochi/github/apple/swift/temp/tooling-libs-build/x86_64/obj/CMakeFiles/CMakeOutput.log". See also "/Users/omochi/github/apple/swift/temp/tooling-libs-build/x86_64/obj/CMakeFiles/CMakeError.log". ERROR: command terminated with a non-zero exit status 1, aborting これでたけど [omochi@omochi-iMacPro swift]$ swift/utils/build-tooling-libs --release --no-assertions --build-dir temp/tooling-libs-build --swiftc /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/bin/swiftc これでいけたbuild-tooling-libs は TOOLCHAINS は見ないのだな・・・[omochi@omochi-iMacPro swift-syntax (main=)]$ swift test --filter SwiftParserTest.* Building for debugging... Build complete! (0.25s) error: signalled(6): /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/libexec/swift/pm/swiftpm-xctest-helper /Users/omochi/github/apple/swift-syntax/.build/x86_64-apple-macosx/debug/SwiftSyntaxPackageTests.xctest /var/folders/1v/_s33fkpj07g9y3zvdfs9cz9m0000gn/T/TemporaryFile.G8m0Jq output: dyld[59495]: Library not loaded: @rpath/XCTest.framework/Versions/A/XCTest Referenced from: /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/libexec/swift/pm/swiftpm-xctest-helper Reason: tried: '/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/libexec/swift/pm/../lib/XCTest.framework/Versions/A/XCTest' (no such file), '/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/libexec/swift/pm/../../../lib/swift/macosx/XCTest.framework/Versions/A/XCTest' (no such file), '/usr/lib/swift/XCTest.framework/Versions/A/XCTest' (no such file), '/Users/ec2-user/jenkins/workspace/oss-swift-package-macos/build/buildbot_osx/intermediate-install/macosx-x86_64/Applications/Xcode.app/Contents/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/lib/swift/macosx/../../swift-5.5/macosx/XCTest.framework/Versions/A/XCTest' (no such file), '/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/libexec/swift/pm/../lib/swift/macosx/XCTest.framework/Versions/A/XCTest' (no such file), '/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/libexec/swift/pm/../lib/XCTest.framework/Versions/A/XCTest' (no such file), '/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/libexec/swift/pm/../../../lib/swift/macosx/XCTest.framework/Versions/A/XCTest' (no such file), '/usr/lib/swift/XCTest.framework/Versions/A/XCTest' (no such file), '/Users/ec2-user/jenkins/workspace/oss-swift-package-macos/build/buildbot_osx/intermediate-install/macosx-x86_64/Applications/Xcode.app/Contents/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/lib/swift/macosx/../../swift-5.5/macosx/XCTest.framework/Versions/A/XCTest' (no such file), '/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/libexec/swift/pm/../lib/swift/macosx/XCTest.framework/Versions/A/XCTest' (no such file), '/System/Library/Frameworks/XCTest.framework/Versions/A/XCTest' (no such file)
--filter するとだめになった・・・[omochi@omochi-iMacPro swift-syntax (main=)]$ xcrun -find XCTest /Applications/Xcode14.beta.5.app/Contents/Developer/usr/bin/XCTest [omochi@omochi-iMacPro swift-syntax (main=)]$ xcrun -find swift /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/bin/swift[omochi@omochi-iMacPro swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain]$ find . | grep XCTest なさそうswift test なら通るんだよね、そもそも。swift test --filter foo するとXCTestが見つからなくなる'/Users/ec2-user/jenkins/workspace/oss-swift-package-macos/build/buildbot_osx/intermediate-install/macosx-x86_64/Applications/Xcode.app/Contents/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/lib/swift/macosx/../../swift-5.5/macosx/XCTest.framework/Versions/A/XCTest' (no such file), $ export DYLD_LIBRARY_PATH=/Applications/Xcode14.beta.5.app/Contents/Developer/Platforms/MacOSX.platform/Developer/Library/Frameworks これは駄目だった/Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2022-08-18-a.xctoolchain/usr/lib/swift/macosx/ にいろいろコピペしたらとりあえず動いた XCTest.framework XCTestCore.framework XCTestSupport.framework XCUIAutomation.framework XCUnit.framework linXCTestSwiftSupport.dylib (edited) mutating func advanceIfMultilineDelimiter(_ CustomDelimiterLen: Int, _ IsOpening: Bool = false) -> Bool { // Test for single-line string literals that resemble multiline delimiter. var TmpPtr = self _ = TmpPtr.advance() LLVM C++ StyleなSwiftコードだ
1var opPrecedence = OperatorPrecedence.standardOperators // Use the Swift standard library operators let parsed = try Parser.parse(source: "x + y * z") dump(parsed) // contains SequenceExprSyntax(x, +, y, *, z) let folded = try opPrecedence.foldAll(parsed) dump(folded) // contains InfixOperatorExpr(x, +, InfixOperatorExpr(y, *, z))let parsedOperators = try Parser.parse(source: moreOperators) // Adds **, ExponentiationPrecedence to the set of known operators and precedence groups. try opPrecedence.addSourceFile(parsedOperators) let parsed2 = try Parser.parse(source: "b ** c ** d") dump(parsed2) // contains SequenceExprSyntax(b, **, c, **, d) let folded2 = try opPrecedence.foldAll(parsed2) dump(folded2) // contains InfixOperatorExpr(b, **, InfixOperatorExpr(c, **, d))"""" を食わせると、1文字目と5文字目に " が足りませんよ、っていう出力になるんだが """""" は別に正しいコードになってないので謎だ。[omochi@omochi-iMacPro swift-syntax (add-fixed-issues-test %=)]$ .build/debug/swift-parser-test dump-tree crash.swift SourceFileSyntax children=2 0: CodeBlockItemListSyntax children=1 0: CodeBlockItemSyntax children=1 0: StringLiteralExprSyntax children=3 0: stringQuote MISSING 1: StringLiteralSegmentsSyntax children=1 0: StringSegmentSyntax children=1 0: stringSegment("\"\"\"\"") 2: stringQuote MISSING 1: eof" + "" + " に解釈しようとしかけるが、(ダブルクォート2つがコンテンツである文字列) (edited)" + "" + " のロジックは # がついてる時だけだ。ParseSourceFileRequest::evaluate に swift_parser_consistencyCheck とやらを仕込んだprivate(set) のパースを考えるときに private(var という入力が来たら、 private(set) var の set) がスッポ抜けていると考える という動作が parser.expect(.rightParen) だとできるなあ (edited)private(get, set) を考えると、, が ) より強いので、 get, をノイズと判定できずに , で力尽きて set) の不存在と、 後続ノイズの set) になってしまうな。expect 使ったら?というコメントが来たので、それだと private(get, set) のパースが微妙になってしまう、という返事をしたけど、 もしいろいろ誤読してるとややこしくなりそうなので実装例も用意して説明をした (edited)extra token munging here. はおそらく先行する2つのwhile loopとかを言ってるんだと思うけど、もしかしたらただ consume(if:) の1行だけを指してるのかもしれない・・・) を探すときに get も , も 食えるから助かるな。 openとcloseでレベルが違う事になってるけどそれは問題ないんだろうか) まで走るのは求めてるのとちょっと違うな。 探してるものが見つからずに強いトークンにぶつかった場合、 先読み失敗じゃなくてそこで止まってほしいわ#704 のために導入してくれた canRecoverToContextualKeyword が他では一箇所も使われてないから、 実装パターンを改善したり、壊れたコードに対する回復力を高められる場所がいろいろ眠ってそうな気はする#777
#778
1UIColor(white: 216.0/255.0, alpha: 44.0/255.0) // regexLiteral("/255.0, alpha: 44.0/") (edited)foo.bar を表すんですけど、fooもbarもtokenとしてはidentifierで、 fooのほうはidentifier exprなんですが、barの方はそうじゃない(ただのtoken)、というsyntaxなのかなあ。init( _ unexpectedBeforeBase: UnexpectedNodesSyntax? = nil, base: ExprSyntax?, _ unexpectedBetweenBaseAndDot: UnexpectedNodesSyntax? = nil, dot: TokenSyntax, _ unexpectedBetweenDotAndName: UnexpectedNodesSyntax? = nil, name: TokenSyntax, _ unexpectedBetweenNameAndDeclNameArguments: UnexpectedNodesSyntax? = nil, declNameArguments: DeclNameArgumentsSyntax?, _ unexpectedAfterDeclNameArguments: UnexpectedNodesSyntax? = nil ) { なるほどね。#imageLiteral(...)、#colorLiteral(...)はObjectLiteralExpr、#selector(...)はObjcSelectorExprだったのが最新のSwiftSyntaxだと全部MacroExpansionExprSyntaxになってるな。SwiftRefactor と、それをXcodeから呼び出すための EditorExtension が生まれてた/// ## Before /// /// if let foo = foo { /// // ... /// } /// /// /// ## After /// /// if let foo { /// // ... /// } (edited)public protocol RefactoringProvider { /// The type of syntax this refactoring action accepts. associatedtype Input: SyntaxProtocol = SourceFileSyntax /// The type of syntax this refactoring action returns. associatedtype Output: SyntaxProtocol = SourceFileSyntax /// Contextual information used by the refactoring action. associatedtype Context = Void /// Perform the refactoring action on the provided syntax node. /// /// - Parameters: /// - syntax: The syntax to transform. /// - context: Contextual information used by the refactoring action. /// - Returns: The result of applying the refactoring action, or `nil` if the /// action could not be performed. static func refactor(syntax: Self.Input, in context: Self.Context) -> Self.Output? } なんか入力と出力がワンファイルな雰囲気(Output = SourceFileSyntax)はあるけどどうなんだろう (edited)Package.swift を自動編集するコードをSwiftSyntax上で組もうとしてるけど思いの外難しい (edited)SyntaxRewriter.visitChildren は RawSyntax とか使ってるのでコピペできないnode.children は取れるけど、それを map { visit($0) } した配列からノードに戻す方法がないFunctionCallExprSyntaxBuilder みたいな具体的なbuilderを使って子ノードを具体的に置き換えていくコードを明示的に書かないといけない?## Syntax Nodes A syntax tree is made up of elements called syntax nodes. To help categorize and organize syntax nodes, SwiftSyntax defines a hierarchy of protocols for syntax nodes. At the top of this hierarchy is the ``SyntaxProtocol`` protocol. To represent related categories of syntax, ``SyntaxProtocol`` is further refined: - ``DeclSyntaxProtocol`` for declarations like `struct`s, `class`es, `enum`s and `protocol`s. - ``StmtSyntaxProtocol`` for statements like `if`, `switch`, and `do`. - ``ExprSyntaxProtocol`` for expressions like function calls, literals, and closures - ``TypeSyntaxProtocol`` for types like `Array<String>`, `[String: String]`, and `some Protocol` - ``PatternSyntaxProtocol`` for patterns like `case (_, let x)` Syntax nodes form the "branches" of the syntax tree, as they are generally high-level collections of one or more syntax nodes. Taken together, these branches form the syntactic structure of the source code. This structure is used by compilers and static analyzers to process source code at a high level. A special kind of syntax node is a ``SyntaxCollection``, which represents syntax with a variable number of children. For example, a code block value can contain zero or more statements in between a pair of braces. To represent these children, a ``CodeBlockSyntax`` value has a ``CodeBlockSyntax/statements`` accessor that returns a ``CodeBlockItemListSyntax`` value. The elements of this syntax collection are ``CodeBlockItemSyntax`` values. これいいな。こういう体系的な情報はドキュメントに書いてくれないとわからんから。できれば網羅して書いてほしいけど。There are two Rules of Trivia that you should obey when parsing or constructing new Syntax nodes: A token owns all of its trailing trivia up to, but not including, the next newline character. Looking backward in the text, a token owns all of the leading trivia up to and including the first newline character.0.50700.0 より 0.50700.1 のほうがいいと思いますー!✨0.xxx じゃないけど sem ver 準拠はしてるのかな"#!/bin/env swift" を解釈するようになった。Swiftをスクリプトっぽく動かすのが便利になるような機能が入るのかしら。@package(...) import Yams って感じらしい@package もSwiftSyntaxでパースできるようになったのかな? /// A script command, starting with '#!'. case shebang(String)Syntax.syntaxTextBytes のみが不正UTF8バイトシーケンス取得できるとおもいます。 https://github.com/apple/swift-syntax/blob/cb3f64d9d4f0efeb23cab8fe458e5195b8900089/Sources/SwiftSyntax/Syntax.swift#L553-L557Syntax.syntaxTextBytes のみが不正UTF8バイトシーケンス取得できるとおもいます。 https://github.com/apple/swift-syntax/blob/cb3f64d9d4f0efeb23cab8fe458e5195b8900089/Sources/SwiftSyntax/Syntax.swift#L553-L557 "#️⃣ がエスケープリテラルを閉じる "# として処理されてしまっている?# + variation selector + enclosing keycap らしいdouble quote + ascii pound 」の並びになっていて、エスケープリテラルの閉じカッコがあるようにみえる。 ゴミは右側に付いてるんだ、これは難しいな 先読みしないとわからないぞ。 (edited)⃣ ↑(単体の囲み文字) がどうしてもエラーを引き起こしてしまう (edited)let 🇯🇵 = "Japan" let 😕🏻🦰 = "first character is not an `Emoji_Modifier_Base`" let #️⃣ = "Pound sign" // Compilation error 絵文字の変数名は使えるしおかしな合成文字も変数名にできるけど#️⃣は無理っていうのはなんか困る気がしないでもない。let # = が駄目だからかな 絵文字にも文字っぽいやつと記号っぽいやつがあるんすねlet ‼️ = "bikkuri" let ❓ = "hatena" let ❔ = "white hatena" はてなとビックリもだめだな。まあ一貫している気がする。<img src="https://emoji.discord.com/ABCDABCD" />|⌚|⭐|⺎|⽋|🇯🇵|🗿|🗿|豈|A|🚀| |ab|cd|ef|あ|い|う|え|お|12|34|5| |ab|cd|ef|あ|い|う|え|お|12|34|5| |⌚|⭐|⺎|⽋|🇯🇵|🗿|🗿|豈|A|🚀| |ab|cd|ef|あ|い|う|え|お|12|34|5| ただどうやっても絵文字が混ざった時点でどうしようもないことがわかった。\u{1234}みたいな形で表現しようかなあと考え中。PatternBindingSyntax.Accessor が enum になったりFunctionSignatureSyntax.parameter が .input になったりしているTypealiasDeclSyntax.initializer のオプショナルが取れてるwMissingType が入ってた。 (edited)debugDescriptionでツリー構造をアスキーアートで出力してくれるようになっってみやすくなったんだけど、そのタイミングで https://github.com/apple/swift-syntax/blob/a9cff1a33af9f5b1a9cc26a5d35049ffa3a3eda8/Sources/SwiftSyntax/Syntax.swift#L609-L612
debugDescriptionが見やすくなったからMirrorはむしろ邪魔だよねっていうことでMirrorを無くしたんだけどそれはそれですごい決断だなって思った。私としてはMirrorもあったほうがMirror使いたいときにいいと思うんだけど。let a = 1 let b = 2
let a = 1 let b = 2assertionFailure(""" First line Second line """) 前見つけた問題は上のような複数行文字列リテラルの中の空行をインデントするところが間違っててコンパイルエラーが起こるというものでした。(自動フォーマットで使われてるフォーマッタはインデントもする) ただ、これはフォーマットしなかったら(テキストに出力しなかったら)起こらないはずなんですよ。 (edited)unexpectedBetweenXXXandYYY としてパースされるなど、何らかの形で_そのまま_マクロ実装に渡ります。マクロ実装は文法エラーのある Syntax Tree を受け取りますが、前後になにか足したりするだけでその内容を扱わないのであれば、expected* がまたそのままテキスト化されてコンパイラに返り、コンパイラは 5.10 の swift-syntax でそれをパースすることによって、新しい文法が適切に解釈されるという形です。 (edited)unexpectedXXX などで表現できます。ExprSyntax("func foo() {}") もExprSyntaxとしてはパースエラーですが、それでもツリー生成はされます。あと SwfitSyntax は 入力テキストのバリデーションを行わないので 極端な例ですが IdentifierExprSyntax(identifier: TokenSyntax(.identifier("var value = 1"), presence: .present)) も通ります。
(edited)#if canImport(SwiftSyntax510) // code specific to swift-syntax version >= 510 #elseif canImport(SwiftSyntax509) // code to support swift-syntax version 509 #else // code for swift-syntax < 509. Not needed for macros since macros require swift-syntax >= 509. #endifSwiftSyntax の定義はどうなってるんだ? override func visit(_ node: IdentifierExprSyntax) -> ExprSyntax { if case .binaryOperator = node.identifier.tokenKind { return super.visit(node) } guard let parent = node.parent, parent.syntaxNodeType != FunctionCallExprSyntax.self else { return super.visit(node) } #if canImport(SwiftSyntax509) if let parent = node.parent, let memberAccess = parent.as(MemberAccessExprSyntax.self), memberAccess.declName == node { return super.visit(node) } if let parent = node.parent, parent.syntaxNodeType == KeyPathPropertyComponentSyntax.self { return super.visit(node) } #endif let column = graphemeColumn(node) return apply(ExprSyntax(super.visit(node)), column: column) } のように書けるところは差分で書けるようになってわかりやすくなるはず。registerNodeForIncrementalParse がミソっぽいけどよくわからない top levelのcode block itemと、declのmember block itemのパース単位で、開始トークンの位置を記録してる?っぽいけど、 どうやって問題のケースで巻き戻ってるんだろ@defineFoo() // 3. ここに飛んでしまう。`var aaa`に飛ばしたい struct S { var aaa: Int var aaaFoo: Int // 1. マクロで生えた } S().aaaFoo // 2. 使用箇所。ここでaaaFooにカーソル合わせて定義ジャンプする (edited).package( url: "https://github.com/apple/swift-syntax", "508.0.0"..<"510.0.0" ) SwiftSyntaxへの依存は範囲で書く、っていうのはその通りっぽいな。これからそうしよう。 https://www.pointfree.co/blog/posts/116-being-a-good-citizen-in-the-land-of-swiftsyntax#if canImport(SwiftSyntax509) と分岐できるようになって最小限で済むようになったのがちょっと前進、みたいな。
1-skipMacroValidationという方法もあるみたい。let str = """ foo bar """ 複数行文字列リテラル内部 開始""" の改行はその trailing trivia になり、また各行の改行は trivia ではなく トークンの一部としてパースされます。(リテラル内部最終行を除く) (edited)textSegment("/**/\n") じゃなくて/**/\n が トリプルクォートのtrailing triviaでも良い気がする" " って感じだけどそんな概念はないかwrintaro@rintaro-m1macbookpro swift-syntax % ./.build/debug/swift-parser-cli print-diags test.swift === test.swift:2 === 1 │ 2 │ let str = """/* foo */ │ ╰─ error: multi-line string literal content must begin on a new line 3 │ foo 4 │ なんで、ParserDiagnosticsではじかれる感じですね.package( url: "https://github.com/apple/swift-syntax", "508.0.0"..<"510.0.0" ) SwiftSyntaxへの依存は範囲で書く、っていうのはその通りっぽいな。これからそうしよう。 https://www.pointfree.co/blog/posts/116-being-a-good-citizen-in-the-land-of-swiftsyntax 下限 ..< 現在リリースされている最新版から 2 個先のメジャーバージョン という認識です. (edited)<510 で押さえたら、 510 の マイナス付きバージョンが含まれてしまうのか。 (edited)508.0.0 ..< 509.999 みたいな書き方がいいのか・・・? (edited)..<"600.0.0" になっているはずですね.だとしたら問題なかったです. 問題を混同してました.600.0.0 の prerelease が降ってきてしまうのは直接 swift-syntax に依存している場合じゃなくて swift-testing 経由で間接的に依存している場合でした.これは意図してそうなっているので問題なかったですね. https://github.com/apple/swift-testing/blob/0.8.0/Package.swift#L36 (edited)..<600.0.0 に対して 600.0.0-beta とかはマッチしませんでしたっけ? x-beta < x だからVersion の < の実装を読むと普通にマッチしそうに見えますが,実際に試してみると "510.0.0"..<"600.0.0" でも "510.0.0"..<"600.0.0-latest" でも "510.0.0"..<"600.0.1" でもマッチしなくて,"510.0.0"..<"600.0.1-latest" でようやくマッチしますね. https://github.com/apple/swift-package-manager/blob/4a6660ac95f4b2f88e1006f84576b0ca16343eb9/Sources/PackageDescription/Version.swift#L121
1"510.0.0"..<"600.0.1" だとマッチしなくて "510.0.0-latest"..<"600.0.1" だとマッチしますね.なんかバージョン比較のロジックに欠陥があるように見えます.true だったんで,Range<Version> 自体は問題なくて,何か SwiftPM が余計なことをしてそうですね. assert(Version("600.0.0-beta") < Version("600.0.0")) assert(Version("510.0.0") <= Version("600.0.0-beta")) assert((Version("510.0.0")..<Version("600.0.0")).contains(Version("600.0.0-beta"))) assert((Version("510.0.0")..<Version("600.0.0")).contains(Version("600.0.0-prerelease-2024-05-07")))Version が使われていたんでそっちも覗いてみたら,こいつが犯人っぽいですね.なぜこんなルールにしたのだろうか... https://github.com/apple/swift-tools-support-core/blob/b170d46b94d6c1cd91db97d2e3a1e0bdb5b79a24/Sources/TSCUtility/Version.swift#L347-L360 (edited)
10.56.0からswift-syntaxの600.0.0-prerelease-2024-07-24を使うようになってて、クロスビルド(mainツールチェインで5.10ツールチェイン同梱sdkを使う)しようとすると、-swift-version 6が5.10ツールチェインへ渡されるようになってビルドが失敗する。-swift-version 5を渡すように設定すればビルドは通るのだけど、swift-syntaxのソースを見ても、どうして-swift-version 6が使われるのかが分からない。-swift-version 6 になるのは swift-tools-version: 6.0 以上に設定されている時だけだったはずで,swift-syntax の swift-tools-version は 5.7 で他の Package@*.swift も無いので. そうなると,Swift SDK を使っている場合特有の問題なのか,ビルドする際の他のフラグだとかが原因だったりしないかというのが気になりますね. https://github.com/swiftlang/swift-package-manager/pull/7469swiftLanguageModes (swiftLanguageVersions) がない場合だけを指していたか-swift-version 6が使われるな。-swift-version 6でビルドされてる。 $ yq -P '.commands|with_entries(select(.value.args|join(" ")|contains("-swift-version 6")))|keys' .build/debug.yaml>commands-built-with-swift-version-6.ymlInheritanceClauseSyntax の中にとりあえず TypeSyntax を書いたけどエラーになって、 InheritedTypeSyntax が正解だったSwiftBasicFormat に indentationOfLine があって便利だvar を掘って 書き換えて組み立て直すのが大変だinout バインディングが欲しい elements.append( ArrayElementSyntax( leadingTrivia: [.newlines(1), .spaces(indent)], expression: ExprSyntax("\(raw: urlTypeName).self") ) ) members.insert( MemberBlockItemSyntax( leadingTrivia: [.newlines(1), .spaces(indent)], decl: DeclSyntax( "public var \(raw: varName): FrontPageEntry" ) ), at: insertIndex )StmtSyntax を構成してたけどlet のついてないただの代入文は expr が正解なんだ.indentationOfLine, .trimmedDescription, BasicFormat(initialIndentation:) などのSyntaxRewriter をオーバライドして関数ローカルに実装するときに、selfをキャプチャさせるためにinitとletをそのクラスに実装する部分が一番めんどくさかった~Escapable 宣言すると外の値を参照出来るようになれば便利かもしれないですね。今は class は ~Escapable サポート対象外なので SyntaxRewriter は難しそうですが。 (edited)ClosureSyntaxRewriter があったら便利かなと考えたんですが、 (edited)let rewritten = node.rewrite( funcDeclSyntax: { node in .. .} tokenSyntax: { token in ... } ) みたいなのだったらnonescapingでいいんだろうけど、200+ のdefaulted引数きついな笑 (edited)
1foo: bar の配列を作りたいけど
1parser.parseFoo が対応してんのかLabeledExprSyntax もこれは対応を追加できそうだ。
1{En,De}codable protocol を実装させるわけじゃなくて完全独自のエンコード・デコード API を生成しているということですかね? (edited)
1guard case let .simple("Result", (successType, failureType))? = destructure(returnType) else { throw MacroError("Invalid return type") }
1
1#elif で空のPlatformMutex実装をつっこんでいただければ良いかなと思います。それか threads.h ありな環境なら #elif __has_include(<threads.h>) で mtx_t での実装もありかも https://github.com/swiftlang/swift-syntax/blob/56a746db8ffb4f864f6df82993bf46f47f95b766/Sources/_SwiftSyntaxCShims/PlatformMutex.c#L83-L85#elif で空のPlatformMutex実装をつっこんでいただければ良いかなと思います。 AvailableInProd が false な機能なのに...)<602 だconformingTo protocols: [TypeSyntax], の方を使うとSwiftSyntaxの下限のどこが切れるのかがよくわかんないなwarning: 'swift-syntax': found 1 file(s) which are unhandled; explicitly declare them as resources or exclude from the target ***/.build/checkouts/swift-syntax/Sources/SwiftLexicalLookup/CMakeLists.txt (edited)
1