1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2023 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
@_spi(RawSyntax) import SwiftSyntax
import XCTest
extension SyntaxProtocol {
subscript<S: SyntaxProtocol>(as type: S.Type) -> S {
get { self.as(S.self)! }
set { self = newValue.as(Self.self)! }
}
}
// Marked as `@unchecked Sendable` to work around rdar://130094927, which complains about `MultithreadingTests` not conforming to
// `Sendable`.
class MultithreadingTests: XCTestCase, @unchecked Sendable {
public func testPathological() {
let tuple = TupleTypeSyntax(
leftParen: .leftParenToken(),
elements: TupleTypeElementListSyntax([]),
rightParen: .rightParenToken()
)
DispatchQueue.concurrentPerform(iterations: 100) { _ in
XCTAssertEqual(tuple.leftParen, tuple.leftParen)
}
}
public func testConcurrentMutation() {
// 'base.member()'
let methodCall = FunctionCallExprSyntax(
calledExpression: MemberAccessExprSyntax(
base: DeclReferenceExprSyntax(
baseName: .identifier("base")
),
period: .periodToken(),
name: .identifier("member")
),
leftParen: .leftParenToken(),
arguments: LabeledExprListSyntax([]),
rightParen: .rightParenToken()
)
DispatchQueue.concurrentPerform(iterations: 100) { i in
var copied = methodCall
copied
.calledExpression[as: MemberAccessExprSyntax.self]
.base![as: DeclReferenceExprSyntax.self]
.baseName = .identifier("ident\(i)")
copied = copied.with(\.leadingTrivia, [.newlines(1)])
XCTAssertEqual(copied.description, "\nident\(i).member()")
}
}
public func testTwoAccesses() async {
let tuple = TupleTypeSyntax(
leftParen: .leftParenToken(),
elements: TupleTypeElementListSyntax([]),
rightParen: .rightParenToken()
)
let concurrentParens = await withTaskGroup(of: TokenSyntax.self) { taskGroup in
taskGroup.addTask { tuple.leftParen }
taskGroup.addTask { tuple.leftParen }
var parens: [TokenSyntax?] = []
for await paren in taskGroup {
parens.append(paren)
}
return parens
}
let final = tuple.leftParen
XCTAssertEqual(concurrentParens, [final, final])
}
}
|