Skip to content

Commit 2e03eac

Browse files
authored
[WIP] Re-apply "SwiftSyntax: Teach SwiftSyntax to use SourceKitd to serialize syntax trees. (#14424)" (#14506)
After removing white space changes and attempting to configure dependencies correctly.
1 parent 157aebc commit 2e03eac

File tree

15 files changed

+582
-17
lines changed

15 files changed

+582
-17
lines changed

CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ set_property(GLOBAL PROPERTY JOB_POOLS local_jobs=${localhost_logical_cores})
1111
# Put linking in that category
1212
set_property(GLOBAL PROPERTY JOB_POOL_LINK local_jobs)
1313

14+
ENABLE_LANGUAGE(C)
15+
1416
# First include general CMake utilities.
1517
include(SwiftUtils)
1618
include(CheckSymbolExists)

test/SwiftSyntax/DeserializeFile.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import StdlibUnittest
77
import Foundation
88
import SwiftSyntax
9+
import SwiftLang
910

1011
func getInput(_ file: String) -> URL {
1112
var result = URL(fileURLWithPath: #file)
@@ -19,7 +20,7 @@ var DecodeTests = TestSuite("DecodeSyntax")
1920

2021
DecodeTests.test("Basic") {
2122
expectDoesNotThrow({
22-
let content = try SourceFileSyntax.encodeSourceFileSyntax(getInput("visitor.swift"))
23+
let content = try SwiftLang.parse(getInput("visitor.swift"))
2324
let source = try String(contentsOf: getInput("visitor.swift"))
2425
let parsed = try SourceFileSyntax.decodeSourceFileSyntax(content)
2526
expectEqual("\(parsed)", source)

test/SwiftSyntax/ParseFile.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
// REQUIRES: executable_test
33
// REQUIRES: OS=macosx
44
// REQUIRES: objc_interop
5-
// REQUIRES: rdar36740859
65

76
import Foundation
87
import StdlibUnittest
98
import SwiftSyntax
9+
import SwiftLang
1010

1111
var ParseFile = TestSuite("ParseFile")
1212

@@ -31,7 +31,8 @@ ParseFile.test("ParseSingleFile") {
3131
let currentFile = URL(fileURLWithPath: #file)
3232
expectDoesNotThrow({
3333
let currentFileContents = try String(contentsOf: currentFile)
34-
let parsed = try SourceFileSyntax.parse(currentFile)
34+
let parsed = try SourceFileSyntax.decodeSourceFileSyntax(try
35+
SwiftLang.parse(currentFile))
3536
expectEqual("\(parsed)", currentFileContents)
3637
})
3738
}

test/SwiftSyntax/VisitorTest.swift

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,10 @@
33
// REQUIRES: OS=macosx
44
// REQUIRES: objc_interop
55

6-
// FIXME: This test fails occassionally in CI with invalid json.
7-
// REQUIRES: disabled
8-
96
import StdlibUnittest
107
import Foundation
118
import SwiftSyntax
9+
import SwiftLang
1210

1311
func getInput(_ file: String) -> URL {
1412
var result = URL(fileURLWithPath: #file)
@@ -29,7 +27,8 @@ VisitorTests.test("Basic") {
2927
}
3028
}
3129
expectDoesNotThrow({
32-
let parsed = try SourceFileSyntax.parse(getInput("visitor.swift"))
30+
let parsed = try SourceFileSyntax.decodeSourceFileSyntax(try
31+
SwiftLang.parse(getInput("visitor.swift")))
3332
let counter = FuncCounter()
3433
let hashBefore = parsed.hashValue
3534
counter.visit(parsed)

test/lit.cfg

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,6 +286,7 @@ else:
286286
test_resource_dir = os.path.join(config.swift_lib_dir, 'swift')
287287
resource_dir_opt = ""
288288
stdlib_resource_dir_opt = resource_dir_opt
289+
sourcekitd_framework_dir = config.swift_lib_dir
289290
lit_config.note('Using resource dir: ' + test_resource_dir)
290291

291292
# Parse the variant triple.
@@ -670,12 +671,13 @@ if run_vendor == 'apple':
670671
(run_cpu, run_os, run_vers, clang_mcp_opt))
671672

672673
config.target_build_swift = (
673-
"%s %s %s -F %s -Xlinker -rpath -Xlinker %s %s %s %s %s"
674+
"%s %s %s -F %s -Xlinker -rpath -Xlinker %s %s %s %s %s -F %s -Xlinker -rpath -Xlinker %s"
674675
% (xcrun_prefix, config.swiftc, target_options,
675676
extra_frameworks_dir, extra_frameworks_dir,
676677
sdk_overlay_linker_opt, config.swift_test_options,
677678
config.swift_driver_test_options,
678-
swift_execution_tests_extra_flags))
679+
swift_execution_tests_extra_flags, sourcekitd_framework_dir,
680+
sourcekitd_framework_dir))
679681
config.target_run = ""
680682

681683
if 'interpret' in lit_config.params:

tools/CMakeLists.txt

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,14 @@
1+
include(CheckIncludeFiles)
2+
check_include_files("xpc/xpc.h" HAVE_XPC_H)
3+
4+
swift_is_installing_component(sourcekit-inproc SOURCEKIT_INSTALLING_INPROC)
5+
6+
if(HAVE_XPC_H AND SWIFT_BUILD_SOURCEKIT AND NOT SOURCEKIT_INSTALLING_INPROC)
7+
set(BUILD_SOURCEKIT_XPC_SERVICE TRUE)
8+
else()
9+
set(BUILD_SOURCEKIT_XPC_SERVICE FALSE)
10+
endif()
11+
112
# Add generated libSyntax headers to global dependencies.
213
list(APPEND LLVM_COMMON_DEPENDS swift-syntax-generated-headers)
314

@@ -16,19 +27,24 @@ add_swift_tool_subdirectory(swift-api-digester)
1627
add_swift_tool_subdirectory(swift-syntax-test)
1728
add_swift_tool_subdirectory(swift-refactor)
1829

30+
if(SWIFT_BUILD_STDLIB AND SWIFT_BUILD_SDK_OVERLAY)
31+
set(BUILD_FOUNDATION TRUE)
32+
else()
33+
set(BUILD_FOUNDATION FALSE)
34+
endif()
35+
1936
if(SWIFT_BUILD_SOURCEKIT)
2037
add_swift_tool_subdirectory(SourceKit)
2138
endif()
2239

23-
2440
if(SWIFT_HOST_VARIANT STREQUAL "macosx")
2541
# Only build Darwin-specific tools when deploying to OS X.
2642
add_swift_tool_subdirectory(swift-stdlib-tool)
2743

2844
# SwiftSyntax depends on both the standard library (because it's a
2945
# Swift module), and the SDK overlays (because it depends on Foundation).
3046
# Ensure we only build SwiftSyntax when we're building both.
31-
if(SWIFT_BUILD_STDLIB AND SWIFT_BUILD_SDK_OVERLAY)
47+
if(BUILD_FOUNDATION)
3248
add_subdirectory(SwiftSyntax)
3349
endif()
3450
endif()

tools/SourceKit/CMakeLists.txt

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ configure_file(
2424
set(SOURCEKIT_DEPLOYMENT_OS "${SWIFT_HOST_VARIANT}")
2525
set(SOURCEKIT_DEPLOYMENT_TARGET "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_DEPLOYMENT_VERSION}")
2626

27-
swift_is_installing_component(sourcekit-inproc SOURCEKIT_INSTALLING_INPROC)
28-
2927
if("${CMAKE_SYSTEM_NAME}" STREQUAL "Darwin" AND NOT CMAKE_CROSSCOMPILING)
3028
set(CMAKE_OSX_SYSROOT "${SWIFT_SDK_${SWIFT_HOST_VARIANT_SDK}_PATH}")
3129
set(CMAKE_OSX_ARCHITECTURES "${SWIFT_HOST_VARIANT_ARCH}")

tools/SourceKit/tools/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,6 @@ if(HAVE_UNICODE_LIBEDIT)
1010
add_swift_tool_subdirectory(sourcekitd-repl)
1111
endif()
1212
add_swift_tool_subdirectory(complete-test)
13+
if(BUILD_FOUNDATION)
14+
add_subdirectory(SwiftSourceKitClient)
15+
endif()
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
set(EXTRA_COMPILE_FLAGS "-F" "${SWIFT_LIBRARY_OUTPUT_INTDIR}")
2+
set(EXTRA_LINKER_FLAGS "-Xlinker" "-rpath" "-Xlinker" "${SWIFT_LIBRARY_OUTPUT_INTDIR}"
3+
"-Xlinker" "-F" "-Xlinker" "${SWIFT_LIBRARY_OUTPUT_INTDIR}")
4+
5+
add_swift_library(swiftSwiftLang SHARED
6+
SwiftLang.swift
7+
SourceKitdClient.swift
8+
SourceKitdRequest.swift
9+
SourceKitdResponse.swift
10+
SourceKitdUID.swift
11+
12+
DEPENDS sourcekitd-test
13+
PRIVATE_LINK_LIBRARIES sourcekitd
14+
SWIFT_COMPILE_FLAGS ${EXTRA_COMPILE_FLAGS}
15+
LINK_FLAGS ${EXTRA_LINKER_FLAGS}
16+
SWIFT_MODULE_DEPENDS Foundation
17+
INSTALL_IN_COMPONENT sourcekit-xpc-service
18+
TARGET_SDKS OSX
19+
IS_STDLIB)
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//===--------------------- SourceKitdClient.swift -------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
// This file provides a wrapper of SourceKitd service.
13+
//===----------------------------------------------------------------------===//
14+
15+
import sourcekitd
16+
import Foundation
17+
18+
public class SourceKitdService {
19+
20+
public init() {
21+
sourcekitd_initialize()
22+
}
23+
deinit {
24+
sourcekitd_shutdown()
25+
}
26+
public func sendSyn(request: SourceKitdRequest) -> SourceKitdResponse {
27+
return SourceKitdResponse(resp: sourcekitd_send_request_sync(request.rawRequest))
28+
}
29+
}
Lines changed: 154 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,154 @@
1+
//===--------------- SourceKitdRequest.swift ------------------------------===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2014 - 2018 Apple Inc. and the Swift project authors
6+
// Licensed under Apache License v2.0 with Runtime Library Exception
7+
//
8+
// See https://swift.org/LICENSE.txt for license information
9+
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
10+
//
11+
//===----------------------------------------------------------------------===//
12+
// This file provides a convenient way to build a sourcekitd request.
13+
//===----------------------------------------------------------------------===//
14+
15+
import sourcekitd
16+
17+
public struct SourceKitdRequest: CustomStringConvertible {
18+
19+
public class Dictionary: CustomStringConvertible {
20+
let dict: sourcekitd_object_t
21+
22+
public init() {
23+
dict = sourcekitd_request_dictionary_create(nil, nil, 0)
24+
}
25+
26+
deinit {
27+
sourcekitd_request_release(UnsafeMutableRawPointer(dict))
28+
}
29+
30+
public func add(_ key: SourceKitdUID, value: String) {
31+
sourcekitd_request_dictionary_set_string(dict, key.uid, value)
32+
}
33+
34+
public func add(_ key: SourceKitdUID, value: Int) {
35+
sourcekitd_request_dictionary_set_int64(dict, key.uid, Int64(value))
36+
}
37+
38+
public func add(_ key: SourceKitdUID, value: SourceKitdUID) {
39+
sourcekitd_request_dictionary_set_uid(dict, key.uid, value.uid)
40+
}
41+
42+
public func add(_ key: SourceKitdUID, value: Array) {
43+
sourcekitd_request_dictionary_set_value(dict, key.uid, value.arr)
44+
}
45+
46+
public func add(_ key: SourceKitdUID, value: Dictionary) {
47+
sourcekitd_request_dictionary_set_value(dict, key.uid, value.dict)
48+
}
49+
50+
public func add(_ key: SourceKitdUID, value: Bool) {
51+
sourcekitd_request_dictionary_set_int64(dict, key.uid, value ? 1 : 0)
52+
}
53+
54+
public var description: String {
55+
let utf8Str = sourcekitd_request_description_copy(dict)!
56+
let result = String(cString: utf8Str)
57+
free(utf8Str)
58+
return result
59+
}
60+
61+
}
62+
63+
public class Array: CustomStringConvertible {
64+
let arr: sourcekitd_object_t
65+
private let Append: Int = -1
66+
67+
public init() {
68+
arr = sourcekitd_request_array_create(nil, 0)
69+
}
70+
71+
deinit {
72+
sourcekitd_request_release(arr)
73+
}
74+
75+
public func add(_ value: String) {
76+
sourcekitd_request_array_set_string(arr, Append, value)
77+
}
78+
79+
public func add(_ value: Int) {
80+
sourcekitd_request_array_set_int64(arr, Append, Int64(value))
81+
}
82+
83+
public func add(_ value: SourceKitdUID) {
84+
sourcekitd_request_array_set_uid(arr, Append, value.uid)
85+
}
86+
87+
public func add(_ value: Dictionary) {
88+
sourcekitd_request_array_set_value(arr, Append, value.dict)
89+
}
90+
91+
public var description: String {
92+
let utf8Str = sourcekitd_request_description_copy(arr)!
93+
let result = String(cString: utf8Str)
94+
free(utf8Str)
95+
return result
96+
}
97+
98+
}
99+
100+
private let req = Dictionary()
101+
102+
public init(uid: SourceKitdUID) {
103+
req.add(SourceKitdUID.key_request, value: uid)
104+
}
105+
106+
public func addParameter(_ key: SourceKitdUID, value: String) {
107+
req.add(key, value: value)
108+
}
109+
110+
public func addParameter(_ key: SourceKitdUID, value: Int) {
111+
req.add(key, value: value)
112+
}
113+
114+
public func addParameter(_ key: SourceKitdUID, value: SourceKitdUID) {
115+
req.add(key, value: value)
116+
}
117+
118+
public func addArrayParameter(_ key: SourceKitdUID) -> Array {
119+
let arr = Array()
120+
req.add(key, value: arr)
121+
return arr
122+
}
123+
124+
public func addDictionaryParameter(_ key: SourceKitdUID) -> Dictionary {
125+
let dict = Dictionary()
126+
req.add(key, value: dict)
127+
return dict
128+
}
129+
130+
public var description: String {
131+
return req.description
132+
}
133+
134+
public var rawRequest: sourcekitd_object_t {
135+
return req.dict
136+
}
137+
138+
public func addCompilerArgsToRequest(_ compilerArguments: [String]?,
139+
_ bufferName: String? = nil) {
140+
let args = self.addArrayParameter(SourceKitdUID.key_compilerargs)
141+
142+
if let compilerArguments = compilerArguments {
143+
for argument in compilerArguments {
144+
switch argument {
145+
// Exclude some arguments which SourceKit doesn't want or need.
146+
case "-Xfrontend":
147+
break
148+
default:
149+
args.add(argument)
150+
}
151+
}
152+
}
153+
}
154+
}

0 commit comments

Comments
 (0)