public override void VisitObjCCategoryDecl(ObjCCategoryDecl decl, VisitKind visitKind) { if (visitKind != VisitKind.Enter) { return; } foreach (var d in decl.Methods) { Visit(d); } }
public override void VisitObjCCategoryDecl(ObjCCategoryDecl decl, VisitKind visitKind) { if (visitKind != VisitKind.Enter) { return; } var categoryName = decl.Name; if (categoryName == null) { return; } // check availability macros to see if the API is available on the OS and not deprecated if (!decl.IsAvailable()) { return; } var framework = Helpers.GetFramework(decl); if (framework == null) { return; } var ciName = decl.ClassInterface.Name; if (!type_map_copy.TryGetValue(ciName, out var td)) { // other checks can't be done without an actual type to inspect return; } // check protocols foreach (var protocol in decl.Protocols) { var pname = protocol.Name; if (!ImplementProtocol(pname, td)) { Log.On(framework).Add($"!missing-protocol-conformance! {ciName} should conform to {pname} (defined in '{categoryName}' category)"); } } }
static string GetCategoryBase(ObjCCategoryDecl category) { // I really dislike doing this switch (category.Name) { case "UIResponderStandardEditActions": // we inlined this protocol in UIResponder but Apple has it on NSObject return("UIResponder"); case "UIAccessibility": // we inlined this protocol in UIView... but Apple has it on NSObject return("UIView"); case "UIAccessibilityAction": // we inlined this protocol in UIResponder but Apple has it on NSObject return("UIResponder"); default: return(Helpers.GetManagedName(category.ClassInterface.Name)); } }
public override void VisitObjCCategoryDecl(ObjCCategoryDecl decl, VisitKind visitKind) => VisitItem(decl, visitKind);