[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 ../temp
Undefined 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-crypto
Undefined 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/swift
swift-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.dylib
Xcode 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.dylib
dyld: loaded: <3D321011-1279-30C7-A9AE-FF13073508AD> /Users/omochi/github/omochi/SwiftTypeReader/.build/x86_64-apple-macosx/debug/SwiftSyntax.framework/Versions/A/Frameworks/lib_InternalSwiftSyntaxParser.dylib
SwiftSyntaxParserTest/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/swift
TOOLCHAINS=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コードだvar 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
UIColor(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 = 2
assertionFailure(""" 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. #endif
SwiftSyntax
の定義はどうなってるんだ? 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)
と分岐できるようになって最小限で済むようになったのがちょっと前進、みたいな。-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"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)0.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.yml