================================================================================
Directive: @synchronized
================================================================================

@synchronized(self) {
  [obj method];
}

--------------------------------------------------------------------------------

(translation_unit
  (synchronized_statement
    condition: (parenthesized_expression
      (self))
    consequence: (compound_statement
      (expression_statement
        (message_expression
          receiver: (type_identifier)
          selector: (identifier))))))

================================================================================
Directive: @autoreleasepool
================================================================================

@autoreleasepool {
  [obj method];
}

--------------------------------------------------------------------------------

(translation_unit
  (autoreleasepool_statement
    consequence: (compound_statement
      (expression_statement
        (message_expression
          receiver: (type_identifier)
          selector: (identifier))))))

================================================================================
Directive: @try @catch @finally
================================================================================

@try {
  [obj method];
} @catch (NSException *exception) {
} @finally {
}

@try {
  [obj method];
} @catch (NSException *exception) {
}

@try {
  [obj method];
} @finally {
}

@try {
} @catch (EH1 *x) {
} @catch (EH2 *x) {
} @catch (EH3 *x) {
}

@try {
} @catch (...) {
}

--------------------------------------------------------------------------------

(translation_unit
  (try_catch_statement
    body: (compound_statement
      (expression_statement
        (message_expression
          receiver: (type_identifier)
          selector: (identifier))))
    declaration: (parameter_declaration
      type: (type_identifier)
      declarator: (pointer_declarator
        declarator: (identifier)))
    catch: (compound_statement)
    finally: (compound_statement))
  (try_catch_statement
    body: (compound_statement
      (expression_statement
        (message_expression
          receiver: (type_identifier)
          selector: (identifier))))
    declaration: (parameter_declaration
      type: (type_identifier)
      declarator: (pointer_declarator
        declarator: (identifier)))
    catch: (compound_statement))
  (try_catch_statement
    body: (compound_statement
      (expression_statement
        (message_expression
          receiver: (type_identifier)
          selector: (identifier))))
    finally: (compound_statement))
  (try_catch_statement
    body: (compound_statement)
    declaration: (parameter_declaration
      type: (type_identifier)
      declarator: (pointer_declarator
        declarator: (identifier)))
    catch: (compound_statement)
    declaration: (parameter_declaration
      type: (type_identifier)
      declarator: (pointer_declarator
        declarator: (identifier)))
    catch: (compound_statement)
    declaration: (parameter_declaration
      type: (type_identifier)
      declarator: (pointer_declarator
        declarator: (identifier)))
    catch: (compound_statement))
  (try_catch_statement
    body: (compound_statement)
    catch: (compound_statement)))

================================================================================
Directive: @throw
================================================================================

@throw [NSException exceptionWithName:NSInternalInconsistencyException reason:@"" userInfo:nil];

--------------------------------------------------------------------------------

(translation_unit
  (throw_statement
    (message_expression
      receiver: (type_identifier)
      selector: (keyword_argument_list
        (keyword_argument
          keyword: (identifier)
          argument: (identifier))
        (keyword_argument
          keyword: (identifier)
          argument: (string_expression))
        (keyword_argument
          keyword: (identifier)
          argument: (nil))))))

================================================================================
Directive: @compatibility_alias
================================================================================

@compatibility_alias Foo Bar;
--------------------------------------------------------------------------------

(translation_unit
  (compatibility_alias_declaration
    class_name: (identifier)
    alias_name: (identifier)))

================================================================================
Directive: @available
================================================================================

if (@available(iOS 13.0, tvOS 13.0, watchOS 6.0, *)) {
  
}

if (__builtin_available(macos 10.12, *)) {
  
}
--------------------------------------------------------------------------------

(translation_unit
  (if_statement
    condition: (parenthesized_expression
      (available_expression
        platform: (identifier)
        platform: (identifier)
        platform: (identifier)))
    consequence: (compound_statement))
  (if_statement
    condition: (parenthesized_expression
      (available_expression
        platform: (identifier)))
    consequence: (compound_statement)))
