@@ -65,12 +65,12 @@ extern "C" void swift_ASTGen_freeExpansionReplacements(
65
65
ptrdiff_t numReplacements);
66
66
67
67
extern " C" ptrdiff_t swift_ASTGen_expandFreestandingMacro (
68
- void *diagEngine, void *macro, uint8_t externalKind,
68
+ void *diagEngine, const void *macro, uint8_t externalKind,
69
69
const char *discriminator, uint8_t rawMacroRole, void *sourceFile,
70
70
const void *sourceLocation, BridgedString *evaluatedSourceOut);
71
71
72
72
extern " C" ptrdiff_t swift_ASTGen_expandAttachedMacro (
73
- void *diagEngine, void *macro, uint8_t externalKind,
73
+ void *diagEngine, const void *macro, uint8_t externalKind,
74
74
const char *discriminator, const char *qualifiedType,
75
75
const char *conformances, uint8_t rawMacroRole, void *customAttrSourceFile,
76
76
const void *customAttrSourceLocation, void *declarationSourceFile,
@@ -381,7 +381,7 @@ CompilerPluginLoadRequest::evaluate(Evaluator &evaluator, ASTContext *ctx,
381
381
return nullptr ;
382
382
}
383
383
384
- static llvm::Optional< ExternalMacroDefinition>
384
+ static ExternalMacroDefinition
385
385
resolveInProcessMacro (ASTContext &ctx, Identifier moduleName,
386
386
Identifier typeName, LoadedLibraryPlugin *plugin) {
387
387
#if SWIFT_BUILD_SWIFT_SYNTAX
@@ -398,13 +398,27 @@ resolveInProcessMacro(ASTContext &ctx, Identifier moduleName,
398
398
399
399
return ExternalMacroDefinition{
400
400
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);
401
409
}
402
410
}
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);
403
417
#endif
404
- return llvm::None ;
418
+ return ExternalMacroDefinition::error ( " macro is not supported " ) ;
405
419
}
406
420
407
- static llvm::Optional< ExternalMacroDefinition>
421
+ static ExternalMacroDefinition
408
422
resolveExecutableMacro (ASTContext &ctx,
409
423
LoadedExecutablePlugin *executablePlugin,
410
424
Identifier moduleName, Identifier typeName) {
@@ -417,11 +431,17 @@ resolveExecutableMacro(ASTContext &ctx,
417
431
return ExternalMacroDefinition{
418
432
ExternalMacroDefinition::PluginKind::Executable, execMacro};
419
433
}
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);
420
440
#endif
421
- return llvm::None ;
441
+ return ExternalMacroDefinition::error ( " macro is not supported " ) ;
422
442
}
423
443
424
- llvm::Optional< ExternalMacroDefinition>
444
+ ExternalMacroDefinition
425
445
ExternalMacroDefinitionRequest::evaluate (Evaluator &evaluator, ASTContext *ctx,
426
446
Identifier moduleName,
427
447
Identifier typeName) const {
@@ -432,19 +452,17 @@ ExternalMacroDefinitionRequest::evaluate(Evaluator &evaluator, ASTContext *ctx,
432
452
evaluateOrDefault (evaluator, loadRequest, nullptr );
433
453
434
454
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);
438
456
}
439
457
440
458
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);
445
460
}
446
461
447
- return llvm::None;
462
+ NullTerminatedStringRef err (" plugin that can handle module '" +
463
+ moduleName.str () + " ' not found" ,
464
+ *ctx);
465
+ return ExternalMacroDefinition::error (err);
448
466
}
449
467
450
468
// / Adjust the given mangled name for a macro expansion to produce a valid
@@ -1028,11 +1046,14 @@ evaluateFreestandingMacro(FreestandingMacroExpansion *expansion,
1028
1046
auto external = macroDef.getExternalMacro ();
1029
1047
ExternalMacroDefinitionRequest request{&ctx, external.moduleName ,
1030
1048
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 ()) {
1033
1053
ctx.Diags .diagnose (loc, diag::external_macro_not_found,
1034
1054
external.moduleName .str (),
1035
- external.macroTypeName .str (), macro->getName ());
1055
+ external.macroTypeName .str (), macro->getName (),
1056
+ externalDef.getErrorMessage ());
1036
1057
macro->diagnose (diag::decl_declared_here, macro);
1037
1058
return nullptr ;
1038
1059
}
@@ -1062,9 +1083,10 @@ evaluateFreestandingMacro(FreestandingMacroExpansion *expansion,
1062
1083
return nullptr ;
1063
1084
1064
1085
BridgedString evaluatedSourceOut{nullptr , 0 };
1086
+ assert (!externalDef.isError ());
1065
1087
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 (),
1068
1090
getRawMacroRole (macroRole), astGenSourceFile,
1069
1091
expansion->getSourceRange ().Start .getOpaquePointerValue (),
1070
1092
&evaluatedSourceOut);
@@ -1301,13 +1323,14 @@ static SourceFile *evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo,
1301
1323
ExternalMacroDefinitionRequest request{
1302
1324
&ctx, external.moduleName , external.macroTypeName
1303
1325
};
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 ()) {
1306
1330
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 ());
1311
1334
macro->diagnose (diag::decl_declared_here, macro);
1312
1335
return nullptr ;
1313
1336
}
@@ -1339,9 +1362,10 @@ static SourceFile *evaluateAttachedMacro(MacroDecl *macro, Decl *attachedTo,
1339
1362
searchDecl = var->getParentPatternBinding ();
1340
1363
1341
1364
BridgedString evaluatedSourceOut{nullptr , 0 };
1365
+ assert (!externalDef.isError ());
1342
1366
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 (),
1345
1369
extendedType.c_str (), conformanceList.c_str (), getRawMacroRole (role),
1346
1370
astGenAttrSourceFile, attr->AtLoc .getOpaquePointerValue (),
1347
1371
astGenDeclSourceFile, searchDecl->getStartLoc ().getOpaquePointerValue (),
0 commit comments