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