Skip to content

Commit 987cd55

Browse files
committed
[NFC] Drop llvm::Expected from Evaluation Points
A request is intended to be a pure function of its inputs. That function could, in theory, fail. In practice, there were basically no requests taking advantage of this ability - the few that were using it to explicitly detect cycles can just return reasonable defaults instead of forwarding the error on up the stack. This is because cycles are checked by *the Evaluator*, and are unwound by the Evaluator. Therefore, restore the idea that the evaluate functions are themselves pure, but keep the idea that *evaluation* of those requests may fail. This model enables the best of both worlds: we not only keep the evaluator flexible enough to handle future use cases like cancellation and diagnostic invalidation, but also request-based dependencies using the values computed at the evaluation points. These aforementioned use cases would use the llvm::Expected interface and the regular evaluation-point interface respectively.
1 parent f2a1abc commit 987cd55

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+374
-367
lines changed

Diff for: include/swift/AST/AccessRequests.h

+3-6
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ class AccessLevelRequest :
4141
friend SimpleRequest;
4242

4343
// Evaluation.
44-
llvm::Expected<AccessLevel> evaluate(Evaluator &evaluator,
45-
ValueDecl *decl) const;
44+
AccessLevel evaluate(Evaluator &evaluator, ValueDecl *decl) const;
4645

4746
public:
4847
// Separate caching.
@@ -65,8 +64,7 @@ class SetterAccessLevelRequest :
6564
friend SimpleRequest;
6665

6766
// Evaluation.
68-
llvm::Expected<AccessLevel>
69-
evaluate(Evaluator &evaluator, AbstractStorageDecl *decl) const;
67+
AccessLevel evaluate(Evaluator &evaluator, AbstractStorageDecl *decl) const;
7068

7169
public:
7270
// Separate caching.
@@ -88,8 +86,7 @@ class DefaultAndMaxAccessLevelRequest :
8886
friend SimpleRequest;
8987

9088
// Evaluation.
91-
llvm::Expected<DefaultAndMax>
92-
evaluate(Evaluator &evaluator, ExtensionDecl *decl) const;
89+
DefaultAndMax evaluate(Evaluator &evaluator, ExtensionDecl *decl) const;
9390

9491
public:
9592
// Separate caching.

Diff for: include/swift/AST/Evaluator.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ using AbstractRequestFunction = void(void);
5454
/// Form the specific request function for the given request type.
5555
template<typename Request>
5656
using RequestFunction =
57-
llvm::Expected<typename Request::OutputType>(const Request &, Evaluator &);
57+
typename Request::OutputType(const Request &, Evaluator &);
5858

5959
/// Pretty stack trace handler for an arbitrary request.
6060
template<typename Request>

Diff for: include/swift/AST/IRGenRequests.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class IRGenSourceFileRequest
124124
friend SimpleRequest;
125125

126126
// Evaluation.
127-
llvm::Expected<std::unique_ptr<llvm::Module>>
127+
std::unique_ptr<llvm::Module>
128128
evaluate(Evaluator &evaluator, IRGenDescriptor desc) const;
129129

130130
public:
@@ -142,7 +142,7 @@ class IRGenWholeModuleRequest
142142
friend SimpleRequest;
143143

144144
// Evaluation.
145-
llvm::Expected<std::unique_ptr<llvm::Module>>
145+
std::unique_ptr<llvm::Module>
146146
evaluate(Evaluator &evaluator, IRGenDescriptor desc) const;
147147

148148
public:

Diff for: include/swift/AST/NameLookupRequests.h

+25-25
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ class SuperclassDeclRequest :
153153
friend SimpleRequest;
154154

155155
// Evaluation.
156-
llvm::Expected<ClassDecl *>
156+
ClassDecl *
157157
evaluate(Evaluator &evaluator, NominalTypeDecl *subject) const;
158158

159159
public:
@@ -197,7 +197,7 @@ class HasMissingDesignatedInitializersRequest :
197197
friend SimpleRequest;
198198

199199
// Evaluation.
200-
llvm::Expected<bool>
200+
bool
201201
evaluate(Evaluator &evaluator, ClassDecl *subject) const;
202202

203203
public:
@@ -219,7 +219,7 @@ class ExtendedNominalRequest :
219219
friend SimpleRequest;
220220

221221
// Evaluation.
222-
llvm::Expected<NominalTypeDecl *>
222+
NominalTypeDecl *
223223
evaluate(Evaluator &evaluator, ExtensionDecl *ext) const;
224224

225225
public:
@@ -283,7 +283,7 @@ class CustomAttrNominalRequest :
283283
friend SimpleRequest;
284284

285285
// Evaluation.
286-
llvm::Expected<NominalTypeDecl *>
286+
NominalTypeDecl *
287287
evaluate(Evaluator &evaluator, CustomAttr *attr, DeclContext *dc) const;
288288

289289
public:
@@ -303,7 +303,7 @@ class GetDestructorRequest :
303303
friend SimpleRequest;
304304

305305
// Evaluation.
306-
llvm::Expected<DestructorDecl *>
306+
DestructorDecl *
307307
evaluate(Evaluator &evaluator, ClassDecl *classDecl) const;
308308

309309
public:
@@ -324,7 +324,7 @@ class GenericParamListRequest :
324324
friend SimpleRequest;
325325

326326
// Evaluation.
327-
llvm::Expected<GenericParamList *>
327+
GenericParamList *
328328
evaluate(Evaluator &evaluator, GenericContext *value) const;
329329

330330
public:
@@ -347,7 +347,7 @@ class ExpandASTScopeRequest
347347
friend SimpleRequest;
348348

349349
// Evaluation.
350-
llvm::Expected<ast_scope::ASTScopeImpl *>
350+
ast_scope::ASTScopeImpl *
351351
evaluate(Evaluator &evaluator, ast_scope::ASTScopeImpl *,
352352
ast_scope::ScopeCreator *) const;
353353

@@ -407,8 +407,8 @@ class UnqualifiedLookupRequest
407407
friend SimpleRequest;
408408

409409
// Evaluation.
410-
llvm::Expected<LookupResult> evaluate(Evaluator &evaluator,
411-
UnqualifiedLookupDescriptor desc) const;
410+
LookupResult evaluate(Evaluator &evaluator,
411+
UnqualifiedLookupDescriptor desc) const;
412412
};
413413

414414
using QualifiedLookupResult = SmallVector<ValueDecl *, 4>;
@@ -427,7 +427,7 @@ class LookupInModuleRequest
427427
friend SimpleRequest;
428428

429429
// Evaluation.
430-
llvm::Expected<QualifiedLookupResult>
430+
QualifiedLookupResult
431431
evaluate(Evaluator &evaluator, const DeclContext *moduleOrFile, DeclName name,
432432
NLKind lookupKind, namelookup::ResolutionKind resolutionKind,
433433
const DeclContext *moduleScopeContext) const;
@@ -445,10 +445,10 @@ class AnyObjectLookupRequest
445445
private:
446446
friend SimpleRequest;
447447

448-
llvm::Expected<QualifiedLookupResult> evaluate(Evaluator &evaluator,
449-
const DeclContext *dc,
450-
DeclNameRef name,
451-
NLOptions options) const;
448+
QualifiedLookupResult evaluate(Evaluator &evaluator,
449+
const DeclContext *dc,
450+
DeclNameRef name,
451+
NLOptions options) const;
452452
};
453453

454454
class ModuleQualifiedLookupRequest
@@ -464,10 +464,10 @@ class ModuleQualifiedLookupRequest
464464
friend SimpleRequest;
465465

466466
// Evaluation.
467-
llvm::Expected<QualifiedLookupResult> evaluate(Evaluator &evaluator,
468-
const DeclContext *DC,
469-
ModuleDecl *mod, DeclNameRef name,
470-
NLOptions opts) const;
467+
QualifiedLookupResult evaluate(Evaluator &evaluator,
468+
const DeclContext *DC,
469+
ModuleDecl *mod, DeclNameRef name,
470+
NLOptions opts) const;
471471
};
472472

473473
class QualifiedLookupRequest
@@ -483,7 +483,7 @@ class QualifiedLookupRequest
483483
friend SimpleRequest;
484484

485485
// Evaluation.
486-
llvm::Expected<QualifiedLookupResult>
486+
QualifiedLookupResult
487487
evaluate(Evaluator &evaluator, const DeclContext *DC,
488488
SmallVector<NominalTypeDecl *, 4> decls,
489489
DeclNameRef name,
@@ -534,7 +534,7 @@ class DirectLookupRequest
534534
friend SimpleRequest;
535535

536536
// Evaluation.
537-
llvm::Expected<TinyPtrVector<ValueDecl *>>
537+
TinyPtrVector<ValueDecl *>
538538
evaluate(Evaluator &evaluator, DirectLookupDescriptor desc) const;
539539
};
540540

@@ -609,8 +609,8 @@ class LookupOperatorRequest
609609
CacheKind::Uncached>;
610610

611611
// Evaluation.
612-
llvm::Expected<OperatorType *> evaluate(Evaluator &evaluator,
613-
OperatorLookupDescriptor desc) const;
612+
OperatorType *
613+
evaluate(Evaluator &evaluator, OperatorLookupDescriptor desc) const;
614614
};
615615

616616
using LookupPrefixOperatorRequest = LookupOperatorRequest<PrefixOperatorDecl>;
@@ -631,7 +631,7 @@ class DirectOperatorLookupRequest
631631
private:
632632
friend SimpleRequest;
633633

634-
llvm::Expected<TinyPtrVector<OperatorDecl *>>
634+
TinyPtrVector<OperatorDecl *>
635635
evaluate(Evaluator &evaluator, OperatorLookupDescriptor descriptor,
636636
OperatorFixity fixity) const;
637637
};
@@ -649,7 +649,7 @@ class DirectPrecedenceGroupLookupRequest
649649
private:
650650
friend SimpleRequest;
651651

652-
llvm::Expected<TinyPtrVector<PrecedenceGroupDecl *>>
652+
TinyPtrVector<PrecedenceGroupDecl *>
653653
evaluate(Evaluator &evaluator, OperatorLookupDescriptor descriptor) const;
654654
};
655655

@@ -694,7 +694,7 @@ class LookupConformanceInModuleRequest
694694
friend SimpleRequest;
695695

696696
// Evaluation.
697-
llvm::Expected<ProtocolConformanceRef> evaluate(
697+
ProtocolConformanceRef evaluate(
698698
Evaluator &evaluator, LookupConformanceDescriptor desc) const;
699699
};
700700

Diff for: include/swift/AST/SILGenRequests.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class SILGenSourceFileRequest :
8989
friend SimpleRequest;
9090

9191
// Evaluation.
92-
llvm::Expected<std::unique_ptr<SILModule>>
92+
std::unique_ptr<SILModule>
9393
evaluate(Evaluator &evaluator, SILGenDescriptor desc) const;
9494

9595
public:
@@ -107,7 +107,7 @@ class SILGenWholeModuleRequest :
107107
friend SimpleRequest;
108108

109109
// Evaluation.
110-
llvm::Expected<std::unique_ptr<SILModule>>
110+
std::unique_ptr<SILModule>
111111
evaluate(Evaluator &evaluator, SILGenDescriptor desc) const;
112112

113113
public:

Diff for: include/swift/AST/SILOptimizerRequests.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ class ExecuteSILPipelineRequest
5959
friend SimpleRequest;
6060

6161
// Evaluation.
62-
llvm::Expected<evaluator::SideEffect>
62+
evaluator::SideEffect
6363
evaluate(Evaluator &evaluator, SILPipelineExecutionDescriptor desc) const;
6464
};
6565

Diff for: include/swift/AST/SimpleRequest.h

+4-4
Original file line numberDiff line numberDiff line change
@@ -148,9 +148,9 @@ SourceLoc extractNearestSourceLoc(const std::tuple<First, Rest...> &value) {
148148
///
149149
/// The \c Derived class needs to implement several operations. The most
150150
/// important one takes an evaluator and the input values, then computes the
151-
/// final result, optionally bubbling up errors from recursive evaulations:
151+
/// final result:
152152
/// \code
153-
/// llvm::Expected<Output> evaluate(Evaluator &evaluator, Inputs...) const;
153+
/// Output evaluate(Evaluator &evaluator, Inputs...) const;
154154
/// \endcode
155155
///
156156
/// Cycle diagnostics can be handled in one of two ways. Either the \c Derived
@@ -194,7 +194,7 @@ class SimpleRequest<Derived, Output(Inputs...), Caching> {
194194
}
195195

196196
template<size_t ...Indices>
197-
llvm::Expected<Output>
197+
Output
198198
callDerived(Evaluator &evaluator, std::index_sequence<Indices...>) const {
199199
static_assert(sizeof...(Indices) > 0, "Subclass must define evaluate()");
200200
return asDerived().evaluate(evaluator, std::get<Indices>(storage)...);
@@ -214,7 +214,7 @@ class SimpleRequest<Derived, Output(Inputs...), Caching> {
214214
: storage(inputs...) { }
215215

216216
/// Request evaluation function that will be registered with the evaluator.
217-
static llvm::Expected<OutputType>
217+
static OutputType
218218
evaluateRequest(const Derived &request, Evaluator &evaluator) {
219219
return request.callDerived(evaluator,
220220
std::index_sequence_for<Inputs...>());

Diff for: include/swift/AST/TBDGenRequests.h

+1-2
Original file line numberDiff line numberDiff line change
@@ -92,8 +92,7 @@ class GenerateTBDRequest
9292
friend SimpleRequest;
9393

9494
// Evaluation.
95-
llvm::Expected<TBDFileAndSymbols> evaluate(Evaluator &evaluator,
96-
TBDGenDescriptor desc) const;
95+
TBDFileAndSymbols evaluate(Evaluator &evaluator, TBDGenDescriptor desc) const;
9796
};
9897

9998
/// Report that a request of the given kind is being evaluated, so it

0 commit comments

Comments
 (0)