mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
Merge remote-tracking branch 'origin/master' into master-next
This commit is contained in:
@@ -824,6 +824,26 @@ void swift::ide::api::SDKNodeDeclFunction::diagnose(SDKNode *Right) {
|
||||
}
|
||||
}
|
||||
|
||||
static StringRef getAttrName(DeclAttrKind Kind) {
|
||||
switch (Kind) {
|
||||
#define DECL_ATTR(NAME, CLASS, ...) \
|
||||
case DAK_##CLASS: \
|
||||
return DeclAttribute::isDeclModifier(DAK_##CLASS) ? #NAME : "@"#NAME;
|
||||
#include "swift/AST/Attr.def"
|
||||
case DAK_Count:
|
||||
llvm_unreachable("unrecognized attribute kind.");
|
||||
}
|
||||
llvm_unreachable("covered switch");
|
||||
}
|
||||
|
||||
static bool shouldDiagnoseAddingAttribute(SDKNodeDecl *D, DeclAttrKind Kind) {
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool shouldDiagnoseRemovingAttribute(SDKNodeDecl *D, DeclAttrKind Kind) {
|
||||
return true;
|
||||
}
|
||||
|
||||
void swift::ide::api::SDKNodeDecl::diagnose(SDKNode *Right) {
|
||||
SDKNode::diagnose(Right);
|
||||
auto *RD = dyn_cast<SDKNodeDecl>(Right);
|
||||
@@ -882,13 +902,27 @@ void swift::ide::api::SDKNodeDecl::diagnose(SDKNode *Right) {
|
||||
}
|
||||
}
|
||||
|
||||
// Check if some attributes with ABI/API-impact have been added/removed.
|
||||
for (auto &Info: Ctx.getBreakingAttributeInfo()) {
|
||||
if (hasDeclAttribute(Info.Kind) != RD->hasDeclAttribute(Info.Kind)) {
|
||||
auto Desc = hasDeclAttribute(Info.Kind) ?
|
||||
Ctx.buffer((llvm::Twine("without ") + Info.Content).str()):
|
||||
Ctx.buffer((llvm::Twine("with ") + Info.Content).str());
|
||||
emitDiag(diag::decl_new_attr, Desc);
|
||||
// Diagnose removing attributes.
|
||||
for (auto Kind: getDeclAttributes()) {
|
||||
if (!RD->hasDeclAttribute(Kind)) {
|
||||
if ((Ctx.checkingABI() ? DeclAttribute::isRemovingBreakingABI(Kind) :
|
||||
DeclAttribute::isRemovingBreakingAPI(Kind)) &&
|
||||
shouldDiagnoseRemovingAttribute(this, Kind)) {
|
||||
emitDiag(diag::decl_new_attr,
|
||||
Ctx.buffer((llvm::Twine("without ") + getAttrName(Kind)).str()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Diagnose adding attributes.
|
||||
for (auto Kind: RD->getDeclAttributes()) {
|
||||
if (!hasDeclAttribute(Kind)) {
|
||||
if ((Ctx.checkingABI() ? DeclAttribute::isAddingBreakingABI(Kind) :
|
||||
DeclAttribute::isAddingBreakingAPI(Kind)) &&
|
||||
shouldDiagnoseAddingAttribute(this, Kind)) {
|
||||
emitDiag(diag::decl_new_attr,
|
||||
Ctx.buffer((llvm::Twine("with ") + getAttrName(Kind)).str()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user