Skip to content

Commit a1d483f

Browse files
committed
AST: Move some code from ProtocolConformance.cpp to Effects.cpp / TypeCheckEffects.cpp
1 parent bb886a6 commit a1d483f

File tree

3 files changed

+73
-73
lines changed

3 files changed

+73
-73
lines changed

lib/AST/Effects.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "swift/AST/Effects.h"
1919
#include "swift/AST/Evaluator.h"
2020
#include "swift/AST/Decl.h"
21+
#include "swift/AST/ProtocolConformanceRef.h"
2122
#include "swift/AST/Type.h"
2223
#include "swift/AST/TypeCheckRequests.h"
2324
#include "llvm/ADT/ArrayRef.h"
@@ -70,4 +71,11 @@ void swift::simple_display(llvm::raw_ostream &out,
7071
out << "invalid";
7172
break;
7273
}
74+
}
75+
76+
bool ProtocolConformanceRef::classifyAsThrows() const {
77+
if (!isConcrete()) { return true; }
78+
return evaluateOrDefault(getRequirement()->getASTContext().evaluator,
79+
ProtocolConformanceRefClassifyAsThrowsRequest{ *this },
80+
true);
7381
}

lib/AST/ProtocolConformance.cpp

Lines changed: 0 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -186,79 +186,6 @@ ProtocolConformanceRef::getWitnessByName(Type type, DeclName name) const {
186186
return getConcrete()->getWitnessDeclRef(requirement);
187187
}
188188

189-
190-
static bool classifyRequirement(ModuleDecl *module,
191-
ProtocolConformance *reqConformance,
192-
ValueDecl *requiredFn) {
193-
auto declRef = reqConformance->getWitnessDeclRef(requiredFn);
194-
auto witnessDecl = cast<AbstractFunctionDecl>(declRef.getDecl());
195-
switch (witnessDecl->getRethrowingKind()) {
196-
case FunctionRethrowingKind::ByConformance: {
197-
auto substitutions = reqConformance->getSubstitutions(module);
198-
for (auto conformanceRef : substitutions.getConformances()) {
199-
if (conformanceRef.classifyAsThrows()) {
200-
return true;
201-
}
202-
}
203-
break;
204-
}
205-
case FunctionRethrowingKind::None:
206-
break;
207-
case FunctionRethrowingKind::Throws:
208-
return true;
209-
default:
210-
return true;
211-
}
212-
return false;
213-
}
214-
215-
// classify the type requirements of a given prottocol type with a function
216-
// requirement as throws or not. This will detect if the signature of the
217-
// function is throwing or not depending on associated types.
218-
static bool classifyTypeRequirement(ModuleDecl *module, Type protoType,
219-
ValueDecl *requiredFn,
220-
ProtocolConformance *conformance,
221-
ProtocolDecl *requiredProtocol) {
222-
auto reqProtocol = cast<ProtocolDecl>(requiredFn->getDeclContext());
223-
ProtocolConformance *reqConformance;
224-
225-
if(protoType->isEqual(reqProtocol->getSelfInterfaceType()) &&
226-
requiredProtocol == reqProtocol) {
227-
reqConformance = conformance;
228-
} else {
229-
auto reqConformanceRef =
230-
conformance->getAssociatedConformance(protoType, reqProtocol);
231-
if (!reqConformanceRef.isConcrete()) {
232-
return true;
233-
}
234-
reqConformance = reqConformanceRef.getConcrete();
235-
}
236-
237-
return classifyRequirement(module, reqConformance, requiredFn);
238-
}
239-
240-
bool
241-
ProtocolConformanceRefClassifyAsThrowsRequest::evaluate(
242-
Evaluator &evaluator, ProtocolConformanceRef conformanceRef) const {
243-
auto conformance = conformanceRef.getConcrete();
244-
auto requiredProtocol = conformanceRef.getRequirement();
245-
auto module = requiredProtocol->getModuleContext();
246-
for (auto req : requiredProtocol->getRethrowingRequirements()) {
247-
if (classifyTypeRequirement(module, req.first, req.second,
248-
conformance, requiredProtocol)) {
249-
return true;
250-
}
251-
}
252-
return false;
253-
}
254-
255-
bool ProtocolConformanceRef::classifyAsThrows() const {
256-
if (!isConcrete()) { return true; }
257-
return evaluateOrDefault(getRequirement()->getASTContext().evaluator,
258-
ProtocolConformanceRefClassifyAsThrowsRequest{ *this },
259-
true);
260-
}
261-
262189
void *ProtocolConformance::operator new(size_t bytes, ASTContext &context,
263190
AllocationArena arena,
264191
unsigned alignment) {

lib/Sema/TypeCheckEffects.cpp

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,71 @@ FunctionRethrowingKindRequest::evaluate(Evaluator &evaluator,
188188
return FunctionRethrowingKind::None;
189189
}
190190

191+
static bool classifyRequirement(ModuleDecl *module,
192+
ProtocolConformance *reqConformance,
193+
ValueDecl *requiredFn) {
194+
auto declRef = reqConformance->getWitnessDeclRef(requiredFn);
195+
auto witnessDecl = cast<AbstractFunctionDecl>(declRef.getDecl());
196+
switch (witnessDecl->getRethrowingKind()) {
197+
case FunctionRethrowingKind::ByConformance: {
198+
auto substitutions = reqConformance->getSubstitutions(module);
199+
for (auto conformanceRef : substitutions.getConformances()) {
200+
if (conformanceRef.classifyAsThrows()) {
201+
return true;
202+
}
203+
}
204+
break;
205+
}
206+
case FunctionRethrowingKind::None:
207+
break;
208+
case FunctionRethrowingKind::Throws:
209+
return true;
210+
default:
211+
return true;
212+
}
213+
return false;
214+
}
215+
216+
// classify the type requirements of a given protocol type with a function
217+
// requirement as throws or not. This will detect if the signature of the
218+
// function is throwing or not depending on associated types.
219+
static bool classifyTypeRequirement(ModuleDecl *module, Type protoType,
220+
ValueDecl *requiredFn,
221+
ProtocolConformance *conformance,
222+
ProtocolDecl *requiredProtocol) {
223+
auto reqProtocol = cast<ProtocolDecl>(requiredFn->getDeclContext());
224+
ProtocolConformance *reqConformance;
225+
226+
if(protoType->isEqual(reqProtocol->getSelfInterfaceType()) &&
227+
requiredProtocol == reqProtocol) {
228+
reqConformance = conformance;
229+
} else {
230+
auto reqConformanceRef =
231+
conformance->getAssociatedConformance(protoType, reqProtocol);
232+
if (!reqConformanceRef.isConcrete()) {
233+
return true;
234+
}
235+
reqConformance = reqConformanceRef.getConcrete();
236+
}
237+
238+
return classifyRequirement(module, reqConformance, requiredFn);
239+
}
240+
241+
bool
242+
ProtocolConformanceRefClassifyAsThrowsRequest::evaluate(
243+
Evaluator &evaluator, ProtocolConformanceRef conformanceRef) const {
244+
auto conformance = conformanceRef.getConcrete();
245+
auto requiredProtocol = conformanceRef.getRequirement();
246+
auto module = requiredProtocol->getModuleContext();
247+
for (auto req : requiredProtocol->getRethrowingRequirements()) {
248+
if (classifyTypeRequirement(module, req.first, req.second,
249+
conformance, requiredProtocol)) {
250+
return true;
251+
}
252+
}
253+
return false;
254+
}
255+
191256
namespace {
192257

193258
/// A function reference.

0 commit comments

Comments
 (0)