Skip to content

Commit b9cefa8

Browse files
committed
Share module extraction logic
1 parent cca2f12 commit b9cefa8

File tree

4 files changed

+38
-53
lines changed

4 files changed

+38
-53
lines changed

include/swift/AST/Attr.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ class ModuleDecl;
6464
class PatternBindingInitializer;
6565
class TrailingWhereClause;
6666
class TypeExpr;
67+
class IdentTypeRepr;
6768

6869
class alignas(1 << AttrAlignInBits) AttributeBase
6970
: public ASTAllocated<AttributeBase> {
@@ -1769,6 +1770,15 @@ class CustomAttr final : public DeclAttribute {
17691770
TypeRepr *getTypeRepr() const;
17701771
Type getType() const;
17711772

1773+
/// Destructure an attribute's type repr for a macro reference.
1774+
///
1775+
/// For a 1-level member type repr whose base and member are both identifier
1776+
/// types, e.g. `Foo.Bar`, return a pair of the base and the member.
1777+
///
1778+
/// For an identifier type repr, return a pair of `nullptr` and the
1779+
/// identifier.
1780+
std::pair<IdentTypeRepr *, IdentTypeRepr *> destructureMacroRef();
1781+
17721782
/// Whether the attribute has any arguments.
17731783
bool hasArgs() const { return argList != nullptr; }
17741784

lib/AST/Attr.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2587,6 +2587,21 @@ CustomAttr *CustomAttr::create(ASTContext &ctx, SourceLoc atLoc, TypeExpr *type,
25872587
CustomAttr(atLoc, range, type, initContext, argList, implicit);
25882588
}
25892589

2590+
std::pair<IdentTypeRepr *, IdentTypeRepr *> CustomAttr::destructureMacroRef() {
2591+
TypeRepr *typeRepr = getTypeRepr();
2592+
if (!typeRepr)
2593+
return {nullptr, nullptr};
2594+
if (auto *identType = dyn_cast<IdentTypeRepr>(typeRepr))
2595+
return {nullptr, identType};
2596+
if (auto *memType = dyn_cast<MemberTypeRepr>(typeRepr))
2597+
if (auto *base = dyn_cast<IdentTypeRepr>(memType->getBaseComponent()))
2598+
if (memType->getMemberComponents().size() == 1)
2599+
if (auto first =
2600+
dyn_cast<IdentTypeRepr>(memType->getMemberComponents().front()))
2601+
return {base, first};
2602+
return {nullptr, nullptr};
2603+
}
2604+
25902605
TypeRepr *CustomAttr::getTypeRepr() const { return typeExpr->getTypeRepr(); }
25912606
Type CustomAttr::getType() const { return typeExpr->getInstanceType(); }
25922607

lib/AST/NameLookup.cpp

Lines changed: 7 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3587,32 +3587,13 @@ CustomAttrNominalRequest::evaluate(Evaluator &evaluator,
35873587
// Look for names at module scope, so we don't trigger name lookup for
35883588
// nested scopes. At this point, we're looking to see whether there are
35893589
// any suitable macros.
3590-
3591-
// Handle a module-qualified name.
3592-
if (auto *memTypeRepr =
3593-
dyn_cast_or_null<MemberTypeRepr>(attr->getTypeRepr())) {
3594-
auto baseTypeRepr = memTypeRepr->getBaseComponent();
3595-
auto memberReprs = memTypeRepr->getMemberComponents();
3596-
auto *moduleNameRepr = dyn_cast<IdentTypeRepr>(baseTypeRepr);
3597-
3598-
if (moduleNameRepr && (memberReprs.size() == 1)) {
3599-
if (auto *macroNameRepr = dyn_cast<IdentTypeRepr>(memberReprs.front())) {
3600-
auto moduleName = moduleNameRepr->getNameRef();
3601-
auto macroName = macroNameRepr->getNameRef();
3602-
auto macros = namelookup::lookupMacros(dc, moduleName, macroName,
3603-
getAttachedMacroRoles());
3604-
if (!macros.empty())
3605-
return nullptr;
3606-
}
3607-
}
3608-
} else if (auto *identTypeRepr =
3609-
dyn_cast_or_null<IdentTypeRepr>(attr->getTypeRepr())) {
3610-
auto macros =
3611-
namelookup::lookupMacros(dc, DeclNameRef(), identTypeRepr->getNameRef(),
3612-
getAttachedMacroRoles());
3613-
if (!macros.empty())
3614-
return nullptr;
3615-
}
3590+
auto [base, member] = attr->destructureMacroRef();
3591+
auto moduleName = (base) ? base->getNameRef() : DeclNameRef();
3592+
auto macroName = (member) ? member->getNameRef() : DeclNameRef();
3593+
auto macros = namelookup::lookupMacros(dc, moduleName, macroName,
3594+
getAttachedMacroRoles());
3595+
if (!macros.empty())
3596+
return nullptr;
36163597

36173598
// Find the types referenced by the custom attribute.
36183599
auto &ctx = dc->getASTContext();

lib/AST/TypeCheckRequests.cpp

Lines changed: 6 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1792,32 +1792,11 @@ void swift::simple_display(
17921792
// ResolveMacroRequest computation.
17931793
//----------------------------------------------------------------------------//
17941794

1795-
/// Destructure a type repr for a macro reference.
1796-
///
1797-
/// For a 1-level member type repr whose base and member are both identifier
1798-
/// types, e.g. `Foo.Bar`, return a pair of the base and the member.
1799-
///
1800-
/// For an identifier type repr, return a pair of `nullptr` and the identifier.
1801-
static std::pair<IdentTypeRepr *, IdentTypeRepr *>
1802-
destructureMacroRefTypeRepr(TypeRepr *typeRepr) {
1803-
if (!typeRepr)
1804-
return {nullptr, nullptr};
1805-
if (auto *identType = dyn_cast<IdentTypeRepr>(typeRepr))
1806-
return {nullptr, identType};
1807-
if (auto *memType = dyn_cast<MemberTypeRepr>(typeRepr))
1808-
if (auto *base = dyn_cast<IdentTypeRepr>(memType->getBaseComponent()))
1809-
if (memType->getMemberComponents().size() == 1)
1810-
if (auto first =
1811-
dyn_cast<IdentTypeRepr>(memType->getMemberComponents().front()))
1812-
return {base, first};
1813-
return {nullptr, nullptr};
1814-
}
1815-
18161795
DeclNameRef UnresolvedMacroReference::getMacroName() const {
18171796
if (auto *expansion = pointer.dyn_cast<FreestandingMacroExpansion *>())
18181797
return expansion->getMacroName();
18191798
if (auto *attr = pointer.dyn_cast<CustomAttr *>()) {
1820-
auto [_, member] = destructureMacroRefTypeRepr(attr->getTypeRepr());
1799+
auto [_, member] = attr->destructureMacroRef();
18211800
if (!member)
18221801
return DeclNameRef();
18231802
return member->getNameRef();
@@ -1837,7 +1816,7 @@ DeclNameRef UnresolvedMacroReference::getModuleName() const {
18371816
if (auto *expansion = pointer.dyn_cast<FreestandingMacroExpansion *>())
18381817
return expansion->getModuleName();
18391818
if (auto *attr = pointer.dyn_cast<CustomAttr *>()) {
1840-
auto [base, _] = destructureMacroRefTypeRepr(attr->getTypeRepr());
1819+
auto [base, _] = attr->destructureMacroRef();
18411820
if (!base)
18421821
return DeclNameRef();
18431822
return base->getNameRef();
@@ -1849,7 +1828,7 @@ DeclNameLoc UnresolvedMacroReference::getModuleNameLoc() const {
18491828
if (auto *expansion = pointer.dyn_cast<FreestandingMacroExpansion *>())
18501829
return expansion->getModuleNameLoc();
18511830
if (auto *attr = pointer.dyn_cast<CustomAttr *>()) {
1852-
auto [base, _] = destructureMacroRefTypeRepr(attr->getTypeRepr());
1831+
auto [base, _] = attr->destructureMacroRef();
18531832
if (!base)
18541833
return DeclNameLoc();
18551834
return base->getNameLoc();
@@ -1861,7 +1840,7 @@ DeclNameLoc UnresolvedMacroReference::getMacroNameLoc() const {
18611840
if (auto *expansion = pointer.dyn_cast<FreestandingMacroExpansion *>())
18621841
return expansion->getMacroNameLoc();
18631842
if (auto *attr = pointer.dyn_cast<CustomAttr *>()) {
1864-
auto [_, member] = destructureMacroRefTypeRepr(attr->getTypeRepr());
1843+
auto [_, member] = attr->destructureMacroRef();
18651844
if (!member)
18661845
return DeclNameLoc();
18671846
return member->getNameLoc();
@@ -1874,7 +1853,7 @@ SourceRange UnresolvedMacroReference::getGenericArgsRange() const {
18741853
return expansion->getGenericArgsRange();
18751854

18761855
if (auto *attr = pointer.dyn_cast<CustomAttr *>()) {
1877-
auto [_, member] = destructureMacroRefTypeRepr(attr->getTypeRepr());
1856+
auto [_, member] = attr->destructureMacroRef();
18781857
if (!member)
18791858
return SourceRange();
18801859
auto *genericTypeRepr = dyn_cast_or_null<GenericIdentTypeRepr>(member);
@@ -1892,7 +1871,7 @@ ArrayRef<TypeRepr *> UnresolvedMacroReference::getGenericArgs() const {
18921871
return expansion->getGenericArgs();
18931872

18941873
if (auto *attr = pointer.dyn_cast<CustomAttr *>()) {
1895-
auto [_, member] = destructureMacroRefTypeRepr(attr->getTypeRepr());
1874+
auto [_, member] = attr->destructureMacroRef();
18961875
if (!member)
18971876
return {};
18981877
auto *genericTypeRepr = dyn_cast_or_null<GenericIdentTypeRepr>(member);

0 commit comments

Comments
 (0)