Skip to content

Commit 77141c5

Browse files
committed
SourceKit: Adopt SemanticAvailableAttr in SwiftDocSupport.cpp.
1 parent f58a269 commit 77141c5

File tree

1 file changed

+77
-66
lines changed

1 file changed

+77
-66
lines changed

tools/SourceKit/lib/SwiftLang/SwiftDocSupport.cpp

Lines changed: 77 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -656,18 +656,17 @@ static void reportRelated(ASTContext &Ctx, const Decl *D,
656656
}
657657
}
658658

659-
static ArrayRef<const DeclAttribute*>
660-
getDeclAttributes(const Decl *D, std::vector<const DeclAttribute*> &Scratch) {
661-
for (auto Attr : D->getAttrs()) {
659+
static ArrayRef<SemanticAvailableAttr>
660+
getAvailableAttrs(const Decl *D, std::vector<SemanticAvailableAttr> &Scratch) {
661+
for (auto Attr : D->getSemanticAvailableAttrs()) {
662662
Scratch.push_back(Attr);
663663
}
664+
// FIXME: [availability] Special-casing enums and deprecation here is weird.
664665
// For enum elements, inherit their parent enum decls' deprecated attributes.
665666
if (auto *DE = dyn_cast<EnumElementDecl>(D)) {
666-
for (auto Attr : DE->getParentEnum()->getAttrs()) {
667-
if (auto Avail = dyn_cast<AvailableAttr>(Attr)) {
668-
if (Avail->Deprecated || Avail->isUnconditionallyDeprecated()) {
669-
Scratch.push_back(Attr);
670-
}
667+
for (auto Attr : DE->getParentEnum()->getSemanticAvailableAttrs()) {
668+
if (Attr.getDeprecated() || Attr.isUnconditionallyDeprecated()) {
669+
Scratch.push_back(Attr);
671670
}
672671
}
673672
}
@@ -676,10 +675,8 @@ getDeclAttributes(const Decl *D, std::vector<const DeclAttribute*> &Scratch) {
676675
}
677676

678677
// Only reports @available.
679-
// FIXME: Handle all attributes.
680-
static void reportAttributes(ASTContext &Ctx,
681-
const Decl *D,
682-
DocInfoConsumer &Consumer) {
678+
static void reportAvailabilityAttributes(ASTContext &Ctx, const Decl *D,
679+
DocInfoConsumer &Consumer) {
683680
static UIdent AvailableAttrKind("source.lang.swift.attribute.availability");
684681
static UIdent PlatformIOS("source.availability.platform.ios");
685682
static UIdent PlatformMacCatalyst("source.availability.platform.maccatalyst");
@@ -693,61 +690,75 @@ static void reportAttributes(ASTContext &Ctx,
693690
static UIdent PlatformWatchOSAppExt("source.availability.platform.watchos_app_extension");
694691
static UIdent PlatformOpenBSD("source.availability.platform.openbsd");
695692
static UIdent PlatformWindows("source.availability.platform.windows");
696-
std::vector<const DeclAttribute*> Scratch;
697-
698-
for (auto Attr : getDeclAttributes(D, Scratch)) {
699-
if (auto Av = dyn_cast<AvailableAttr>(Attr)) {
700-
UIdent PlatformUID;
701-
switch (Av->getPlatform()) {
702-
case PlatformKind::none:
703-
PlatformUID = UIdent(); break;
704-
case PlatformKind::iOS:
705-
PlatformUID = PlatformIOS; break;
706-
case PlatformKind::macCatalyst:
707-
PlatformUID = PlatformMacCatalyst; break;
708-
case PlatformKind::macOS:
709-
PlatformUID = PlatformOSX; break;
710-
case PlatformKind::tvOS:
711-
PlatformUID = PlatformtvOS; break;
712-
case PlatformKind::watchOS:
713-
PlatformUID = PlatformWatchOS; break;
714-
case PlatformKind::iOSApplicationExtension:
715-
PlatformUID = PlatformIOSAppExt; break;
716-
case PlatformKind::visionOS:
717-
// FIXME: Formal platform support in SourceKit is needed.
718-
PlatformUID = UIdent(); break;
719-
case PlatformKind::macCatalystApplicationExtension:
720-
PlatformUID = PlatformMacCatalystAppExt; break;
721-
case PlatformKind::macOSApplicationExtension:
722-
PlatformUID = PlatformOSXAppExt; break;
723-
case PlatformKind::tvOSApplicationExtension:
724-
PlatformUID = PlatformtvOSAppExt; break;
725-
case PlatformKind::watchOSApplicationExtension:
726-
PlatformUID = PlatformWatchOSAppExt; break;
727-
case PlatformKind::visionOSApplicationExtension:
728-
// FIXME: Formal platform support in SourceKit is needed.
729-
PlatformUID = UIdent(); break;
730-
case PlatformKind::OpenBSD:
731-
PlatformUID = PlatformOpenBSD; break;
732-
case PlatformKind::Windows:
733-
PlatformUID = PlatformWindows; break;
734-
}
693+
std::vector<SemanticAvailableAttr> Scratch;
735694

736-
AvailableAttrInfo Info;
737-
Info.AttrKind = AvailableAttrKind;
738-
Info.IsUnavailable = Av->isUnconditionallyUnavailable();
739-
Info.IsDeprecated = Av->isUnconditionallyDeprecated();
740-
Info.Platform = PlatformUID;
741-
Info.Message = Av->Message;
742-
if (Av->Introduced)
743-
Info.Introduced = *Av->Introduced;
744-
if (Av->Deprecated)
745-
Info.Deprecated = *Av->Deprecated;
746-
if (Av->Obsoleted)
747-
Info.Obsoleted = *Av->Obsoleted;
748-
749-
Consumer.handleAvailableAttribute(Info);
695+
for (auto Attr : getAvailableAttrs(D, Scratch)) {
696+
UIdent PlatformUID;
697+
switch (Attr.getPlatform()) {
698+
case PlatformKind::none:
699+
PlatformUID = UIdent();
700+
break;
701+
case PlatformKind::iOS:
702+
PlatformUID = PlatformIOS;
703+
break;
704+
case PlatformKind::macCatalyst:
705+
PlatformUID = PlatformMacCatalyst;
706+
break;
707+
case PlatformKind::macOS:
708+
PlatformUID = PlatformOSX;
709+
break;
710+
case PlatformKind::tvOS:
711+
PlatformUID = PlatformtvOS;
712+
break;
713+
case PlatformKind::watchOS:
714+
PlatformUID = PlatformWatchOS;
715+
break;
716+
case PlatformKind::iOSApplicationExtension:
717+
PlatformUID = PlatformIOSAppExt;
718+
break;
719+
case PlatformKind::visionOS:
720+
// FIXME: Formal platform support in SourceKit is needed.
721+
PlatformUID = UIdent();
722+
break;
723+
case PlatformKind::macCatalystApplicationExtension:
724+
PlatformUID = PlatformMacCatalystAppExt;
725+
break;
726+
case PlatformKind::macOSApplicationExtension:
727+
PlatformUID = PlatformOSXAppExt;
728+
break;
729+
case PlatformKind::tvOSApplicationExtension:
730+
PlatformUID = PlatformtvOSAppExt;
731+
break;
732+
case PlatformKind::watchOSApplicationExtension:
733+
PlatformUID = PlatformWatchOSAppExt;
734+
break;
735+
case PlatformKind::visionOSApplicationExtension:
736+
// FIXME: Formal platform support in SourceKit is needed.
737+
PlatformUID = UIdent();
738+
break;
739+
case PlatformKind::OpenBSD:
740+
PlatformUID = PlatformOpenBSD;
741+
break;
742+
case PlatformKind::Windows:
743+
PlatformUID = PlatformWindows;
744+
break;
750745
}
746+
// FIXME: [availability] Handle other availability domains?
747+
748+
AvailableAttrInfo Info;
749+
Info.AttrKind = AvailableAttrKind;
750+
Info.IsUnavailable = Attr.isUnconditionallyUnavailable();
751+
Info.IsDeprecated = Attr.isUnconditionallyDeprecated();
752+
Info.Platform = PlatformUID;
753+
Info.Message = Attr.getMessage();
754+
if (Attr.getIntroduced())
755+
Info.Introduced = Attr.getIntroduced().value();
756+
if (Attr.getDeprecated())
757+
Info.Deprecated = Attr.getDeprecated().value();
758+
if (Attr.getObsoleted())
759+
Info.Obsoleted = Attr.getObsoleted().value();
760+
761+
Consumer.handleAvailableAttribute(Info);
751762
}
752763
}
753764

@@ -764,7 +775,7 @@ static void reportDocEntities(ASTContext &Ctx,
764775
: TypeOrExtensionDecl(),
765776
Consumer);
766777
reportDocEntities(Ctx, Entity.SubEntities, Consumer);
767-
reportAttributes(Ctx, Entity.Dcl, Consumer);
778+
reportAvailabilityAttributes(Ctx, Entity.Dcl, Consumer);
768779
Consumer.finishSourceEntity(EntInfo.Kind);
769780
}
770781
}

0 commit comments

Comments
 (0)