Skip to content

Commit 537c386

Browse files
committed
Use the New Evaluator-Based Dependency Enumerator in the Dependency Verifier
1 parent bf8d541 commit 537c386

File tree

5 files changed

+60
-67
lines changed

5 files changed

+60
-67
lines changed

lib/Frontend/DependencyVerifier.cpp

Lines changed: 32 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -279,11 +279,9 @@ struct Obligation {
279279
/// in the referenced name trackers associated with that file.
280280
class DependencyVerifier {
281281
SourceManager &SM;
282-
const DependencyTracker &DT;
283282

284283
public:
285-
explicit DependencyVerifier(SourceManager &SM, const DependencyTracker &DT)
286-
: SM(SM), DT(DT) {}
284+
explicit DependencyVerifier(SourceManager &SM) : SM(SM) {}
287285

288286
bool verifyFile(const SourceFile *SF);
289287

@@ -338,11 +336,11 @@ class DependencyVerifier {
338336
}
339337

340338
private:
341-
StringRef copyDemangledTypeName(ASTContext &Ctx, StringRef str) {
342-
Demangle::DemangleOptions Opts;
343-
Opts.ShowPrivateDiscriminators = false;
344-
Opts.DisplayModuleNames = true;
345-
return Ctx.AllocateCopy(Demangle::demangleTypeAsString(str, Opts));
339+
StringRef copyQualifiedTypeName(ASTContext &Ctx, NominalTypeDecl *subject) {
340+
auto printOptions = PrintOptions();
341+
printOptions.FullyQualifiedTypes = true;
342+
auto key = subject->getDeclaredInterfaceType()->getString(printOptions);
343+
return Ctx.AllocateCopy(key);
346344
}
347345

348346
private:
@@ -428,60 +426,49 @@ bool DependencyVerifier::parseExpectations(
428426

429427
bool DependencyVerifier::constructObligations(const SourceFile *SF,
430428
ObligationMap &Obligations) {
431-
auto *tracker = SF->getConfiguredReferencedNameTracker();
432-
assert(tracker && "Constructed source file without referenced name tracker!");
433-
434429
auto &Ctx = SF->getASTContext();
435-
tracker->enumerateAllUses(
436-
/*includeIntrafileDeps*/ true, DT,
437-
[&](const fine_grained_dependencies::NodeKind kind, StringRef context,
438-
StringRef name, const bool isCascadingUse) {
439-
using NodeKind = fine_grained_dependencies::NodeKind;
440-
switch (kind) {
441-
case NodeKind::externalDepend:
442-
// We only care about the referenced name trackers for now. The set of
443-
// external dependencies is often quite a large subset of the SDK.
444-
return;
445-
case NodeKind::nominal:
446-
// Nominals duplicate member entries. We care about the member itself.
447-
return;
448-
case NodeKind::potentialMember: {
449-
auto key = copyDemangledTypeName(Ctx, context);
450-
auto nameCpy = Ctx.AllocateCopy(name);
430+
Ctx.evaluator.enumerateReferencesInFile(
431+
SF, [&](const auto &reference) {
432+
const auto isCascadingUse = reference.cascades;
433+
using NodeKind = evaluator::DependencyCollector::Reference::Kind;
434+
switch (reference.kind) {
435+
case NodeKind::Empty:
436+
case NodeKind::Tombstone:
437+
llvm_unreachable("Cannot enumerate dead dependency!");
438+
439+
case NodeKind::PotentialMember: {
440+
auto key = copyQualifiedTypeName(Ctx, reference.subject);
451441
Obligations.insert({Obligation::Key::forPotentialMember(key),
452-
{nameCpy, Expectation::Kind::PotentialMember,
442+
{"", Expectation::Kind::PotentialMember,
453443
isCascadingUse ? Expectation::Scope::Cascading
454444
: Expectation::Scope::Private}});
455445
}
456446
break;
457-
case NodeKind::member: {
458-
auto demContext = copyDemangledTypeName(Ctx, context);
447+
case NodeKind::UsedMember: {
448+
auto demContext = copyQualifiedTypeName(Ctx, reference.subject);
449+
auto name = reference.name.userFacingName();
459450
auto key = Ctx.AllocateCopy((demContext + "." + name).str());
460451
Obligations.insert({Obligation::Key::forMember(key),
461452
{key, Expectation::Kind::Member,
462453
isCascadingUse ? Expectation::Scope::Cascading
463454
: Expectation::Scope::Private}});
464455
}
465456
break;
466-
case NodeKind::dynamicLookup: {
467-
auto contextCpy = Ctx.AllocateCopy(context);
468-
auto key = Ctx.AllocateCopy(name);
457+
case NodeKind::Dynamic: {
458+
auto key = Ctx.AllocateCopy(reference.name.userFacingName());
469459
Obligations.insert({Obligation::Key::forDynamicMember(key),
470-
{contextCpy, Expectation::Kind::DynamicMember,
460+
{"", Expectation::Kind::DynamicMember,
471461
isCascadingUse ? Expectation::Scope::Cascading
472462
: Expectation::Scope::Private}});
473-
break;
474463
}
475-
case NodeKind::topLevel:
476-
case NodeKind::sourceFileProvide: {
477-
auto key = Ctx.AllocateCopy(name);
464+
break;
465+
case NodeKind::TopLevel: {
466+
auto key = Ctx.AllocateCopy(reference.name.userFacingName());
478467
Obligations.insert({Obligation::Key::forProvides(key),
479468
{key, Expectation::Kind::Provides,
480469
Expectation::Scope::None}});
481-
break;
482470
}
483-
case NodeKind::kindCount:
484-
llvm_unreachable("Given count node?");
471+
break;
485472
}
486473
});
487474

@@ -491,8 +478,6 @@ bool DependencyVerifier::constructObligations(const SourceFile *SF,
491478
bool DependencyVerifier::verifyObligations(
492479
const SourceFile *SF, const std::vector<Expectation> &ExpectedDependencies,
493480
ObligationMap &OM, llvm::StringMap<Expectation> &NegativeExpectations) {
494-
auto *tracker = SF->getConfiguredReferencedNameTracker();
495-
assert(tracker && "Constructed source file without referenced name tracker!");
496481
auto &diags = SF->getASTContext().Diags;
497482
for (auto &expectation : ExpectedDependencies) {
498483
const bool wantsCascade = expectation.isCascading();
@@ -645,21 +630,19 @@ bool DependencyVerifier::verifyFile(const SourceFile *SF) {
645630
// MARK: Main entrypoints
646631
//===----------------------------------------------------------------------===//
647632

648-
bool swift::verifyDependencies(SourceManager &SM, const DependencyTracker &DT,
649-
ArrayRef<FileUnit *> SFs) {
633+
bool swift::verifyDependencies(SourceManager &SM, ArrayRef<FileUnit *> SFs) {
650634
bool HadError = false;
651-
DependencyVerifier Verifier{SM, DT};
635+
DependencyVerifier Verifier{SM};
652636
for (const auto *FU : SFs) {
653637
if (const auto *SF = dyn_cast<SourceFile>(FU))
654638
HadError |= Verifier.verifyFile(SF);
655639
}
656640
return HadError;
657641
}
658642

659-
bool swift::verifyDependencies(SourceManager &SM, const DependencyTracker &DT,
660-
ArrayRef<SourceFile *> SFs) {
643+
bool swift::verifyDependencies(SourceManager &SM, ArrayRef<SourceFile *> SFs) {
661644
bool HadError = false;
662-
DependencyVerifier Verifier{SM, DT};
645+
DependencyVerifier Verifier{SM};
663646
for (const auto *SF : SFs) {
664647
HadError |= Verifier.verifyFile(SF);
665648
}

test/Incremental/Verifier/multi-file/Inputs/Base.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
open class OpenBase {} // expected-provides {{OpenBase}}
22
// expected-cascading-member {{main.OpenBase.init}}
3-
// expected-cascading-member {{main.OpenBase.deinit}}
3+
// expected-private-member {{main.OpenBase.deinit}}
44

55
public class PublicBase {} // expected-provides {{PublicBase}}
66
// expected-cascading-member {{main.PublicBase.init}}
7-
// expected-cascading-member {{main.PublicBase.deinit}}
7+
// expected-private-member {{main.PublicBase.deinit}}
88

99
internal class InternalBase {} // expected-provides {{InternalBase}}
1010
// expected-cascading-member {{main.InternalBase.init}}
11-
// expected-cascading-member {{main.InternalBase.deinit}}
11+
// expected-private-member {{main.InternalBase.deinit}}
1212

1313
fileprivate class FilePrivateBase {} // expected-provides {{FilePrivateBase}}
1414
// expected-cascading-member {{main.FilePrivateBase.init}}

test/Incremental/Verifier/multi-file/Inputs/Derived.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,19 @@ final public class OpenSubclass: OpenBase {} // expected-provides {{OpenSubclass
22
// expected-provides {{OpenBase}}
33
// expected-cascading-member {{main.OpenBase.init}}
44
// expected-cascading-member {{main.OpenSubclass.init}}
5-
// expected-cascading-member {{main.OpenSubclass.deinit}}
5+
// expected-private-member {{main.OpenSubclass.deinit}}
66

77
final public class PublicSubclass: PublicBase {} // expected-provides {{PublicSubclass}} expected-cascading-superclass {{main.PublicBase}}
88
// expected-provides {{PublicBase}}
99
// expected-cascading-member {{main.PublicBase.init}}
1010
// expected-cascading-member {{main.PublicSubclass.init}}
11-
// expected-cascading-member {{main.PublicSubclass.deinit}}
11+
// expected-private-member {{main.PublicSubclass.deinit}}
1212

1313
final internal class InternalSubclass: InternalBase {} // expected-provides {{InternalSubclass}} expected-cascading-superclass {{main.InternalBase}}
1414
// expected-provides {{InternalBase}}
1515
// expected-cascading-member {{main.InternalBase.init}}
1616
// expected-cascading-member {{main.InternalSubclass.init}}
17-
// expected-cascading-member {{main.InternalSubclass.deinit}}
17+
// expected-private-member {{main.InternalSubclass.deinit}}
1818

1919
public protocol PublicProtocol: PublicBaseProtocol {}
2020
// expected-provides {{PublicProtocol}}

test/Incremental/Verifier/single-file-private/AnyObject.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import Foundation
1515

1616
// expected-provides {{LookupFactory}}
1717
// expected-provides {{NSObject}}
18-
// expected-private-superclass {{__C.NSObject}}
18+
// expected-private-superclass {{ObjectiveC.NSObject}}
19+
// expected-private-conformance {{ObjectiveC.NSObjectProtocol}}
1920
// expected-private-conformance {{Foundation._KeyValueCodingAndObserving}}
2021
// expected-private-conformance {{Foundation._KeyValueCodingAndObservingPublishing}}
2122
// expected-private-conformance {{Swift.Hashable}}
@@ -30,14 +31,18 @@ import Foundation
3031
// expected-provides {{IntegerLiteralType}}
3132
// expected-provides {{FloatLiteralType}}
3233
// expected-provides {{Int}}
33-
// expected-private-member {{__C.NSObject.someMember}}
34-
// expected-private-member {{__C.NSObject.Int}}
34+
// expected-private-member {{ObjectiveC.NSObject.someMember}}
35+
// expected-private-member {{ObjectiveC.NSObject.Int}}
36+
// expected-private-member {{ObjectiveC.NSObjectProtocol.someMember}}
37+
// expected-private-member {{ObjectiveC.NSObjectProtocol.Int}}
3538
// expected-private-member {{main.LookupFactory.Int}}
3639
@objc var someMember: Int = 0
37-
// expected-private-member {{__C.NSObject.someMethod}}
40+
// expected-private-member {{ObjectiveC.NSObject.someMethod}}
41+
// expected-private-member {{ObjectiveC.NSObjectProtocol.someMethod}}
3842
@objc func someMethod() {}
3943

40-
// expected-private-member {{__C.NSObject.init}}
44+
// expected-private-member {{ObjectiveC.NSObject.init}}
45+
// expected-private-member {{ObjectiveC.NSObjectProtocol.init}}
4146
// expected-private-member {{main.LookupFactory.init}}
4247
// expected-private-member {{main.LookupFactory.deinit}}
4348
// expected-private-member {{main.LookupFactory.someMember}}
@@ -47,7 +52,7 @@ import Foundation
4752
// expected-private-member {{Swift.ExpressibleByNilLiteral.callAsFunction}}
4853
// expected-private-member {{Swift.CustomReflectable.callAsFunction}}
4954
// expected-private-member {{Swift._ObjectiveCBridgeable.callAsFunction}}
50-
// expected-private-member {{Swift.Optional.callAsFunction}}
55+
// expected-private-member {{Swift.Optional<Wrapped>.callAsFunction}}
5156
// expected-private-member {{Swift.CustomDebugStringConvertible.callAsFunction}}
5257
// expected-private-member {{Swift.Equatable.callAsFunction}}
5358
// expected-private-member {{Swift.Hashable.callAsFunction}}

test/Incremental/Verifier/single-file/AnyObject.swift

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,8 @@ import Foundation
1515

1616
// expected-provides {{LookupFactory}}
1717
// expected-provides {{NSObject}}
18-
// expected-private-superclass {{__C.NSObject}}
18+
// expected-private-superclass {{ObjectiveC.NSObject}}
19+
// expected-private-conformance {{ObjectiveC.NSObjectProtocol}}
1920
// expected-private-conformance {{Foundation._KeyValueCodingAndObserving}}
2021
// expected-private-conformance {{Foundation._KeyValueCodingAndObservingPublishing}}
2122
// expected-private-conformance {{Swift.Hashable}}
@@ -30,14 +31,18 @@ import Foundation
3031
// expected-provides {{IntegerLiteralType}}
3132
// expected-provides {{FloatLiteralType}}
3233
// expected-provides {{Int}}
33-
// expected-cascading-member {{__C.NSObject.someMember}}
34-
// expected-cascading-member {{__C.NSObject.Int}}
34+
// expected-cascading-member {{ObjectiveC.NSObject.someMember}}
35+
// expected-cascading-member {{ObjectiveC.NSObject.Int}}
36+
// expected-cascading-member {{ObjectiveC.NSObjectProtocol.someMember}}
37+
// expected-cascading-member {{ObjectiveC.NSObjectProtocol.Int}}
3538
// expected-cascading-member {{main.LookupFactory.Int}}
3639
@objc var someMember: Int = 0
37-
// expected-cascading-member {{__C.NSObject.someMethod}}
40+
// expected-cascading-member {{ObjectiveC.NSObject.someMethod}}
41+
// expected-cascading-member {{ObjectiveC.NSObjectProtocol.someMethod}}
3842
@objc func someMethod() {}
3943

40-
// expected-cascading-member {{__C.NSObject.init}}
44+
// expected-cascading-member {{ObjectiveC.NSObject.init}}
45+
// expected-cascading-member {{ObjectiveC.NSObjectProtocol.init}}
4146
// expected-cascading-member {{main.LookupFactory.init}}
4247
// expected-private-member {{main.LookupFactory.deinit}}
4348
// expected-cascading-member {{main.LookupFactory.someMember}}
@@ -47,7 +52,7 @@ import Foundation
4752
// expected-private-member {{Swift.ExpressibleByNilLiteral.callAsFunction}}
4853
// expected-private-member {{Swift.CustomReflectable.callAsFunction}}
4954
// expected-private-member {{Swift._ObjectiveCBridgeable.callAsFunction}}
50-
// expected-private-member {{Swift.Optional.callAsFunction}}
55+
// expected-private-member {{Swift.Optional<Wrapped>.callAsFunction}}
5156
// expected-private-member {{Swift.CustomDebugStringConvertible.callAsFunction}}
5257
// expected-private-member {{Swift.Equatable.callAsFunction}}
5358
// expected-private-member {{Swift.Hashable.callAsFunction}}

0 commit comments

Comments
 (0)