diff --git a/SourceKitStressTester/Sources/StressTester/ActionGenerators.swift b/SourceKitStressTester/Sources/StressTester/ActionGenerators.swift index 6806918..3f3b2ff 100644 --- a/SourceKitStressTester/Sources/StressTester/ActionGenerators.swift +++ b/SourceKitStressTester/Sources/StressTester/ActionGenerators.swift @@ -495,7 +495,9 @@ private struct ActionToken { case .functionCallExpr: fallthrough case .subscriptExpr: fallthrough case .expressionSegment: - guard tupleElem.indexInParent != 0 else { return nil } + if tupleElem.parent?.as(TupleExprElementListSyntax.self)?.first == tupleElem { + return nil + } return ExpectedResult(name: SwiftName(base: token.textWithoutBackticks + ":", labels: []), kind: .reference) default: return nil diff --git a/SwiftEvolve/Package.swift b/SwiftEvolve/Package.swift index 7be3881..c77a4aa 100644 --- a/SwiftEvolve/Package.swift +++ b/SwiftEvolve/Package.swift @@ -41,7 +41,7 @@ let package = Package( ), .target( name: "SwiftEvolve", - dependencies: ["SwiftToolsSupport-auto", "SwiftSyntax", "SwiftSyntaxParser"], + dependencies: ["SwiftToolsSupport-auto", "SwiftSyntax", "SwiftParser"], linkerSettings: [.unsafeFlags(["-Xlinker", "-rpath", "-Xlinker", sourcekitSearchPath])] ), .testTarget( diff --git a/SwiftEvolve/Sources/SwiftEvolve/DeclContext.swift b/SwiftEvolve/Sources/SwiftEvolve/DeclContext.swift index ccf54a6..f7645c8 100644 --- a/SwiftEvolve/Sources/SwiftEvolve/DeclContext.swift +++ b/SwiftEvolve/Sources/SwiftEvolve/DeclContext.swift @@ -171,7 +171,7 @@ public extension Decl { public extension Decl where Self: DeclWithMembers { func lookupDirect(_ name: String) -> Decl? { - for item in members.members { + for item in memberBlock.members { guard let member = item.decl.as(Decl.self) else { continue } if member.name == name { return member diff --git a/SwiftEvolve/Sources/SwiftEvolve/Evolver.swift b/SwiftEvolve/Sources/SwiftEvolve/Evolver.swift index b76d91f..d60717c 100644 --- a/SwiftEvolve/Sources/SwiftEvolve/Evolver.swift +++ b/SwiftEvolve/Sources/SwiftEvolve/Evolver.swift @@ -18,12 +18,12 @@ import Foundation import SwiftSyntax struct Context { - var syntaxPath: [Int] = [] + var syntaxPath: [String] = [] var declContext = DeclContext() @discardableResult mutating func enter(_ node: Syntax) -> Bool { - syntaxPath.append(node.indexInParent) + syntaxPath.append(String(describing: node.keyPathInParent!)) if let node = node.as(Decl.self) { declContext.append(node) return true @@ -43,7 +43,7 @@ struct Context { } public class Evolver: SyntaxRewriter { - var plan: [URL: [[Int]: [PlannedEvolution]]] + var plan: [URL: [[String]: [PlannedEvolution]]] var url: URL! var context = Context() diff --git a/SwiftEvolve/Sources/SwiftEvolve/Planner.swift b/SwiftEvolve/Sources/SwiftEvolve/Planner.swift index 52996cc..320108f 100644 --- a/SwiftEvolve/Sources/SwiftEvolve/Planner.swift +++ b/SwiftEvolve/Sources/SwiftEvolve/Planner.swift @@ -21,7 +21,7 @@ import SwiftSyntax public struct PlannedEvolution: Codable { var sourceLocation: String var file: URL - var syntaxPath: [Int] + var syntaxPath: [String] var evolution: AnyEvolution } diff --git a/SwiftEvolve/Sources/SwiftEvolve/SwiftEvolveTool.swift b/SwiftEvolve/Sources/SwiftEvolve/SwiftEvolveTool.swift index 3ea6f72..4299743 100644 --- a/SwiftEvolve/Sources/SwiftEvolve/SwiftEvolveTool.swift +++ b/SwiftEvolve/Sources/SwiftEvolve/SwiftEvolveTool.swift @@ -16,7 +16,7 @@ import Foundation import SwiftSyntax -import SwiftSyntaxParser +import SwiftParser import TSCBasic public class SwiftEvolveTool { @@ -184,7 +184,7 @@ extension SwiftEvolveTool { return preparsed } - let parsed = try SyntaxParser.parse(URL(path)) + let parsed = Parser.parse(source: try String(contentsOf: URL(path))) parsedSourceFiles[path] = parsed return parsed } diff --git a/SwiftEvolve/Sources/SwiftEvolve/SyntaxExtensions.swift b/SwiftEvolve/Sources/SwiftEvolve/SyntaxExtensions.swift index 336d3f3..d6baf47 100644 --- a/SwiftEvolve/Sources/SwiftEvolve/SyntaxExtensions.swift +++ b/SwiftEvolve/Sources/SwiftEvolve/SyntaxExtensions.swift @@ -19,7 +19,7 @@ import SwiftSyntax import Foundation public protocol DeclWithMembers: DeclSyntaxProtocol { - var members: MemberDeclBlockSyntax { get set } + var memberBlock: MemberDeclBlockSyntax { get set } } extension ClassDeclSyntax: DeclWithMembers {} @@ -185,9 +185,8 @@ extension TypeSyntax { extension TokenKind { var needsSpace: Bool { - if isLexerClassifiedKeyword { return true } switch self { - case .identifier, .dollarIdentifier, .integerLiteral, .floatingLiteral, .keyword(.yield): + case .identifier, .dollarIdentifier, .integerLiteral, .floatingLiteral, .keyword: return true default: return false diff --git a/SwiftEvolve/Tests/SwiftEvolveTests/RegressionTests.swift b/SwiftEvolve/Tests/SwiftEvolveTests/RegressionTests.swift index e07e5a0..e5ed7fd 100644 --- a/SwiftEvolve/Tests/SwiftEvolveTests/RegressionTests.swift +++ b/SwiftEvolve/Tests/SwiftEvolveTests/RegressionTests.swift @@ -1,16 +1,16 @@ import XCTest import SwiftSyntax -import SwiftSyntaxParser +import SwiftParser import SwiftEvolve class RegressionTests: XCTestCase { var unusedRNG = UnusedGenerator() - func testUnshuffledDeclsStayInOrder() throws { + func testUnshuffledDeclsStayInOrder() { // Checks that we don't mess up the order of declarations we're not trying // to shuffle. In particular, if we store the properties in a Set or other // unordered collection, we could screw this up. - let code = try SyntaxParser.parse(source: + let code = Parser.parse(source: """ @_fixed_layout struct X { var p0: Int @@ -44,12 +44,12 @@ class RegressionTests: XCTestCase { } } - func testStoredIfConfigBlocksMemberwiseInitSynthesis() throws { + func testStoredIfConfigBlocksMemberwiseInitSynthesis() { do { // FIXME: Crashes when run in Xcode because of a version mismatch between // SwiftSyntax and the compiler it uses (specifically, how they represent // accessor blocks). Should pass in "env PATH=... swift build". - let code = try SyntaxParser.parse(source: + let code = Parser.parse(source: """ struct A { #if os(iOS) @@ -64,7 +64,7 @@ class RegressionTests: XCTestCase { XCTAssertThrowsError( try SynthesizeMemberwiseInitializerEvolution( - for: Syntax(decl.members.members), in: dc, using: &unusedRNG + for: Syntax(decl.memberBlock.members), in: dc, using: &unusedRNG ), "Should throw when a stored property is in a #if block" ) @@ -84,7 +84,7 @@ class RegressionTests: XCTestCase { } do { - let code = try SyntaxParser.parse(source: + let code = Parser.parse(source: """ struct B { var b1: Int @@ -99,7 +99,7 @@ class RegressionTests: XCTestCase { XCTAssertNoThrow( try SynthesizeMemberwiseInitializerEvolution( - for: Syntax(decl.members.members), in: dc, using: &unusedRNG + for: Syntax(decl.memberBlock.members), in: dc, using: &unusedRNG ), "Should not throw when properties are only non-stored" ) @@ -119,7 +119,7 @@ class RegressionTests: XCTestCase { } do { - let code = try SyntaxParser.parse(source: + let code = Parser.parse(source: """ struct C { #if os(iOS) @@ -135,7 +135,7 @@ class RegressionTests: XCTestCase { XCTAssertNoThrow( try SynthesizeMemberwiseInitializerEvolution( - for: Syntax(decl.members.members), in: dc, using: &unusedRNG + for: Syntax(decl.memberBlock.members), in: dc, using: &unusedRNG ), "Should not throw when there's an explicit init" ) diff --git a/SwiftEvolve/Tests/SwiftEvolveTests/ShuffleGenericRequirementsEvolutionTests.swift b/SwiftEvolve/Tests/SwiftEvolveTests/ShuffleGenericRequirementsEvolutionTests.swift index 3877186..c29088d 100644 --- a/SwiftEvolve/Tests/SwiftEvolveTests/ShuffleGenericRequirementsEvolutionTests.swift +++ b/SwiftEvolve/Tests/SwiftEvolveTests/ShuffleGenericRequirementsEvolutionTests.swift @@ -1,13 +1,13 @@ import XCTest import SwiftSyntax -import SwiftSyntaxParser +import SwiftParser import SwiftEvolve class ShuffleGenericRequirementsEvolutionTests: XCTestCase { var predictableRNG = PredictableGenerator(values: 1..<16) func testEvolution() throws { - let code = try SyntaxParser.parse(source: + let code = Parser.parse(source: """ func foo(_: T) where T: Hashable, T == Comparable {} """ @@ -27,8 +27,8 @@ class ShuffleGenericRequirementsEvolutionTests: XCTestCase { // "T == Comparable , T: Hashable") } - func testBypass() throws { - let code = try SyntaxParser.parse(source: + func testBypass() { + let code = Parser.parse(source: """ func foo(_: T) where T: Hashable, T == Comparable {} """ diff --git a/SwiftEvolve/Tests/SwiftEvolveTests/ShuffleMembersEvolutionTests.swift b/SwiftEvolve/Tests/SwiftEvolveTests/ShuffleMembersEvolutionTests.swift index bb3b2c5..940528e 100644 --- a/SwiftEvolve/Tests/SwiftEvolveTests/ShuffleMembersEvolutionTests.swift +++ b/SwiftEvolve/Tests/SwiftEvolveTests/ShuffleMembersEvolutionTests.swift @@ -1,13 +1,13 @@ import XCTest import SwiftSyntax -import SwiftSyntaxParser +import SwiftParser import SwiftEvolve class ShuffleMembersEvolutionTests: XCTestCase { var predictableRNG = PredictableGenerator(values: 0..<16) func testEnumCases() throws { - let code = try SyntaxParser.parse(source: + let code = Parser.parse(source: """ enum Foo { case a @@ -19,7 +19,7 @@ class ShuffleMembersEvolutionTests: XCTestCase { let decl = code.filter(whereIs: EnumDeclSyntax.self).first! let dc = DeclContext(declarationChain: [code, decl]) let evo = try ShuffleMembersEvolution( - for: Syntax(decl.members.members), in: dc, using: &predictableRNG + for: Syntax(decl.memberBlock.members), in: dc, using: &predictableRNG ) XCTAssertEqual(evo?.mapping.count, 3)