Skip to content

Commit a992917

Browse files
committed
[NFC][RequirementMachine] Rename some of the RequirementError::Kind cases,
add documentation for each case, and move RequirementError to lib/AST/RequirementMachine/Diagnostics.h.
1 parent 1f11250 commit a992917

File tree

4 files changed

+89
-57
lines changed

4 files changed

+89
-57
lines changed

include/swift/AST/Requirement.h

Lines changed: 0 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -124,55 +124,6 @@ struct StructuralRequirement {
124124
bool inferred = false;
125125
};
126126

127-
/// Represents an invalid requirement, such as `T: Int`.
128-
///
129-
/// Invalid requirements are recorded while computing the
130-
/// generic signature of a declaration, and diagnosed via
131-
/// \c diagnoseRequirementErrors .
132-
struct RequirementError {
133-
/// The kind of requirement error.
134-
enum class Kind {
135-
InvalidConformance,
136-
ConcreteTypeMismatch,
137-
NonTypeParameter,
138-
RedundantRequirement,
139-
} kind;
140-
141-
/// The invalid requirement.
142-
Requirement requirement;
143-
144-
SourceLoc loc;
145-
146-
private:
147-
RequirementError(Kind kind, Requirement requirement, SourceLoc loc)
148-
: kind(kind), requirement(requirement), loc(loc) {}
149-
150-
public:
151-
static RequirementError forInvalidConformance(Type subjectType,
152-
Type constraint,
153-
SourceLoc loc) {
154-
Requirement requirement(RequirementKind::Conformance, subjectType, constraint);
155-
return {Kind::InvalidConformance, requirement, loc};
156-
}
157-
158-
static RequirementError forConcreteTypeMismatch(Type type1,
159-
Type type2,
160-
SourceLoc loc) {
161-
Requirement requirement(RequirementKind::SameType, type1, type2);
162-
return {Kind::ConcreteTypeMismatch, requirement, loc};
163-
}
164-
165-
static RequirementError forNonTypeParameter(Requirement req,
166-
SourceLoc loc) {
167-
return {Kind::NonTypeParameter, req, loc};
168-
}
169-
170-
static RequirementError forRedundantRequirement(Requirement req,
171-
SourceLoc loc) {
172-
return {Kind::RedundantRequirement, req, loc};
173-
}
174-
};
175-
176127
} // end namespace swift
177128

178129
#endif
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//===--- Diagnostics.h - Requirement machine diagnostics --------*- C++ -*-===//
2+
//
3+
// This source file is part of the Swift.org open source project
4+
//
5+
// Copyright (c) 2021 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+
13+
#ifndef SWIFT_REQUIREMENT_DIAGNOSTICS_H
14+
#define SWIFT_REQUIREMENT_DIAGNOSTICS_H
15+
16+
#include "swift/AST/Requirement.h"
17+
#include "swift/AST/Type.h"
18+
19+
namespace swift {
20+
21+
namespace rewriting {
22+
23+
/// Represents an invalid requirement, such as `T: Int`.
24+
///
25+
/// Invalid requirements are recorded while computing the
26+
/// generic signature of a declaration, and diagnosed via
27+
/// \c diagnoseRequirementErrors .
28+
struct RequirementError {
29+
/// The kind of requirement error.
30+
enum class Kind {
31+
/// A constraint to a non-protocol, non-class type, e.g. T: Int.
32+
InvalidTypeRequirement,
33+
/// A type mismatch, e.g. Int == String.
34+
ConcreteTypeMismatch,
35+
/// A requirement proven to be false, e.g. Bool: Collection
36+
ConflictingRequirement,
37+
/// A redundant requirement, e.g. T == T.
38+
RedundantRequirement,
39+
} kind;
40+
41+
/// The invalid requirement.
42+
Requirement requirement;
43+
44+
SourceLoc loc;
45+
46+
private:
47+
RequirementError(Kind kind, Requirement requirement, SourceLoc loc)
48+
: kind(kind), requirement(requirement), loc(loc) {}
49+
50+
public:
51+
static RequirementError forInvalidTypeRequirement(Type subjectType,
52+
Type constraint,
53+
SourceLoc loc) {
54+
Requirement requirement(RequirementKind::Conformance, subjectType, constraint);
55+
return {Kind::InvalidTypeRequirement, requirement, loc};
56+
}
57+
58+
static RequirementError forConcreteTypeMismatch(Type type1,
59+
Type type2,
60+
SourceLoc loc) {
61+
Requirement requirement(RequirementKind::SameType, type1, type2);
62+
return {Kind::ConcreteTypeMismatch, requirement, loc};
63+
}
64+
65+
static RequirementError forConflictingRequirement(Requirement req,
66+
SourceLoc loc) {
67+
return {Kind::ConflictingRequirement, req, loc};
68+
}
69+
70+
static RequirementError forRedundantRequirement(Requirement req,
71+
SourceLoc loc) {
72+
return {Kind::RedundantRequirement, req, loc};
73+
}
74+
};
75+
76+
} // end namespace rewriting
77+
78+
} // end namespace swift
79+
80+
#endif

lib/AST/RequirementMachine/RequirementLowering.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ static void desugarSuperclassRequirement(Type subjectType,
135135
RequirementError::forRedundantRequirement(requirement, loc));
136136
} else {
137137
errors.push_back(
138-
RequirementError::forNonTypeParameter(requirement, loc));
138+
RequirementError::forConflictingRequirement(requirement, loc));
139139
}
140140

141141
return;
@@ -157,7 +157,7 @@ static void desugarLayoutRequirement(Type subjectType,
157157
RequirementError::forRedundantRequirement(requirement, loc));
158158
} else {
159159
errors.push_back(
160-
RequirementError::forNonTypeParameter(requirement, loc));
160+
RequirementError::forConflictingRequirement(requirement, loc));
161161
}
162162

163163
return;
@@ -193,7 +193,7 @@ static void desugarConformanceRequirement(Type subjectType, Type constraintType,
193193
auto *module = protoDecl->getParentModule();
194194
auto conformance = module->lookupConformance(subjectType, protoDecl);
195195
if (conformance.isInvalid()) {
196-
errors.push_back(RequirementError::forNonTypeParameter(
196+
errors.push_back(RequirementError::forConflictingRequirement(
197197
{RequirementKind::Conformance, subjectType, constraintType}, loc));
198198
return;
199199
}
@@ -303,9 +303,9 @@ static void realizeTypeRequirement(Type subjectType, Type constraintType,
303303
desugarSuperclassRequirement(subjectType, constraintType, loc, reqs, errors);
304304
} else {
305305
errors.push_back(
306-
RequirementError::forInvalidConformance(subjectType,
307-
constraintType,
308-
loc));
306+
RequirementError::forInvalidTypeRequirement(subjectType,
307+
constraintType,
308+
loc));
309309
return;
310310
}
311311

@@ -557,7 +557,7 @@ bool swift::rewriting::diagnoseRequirementErrors(
557557
continue;
558558

559559
switch (error.kind) {
560-
case RequirementError::Kind::InvalidConformance: {
560+
case RequirementError::Kind::InvalidTypeRequirement: {
561561
Type subjectType = error.requirement.getFirstType();
562562
Type constraint = error.requirement.getSecondType();
563563

@@ -607,7 +607,7 @@ bool swift::rewriting::diagnoseRequirementErrors(
607607
break;
608608
}
609609

610-
case RequirementError::Kind::NonTypeParameter: {
610+
case RequirementError::Kind::ConflictingRequirement: {
611611
ctx.Diags.diagnose(loc, diag::requires_not_suitable_archetype,
612612
error.requirement.getFirstType());
613613
diagnosedError = true;

lib/AST/RequirementMachine/RequirementLowering.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "llvm/ADT/DenseMap.h"
1919
#include "llvm/ADT/SmallVector.h"
2020
#include <vector>
21+
#include "Diagnostics.h"
2122
#include "RewriteContext.h"
2223
#include "Symbol.h"
2324
#include "Term.h"

0 commit comments

Comments
 (0)