@@ -2642,44 +2642,31 @@ ArgumentAttrs ClangImporter::Implementation::inferDefaultArgument(
2642
2642
}
2643
2643
} else if (const clang::TypedefType *typedefType =
2644
2644
type->getAs <clang::TypedefType>()) {
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;
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
+ }
2660
2669
}
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;
2683
2670
}
2684
2671
}
2685
2672
}
0 commit comments