@@ -472,6 +472,35 @@ static std::string adjustMacroExpansionBufferName(StringRef name) {
472
472
return result;
473
473
}
474
474
475
+ Optional<unsigned >
476
+ ExpandMacroExpansionExprRequest::evaluate (Evaluator &evaluator,
477
+ MacroExpansionExpr *mee) const {
478
+ ConcreteDeclRef macroRef = mee->getMacroRef ();
479
+ assert (macroRef && isa<MacroDecl>(macroRef.getDecl ()) &&
480
+ " MacroRef should be set before expansion" );
481
+
482
+ auto *macro = cast<MacroDecl>(macroRef.getDecl ());
483
+ if (macro->getMacroRoles ().contains (MacroRole::Expression)) {
484
+ return expandMacroExpr (mee);
485
+ }
486
+ // For a non-expression macro, expand it as a declaration.
487
+ else if (macro->getMacroRoles ().contains (MacroRole::Declaration) ||
488
+ macro->getMacroRoles ().contains (MacroRole::CodeItem)) {
489
+ if (!mee->getSubstituteDecl ()) {
490
+ auto *med = mee->createSubstituteDecl ();
491
+ TypeChecker::typeCheckDecl (med);
492
+ }
493
+ // Return the expanded buffer ID.
494
+ return evaluateOrDefault (
495
+ evaluator, ExpandMacroExpansionDeclRequest (mee->getSubstituteDecl ()),
496
+ None);
497
+ }
498
+
499
+ // Other macro roles may also be encountered here, as they use
500
+ // `MacroExpansionExpr` for resolution. In those cases, do not expand.
501
+ return None;
502
+ }
503
+
475
504
ArrayRef<unsigned > ExpandMemberAttributeMacros::evaluate (Evaluator &evaluator,
476
505
Decl *decl) const {
477
506
if (decl->isImplicit ())
@@ -682,22 +711,24 @@ static std::string expandMacroDefinition(
682
711
return expandedResult;
683
712
}
684
713
685
- Expr * swift::expandMacroExpr (
686
- DeclContext *dc, Expr *expr, ConcreteDeclRef macroRef, Type expandedType
687
- ) {
714
+ Optional< unsigned >
715
+ swift::expandMacroExpr (MacroExpansionExpr *mee) {
716
+ DeclContext *dc = mee-> getDeclContext ();
688
717
ASTContext &ctx = dc->getASTContext ();
689
718
SourceManager &sourceMgr = ctx.SourceMgr ;
719
+ ConcreteDeclRef macroRef = mee->getMacroRef ();
720
+ Type expandedType = mee->getType ();
690
721
691
722
auto moduleDecl = dc->getParentModule ();
692
- auto sourceFile = moduleDecl->getSourceFileContainingLocation (expr ->getLoc ());
723
+ auto sourceFile = moduleDecl->getSourceFileContainingLocation (mee ->getLoc ());
693
724
if (!sourceFile)
694
- return nullptr ;
725
+ return None ;
695
726
696
727
MacroDecl *macro = cast<MacroDecl>(macroRef.getDecl ());
697
728
698
729
if (isFromExpansionOfMacro (sourceFile, macro, MacroRole::Expression)) {
699
- ctx.Diags .diagnose (expr ->getLoc (), diag::macro_recursive, macro->getName ());
700
- return nullptr ;
730
+ ctx.Diags .diagnose (mee ->getLoc (), diag::macro_recursive, macro->getName ());
731
+ return None ;
701
732
}
702
733
703
734
// Evaluate the macro.
@@ -706,34 +737,33 @@ Expr *swift::expandMacroExpr(
706
737
// / The discriminator used for the macro.
707
738
LazyValue<std::string> discriminator ([&]() -> std::string {
708
739
#if SWIFT_SWIFT_PARSER
709
- if (auto expansionExpr = dyn_cast<MacroExpansionExpr>(expr)) {
710
- Mangle::ASTMangler mangler;
711
- return mangler.mangleMacroExpansion (expansionExpr);
712
- }
713
- #endif
740
+ Mangle::ASTMangler mangler;
741
+ return mangler.mangleMacroExpansion (mee);
742
+ #else
714
743
return " " ;
744
+ #endif
715
745
});
716
746
717
747
auto macroDef = macro->getDefinition ();
718
748
switch (macroDef.kind ) {
719
749
case MacroDefinition::Kind::Undefined:
720
750
case MacroDefinition::Kind::Invalid:
721
751
// Already diagnosed as an error elsewhere.
722
- return nullptr ;
752
+ return None ;
723
753
724
754
case MacroDefinition::Kind::Builtin: {
725
755
switch (macroDef.getBuiltinKind ()) {
726
756
case BuiltinMacroKind::ExternalMacro:
727
757
ctx.Diags .diagnose (
728
- expr ->getLoc (), diag::external_macro_outside_macro_definition);
729
- return nullptr ;
758
+ mee ->getLoc (), diag::external_macro_outside_macro_definition);
759
+ return None ;
730
760
}
731
761
}
732
762
733
763
case MacroDefinition::Kind::Expanded: {
734
764
// Expand the definition with the given arguments.
735
765
auto result = expandMacroDefinition (
736
- macroDef.getExpanded (), macro, expr ->getArgs ());
766
+ macroDef.getExpanded (), macro, mee ->getArgs ());
737
767
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy (
738
768
result, adjustMacroExpansionBufferName (*discriminator));
739
769
break ;
@@ -748,41 +778,41 @@ Expr *swift::expandMacroExpr(
748
778
auto externalDef = evaluateOrDefault (ctx.evaluator , request, None);
749
779
if (!externalDef) {
750
780
ctx.Diags .diagnose (
751
- expr ->getLoc (), diag::external_macro_not_found,
781
+ mee ->getLoc (), diag::external_macro_not_found,
752
782
external.moduleName .str (),
753
783
external.macroTypeName .str (),
754
784
macro->getName ()
755
785
);
756
786
macro->diagnose (diag::decl_declared_here, macro->getName ());
757
- return nullptr ;
787
+ return None ;
758
788
}
759
789
760
790
#if SWIFT_SWIFT_PARSER
761
- PrettyStackTraceExpr debugStack (ctx, " expanding macro" , expr );
791
+ PrettyStackTraceExpr debugStack (ctx, " expanding macro" , mee );
762
792
763
793
// Builtin macros are handled via ASTGen.
764
794
auto astGenSourceFile = sourceFile->exportedSourceFile ;
765
795
if (!astGenSourceFile)
766
- return nullptr ;
796
+ return None ;
767
797
768
798
const char *evaluatedSourceAddress;
769
799
ptrdiff_t evaluatedSourceLength;
770
800
swift_ASTGen_expandFreestandingMacro (
771
801
&ctx.Diags , externalDef->opaqueHandle ,
772
802
static_cast <uint32_t >(externalDef->kind ), discriminator->data (),
773
803
discriminator->size (), astGenSourceFile,
774
- expr ->getStartLoc ().getOpaquePointerValue (), &evaluatedSourceAddress,
804
+ mee ->getStartLoc ().getOpaquePointerValue (), &evaluatedSourceAddress,
775
805
&evaluatedSourceLength);
776
806
if (!evaluatedSourceAddress)
777
- return nullptr ;
807
+ return None ;
778
808
evaluatedSource = llvm::MemoryBuffer::getMemBufferCopy (
779
809
{evaluatedSourceAddress, (size_t )evaluatedSourceLength},
780
810
adjustMacroExpansionBufferName (*discriminator));
781
811
free ((void *)evaluatedSourceAddress);
782
812
break ;
783
813
#else
784
- ctx.Diags .diagnose (expr ->getLoc (), diag::macro_unsupported);
785
- return nullptr ;
814
+ ctx.Diags .diagnose (mee ->getLoc (), diag::macro_unsupported);
815
+ return None ;
786
816
#endif
787
817
}
788
818
}
@@ -803,9 +833,9 @@ Expr *swift::expandMacroExpr(
803
833
GeneratedSourceInfo sourceInfo{
804
834
GeneratedSourceInfo::ExpressionMacroExpansion,
805
835
Lexer::getCharSourceRangeFromSourceRange (
806
- sourceMgr, expr ->getSourceRange ()),
836
+ sourceMgr, mee ->getSourceRange ()),
807
837
macroBufferRange,
808
- ASTNode (expr ).getOpaqueValue (),
838
+ ASTNode (mee ).getOpaqueValue (),
809
839
dc
810
840
};
811
841
sourceMgr.setGeneratedSourceInfo (macroBufferID, sourceInfo);
@@ -823,7 +853,7 @@ Expr *swift::expandMacroExpr(
823
853
if (topLevelItems.size () != 1 ) {
824
854
ctx.Diags .diagnose (
825
855
macroBufferRange.getStart (), diag::expected_macro_expansion_expr);
826
- return nullptr ;
856
+ return macroBufferID ;
827
857
}
828
858
829
859
auto codeItem = topLevelItems.front ();
@@ -833,7 +863,7 @@ Expr *swift::expandMacroExpr(
833
863
if (!expandedExpr) {
834
864
ctx.Diags .diagnose (
835
865
macroBufferRange.getStart (), diag::expected_macro_expansion_expr);
836
- return nullptr ;
866
+ return macroBufferID ;
837
867
}
838
868
839
869
// Type-check the expanded expression.
@@ -850,12 +880,15 @@ Expr *swift::expandMacroExpr(
850
880
Type realExpandedType = TypeChecker::typeCheckExpression (
851
881
expandedExpr, dc, contextualType);
852
882
if (!realExpandedType)
853
- return nullptr ;
883
+ return macroBufferID ;
854
884
855
885
assert ((expandedType->isEqual (realExpandedType) ||
856
886
realExpandedType->hasError ()) &&
857
887
" Type checking changed the result type?" );
858
- return expandedExpr;
888
+
889
+ mee->setRewritten (expandedExpr);
890
+
891
+ return macroBufferID;
859
892
}
860
893
861
894
// / Expands the given macro expansion declaration.
0 commit comments