@@ -49,6 +49,7 @@ struct ExternalMacroDefinition;
4949class ClosureExpr ;
5050class GenericParamList ;
5151class LabeledStmt ;
52+ class LoadedExecutablePlugin ;
5253class MacroDefinition ;
5354class PrecedenceGroupDecl ;
5455class PropertyWrapperInitializerInfo ;
@@ -4000,19 +4001,51 @@ class ExpandSynthesizedMemberMacroRequest
40004001// / Load a plugin module with the given name.
40014002// /
40024003// /
4004+ class LoadedCompilerPlugin {
4005+ enum class PluginKind : uint8_t {
4006+ None,
4007+ InProcess,
4008+ Executable,
4009+ };
4010+ PluginKind kind;
4011+ void *ptr;
4012+
4013+ LoadedCompilerPlugin (PluginKind kind, void *ptr) : kind(kind), ptr(ptr) {
4014+ assert (ptr != nullptr || kind == PluginKind::None);
4015+ }
4016+
4017+ public:
4018+ LoadedCompilerPlugin (std::nullptr_t ) : kind(PluginKind::None), ptr(nullptr ) {}
4019+
4020+ static LoadedCompilerPlugin inProcess (void *ptr) {
4021+ return {PluginKind::InProcess, ptr};
4022+ }
4023+ static LoadedCompilerPlugin executable (LoadedExecutablePlugin *ptr) {
4024+ return {PluginKind::Executable, ptr};
4025+ }
4026+
4027+ void *getAsInProcessPlugin () const {
4028+ return kind == PluginKind::InProcess ? ptr : nullptr ;
4029+ }
4030+ LoadedExecutablePlugin *getAsExecutablePlugin () const {
4031+ return kind == PluginKind::Executable
4032+ ? static_cast <LoadedExecutablePlugin *>(ptr)
4033+ : nullptr ;
4034+ }
4035+ };
4036+
40034037class CompilerPluginLoadRequest
4004- : public SimpleRequest<CompilerPluginLoadRequest,
4005- void * (ASTContext *, Identifier),
4006- RequestFlags::Cached> {
4038+ : public SimpleRequest<CompilerPluginLoadRequest,
4039+ LoadedCompilerPlugin (ASTContext *, Identifier),
4040+ RequestFlags::Cached> {
40074041public:
40084042 using SimpleRequest::SimpleRequest;
40094043
40104044private:
40114045 friend SimpleRequest;
40124046
4013- void *evaluate (
4014- Evaluator &evaluator, ASTContext *ctx, Identifier moduleName
4015- ) const ;
4047+ LoadedCompilerPlugin evaluate (Evaluator &evaluator, ASTContext *ctx,
4048+ Identifier moduleName) const ;
40164049
40174050public:
40184051 // Source location
0 commit comments