@@ -65,12 +65,12 @@ extern "C" void swift_ASTGen_freeExpansionReplacements(
6565 ptrdiff_t numReplacements);
6666
6767extern " C" ptrdiff_t swift_ASTGen_expandFreestandingMacro (
68- void *diagEngine, void *macro, uint8_t externalKind,
68+ void *diagEngine, const void *macro, uint8_t externalKind,
6969 const char *discriminator, uint8_t rawMacroRole, void *sourceFile,
7070 const void *sourceLocation, BridgedString *evaluatedSourceOut);
7171
7272extern " C" ptrdiff_t swift_ASTGen_expandAttachedMacro (
73- void *diagEngine, void *macro, uint8_t externalKind,
73+ void *diagEngine, const void *macro, uint8_t externalKind,
7474 const char *discriminator, const char *qualifiedType,
7575 const char *conformances, uint8_t rawMacroRole, void *customAttrSourceFile,
7676 const void *customAttrSourceLocation, void *declarationSourceFile,
@@ -381,7 +381,7 @@ CompilerPluginLoadRequest::evaluate(Evaluator &evaluator, ASTContext *ctx,
381381 return nullptr ;
382382}
383383
384- static llvm::Optional< ExternalMacroDefinition>
384+ static ExternalMacroDefinition
385385resolveInProcessMacro (ASTContext &ctx, Identifier moduleName,
386386 Identifier typeName, LoadedLibraryPlugin *plugin) {
387387#if SWIFT_BUILD_SWIFT_SYNTAX
@@ -398,13 +398,27 @@ resolveInProcessMacro(ASTContext &ctx, Identifier moduleName,
398398
399399 return ExternalMacroDefinition{
400400 ExternalMacroDefinition::PluginKind::InProcess, inProcess};
401+ } else {
402+ NullTerminatedStringRef err (
403+ " type '" + moduleName.str () + " ." + typeName.str () +
404+ " ' is not a valid macro implementation type in library plugin '" +
405+ StringRef (plugin->getLibraryPath ()) + " '" ,
406+ ctx);
407+
408+ return ExternalMacroDefinition::error (err);
401409 }
402410 }
411+ NullTerminatedStringRef err (" macro implementation type '" + moduleName.str () +
412+ " ." + typeName.str () +
413+ " ' could not be found in library plugin '" +
414+ StringRef (plugin->getLibraryPath ()) + " '" ,
415+ ctx);
416+ return ExternalMacroDefinition::error (err);
403417#endif
404- return llvm::None ;
418+ return ExternalMacroDefinition::error ( " macro is not supported " ) ;
405419}
406420
407- static llvm::Optional< ExternalMacroDefinition>
421+ static ExternalMacroDefinition
408422resolveExecutableMacro (ASTContext &ctx,
409423 LoadedExecutablePlugin *executablePlugin,
410424 Identifier moduleName, Identifier typeName) {
@@ -417,11 +431,17 @@ resolveExecutableMacro(ASTContext &ctx,
417431 return ExternalMacroDefinition{
418432 ExternalMacroDefinition::PluginKind::Executable, execMacro};
419433 }
434+ NullTerminatedStringRef err (
435+ " macro implementation type '" + moduleName.str () + " ." + typeName.str () +
436+ " ' could not be found in executable plugin" +
437+ StringRef (executablePlugin->getExecutablePath ()),
438+ ctx);
439+ return ExternalMacroDefinition::error (err);
420440#endif
421- return llvm::None ;
441+ return ExternalMacroDefinition::error ( " macro is not supported " ) ;
422442}
423443
424- llvm::Optional< ExternalMacroDefinition>
444+ ExternalMacroDefinition
425445ExternalMacroDefinitionRequest::evaluate (Evaluator &evaluator, ASTContext *ctx,
426446 Identifier moduleName,
427447 Identifier typeName) const {
@@ -432,19 +452,17 @@ ExternalMacroDefinitionRequest::evaluate(Evaluator &evaluator, ASTContext *ctx,
432452 evaluateOrDefault (evaluator, loadRequest, nullptr );
433453
434454 if (auto loadedLibrary = loaded.getAsLibraryPlugin ()) {
435- if (auto inProcess = resolveInProcessMacro (
436- *ctx, moduleName, typeName, loadedLibrary))
437- return *inProcess;
455+ return resolveInProcessMacro (*ctx, moduleName, typeName, loadedLibrary);
438456 }
439457
440458 if (auto *executablePlugin = loaded.getAsExecutablePlugin ()) {
441- if (auto executableMacro = resolveExecutableMacro (*ctx, executablePlugin,
442- moduleName, typeName)) {
443- return executableMacro;
444- }
459+ return resolveExecutableMacro (*ctx, executablePlugin, moduleName, typeName);
445460 }
446461
447- return llvm::None;
462+ NullTerminatedStringRef err (" plugin that can handle module '" +
463+ moduleName.str () + " ' not found" ,
464+ *ctx);
465+ return ExternalMacroDefinition::error (err);
448466}
449467
450468// / Adjust the given mangled name for a macro expansion to produce a valid
@@ -1028,11 +1046,14 @@ evaluateFreestandingMacro(FreestandingMacroExpansion *expansion,
10281046 auto external = macroDef.getExternalMacro ();
10291047 ExternalMacroDefinitionRequest request{&ctx, external.moduleName ,
10301048 external.macroTypeName };
1031- auto externalDef = evaluateOrDefault (ctx.evaluator , request, llvm::None);
1032- if (!externalDef) {
1049+ auto externalDef =
1050+ evaluateOrDefault (ctx.evaluator , request,
1051+ ExternalMacroDefinition::error (" request error" ));
1052+ if (externalDef.isError ()) {
10331053 ctx.Diags .diagnose (loc, diag::external_macro_not_found,
10341054 external.moduleName .str (),
1035- external.macroTypeName .str (), macro->getName ());
1055+ external.macroTypeName .str (), macro->getName (),
1056+ externalDef.getErrorMessage ());
10361057 macro->diagnose (diag::decl_declared_here, macro);
10371058 return nullptr ;
10381059 }
@@ -1062,9 +1083,10 @@ evaluateFreestandingMacro(FreestandingMacroExpansion *expansion,
10621083 return nullptr ;
10631084
10641085 BridgedString evaluatedSourceOut{nullptr , 0 };
1086+ assert (!externalDef.isError ());
10651087 swift_ASTGen_expandFreestandingMacro (
1066- &ctx.Diags , externalDef-> opaqueHandle ,
1067- static_cast <uint32_t >(externalDef-> kind ), discriminator->c_str (),
1088+ &ctx.Diags , externalDef. opaqueHandle ,
1089+ static_cast <uint32_t >(externalDef. kind ), discriminator->c_str (),
10681090 getRawMacroRole (macroRole), astGenSourceFile,
10691091 expansion->getSourceRange ().Start .getOpaquePointerValue (),
10701092 &evaluatedSourceOut);
@@ -1301,13 +1323,14 @@ static SourceFile *evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo,
13011323 ExternalMacroDefinitionRequest request{
13021324 &ctx, external.moduleName , external.macroTypeName
13031325 };
1304- auto externalDef = evaluateOrDefault (ctx.evaluator , request, llvm::None);
1305- if (!externalDef) {
1326+ auto externalDef =
1327+ evaluateOrDefault (ctx.evaluator , request,
1328+ ExternalMacroDefinition::error (" failed request" ));
1329+ if (externalDef.isError ()) {
13061330 attachedTo->diagnose (diag::external_macro_not_found,
1307- external.moduleName .str (),
1308- external.macroTypeName .str (),
1309- macro->getName ()
1310- );
1331+ external.moduleName .str (),
1332+ external.macroTypeName .str (), macro->getName (),
1333+ externalDef.getErrorMessage ());
13111334 macro->diagnose (diag::decl_declared_here, macro);
13121335 return nullptr ;
13131336 }
@@ -1339,9 +1362,10 @@ static SourceFile *evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo,
13391362 searchDecl = var->getParentPatternBinding ();
13401363
13411364 BridgedString evaluatedSourceOut{nullptr , 0 };
1365+ assert (!externalDef.isError ());
13421366 swift_ASTGen_expandAttachedMacro (
1343- &ctx.Diags , externalDef-> opaqueHandle ,
1344- static_cast <uint32_t >(externalDef-> kind ), discriminator->c_str (),
1367+ &ctx.Diags , externalDef. opaqueHandle ,
1368+ static_cast <uint32_t >(externalDef. kind ), discriminator->c_str (),
13451369 extendedType.c_str (), conformanceList.c_str (), getRawMacroRole (role),
13461370 astGenAttrSourceFile, attr->AtLoc .getOpaquePointerValue (),
13471371 astGenDeclSourceFile, searchDecl->getStartLoc ().getOpaquePointerValue (),
0 commit comments