/* This file contains the definitions and documentation for the
   additional tree codes used in the Objective C front end (see tree.def
   for the standard codes).
   Copyright (C) 1990, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2007, 2010
   Free Software Foundation, Inc.

This file is part of GCC.

GCC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.

GCC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */


/* Objective-C types.  */
DEFTREECODE (CLASS_INTERFACE_TYPE, "class_interface_type", tcc_type, 0)
DEFTREECODE (CLASS_IMPLEMENTATION_TYPE, "class_implementation_type",
	     tcc_type, 0)
DEFTREECODE (CATEGORY_INTERFACE_TYPE, "category_interface_type", tcc_type, 0)
DEFTREECODE (CATEGORY_IMPLEMENTATION_TYPE,"category_implementation_type",
	     tcc_type, 0)
DEFTREECODE (PROTOCOL_INTERFACE_TYPE, "protocol_interface_type", tcc_type, 0)

/* Objective-C decls.  */
DEFTREECODE (KEYWORD_DECL, "keyword_decl", tcc_declaration, 0)
DEFTREECODE (INSTANCE_METHOD_DECL, "instance_method_decl", tcc_declaration, 0)
DEFTREECODE (CLASS_METHOD_DECL, "class_method_decl", tcc_declaration, 0)
DEFTREECODE (PROPERTY_DECL, "property_decl", tcc_declaration, 0)

/* Objective-C expressions.  */
DEFTREECODE (MESSAGE_SEND_EXPR, "message_send_expr", tcc_expression, 3)
DEFTREECODE (CLASS_REFERENCE_EXPR, "class_reference_expr", tcc_expression, 1)

/* This tree is used to represent the expression 'object.property',
   where 'object' is an Objective-C object and 'property' is an
   Objective-C property.  Operand 0 is the object (the tree
   representing the expression), and Operand 1 is the property (the
   PROPERTY_DECL).  Operand 2 is the 'getter' call, ready to be used;
   we pregenerate it because it is hard to generate it properly later
   on.  Operand 3 records whether using the 'getter' call should
   generate a deprecation warning or not.

   A PROPERTY_REF tree needs to be transformed into 'setter' and
   'getter' calls at some point; at the moment this happens in two
   places:

     * if we detect that a modify expression is being applied to a
       PROPERTY_REF, then we transform that into a 'getter' call (this
       happens in build_modify_expr() or cp_build_modify_expr()).

    * else, it will remain as a PROPERTY_REF until we get to
      gimplification; at that point, we convert each PROPERTY_REF into
      a 'getter' call during ObjC/ObjC++ gimplify.  At that point, it
      is quite hard to build a 'getter' call, but we have already built
      it and we just need to swap Operand 2 in, and emit the deprecation
      warnings from Operand 3 if needed.

  Please note that when the Objective-C 2.0 "dot-syntax" 'object.component'
  is encountered, where 'component' is not a property but there are valid
  setter/getter methods for it, an artificial PROPERTY_DECL is generated
  and used in the PROPERTY_REF.  */
DEFTREECODE (PROPERTY_REF, "property_ref", tcc_expression, 4)

/*
Local variables:
mode:c
End:
*/
