Skip to content

Commit 12a08ec

Browse files
authored
Revert "Simplify the signatures for Parser.parse()"
1 parent 8125de0 commit 12a08ec

File tree

10 files changed

+120
-51
lines changed

10 files changed

+120
-51
lines changed

Sources/SwiftOperators/SwiftOperators.docc/SwiftOperators.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ import SwiftParser
4545
import SwiftOperators
4646

4747
var opPrecedence = OperatorTable.standardOperators // Use the Swift standard library operators
48-
let parsed = Parser.parse(source: "x + y * z")
48+
let parsed = try Parser.parse(source: "x + y * z")
4949
dump(parsed) // contains SequenceExprSyntax(x, +, y, *, z)
5050
let folded = try opPrecedence.foldAll(parsed)
5151
dump(folded) // contains InfixOperatorExpr(x, +, InfixOperatorExpr(y, *, z))
@@ -65,12 +65,12 @@ let moreOperators =
6565
6666
infix operator **: ExponentiationPrecedence
6767
"""
68-
let parsedOperators = Parser.parse(source: moreOperators)
68+
let parsedOperators = try Parser.parse(source: moreOperators)
6969

7070
// Adds **, ExponentiationPrecedence to the set of known operators and precedence groups.
7171
try opPrecedence.addSourceFile(parsedOperators)
7272

73-
let parsed2 = Parser.parse(source: "b ** c ** d")
73+
let parsed2 = try Parser.parse(source: "b ** c ** d")
7474
dump(parsed2) // contains SequenceExprSyntax(b, **, c, **, d)
7575
let folded2 = try opPrecedence.foldAll(parsed2)
7676
dump(folded2) // contains InfixOperatorExpr(b, **, InfixOperatorExpr(c, **, d))

Sources/SwiftParser/Parser.swift

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,31 @@
1313
@_spi(RawSyntax) import SwiftSyntax
1414

1515
extension Parser {
16-
/// Parse the source code in the given string as Swift source file.
1716
public static func parse(
1817
source: String,
19-
parseTransition: IncrementalParseTransition? = nil
20-
) -> SourceFileSyntax {
18+
parseTransition: IncrementalParseTransition? = nil,
19+
filenameForDiagnostics: String = "",
20+
languageVersion: String? = nil,
21+
enableBareSlashRegexLiteral: Bool? = nil
22+
) throws -> SourceFileSyntax {
2123
var source = source
2224
source.makeContiguousUTF8()
23-
return source.withUTF8 { buffer in
24-
return parse(source: buffer, parseTransition: parseTransition)
25+
return try source.withUTF8 { buffer in
26+
return try parse(source: buffer,
27+
parseTransition: parseTransition,
28+
filenameForDiagnostics: filenameForDiagnostics,
29+
languageVersion: languageVersion,
30+
enableBareSlashRegexLiteral: enableBareSlashRegexLiteral)
2531
}
2632
}
2733

28-
/// Parse the source code in the given string as Swift source file.
2934
public static func parse(
3035
source: UnsafeBufferPointer<UInt8>,
31-
parseTransition: IncrementalParseTransition? = nil
32-
) -> SourceFileSyntax {
36+
parseTransition: IncrementalParseTransition? = nil,
37+
filenameForDiagnostics: String = "",
38+
languageVersion: String? = nil,
39+
enableBareSlashRegexLiteral: Bool? = nil
40+
) throws -> SourceFileSyntax {
3341
var parser = Parser(source)
3442
// Extended lifetime is required because `SyntaxArena` in the parser must
3543
// be alive until `Syntax(raw:)` retains the arena.

Sources/swift-parser-cli/swift-parser-cli.swift

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -83,13 +83,21 @@ class VerifyRoundTrip: ParsableCommand {
8383
abstract: "Verify that printing the parsed syntax tree produces the original source"
8484
)
8585

86-
init(sourceFile: String?) {
86+
init(sourceFile: String?, swiftVersion: String?, enableBareSlashRegex: Bool?) {
8787
self.sourceFile = sourceFile
88+
self.swiftVersion = swiftVersion
89+
self.enableBareSlashRegex = enableBareSlashRegex
8890
}
8991

9092
@Argument(help: "The source file that should be parsed; if omitted, use stdin")
9193
var sourceFile: String?
9294

95+
@Option(name: .long, help: "Interpret input according to a specific Swift language version number")
96+
var swiftVersion: String?
97+
98+
@Option(name: .long, help: "Enable or disable the use of forward slash regular-expression literal syntax")
99+
var enableBareSlashRegex: Bool?
100+
93101
@Flag(name: .long, help: "Perform sequence folding with the standard operators")
94102
var foldSequences: Bool = false
95103

@@ -109,15 +117,22 @@ class VerifyRoundTrip: ParsableCommand {
109117

110118
try source.withUnsafeBufferPointer { sourceBuffer in
111119
try Self.run(
112-
source: sourceBuffer, foldSequences: foldSequences
120+
source: sourceBuffer, swiftVersion: swiftVersion,
121+
enableBareSlashRegex: enableBareSlashRegex,
122+
foldSequences: foldSequences
113123
)
114124
}
115125
}
116126

117127
static func run(
118-
source: UnsafeBufferPointer<UInt8>, foldSequences: Bool
128+
source: UnsafeBufferPointer<UInt8>, swiftVersion: String?,
129+
enableBareSlashRegex: Bool?, foldSequences: Bool
119130
) throws {
120-
let tree = Parser.parse(source: source)
131+
let tree = try Parser.parse(
132+
source: source,
133+
languageVersion: swiftVersion,
134+
enableBareSlashRegexLiteral: enableBareSlashRegex
135+
)
121136

122137
let resultTree: Syntax
123138
if foldSequences {
@@ -143,14 +158,24 @@ class PrintDiags: ParsableCommand {
143158
@Argument(help: "The source file that should be parsed; if omitted, use stdin")
144159
var sourceFile: String?
145160

161+
@Option(name: .long, help: "Interpret input according to a specific Swift language version number")
162+
var swiftVersion: String?
163+
164+
@Option(name: .long, help: "Enable or disable the use of forward slash regular-expression literal syntax")
165+
var enableBareSlashRegex: Bool?
166+
146167
@Flag(name: .long, help: "Perform sequence folding with the standard operators")
147168
var foldSequences: Bool = false
148169

149170
func run() throws {
150171
let source = try getContentsOfSourceFile(at: sourceFile)
151172

152-
source.withUnsafeBufferPointer { sourceBuffer in
153-
let tree = Parser.parse(source: sourceBuffer)
173+
try source.withUnsafeBufferPointer { sourceBuffer in
174+
let tree = try Parser.parse(
175+
source: sourceBuffer,
176+
languageVersion: swiftVersion,
177+
enableBareSlashRegexLiteral: enableBareSlashRegex
178+
)
154179

155180
var diags = ParseDiagnosticsGenerator.diagnostics(for: tree)
156181
print(DiagnosticsFormatter.annotatedSource(tree: tree, diags: diags))
@@ -177,14 +202,24 @@ class PrintInitCall: ParsableCommand {
177202
@Argument(help: "The source file that should be parsed; if omitted, use stdin")
178203
var sourceFile: String?
179204

205+
@Option(name: .long, help: "Interpret input according to a specific Swift language version number")
206+
var swiftVersion: String?
207+
208+
@Option(name: .long, help: "Enable or disable the use of forward slash regular-expression literal syntax")
209+
var enableBareSlashRegex: Bool?
210+
180211
@Flag(name: .long, help: "Perform sequence folding with the standard operators")
181212
var foldSequences: Bool = false
182213

183214
func run() throws {
184215
let source = try getContentsOfSourceFile(at: sourceFile)
185216

186-
source.withUnsafeBufferPointer { sourceBuffer in
187-
var tree = Parser.parse(source: sourceBuffer)
217+
try source.withUnsafeBufferPointer { sourceBuffer in
218+
var tree = try Parser.parse(
219+
source: sourceBuffer,
220+
languageVersion: swiftVersion,
221+
enableBareSlashRegexLiteral: enableBareSlashRegex
222+
)
188223

189224
if foldSequences {
190225
tree = foldAllSequences(tree).0.as(SourceFileSyntax.self)!
@@ -206,14 +241,24 @@ class PrintTree: ParsableCommand {
206241
@Argument(help: "The source file that should be parsed; if omitted, use stdin")
207242
var sourceFile: String?
208243

244+
@Option(name: .long, help: "Interpret input according to a specific Swift language version number")
245+
var swiftVersion: String?
246+
247+
@Option(name: .long, help: "Enable or disable the use of forward slash regular-expression literal syntax")
248+
var enableBareSlashRegex: Bool?
249+
209250
@Flag(name: .long, help: "Perform sequence folding with the standard operators")
210251
var foldSequences: Bool = false
211252

212253
func run() throws {
213254
let source = try getContentsOfSourceFile(at: sourceFile)
214255

215-
source.withUnsafeBufferPointer { sourceBuffer in
216-
let tree = Parser.parse(source: sourceBuffer)
256+
try source.withUnsafeBufferPointer { sourceBuffer in
257+
let tree = try Parser.parse(
258+
source: sourceBuffer,
259+
languageVersion: swiftVersion,
260+
enableBareSlashRegexLiteral: enableBareSlashRegex
261+
)
217262

218263
let resultTree: Syntax
219264
if foldSequences {
@@ -238,6 +283,12 @@ class Reduce: ParsableCommand {
238283
@Argument(help: "The test case that should be reduced; if omitted, use stdin")
239284
var sourceFile: String?
240285

286+
@Option(name: .long, help: "Interpret input according to a specific Swift language version number")
287+
var swiftVersion: String?
288+
289+
@Option(name: .long, help: "Enable or disable the use of forward slash regular-expression literal syntax")
290+
var enableBareSlashRegex: Bool?
291+
241292
@Flag(name: .long, help: "Perform sequence folding with the standard operators")
242293
var foldSequences: Bool = false
243294

@@ -275,6 +326,16 @@ class Reduce: ParsableCommand {
275326
process.arguments = [
276327
"verify-round-trip", tempFileURL.path,
277328
]
329+
if let enableBareSlashRegex = enableBareSlashRegex {
330+
process.arguments! += [
331+
"--enable-bare-slash-regex", enableBareSlashRegex ? "true" : "false"
332+
]
333+
}
334+
if let swiftVersion = swiftVersion {
335+
process.arguments! += [
336+
"--swift-version", swiftVersion
337+
]
338+
}
278339
if foldSequences {
279340
process.arguments! += [ "--fold-sequences" ]
280341
}
@@ -311,8 +372,8 @@ class Reduce: ParsableCommand {
311372
private func runVerifyRoundTripInCurrentProcess(source: [UInt8]) throws -> Bool {
312373
do {
313374
try source.withUnsafeBufferPointer { sourceBuffer in
314-
try VerifyRoundTrip.run(
315-
source: sourceBuffer, foldSequences: foldSequences)
375+
try VerifyRoundTrip.run(source: sourceBuffer, swiftVersion: self.swiftVersion, enableBareSlashRegex: self.enableBareSlashRegex,
376+
foldSequences: foldSequences)
316377
}
317378
} catch {
318379
return false

Tests/PerformanceTest/ParsingPerformanceTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public class ParsingPerformanceTests: XCTestCase {
2626
measure {
2727
do {
2828
let source = try String(contentsOf: inputFile)
29-
_ = SwiftParser.Parser.parse(source: source)
29+
_ = try SwiftParser.Parser.parse(source: source)
3030
} catch {
3131
XCTFail(error.localizedDescription)
3232
}

Tests/SwiftDiagnosticsTest/DiagnosticsFormatterTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import SwiftParser
1616
final class DiagnosticsFormatterTests: XCTestCase {
1717

1818
func annotate(source: String) throws -> String {
19-
let tree = Parser.parse(source: source)
19+
let tree = try Parser.parse(source: source)
2020
let diags = ParseDiagnosticsGenerator.diagnostics(for: tree)
2121
return DiagnosticsFormatter.annotatedSource(tree: tree, diags: diags)
2222
}

Tests/SwiftOperatorsTest/OperatorTableTests.swift

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,12 @@ extension OperatorTable {
8080
_ fullyParenthesizedSource: String
8181
) throws {
8282
// Parse and fold the source we're testing.
83-
let parsed = Parser.parse(source: source)
83+
let parsed = try Parser.parse(source: source)
8484
let foldedSyntax = try foldAll(parsed)
8585
XCTAssertFalse(foldedSyntax.containsExprSequence)
8686

8787
// Parse and "fold" the parenthesized version.
88-
let parenthesizedParsed = Parser.parse(source: fullyParenthesizedSource)
88+
let parenthesizedParsed = try Parser.parse(source: fullyParenthesizedSource)
8989
let parenthesizedSyntax = ExplicitParenFolder().visit(parenthesizedParsed)
9090
XCTAssertFalse(parenthesizedSyntax.containsExprSequence)
9191

@@ -102,7 +102,7 @@ extension OperatorTable {
102102
public class OperatorPrecedenceTests: XCTestCase {
103103
func testLogicalExprsSingle() throws {
104104
let opPrecedence = OperatorTable.logicalOperators
105-
let parsed = Parser.parse(source: "x && y || w && v || z")
105+
let parsed = try Parser.parse(source: "x && y || w && v || z")
106106
let sequenceExpr =
107107
parsed.statements.first!.item.as(SequenceExprSyntax.self)!
108108
let foldedExpr = try opPrecedence.foldSingle(sequenceExpr)
@@ -118,7 +118,7 @@ public class OperatorPrecedenceTests: XCTestCase {
118118

119119
func testSwiftExprs() throws {
120120
let opPrecedence = OperatorTable.standardOperators
121-
let parsed = Parser.parse(source: "(x + y > 17) && x && y || w && v || z")
121+
let parsed = try Parser.parse(source: "(x + y > 17) && x && y || w && v || z")
122122
let sequenceExpr =
123123
parsed.statements.first!.item.as(SequenceExprSyntax.self)!
124124
let foldedExpr = try opPrecedence.foldSingle(sequenceExpr)
@@ -128,7 +128,7 @@ public class OperatorPrecedenceTests: XCTestCase {
128128

129129
func testNestedSwiftExprs() throws {
130130
let opPrecedence = OperatorTable.standardOperators
131-
let parsed = Parser.parse(source: "(x + y > 17) && x && y || w && v || z")
131+
let parsed = try Parser.parse(source: "(x + y > 17) && x && y || w && v || z")
132132
let foldedAll = try opPrecedence.foldAll(parsed)
133133
XCTAssertEqual("\(foldedAll)", "(x + y > 17) && x && y || w && v || z")
134134
XCTAssertFalse(foldedAll.containsExprSequence)
@@ -175,11 +175,11 @@ public class OperatorPrecedenceTests: XCTestCase {
175175
infix operator ||: LogicalDisjunctionPrecedence
176176
"""
177177

178-
let parsedOperatorPrecedence = Parser.parse(source: logicalOperatorSources)
178+
let parsedOperatorPrecedence = try Parser.parse(source: logicalOperatorSources)
179179
var opPrecedence = OperatorTable()
180180
try opPrecedence.addSourceFile(parsedOperatorPrecedence)
181181

182-
let parsed = Parser.parse(source: "x && y || w && v || z")
182+
let parsed = try Parser.parse(source: "x && y || w && v || z")
183183
let sequenceExpr =
184184
parsed.statements.first!.item.as(SequenceExprSyntax.self)!
185185
let foldedExpr = try opPrecedence.foldSingle(sequenceExpr)
@@ -204,7 +204,7 @@ public class OperatorPrecedenceTests: XCTestCase {
204204
}
205205
"""
206206

207-
let parsedOperatorPrecedence = Parser.parse(source: sources)
207+
let parsedOperatorPrecedence = try Parser.parse(source: sources)
208208

209209
var opPrecedence = OperatorTable()
210210
var errors: [OperatorError] = []
@@ -244,7 +244,7 @@ public class OperatorPrecedenceTests: XCTestCase {
244244
postfix operator*
245245
"""
246246

247-
let parsedOperatorPrecedence = Parser.parse(source: sources)
247+
let parsedOperatorPrecedence = try Parser.parse(source: sources)
248248

249249
var opPrecedence = OperatorTable()
250250
var errors: [OperatorError] = []
@@ -266,7 +266,7 @@ public class OperatorPrecedenceTests: XCTestCase {
266266
}
267267

268268
func testFoldErrors() throws {
269-
let parsedOperatorPrecedence = Parser.parse(source:
269+
let parsedOperatorPrecedence = try Parser.parse(source:
270270
"""
271271
precedencegroup A {
272272
associativity: none
@@ -294,7 +294,7 @@ public class OperatorPrecedenceTests: XCTestCase {
294294

295295
do {
296296
var errors: [OperatorError] = []
297-
let parsed = Parser.parse(source: "a + b * c")
297+
let parsed = try Parser.parse(source: "a + b * c")
298298
let sequenceExpr =
299299
parsed.statements.first!.item.as(SequenceExprSyntax.self)!
300300
_ = opPrecedence.foldSingle(sequenceExpr) { error in
@@ -313,7 +313,7 @@ public class OperatorPrecedenceTests: XCTestCase {
313313

314314
do {
315315
var errors: [OperatorError] = []
316-
let parsed = Parser.parse(source: "a / c")
316+
let parsed = try Parser.parse(source: "a / c")
317317
let sequenceExpr =
318318
parsed.statements.first!.item.as(SequenceExprSyntax.self)!
319319
_ = opPrecedence.foldSingle(sequenceExpr) { error in
@@ -332,7 +332,7 @@ public class OperatorPrecedenceTests: XCTestCase {
332332

333333
do {
334334
var errors: [OperatorError] = []
335-
let parsed = Parser.parse(source: "a + b - c")
335+
let parsed = try Parser.parse(source: "a + b - c")
336336
let sequenceExpr =
337337
parsed.statements.first!.item.as(SequenceExprSyntax.self)!
338338
_ = opPrecedence.foldSingle(sequenceExpr) { error in
@@ -354,7 +354,7 @@ public class OperatorPrecedenceTests: XCTestCase {
354354

355355
do {
356356
var errors: [OperatorError] = []
357-
let parsed = Parser.parse(source: "a ++ b - d")
357+
let parsed = try Parser.parse(source: "a ++ b - d")
358358
let sequenceExpr =
359359
parsed.statements.first!.item.as(SequenceExprSyntax.self)!
360360
_ = opPrecedence.foldSingle(sequenceExpr) { error in

Tests/SwiftParserTest/ParserTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ public class ParserTests: XCTestCase {
88
/// Run a single parse test.
99
func runParseTest(fileURL: URL, checkDiagnostics: Bool) throws {
1010
let fileContents = try Data(contentsOf: fileURL)
11-
let parsed = fileContents.withUnsafeBytes({ buffer in
12-
Parser.parse(source: buffer.bindMemory(to: UInt8.self))
11+
let parsed = try fileContents.withUnsafeBytes({ buffer in
12+
try Parser.parse(source: buffer.bindMemory(to: UInt8.self))
1313
})
1414
AssertDataEqualWithDiff(Data(parsed.syntaxTextBytes), fileContents,
1515
additionalInfo: "Failed in file \(fileURL)")

0 commit comments

Comments
 (0)