@@ -2642,31 +2642,44 @@ ArgumentAttrs ClangImporter::Implementation::inferDefaultArgument(
2642
2642
}
2643
2643
} else if (const clang::TypedefType *typedefType =
2644
2644
type->getAs <clang::TypedefType>()) {
2645
- clang::TypedefNameDecl *typedefDecl = typedefType->getDecl ();
2646
- // Find the next decl in the same context. If this typedef is a part of an
2647
- // NS/CF_OPTIONS declaration, the next decl will be an enum.
2648
- auto declsInContext = typedefDecl->getDeclContext ()->decls ();
2649
- auto declIter = llvm::find (declsInContext, typedefDecl);
2650
- if (declIter != declsInContext.end ())
2651
- declIter++;
2652
- if (declIter != declsInContext.end ()) {
2653
- if (auto enumDecl = dyn_cast<clang::EnumDecl>(*declIter)) {
2654
- if (auto cfOptionsTy =
2655
- nameImporter.getContext ()
2656
- .getClangModuleLoader ()
2657
- ->getTypeDefForCXXCFOptionsDefinition (enumDecl)) {
2658
- if (cfOptionsTy->getDecl () == typedefDecl) {
2659
- auto enumName = typedefDecl->getName ();
2660
- ArgumentAttrs argumentAttrs (DefaultArgumentKind::None, true ,
2661
- enumName);
2662
- for (auto word : llvm::reverse (camel_case::getWords (enumName))) {
2663
- if (camel_case::sameWordIgnoreFirstCase (word, " options" )) {
2664
- argumentAttrs.argumentKind = DefaultArgumentKind::EmptyArray;
2665
- }
2666
- }
2667
- return argumentAttrs;
2668
- }
2645
+ // Get the AvailabilityAttr that would be set from CF/NS_OPTIONS
2646
+ if (importer::isUnavailableInSwift (typedefType->getDecl (), nullptr , true )) {
2647
+ // If we've taken this branch it means we have an enum type, and it is
2648
+ // likely an integer or NSInteger that is being used by NS/CF_OPTIONS to
2649
+ // behave like a C enum in the presence of C++.
2650
+ auto enumName = typedefType->getDecl ()->getName ();
2651
+ ArgumentAttrs argumentAttrs (DefaultArgumentKind::None, true , enumName);
2652
+ auto camelCaseWords = camel_case::getWords (enumName);
2653
+ for (auto it = camelCaseWords.rbegin (); it != camelCaseWords.rend ();
2654
+ ++it) {
2655
+ auto word = *it;
2656
+ auto next = std::next (it);
2657
+ if (camel_case::sameWordIgnoreFirstCase (word, " options" )) {
2658
+ argumentAttrs.argumentKind = DefaultArgumentKind::EmptyArray;
2659
+ return argumentAttrs;
2669
2660
}
2661
+ if (camel_case::sameWordIgnoreFirstCase (word, " units" ))
2662
+ return argumentAttrs;
2663
+ if (camel_case::sameWordIgnoreFirstCase (word, " domain" ))
2664
+ return argumentAttrs;
2665
+ if (camel_case::sameWordIgnoreFirstCase (word, " action" ))
2666
+ return argumentAttrs;
2667
+ if (camel_case::sameWordIgnoreFirstCase (word, " event" ))
2668
+ return argumentAttrs;
2669
+ if (camel_case::sameWordIgnoreFirstCase (word, " events" ) &&
2670
+ next != camelCaseWords.rend () &&
2671
+ camel_case::sameWordIgnoreFirstCase (*next, " control" ))
2672
+ return argumentAttrs;
2673
+ if (camel_case::sameWordIgnoreFirstCase (word, " state" ))
2674
+ return argumentAttrs;
2675
+ if (camel_case::sameWordIgnoreFirstCase (word, " unit" ))
2676
+ return argumentAttrs;
2677
+ if (camel_case::sameWordIgnoreFirstCase (word, " position" ) &&
2678
+ next != camelCaseWords.rend () &&
2679
+ camel_case::sameWordIgnoreFirstCase (*next, " scroll" ))
2680
+ return argumentAttrs;
2681
+ if (camel_case::sameWordIgnoreFirstCase (word, " edge" ))
2682
+ return argumentAttrs;
2670
2683
}
2671
2684
}
2672
2685
}
0 commit comments