@@ -456,6 +456,35 @@ static std::string adjustMacroExpansionBufferName(StringRef name) {
456
456
return result;
457
457
}
458
458
459
+ Optional<unsigned >
460
+ ExpandMacroExpansionExprRequest::evaluate (Evaluator &evaluator,
461
+ MacroExpansionExpr *mee) const {
462
+ ConcreteDeclRef macroRef = mee->getMacroRef ();
463
+ assert (macroRef && isa<MacroDecl>(macroRef.getDecl ()) &&
464
+ " MacroRef should be set before expansion" );
465
+
466
+ auto *macro = cast<MacroDecl>(macroRef.getDecl ());
467
+ if (macro->getMacroRoles ().contains (MacroRole::Expression)) {
468
+ return expandMacroExpr (mee);
469
+ }
470
+ // For a non-expression macro, expand it as a declaration.
471
+ else if (macro->getMacroRoles ().contains (MacroRole::Declaration) ||
472
+ macro->getMacroRoles ().contains (MacroRole::CodeItem)) {
473
+ if (!mee->getSubstituteDecl ()) {
474
+ auto *med = mee->createSubstituteDecl ();
475
+ TypeChecker::typeCheckDecl (med);
476
+ }
477
+ // Return the expanded buffer ID.
478
+ return evaluateOrDefault (
479
+ evaluator, ExpandMacroExpansionDeclRequest (mee->getSubstituteDecl ()),
480
+ None);
481
+ }
482
+
483
+ // Other macro roles may also be encountered here, as they use
484
+ // `MacroExpansionExpr` for resolution. In those cases, do not expand.
485
+ return None;
486
+ }
487
+
459
488
ArrayRef<unsigned > ExpandMemberAttributeMacros::evaluate (Evaluator &evaluator,
460
489
Decl *decl) const {
461
490
if (decl->isImplicit ())
@@ -666,22 +695,24 @@ static std::string expandMacroDefinition(
666
695
return expandedResult;
667
696
}
668
697
669
- Expr * swift::expandMacroExpr (
670
- DeclContext *dc, Expr *expr, ConcreteDeclRef macroRef, Type expandedType
671
- ) {
698
+ Optional< unsigned >
699
+ swift::expandMacroExpr (MacroExpansionExpr *mee) {
700
+ DeclContext *dc = mee-> getDeclContext ();
672
701
ASTContext &ctx = dc->getASTContext ();
673
702
SourceManager &sourceMgr = ctx.SourceMgr ;
703
+ ConcreteDeclRef macroRef = mee->getMacroRef ();
704
+ Type expandedType = mee->getType ();
674
705
675
706
auto moduleDecl = dc->getParentModule ();
676
- auto sourceFile = moduleDecl->getSourceFileContainingLocation (expr ->getLoc ());
707
+ auto sourceFile = moduleDecl->getSourceFileContainingLocation (mee ->getLoc ());
677
708
if (!sourceFile)
678
- return nullptr ;
709
+ return None ;
679
710
680
711
MacroDecl *macro = cast<MacroDecl>(macroRef.getDecl ());
681
712
682
713
if (isFromExpansionOfMacro (sourceFile, macro, MacroRole::Expression)) {
683
- ctx.Diags .diagnose (expr ->getLoc (), diag::macro_recursive, macro->getName ());
684
- return nullptr ;
714
+ ctx.Diags .diagnose (mee ->getLoc (), diag::macro_recursive, macro->getName ());
715
+ return None ;
685
716
}
686
717
687
718
// Evaluate the macro.
@@ -690,34 +721,33 @@ Expr *swift::expandMacroExpr(
690
721
// / The discriminator used for the macro.
691
722
LazyValue<std::string> discriminator ([&]() -> std::string {
692
723
#if SWIFT_SWIFT_PARSER
693
- if (auto expansionExpr = dyn_cast<MacroExpansionExpr>(expr)) {
694
- Mangle::ASTMangler mangler;
695
- return mangler.mangleMacroExpansion (expansionExpr);
696
- }
697
- #endif
724
+ Mangle::ASTMangler mangler;
725
+ return mangler.mangleMacroExpansion (mee);
726
+ #else
698
727
return " " ;
728
+ #endif
699
729
});
700
730
701
731
auto macroDef = macro->getDefinition ();
702
732
switch (macroDef.kind ) {
703
733
case MacroDefinition::Kind::Undefined:
704
734
case MacroDefinition::Kind::Invalid:
705
735
// Already diagnosed as an error elsewhere.
706
- return nullptr ;
736
+ return None ;
707
737
708
738
case MacroDefinition::Kind::Builtin: {
709
739
switch (macroDef.getBuiltinKind ()) {
710
740
case BuiltinMacroKind::ExternalMacro:
711
741
ctx.Diags .diagnose (
712
- expr ->getLoc (), diag::external_macro_outside_macro_definition);
713
- return nullptr ;
742
+ mee ->getLoc (), diag::external_macro_outside_macro_definition);
743
+ return None ;
714
744
}
715
745
}
716
746
717
747
case MacroDefinition::Kind::Expanded: {
718
748
// Expand the definition with the given arguments.
719
749
auto result = expandMacroDefinition (
720
- macroDef.getExpanded (), macro, expr ->getArgs ());
750
+ macroDef.getExpanded (), macro, mee ->getArgs ());
721
751
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy (
722
752
result, adjustMacroExpansionBufferName (*discriminator));
723
753
break ;
@@ -732,41 +762,41 @@ Expr *swift::expandMacroExpr(
732
762
auto externalDef = evaluateOrDefault (ctx.evaluator , request, None);
733
763
if (!externalDef) {
734
764
ctx.Diags .diagnose (
735
- expr ->getLoc (), diag::external_macro_not_found,
765
+ mee ->getLoc (), diag::external_macro_not_found,
736
766
external.moduleName .str (),
737
767
external.macroTypeName .str (),
738
768
macro->getName ()
739
769
);
740
770
macro->diagnose (diag::decl_declared_here, macro->getName ());
741
- return nullptr ;
771
+ return None ;
742
772
}
743
773
744
774
#if SWIFT_SWIFT_PARSER
745
- PrettyStackTraceExpr debugStack (ctx, " expanding macro" , expr );
775
+ PrettyStackTraceExpr debugStack (ctx, " expanding macro" , mee );
746
776
747
777
// Builtin macros are handled via ASTGen.
748
778
auto astGenSourceFile = sourceFile->exportedSourceFile ;
749
779
if (!astGenSourceFile)
750
- return nullptr ;
780
+ return None ;
751
781
752
782
const char *evaluatedSourceAddress;
753
783
ptrdiff_t evaluatedSourceLength;
754
784
swift_ASTGen_expandFreestandingMacro (
755
785
&ctx.Diags , externalDef->opaqueHandle ,
756
786
static_cast <uint32_t >(externalDef->kind ), discriminator->data (),
757
787
discriminator->size (), astGenSourceFile,
758
- expr ->getStartLoc ().getOpaquePointerValue (), &evaluatedSourceAddress,
788
+ mee ->getStartLoc ().getOpaquePointerValue (), &evaluatedSourceAddress,
759
789
&evaluatedSourceLength);
760
790
if (!evaluatedSourceAddress)
761
- return nullptr ;
791
+ return None ;
762
792
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy (
763
793
{evaluatedSourceAddress, (size_t )evaluatedSourceLength},
764
794
adjustMacroExpansionBufferName (*discriminator));
765
795
free ((void *)evaluatedSourceAddress);
766
796
break ;
767
797
#else
768
- ctx.Diags .diagnose (expr ->getLoc (), diag::macro_unsupported);
769
- return nullptr ;
798
+ ctx.Diags .diagnose (mee ->getLoc (), diag::macro_unsupported);
799
+ return None ;
770
800
#endif
771
801
}
772
802
}
@@ -787,9 +817,9 @@ Expr *swift::expandMacroExpr(
787
817
GeneratedSourceInfo sourceInfo{
788
818
GeneratedSourceInfo::ExpressionMacroExpansion,
789
819
Lexer::getCharSourceRangeFromSourceRange (
790
- sourceMgr, expr ->getSourceRange ()),
820
+ sourceMgr, mee ->getSourceRange ()),
791
821
macroBufferRange,
792
- ASTNode (expr ).getOpaqueValue (),
822
+ ASTNode (mee ).getOpaqueValue (),
793
823
dc
794
824
};
795
825
sourceMgr.setGeneratedSourceInfo (macroBufferID, sourceInfo);
@@ -807,7 +837,7 @@ Expr *swift::expandMacroExpr(
807
837
if (topLevelItems.size () != 1 ) {
808
838
ctx.Diags .diagnose (
809
839
macroBufferRange.getStart (), diag::expected_macro_expansion_expr);
810
- return nullptr ;
840
+ return macroBufferID ;
811
841
}
812
842
813
843
auto codeItem = topLevelItems.front ();
@@ -817,7 +847,7 @@ Expr *swift::expandMacroExpr(
817
847
if (!expandedExpr) {
818
848
ctx.Diags .diagnose (
819
849
macroBufferRange.getStart (), diag::expected_macro_expansion_expr);
820
- return nullptr ;
850
+ return macroBufferID ;
821
851
}
822
852
823
853
// Type-check the expanded expression.
@@ -834,12 +864,15 @@ Expr *swift::expandMacroExpr(
834
864
Type realExpandedType = TypeChecker::typeCheckExpression (
835
865
expandedExpr, dc, contextualType);
836
866
if (!realExpandedType)
837
- return nullptr ;
867
+ return macroBufferID ;
838
868
839
869
assert ((expandedType->isEqual (realExpandedType) ||
840
870
realExpandedType->hasError ()) &&
841
871
" Type checking changed the result type?" );
842
- return expandedExpr;
872
+
873
+ mee->setRewritten (expandedExpr);
874
+
875
+ return macroBufferID;
843
876
}
844
877
845
878
// / Expands the given macro expansion declaration.
0 commit comments