Skip to content

Commit e24c9e7

Browse files
authored
omitNeedlessWords: Fix self-type-stripping regression (#27742)
Turns out self-type-stripping /always/ operates on a type without prefixes rather than /never/. Neither of these behaviors are really what we'd want, but we'll live with it! rdar://problem/56334797
1 parent ab1381a commit e24c9e7

File tree

3 files changed

+37
-7
lines changed

3 files changed

+37
-7
lines changed

lib/Basic/StringExtras.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -609,7 +609,7 @@ omitTrailingTypeNameWithSpecialCases(StringRef name,
609609
/// If there is no match, returns the end WordIterator for \p name.
610610
static Words::iterator matchTypeNameFromBackWithSpecialCases(
611611
StringRef name, OmissionTypeName typeName,
612-
const InheritedNameSet *allPropertyNames, bool canSkipTypeSuffix = true) {
612+
const InheritedNameSet *allPropertyNames) {
613613
// Get the camel-case words in the name and type name.
614614
auto nameWords = camel_case::getWords(name);
615615
auto typeWords = camel_case::getWords(typeName.Name);
@@ -697,7 +697,7 @@ static Words::iterator matchTypeNameFromBackWithSpecialCases(
697697
}
698698

699699
// If this is a skippable suffix, skip it and keep looking.
700-
if (canSkipTypeSuffix && nameWordRevIter == nameWordRevIterBegin) {
700+
if (nameWordRevIter == nameWordRevIterBegin) {
701701
if (auto withoutSuffix = skipTypeSuffix(typeName.Name)) {
702702
typeName.Name = *withoutSuffix;
703703
typeWords = camel_case::getWords(typeName.Name);
@@ -724,8 +724,6 @@ omitSelfTypeFromBaseName(StringRef name, OmissionTypeName typeName,
724724
typeName.CollectionElement = StringRef();
725725

726726
auto nameWords = camel_case::getWords(name);
727-
728-
bool canSkipTypeSuffix = true;
729727
Optional<llvm::iterator_range<WordIterator>> matchingRange;
730728

731729
// Search backwards for the type name, whether anchored at the end or not.
@@ -734,8 +732,7 @@ omitSelfTypeFromBaseName(StringRef name, OmissionTypeName typeName,
734732
++nameReverseIter) {
735733
StringRef matchName = nameReverseIter.base().getPriorStr();
736734
auto matchIter = matchTypeNameFromBackWithSpecialCases(matchName, typeName,
737-
allPropertyNames,
738-
canSkipTypeSuffix);
735+
allPropertyNames);
739736
auto matchIterInFullName = WordIterator(name, matchIter.getPosition());
740737
if (matchIterInFullName != nameReverseIter.base()) {
741738
matchingRange = llvm::make_range(matchIterInFullName,
@@ -746,7 +743,8 @@ omitSelfTypeFromBaseName(StringRef name, OmissionTypeName typeName,
746743
// Note: This behavior fell out of a previous implementation of
747744
// omit-needless-words, even though it probably wasn't intentional. At this
748745
// point, though, it could be source-breaking to change it.
749-
canSkipTypeSuffix = false;
746+
while (auto withoutSuffix = skipTypeSuffix(typeName.Name))
747+
typeName.Name = *withoutSuffix;
750748
}
751749

752750
// If we matched nothing, or if the type name was all the way at the start

test/IDE/Inputs/custom-modules/OmitNeedlessWords.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,3 +79,16 @@ typedef NS_OPTIONS(NSUInteger, OMWWobbleOptions) {
7979
-(void)conflicting1;
8080
@property (readonly) NSInteger conflictingProp1;
8181
@end
82+
83+
@interface OMWObjectType : NSObject
84+
-(void)_enumerateObjectTypesWithHandler:(nonnull void (^)(void))handler;
85+
@end
86+
87+
@interface OMWTerrifyingGarbage4DTypeRefMask_t : NSObject
88+
-(void)throwGarbageAway;
89+
-(void)throwGarbage4DAwayHarder;
90+
-(void)throwGarbage4DTypeRefMask_tAwayHardest;
91+
-(void)burnGarbage;
92+
-(void)carefullyBurnGarbage4D;
93+
-(void)veryCarefullyBurnGarbage4DTypeRefMask_t;
94+
@end

test/IDE/print_omit_needless_words.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,25 @@
300300
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func jumpSuper()
301301
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func joinSub()
302302

303+
// CHECK-OMIT-NEEDLESS-WORDS-LABEL: class OMWObjectType
304+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func _enumerateTypes(handler: @escaping () -> Void)
305+
306+
// CHECK-OMIT-NEEDLESS-WORDS-LABEL: class OMWTerrifyingGarbage4DTypeRefMask_t
307+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func throwAway()
308+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: @available(swift, obsoleted: 3, renamed: "throwAway()")
309+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func throwGarbageAway()
310+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func throwGarbage4DAwayHarder()
311+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func throwGarbage4DTypeRefMask_tAwayHardest()
312+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func burn()
313+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: @available(swift, obsoleted: 3, renamed: "burn()")
314+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func burnGarbage()
315+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func carefullyBurn()
316+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: @available(swift, obsoleted: 3, renamed: "carefullyBurn()")
317+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func carefullyBurnGarbage4D()
318+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func veryCarefullyBurn()
319+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: @available(swift, obsoleted: 3, renamed: "veryCarefullyBurn()")
320+
// CHECK-OMIT-NEEDLESS-WORDS-NEXT: func veryCarefullyBurnGarbage4DTypeRefMask_t()
321+
303322
// CHECK-OMIT-NEEDLESS-WORDS-DIAGS: inconsistent Swift name for Objective-C method 'conflicting1' in 'OMWSub' ('waggle1()' in 'OMWWaggle' vs. 'wiggle1()' in 'OMWWiggle')
304323
// CHECK-OMIT-NEEDLESS-WORDS-DIAGS: inconsistent Swift name for Objective-C property 'conflictingProp1' in 'OMWSub' ('waggleProp1' in 'OMWWaggle' vs. 'wiggleProp1' in 'OMWSuper')
305324

0 commit comments

Comments
 (0)