Skip to content

Commit 23ee291

Browse files
elicwhitemeta-codesync[bot]
authored andcommitted
Unify enum and union member comparison types (#55377)
Summary: Pull Request resolved: #55377 Simplifies the member comparison logic by consolidating enum and union member types into a single discriminated union. This reduces code duplication and makes the comparison result handling more uniform across the codebase, as both member types now follow the same pattern with a `memberKind` discriminator. When D86501597 was added, we couldn't come up with an easy way to converge these, so it was easier to just duplicate the code path for enum for unions. It always felt like a smell to me though, because they are so similar. AI was able to find a good way to converge them. Changelog: [Internal] Reviewed By: makovkastar Differential Revision: D91296850 fbshipit-source-id: 5a1baf1c8149f0c6c9c72c0dce9ea093f71e39cd
1 parent 9907a06 commit 23ee291

7 files changed

Lines changed: 141 additions & 271 deletions

File tree

packages/react-native-compatibility-check/src/ComparisonResult.js

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,8 @@ export type PropertiesComparisonResult = {
101101
nestedPropertyChanges?: Array<[string, ComparisonResult]>,
102102
...
103103
};
104-
export type MembersComparisonResult = {
104+
export type EnumMembersComparisonResult = {
105+
memberKind: 'enum',
105106
addedMembers?: Array<NativeModuleEnumMember>,
106107
missingMembers?: Array<NativeModuleEnumMember>,
107108
errorMembers?: Array<{
@@ -110,13 +111,17 @@ export type MembersComparisonResult = {
110111
}>,
111112
};
112113
export type UnionMembersComparisonResult = {
114+
memberKind: 'union',
113115
addedMembers?: Array<CompleteTypeAnnotation>,
114116
missingMembers?: Array<CompleteTypeAnnotation>,
115117
errorMembers?: Array<{
116118
member: string,
117119
fault?: TypeComparisonError,
118120
}>,
119121
};
122+
export type MembersComparisonResult =
123+
| EnumMembersComparisonResult
124+
| UnionMembersComparisonResult;
120125
export type NullableComparisonResult = {
121126
/* Four possible cases of change:
122127
void goes to T? :: typeRefined !optionsReduced
@@ -150,11 +155,6 @@ export type ComparisonResult =
150155
memberLog: MembersComparisonResult,
151156
errorLog?: TypeComparisonError,
152157
}
153-
| {
154-
status: 'unionMembers',
155-
memberLog: UnionMembersComparisonResult,
156-
errorLog?: TypeComparisonError,
157-
}
158158
| {
159159
status: 'functionChange',
160160
functionChangeLog: FunctionComparisonResult,
@@ -184,12 +184,6 @@ export function isMemberLogEmpty(result: MembersComparisonResult): boolean {
184184
return !(result.addedMembers || result.missingMembers || result.errorMembers);
185185
}
186186

187-
export function isUnionMemberLogEmpty(
188-
result: UnionMembersComparisonResult,
189-
): boolean {
190-
return !(result.addedMembers || result.missingMembers || result.errorMembers);
191-
}
192-
193187
export function isFunctionLogEmpty(result: FunctionComparisonResult): boolean {
194188
return !(result.returnType || result.parameterTypes);
195189
}

packages/react-native-compatibility-check/src/DiffResults.js

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,8 @@ export type ErrorCode =
2323
| 'optionalProps'
2424
| 'nonNullableOfNull'
2525
| 'nullableOfNonNull'
26-
| 'removedUnionCases'
27-
| 'addedUnionCases'
28-
| 'addedEnumCases'
29-
| 'removedEnumCases'
26+
| 'removedMemberCases'
27+
| 'addedMemberCases'
3028
| 'removedIntersectCases'
3129
| 'addedIntersectCases'
3230
| 'removedModule'

packages/react-native-compatibility-check/src/TypeDiffing.js

Lines changed: 14 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import type {
1212
ComparisonResult,
13+
EnumMembersComparisonResult,
1314
FunctionComparisonResult,
1415
MembersComparisonResult,
1516
PositionalComparisonResult,
@@ -45,7 +46,6 @@ import {
4546
isFunctionLogEmpty,
4647
isMemberLogEmpty,
4748
isPropertyLogEmpty,
48-
isUnionMemberLogEmpty,
4949
makeError,
5050
memberComparisonError,
5151
propertyComparisonError,
@@ -325,33 +325,7 @@ function updatePropertyError(
325325
};
326326
}
327327

328-
function updateUnionMemberError(
329-
name: CompleteTypeAnnotation,
330-
newType: CompleteTypeAnnotation,
331-
oldType: CompleteTypeAnnotation,
332-
result: UnionMembersComparisonResult,
333-
) {
334-
return (oldError: TypeComparisonError) => {
335-
const comparisonError = typeAnnotationComparisonError(
336-
'has conflicting changes',
337-
newType,
338-
oldType,
339-
oldError,
340-
);
341-
const memberLabel = getTypeAnnotationLabel(name);
342-
const newFault: {fault?: TypeComparisonError, member: string} = {
343-
member: memberLabel,
344-
fault: comparisonError,
345-
};
346-
if (result.errorMembers) {
347-
result.errorMembers.push(newFault);
348-
} else {
349-
result.errorMembers = [newFault];
350-
}
351-
};
352-
}
353-
354-
function updateEnumMemberError(
328+
function updateMemberError(
355329
name: string,
356330
newType: CompleteTypeAnnotation,
357331
oldType: CompleteTypeAnnotation,
@@ -501,7 +475,6 @@ function comparePropertyArrays(
501475
result,
502476
);
503477
case 'members':
504-
case 'unionMembers':
505478
case 'properties':
506479
case 'functionChange':
507480
case 'positionalTypeChange':
@@ -675,13 +648,13 @@ export function compareEnumDeclarations(
675648
export function compareEnumDeclarationMemberArrays(
676649
newer: Array<NativeModuleEnumMember>,
677650
older: Array<NativeModuleEnumMember>,
678-
): MembersComparisonResult {
651+
): EnumMembersComparisonResult {
679652
if (newer.length === 0 && older.length === 0) {
680-
return {};
653+
return {memberKind: 'enum'};
681654
} else if (newer.length === 0) {
682-
return {missingMembers: [...older]};
655+
return {memberKind: 'enum', missingMembers: [...older]};
683656
} else if (older.length === 0) {
684-
return {addedMembers: [...newer]};
657+
return {memberKind: 'enum', addedMembers: [...newer]};
685658
}
686659
687660
const newerHead = newer.pop();
@@ -702,7 +675,7 @@ export function compareEnumDeclarationMemberArrays(
702675
case 'matching':
703676
return result;
704677
case 'error':
705-
updateEnumMemberError(
678+
updateMemberError(
706679
newerName,
707680
newerHead.value,
708681
olderHead.value,
@@ -718,7 +691,6 @@ export function compareEnumDeclarationMemberArrays(
718691
case 'functionChange':
719692
case 'positionalTypeChange':
720693
case 'members':
721-
case 'unionMembers':
722694
break;
723695
default:
724696
// Flow exhaustiveness check
@@ -753,11 +725,11 @@ export function compareUnionMemberArrays(
753725
older: Array<CompleteTypeAnnotation>,
754726
): UnionMembersComparisonResult {
755727
if (newer.length === 0 && older.length === 0) {
756-
return {};
728+
return {memberKind: 'union'};
757729
} else if (newer.length === 0) {
758-
return {missingMembers: [...older]};
730+
return {memberKind: 'union', missingMembers: [...older]};
759731
} else if (older.length === 0) {
760-
return {addedMembers: [...newer]};
732+
return {memberKind: 'union', addedMembers: [...newer]};
761733
}
762734
763735
const newerHead = newer.pop();
@@ -777,8 +749,8 @@ export function compareUnionMemberArrays(
777749
case 'matching':
778750
return restComparison;
779751
case 'error':
780-
updateUnionMemberError(
781-
newerHead,
752+
updateMemberError(
753+
getTypeAnnotationLabel(newerHead),
782754
newerHead,
783755
olderHead,
784756
restComparison,
@@ -799,7 +771,6 @@ export function compareUnionMemberArrays(
799771
case 'functionChange':
800772
case 'positionalTypeChange':
801773
case 'members':
802-
case 'unionMembers':
803774
break;
804775
default:
805776
// Flow exhaustiveness check
@@ -984,7 +955,7 @@ export function compareUnionTypes(
984955
sortedOlderTypes.map(([_, type]) => type),
985956
);
986957
987-
if (isUnionMemberLogEmpty(result)) {
958+
if (isMemberLogEmpty(result)) {
988959
return {status: 'matching'};
989960
} else if (result.errorMembers) {
990961
return makeError(
@@ -1018,7 +989,7 @@ export function compareUnionTypes(
1018989
}
1019990
1020991
return {
1021-
status: 'unionMembers',
992+
status: 'members',
1022993
memberLog: result,
1023994
errorLog: typeAnnotationComparisonError(
1024995
'Union has member changes',
@@ -1212,7 +1183,6 @@ export function compareFunctionTypes(
12121183
if (
12131184
returnTypeResult.status === 'properties' ||
12141185
returnTypeResult.status === 'members' ||
1215-
returnTypeResult.status === 'unionMembers' ||
12161186
returnTypeResult.status === 'functionChange' ||
12171187
returnTypeResult.status === 'positionalTypeChange' ||
12181188
returnTypeResult.status === 'nullableChange'
@@ -1315,7 +1285,6 @@ function compareArrayOfTypes(
13151285
if (
13161286
result.status === 'properties' ||
13171287
result.status === 'members' ||
1318-
result.status === 'unionMembers' ||
13191288
result.status === 'functionChange' ||
13201289
result.status === 'positionalTypeChange' ||
13211290
result.status === 'nullableChange'

0 commit comments

Comments
 (0)