Skip to content

Commit a386ffb

Browse files
authored
---
yaml --- r: 341991 b: refs/heads/rxwei-patch-1 c: 65ed4cb h: refs/heads/master i: 341989: 25b7aa6 341987: 7328e49 341983: d929c74
1 parent 32be2ec commit a386ffb

File tree

12 files changed

+220
-169
lines changed

12 files changed

+220
-169
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1015,7 +1015,7 @@ refs/tags/swift-DEVELOPMENT-SNAPSHOT-2018-08-18-a: b10b1fce14385faa6d44f6b933e95
10151015
refs/heads/rdar-43033749-fix-batch-mode-no-diags-swift-5.0-branch: a14e64eaad30de89f0f5f0b2a782eed7ecdcb255
10161016
refs/heads/revert-19006-error-bridging-integer-type: 8a9065a3696535305ea53fe9b71f91cbe6702019
10171017
refs/heads/revert-19050-revert-19006-error-bridging-integer-type: ecf752d54b05dd0a20f510f0bfa54a3fec3bcaca
1018-
refs/heads/rxwei-patch-1: ee2f39cc211d88e23b6665cb67e13e3f452a4d57
1018+
refs/heads/rxwei-patch-1: 65ed4cb4f7194907a18f9daf74092a54c6229e05
10191019
refs/heads/shahmishal-patch-1: e58ec0f7488258d42bef51bc3e6d7b3dc74d7b2a
10201020
refs/heads/typelist-existential: 4046359efd541fb5c72d69a92eefc0a784df8f5e
10211021
refs/tags/swift-4.2-DEVELOPMENT-SNAPSHOT-2018-08-20-a: 4319ba09e4fb8650ee86061075c74a016b6baab9

branches/rxwei-patch-1/benchmark/Package.swift

Lines changed: 62 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// swift-tools-version:4.2
1+
// swift-tools-version:5.0
22

33
import PackageDescription
44
import Foundation
@@ -9,10 +9,15 @@ unsupportedTests.insert("ObjectiveCBridging")
99
unsupportedTests.insert("ObjectiveCBridgingStubs")
1010
#endif
1111

12-
// This is a stop gap hack so we can edit benchmarks in Xcode.
13-
let singleSourceLibraries: [String] = {
12+
//===---
13+
// Single Source Libraries
14+
//
15+
16+
/// Return the source files in subDirectory that we will translate into
17+
/// libraries. Each source library will be compiled as its own module.
18+
func getSingleSourceLibraries(subDirectory: String) -> [String] {
1419
let f = FileManager.`default`
15-
let dirURL = URL(fileURLWithPath: "single-source").absoluteURL
20+
let dirURL = URL(fileURLWithPath: subDirectory)
1621
let fileURLs = try! f.contentsOfDirectory(at: dirURL,
1722
includingPropertiesForKeys: nil)
1823
return fileURLs.compactMap { (path: URL) -> String? in
@@ -25,27 +30,45 @@ let singleSourceLibraries: [String] = {
2530
return nil
2631
}
2732

28-
let s = String(c[0])
33+
let name = String(c[0])
2934

3035
// We do not support this test.
31-
if unsupportedTests.contains(s) {
36+
if unsupportedTests.contains(name) {
3237
return nil
3338
}
3439

35-
assert(s != "PrimsSplit")
36-
return s
40+
return name
3741
}
38-
}()
42+
}
43+
44+
var singleSourceLibraryDirs: [String] = []
45+
singleSourceLibraryDirs.append("single-source")
46+
47+
var singleSourceLibraries: [String] = singleSourceLibraryDirs.flatMap {
48+
getSingleSourceLibraries(subDirectory: $0)
49+
}
3950

40-
let multiSourceLibraries: [String] = {
51+
//===---
52+
// Multi Source Libraries
53+
//
54+
55+
func getMultiSourceLibraries(subDirectory: String) -> [(String, String)] {
4156
let f = FileManager.`default`
42-
let dirURL = URL(fileURLWithPath: "multi-source").absoluteURL
43-
let fileURLs = try! f.contentsOfDirectory(at: dirURL,
44-
includingPropertiesForKeys: nil)
45-
return fileURLs.map { (path: URL) -> String in
46-
return path.lastPathComponent
47-
}
48-
}()
57+
let dirURL = URL(string: subDirectory)!
58+
let subDirs = try! f.contentsOfDirectory(at: dirURL, includingPropertiesForKeys: nil)
59+
return subDirs.map { (subDirectory, $0.lastPathComponent) }
60+
}
61+
62+
var multiSourceLibraryDirs: [String] = []
63+
multiSourceLibraryDirs.append("multi-source")
64+
65+
var multiSourceLibraries: [(parentSubDir: String, name: String)] = multiSourceLibraryDirs.flatMap {
66+
getMultiSourceLibraries(subDirectory: $0)
67+
}
68+
69+
//===---
70+
// Products
71+
//
4972

5073
var products: [Product] = []
5174
products.append(.library(name: "TestsUtils", type: .static, targets: ["TestsUtils"]))
@@ -54,9 +77,15 @@ products.append(.library(name: "DriverUtils", type: .static, targets: ["DriverUt
5477
products.append(.library(name: "ObjectiveCTests", type: .static, targets: ["ObjectiveCTests"]))
5578
#endif
5679
products.append(.executable(name: "SwiftBench", targets: ["SwiftBench"]))
57-
products.append(.library(name: "PrimsSplit", type: .static, targets: ["PrimsSplit"]))
80+
5881
products += singleSourceLibraries.map { .library(name: $0, type: .static, targets: [$0]) }
59-
products += multiSourceLibraries.map { .library(name: $0, type: .static, targets: [$0]) }
82+
products += multiSourceLibraries.map {
83+
return .library(name: $0.name, type: .static, targets: [$0.name])
84+
}
85+
86+
//===---
87+
// Targets
88+
//
6089

6190
var targets: [Target] = []
6291
targets.append(.target(name: "TestsUtils", path: "utils", sources: ["TestsUtils.swift"]))
@@ -73,7 +102,7 @@ swiftBenchDeps.append(.target(name: "ObjectiveCTests"))
73102
#endif
74103
swiftBenchDeps.append(.target(name: "DriverUtils"))
75104
swiftBenchDeps += singleSourceLibraries.map { .target(name: $0) }
76-
swiftBenchDeps += multiSourceLibraries.map { .target(name: $0) }
105+
swiftBenchDeps += multiSourceLibraries.map { .target(name: $0.name) }
77106

78107
targets.append(
79108
.target(name: "SwiftBench",
@@ -92,20 +121,27 @@ var singleSourceDeps: [Target.Dependency] = [.target(name: "TestsUtils")]
92121
#if os(macOS) || os(iOS) || os(watchOS) || os(tvOS)
93122
singleSourceDeps.append(.target(name: "ObjectiveCTests"))
94123
#endif
95-
targets += singleSourceLibraries.map { x in
96-
return .target(name: x,
124+
125+
targets += singleSourceLibraries.map { name in
126+
return .target(name: name,
97127
dependencies: singleSourceDeps,
98128
path: "single-source",
99-
sources: ["\(x).swift"])
129+
sources: ["\(name).swift"])
100130
}
101-
targets += multiSourceLibraries.map { x in
102-
return .target(name: x,
131+
132+
targets += multiSourceLibraries.map { lib in
133+
return .target(
134+
name: lib.name,
103135
dependencies: [
104136
.target(name: "TestsUtils")
105137
],
106-
path: "multi-source/\(x)")
138+
path: lib.parentSubDir)
107139
}
108140

141+
//===---
142+
// Top Level Definition
143+
//
144+
109145
let p = Package(
110146
name: "swiftbench",
111147
products: products,

branches/rxwei-patch-1/benchmark/README.md

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
1-
Swift Benchmark Suite
2-
=====================
1+
# Swift Benchmark Suite
32

43
This directory contains the Swift Benchmark Suite.
54

6-
Running Swift Benchmarks
7-
------------------------
5+
## Running Swift Benchmarks
86

97
To run Swift benchmarks, pass the `--benchmark` flag to `build-script`. The
108
current benchmark results will be compared to the previous run's results if
@@ -16,8 +14,7 @@ impacting changes, and run the benchmarks again. Upon benchmark completion, the
1614
benchmark results for the development branch will be compared to the most
1715
recent benchmark results for `master`.
1816

19-
Building with build-script
20-
--------------------------
17+
## Building with build-script
2118

2219
By default, Swift benchmarks for OS X are compiled during the Swift build
2320
process. To build Swift benchmarks for additional platforms, pass the following
@@ -33,8 +30,7 @@ drivers dynamically link Swift standard library dylibs from a path
3330
relative to their run-time location (../lib/swift) so the standard
3431
library should be distributed alongside them.
3532

36-
Building Independently
37-
----------------------
33+
## Building Independently
3834

3935
To build the Swift benchmarks using only an Xcode installation: install an
4036
Xcode version with Swift support, install cmake 2.8.12, and ensure Xcode is
@@ -110,8 +106,7 @@ installed libraries instead, enable
110106
This will reflect the performance of the Swift standard library
111107
installed on the device, not the one included in the Swift root.
112108

113-
Using the Benchmark Driver
114-
--------------------------
109+
## Using the Benchmark Driver
115110

116111
### Usage
117112

@@ -154,17 +149,15 @@ You can use test numbers instead of test names like this:
154149
Test numbers are not stable in the long run, adding and removing tests from the
155150
benchmark suite will reorder them, but they are stable for a given build.
156151

157-
Using the Harness Generator
158-
---------------------------
152+
## Using the Harness Generator
159153

160154
`scripts/generate_harness/generate_harness.py` runs `gyb` to automate generation
161155
of some benchmarks.
162156

163157
** FIXME ** `gyb` should be invoked automatically during the
164158
build so that manually invoking `generate_harness.py` is not required.
165159

166-
Adding New Benchmarks
167-
---------------------
160+
## Adding New Benchmarks
168161

169162
The harness generator supports both single and multiple file tests.
170163

@@ -244,8 +237,8 @@ public func run_YourTestName(N: Int) {
244237
The current set of tags are defined by the `BenchmarkCategory` enum in
245238
`TestsUtils.swift` .
246239

247-
Testing the Benchmark Drivers
248-
-----------------------------
240+
## Testing the Benchmark Drivers
241+
249242
When working on tests, after the initial build
250243
````
251244
swift-source$ ./swift/utils/build-script -R -B

branches/rxwei-patch-1/include/swift/Index/Utils.h

Lines changed: 0 additions & 41 deletions
This file was deleted.

branches/rxwei-patch-1/include/swift/Sema/IDETypeChecking.h

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,24 @@ namespace swift {
241241
Optional<std::pair<Type, Type>>
242242
getRootAndResultTypeOfKeypathDynamicMember(SubscriptDecl *subscript,
243243
const DeclContext *DC);
244+
/// Collect all the protocol requirements that a given declaration can
245+
/// provide default implementations for. VD is a declaration in extension
246+
/// declaration. Scratch is the buffer to collect those protocol
247+
/// requirements.
248+
///
249+
/// \returns the slice of Scratch
250+
ArrayRef<ValueDecl*>
251+
canDeclProvideDefaultImplementationFor(ValueDecl* VD,
252+
llvm::SmallVectorImpl<ValueDecl*> &Scratch);
253+
254+
/// Get decls that the given decl overrides, protocol requirements that
255+
/// it serves as a default implementation of, and optionally protocol
256+
/// requirements it satisfies in a conforming class
257+
std::vector<ValueDecl*>
258+
collectAllOverriddenDecls(ValueDecl *VD,
259+
bool IncludeProtocolRequirements = true,
260+
bool Transitive = false);
261+
244262
}
245263

246264
#endif

branches/rxwei-patch-1/lib/IDE/IDETypeChecking.cpp

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -740,3 +740,69 @@ swift::collectExpressionType(SourceFile &SF,
740740
Walker.walk(SF);
741741
return Scratch;
742742
}
743+
744+
static Type getContextFreeInterfaceType(ValueDecl *VD) {
745+
if (auto AFD = dyn_cast<AbstractFunctionDecl>(VD)) {
746+
return AFD->getMethodInterfaceType();
747+
}
748+
return VD->getInterfaceType();
749+
}
750+
751+
ArrayRef<ValueDecl*> swift::
752+
canDeclProvideDefaultImplementationFor(ValueDecl* VD,
753+
llvm::SmallVectorImpl<ValueDecl*> &Scratch) {
754+
755+
// Skip decls that don't have valid names.
756+
if (!VD->getFullName())
757+
return {};
758+
759+
// Check if VD is from a protocol extension.
760+
auto P = VD->getDeclContext()->getExtendedProtocolDecl();
761+
if (!P)
762+
return {};
763+
764+
// Look up all decls in the protocol's inheritance chain for the ones with
765+
// the same name with VD.
766+
ResolvedMemberResult LookupResult =
767+
resolveValueMember(*P->getInnermostDeclContext(),
768+
P->getDeclaredInterfaceType(), VD->getFullName());
769+
770+
auto VDType = getContextFreeInterfaceType(VD);
771+
for (auto Mem : LookupResult.getMemberDecls(InterestedMemberKind::All)) {
772+
if (isa<ProtocolDecl>(Mem->getDeclContext())) {
773+
if (Mem->isProtocolRequirement() &&
774+
getContextFreeInterfaceType(Mem)->isEqual(VDType)) {
775+
// We find a protocol requirement VD can provide default
776+
// implementation for.
777+
Scratch.push_back(Mem);
778+
}
779+
}
780+
}
781+
return Scratch;
782+
}
783+
784+
std::vector<ValueDecl*> swift::
785+
collectAllOverriddenDecls(ValueDecl *VD, bool IncludeProtocolRequirements,
786+
bool Transitive) {
787+
std::vector<ValueDecl*> results;
788+
789+
if (auto Overridden = VD->getOverriddenDecl()) {
790+
results.push_back(Overridden);
791+
while (Transitive && (Overridden = Overridden->getOverriddenDecl()))
792+
results.push_back(Overridden);
793+
}
794+
795+
// Collect the protocol requirements this decl is a default impl for
796+
llvm::SmallVector<ValueDecl*, 2> Buffer;
797+
for (auto Req : canDeclProvideDefaultImplementationFor(VD, Buffer)) {
798+
results.push_back(Req);
799+
}
800+
801+
if (IncludeProtocolRequirements) {
802+
for (auto Satisfied : VD->getSatisfiedProtocolRequirements()) {
803+
results.push_back(Satisfied);
804+
}
805+
}
806+
807+
return results;
808+
}

branches/rxwei-patch-1/lib/Index/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,4 +4,5 @@ add_swift_host_library(swiftIndex STATIC
44
IndexRecord.cpp
55
IndexSymbol.cpp)
66
target_link_libraries(swiftIndex PRIVATE
7-
swiftAST)
7+
swiftAST
8+
swiftIDE)

0 commit comments

Comments
 (0)