Skip to content

Commit 07e002c

Browse files
committed
swift-api-digester: diagnose generic signature change for any declarations.
1 parent 9b036b2 commit 07e002c

File tree

8 files changed

+64
-1
lines changed

8 files changed

+64
-1
lines changed

include/swift/IDE/DigesterEnums.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ NODE_ANNOTATION(OwnershipChange)
6262
NODE_ANNOTATION(ChangeObjC)
6363
NODE_ANNOTATION(ChangeFixedLayout)
6464
NODE_ANNOTATION(ChangeFrozen)
65+
NODE_ANNOTATION(ChangeGenericSignature)
6566
NODE_ANNOTATION(RawTypeLeft)
6667
NODE_ANNOTATION(RawTypeRight)
6768

test/api-digester/Inputs/cake1.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,3 +36,11 @@ public struct C6 {}
3636

3737
@_frozen
3838
public enum IceKind {}
39+
40+
public protocol P1 {}
41+
42+
public protocol P2 {}
43+
44+
public extension P1 where Self: P2 {
45+
func P1Constraint() {}
46+
}

test/api-digester/Inputs/cake2.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,12 @@ public class C5 {}
3535
@_fixed_layout
3636
public struct C6 {}
3737

38-
public enum IceKind {}
38+
public enum IceKind {}
39+
40+
public protocol P1 {}
41+
42+
public protocol P2 {}
43+
44+
public extension P1 {
45+
func P1Constraint() {}
46+
}

test/api-digester/Outputs/Cake-abi.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11

2+
/* Generic Signature Changes */
3+
cake1: Func P1.P1Constraint() has generic signature change from <τ_0_0 where τ_0_0 : P1, τ_0_0 : P2> to <τ_0_0 where τ_0_0 : P1>
4+
25
/* RawRepresentable Changes */
36

47
/* Removed Decls */

test/api-digester/Outputs/Cake.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11

2+
/* Generic Signature Changes */
3+
cake1: Func P1.P1Constraint() has generic signature change from <Self where Self : P1, Self : P2> to <Self where Self : P1>
4+
25
/* RawRepresentable Changes */
36

47
/* Removed Decls */

test/api-digester/Outputs/apinotes-diags-3-4.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11

2+
/* Generic Signature Changes */
3+
24
/* RawRepresentable Changes */
35
APINotesTest(APINotesTest.h): TypeAlias AnimalAttributeName(NSString) is now String representable
46

test/api-digester/Outputs/apinotes-diags.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
11

2+
/* Generic Signature Changes */
3+
APINotesTest(APINotesTest.h): Func SwiftTypeWithMethodLeft.minusPrint() has generic signature change from <Self where Self : SwiftTypeWithMethodLeft> to <Self where Self : SwiftTypeWithMethodRight>
4+
APINotesTest(APINotesTest.h): Func SwiftTypeWithMethodLeft.plusPrint() has generic signature change from <Self where Self : SwiftTypeWithMethodLeft> to <Self where Self : SwiftTypeWithMethodRight>
5+
26
/* RawRepresentable Changes */
37
APINotesTest(APINotesTest.h): TypeAlias CatAttributeName(NSString) is now String representable
48

tools/swift-api-digester/swift-api-digester.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2505,6 +2505,9 @@ static void detectDeclChange(NodePtr L, NodePtr R) {
25052505
if (LD->hasDeclAttribute(Info.Kind) != RD->hasDeclAttribute(Info.Kind))
25062506
L->annotate(Info.Annotation);
25072507
}
2508+
// Mark generic signature change
2509+
if (LD->getGenericSignature() != RD->getGenericSignature())
2510+
L->annotate(NodeAnnotation::ChangeGenericSignature);
25082511
detectRename(L, R);
25092512
}
25102513
}
@@ -3441,13 +3444,35 @@ class DiagnosisEmitter : public SDKNodeVisitor {
34413444
static void theme(raw_ostream &OS) { OS << "RawRepresentable Changes"; };
34423445
};
34433446

3447+
struct GenericSignatureChangeDiag: public DiagBase {
3448+
DeclKind Kind;
3449+
StringRef DeclName;
3450+
StringRef GSBefore;
3451+
StringRef GSAfter;
3452+
GenericSignatureChangeDiag(MetaInfo Info, DeclKind Kind, StringRef DeclName,
3453+
StringRef GSBefore, StringRef GSAfter): DiagBase(Info), Kind(Kind),
3454+
DeclName(DeclName), GSBefore(GSBefore), GSAfter(GSAfter) {}
3455+
bool operator<(GenericSignatureChangeDiag Other) const {
3456+
if (Kind != Other.Kind)
3457+
return Kind < Other.Kind;
3458+
return DeclName.compare(Other.DeclName) < 0;
3459+
}
3460+
void output() const override {
3461+
llvm::outs() << Kind << " " << printName(DeclName)
3462+
<< " has generic signature change from " << GSBefore << " to "
3463+
<< GSAfter << "\n";
3464+
}
3465+
static void theme(raw_ostream &OS) { OS << "Generic Signature Changes"; };
3466+
};
3467+
34443468
std::set<SDKNodeDecl*> AddedDecls;
34453469
DiagBag<DeclAttrDiag> AttrChangedDecls;
34463470
DiagBag<DeclTypeChangeDiag> TypeChangedDecls;
34473471
DiagBag<RenamedDeclDiag> RenamedDecls;
34483472
DiagBag<MovedDeclDiag> MovedDecls;
34493473
DiagBag<RemovedDeclDiag> RemovedDecls;
34503474
DiagBag<RawRepresentableChangeDiag> RawRepresentableDecls;
3475+
DiagBag<GenericSignatureChangeDiag> GSChangeDecls;
34513476

34523477
UpdatedNodesMap &UpdateMap;
34533478
NodeMap &TypeAliasUpdateMap;
@@ -3697,6 +3722,15 @@ void DiagnosisEmitter::handle(const SDKNodeDecl *Node, NodeAnnotation Anno) {
36973722
getOwnershipDescription(Count->getReferenceOwnership()));
36983723
return;
36993724
}
3725+
case NodeAnnotation::ChangeGenericSignature: {
3726+
MetaInfo ScreenInfo(Node, false);
3727+
GSChangeDecls.Diags.emplace_back(ScreenInfo, Node->getDeclKind(),
3728+
Node->getFullyQualifiedName(), Node->getGenericSignature(),
3729+
UpdateMap.findUpdateCounterpart(Node)->getAs<SDKNodeDecl>()->
3730+
getGenericSignature());
3731+
return;
3732+
}
3733+
37003734
default: {
37013735
// Diagnose the addition/removal of attributes with ABI impact.
37023736
auto Infos = Ctx.getABIAttributeInfo();

0 commit comments

Comments
 (0)