Skip to content

Commit c33c925

Browse files
committed
[Macros] Remove the macro role argument to ResolveMacroRequest.
The macro role argument presented an opportunity for callers to accidentally invoke this request twice for the same macro with slightly different macro roles passed in, which resulted in re-typechecking the macro arguments. Instead, derive the corresponding macro roles from the macro reference syntax.
1 parent 46db62b commit c33c925

13 files changed

+54
-14
lines changed

include/swift/AST/TypeCheckRequests.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3162,6 +3162,9 @@ class UnresolvedMacroReference {
31623162
ArrayRef<TypeRepr *> getGenericArgs() const;
31633163
ArgumentList *getArgs() const;
31643164

3165+
/// Returns the macro roles corresponding to this macro reference.
3166+
MacroRoles getMacroRoles() const;
3167+
31653168
friend bool operator==(const UnresolvedMacroReference &lhs,
31663169
const UnresolvedMacroReference &rhs) {
31673170
return lhs.getOpaqueValue() == rhs.getOpaqueValue();
@@ -3178,7 +3181,7 @@ void simple_display(llvm::raw_ostream &out,
31783181
/// Resolve a given custom attribute to an attached macro declaration.
31793182
class ResolveMacroRequest
31803183
: public SimpleRequest<ResolveMacroRequest,
3181-
MacroDecl *(UnresolvedMacroReference, MacroRoles,
3184+
MacroDecl *(UnresolvedMacroReference,
31823185
DeclContext *),
31833186
RequestFlags::Cached> {
31843187
public:
@@ -3189,7 +3192,7 @@ class ResolveMacroRequest
31893192

31903193
MacroDecl *
31913194
evaluate(Evaluator &evaluator, UnresolvedMacroReference macroRef,
3192-
MacroRoles roles, DeclContext *dc) const;
3195+
DeclContext *dc) const;
31933196

31943197
public:
31953198
bool isCached() const { return true; }

lib/AST/ASTMangler.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3804,7 +3804,7 @@ void ASTMangler::appendMacroExpansionContext(
38043804
auto *macroDecl = evaluateOrDefault(
38053805
ctx.evaluator,
38063806
ResolveMacroRequest{const_cast<CustomAttr *>(attr),
3807-
getAttachedMacroRoles(), outerExpansionDC},
3807+
outerExpansionDC},
38083808
nullptr);
38093809
if (macroDecl)
38103810
baseName = macroDecl->getBaseName();
@@ -3898,7 +3898,7 @@ std::string ASTMangler::mangleAttachedMacroExpansion(
38983898
StringRef macroName;
38993899
auto *macroDecl = evaluateOrDefault(
39003900
decl->getASTContext().evaluator,
3901-
ResolveMacroRequest{attr, role, macroDeclContext},
3901+
ResolveMacroRequest{attr, macroDeclContext},
39023902
nullptr);
39033903
if (macroDecl)
39043904
macroName = macroDecl->getName().getBaseName().userFacingName();

lib/AST/Attr.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2382,8 +2382,7 @@ bool CustomAttr::isAttachedMacro(const Decl *decl) const {
23822382

23832383
auto *macroDecl = evaluateOrDefault(
23842384
ctx.evaluator,
2385-
ResolveMacroRequest{const_cast<CustomAttr *>(this),
2386-
getAttachedMacroRoles(), dc},
2385+
ResolveMacroRequest{const_cast<CustomAttr *>(this), dc},
23872386
nullptr);
23882387

23892388
return macroDecl != nullptr;

lib/AST/Decl.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -406,7 +406,7 @@ void Decl::forEachAttachedMacro(MacroRole role,
406406
auto customAttr = const_cast<CustomAttr *>(customAttrConst);
407407
auto *macroDecl = evaluateOrDefault(
408408
ctx.evaluator,
409-
ResolveMacroRequest{customAttr, getAttachedMacroRoles(), dc},
409+
ResolveMacroRequest{customAttr, dc},
410410
nullptr);
411411

412412
if (!macroDecl)

lib/AST/NameLookup.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1523,7 +1523,7 @@ populateLookupTableEntryFromMacroExpansions(ASTContext &ctx,
15231523
if (!med)
15241524
continue;
15251525
auto macro = evaluateOrDefault(
1526-
ctx.evaluator, ResolveMacroRequest{med, MacroRole::Declaration, dc},
1526+
ctx.evaluator, ResolveMacroRequest{med, dc},
15271527
nullptr);
15281528
if (!macro)
15291529
continue;

lib/AST/TypeCheckRequests.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1742,6 +1742,19 @@ ArgumentList *UnresolvedMacroReference::getArgs() const {
17421742
llvm_unreachable("Unhandled case");
17431743
}
17441744

1745+
MacroRoles UnresolvedMacroReference::getMacroRoles() const {
1746+
if (pointer.is<MacroExpansionExpr *>())
1747+
return MacroRole::Expression;
1748+
1749+
if (pointer.is<MacroExpansionDecl *>())
1750+
return getFreestandingMacroRoles();
1751+
1752+
if (pointer.is<CustomAttr *>())
1753+
return getAttachedMacroRoles();
1754+
1755+
llvm_unreachable("Unsupported macro reference");
1756+
}
1757+
17451758
void swift::simple_display(llvm::raw_ostream &out,
17461759
const UnresolvedMacroReference &ref) {
17471760
if (ref.getDecl())

lib/IDE/SourceEntityWalker.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,6 @@ bool SemaAnnotator::handleCustomAttributes(Decl *D) {
698698
// If this attribute resolves to a macro, index that.
699699
ASTContext &ctx = D->getASTContext();
700700
ResolveMacroRequest req{const_cast<CustomAttr *>(customAttr),
701-
getAttachedMacroRoles(),
702701
D->getInnermostDeclContext()};
703702
if (auto macroDecl = evaluateOrDefault(ctx.evaluator, req, nullptr)) {
704703
Type macroRefType = macroDecl->getDeclaredInterfaceType();

lib/Sema/CSApply.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5365,7 +5365,12 @@ namespace {
53655365
ConcreteDeclRef macroRef = resolveConcreteDeclRef(macro, locator);
53665366
E->setMacroRef(macroRef);
53675367

5368-
if (E->getMacroRoles().contains(MacroRole::Expression) &&
5368+
// For now, only expand macro expansion expressions that fulfill
5369+
// `MacroRole::Expression` exactly. Freestanding code item macros
5370+
// have a `getMacroRoles()` value equal to `getFreestandingMacroRoles()`,
5371+
// which includes expression macros, and they are expanded in a separate
5372+
// request.
5373+
if (E->getMacroRoles() == MacroRole::Expression &&
53695374
!cs.Options.contains(ConstraintSystemFlags::DisableMacroExpansions)) {
53705375
if (auto newExpr = expandMacroExpr(dc, E, macroRef, expandedType)) {
53715376
E->setRewritten(newExpr);

lib/Sema/TypeCheckAttr.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3568,7 +3568,7 @@ void AttributeChecker::visitCustomAttr(CustomAttr *attr) {
35683568
if (!nominal) {
35693569
// Try resolving an attached macro attribute.
35703570
auto *macro = evaluateOrDefault(
3571-
Ctx.evaluator, ResolveMacroRequest{attr, getAttachedMacroRoles(), dc},
3571+
Ctx.evaluator, ResolveMacroRequest{attr, dc},
35723572
nullptr);
35733573
if (macro || !attr->isValid())
35743574
return;

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3782,7 +3782,7 @@ ExpandMacroExpansionDeclRequest::evaluate(Evaluator &evaluator,
37823782
MacroDecl *macro;
37833783
if (auto *args = MED->getArgs()) {
37843784
macro = evaluateOrDefault(
3785-
ctx.evaluator, ResolveMacroRequest{MED, MacroRole::Declaration, dc},
3785+
ctx.evaluator, ResolveMacroRequest{MED, dc},
37863786
nullptr);
37873787
}
37883788
else {

0 commit comments

Comments
 (0)