/* 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:
*/
