Modules | Files | Inheritance Tree | Inheritance Graph | Name Index | Config
File: Synopsis/Parser/C++/occ/mop.h
    1| /*
    2|   Copyright (C) 1997-2000 Shigeru Chiba, University of Tsukuba.
    3| 
    4|   Permission to use, copy, distribute and modify this software and   
    5|   its documentation for any purpose is hereby granted without fee,        
    6|   provided that the above copyright notice appear in all copies and that 
    7|   both that copyright notice and this permission notice appear in 
    8|   supporting documentation.
    9| 
   10|   Shigeru Chiba makes no representations about the suitability of this 
   11|   software for any purpose.  It is provided "as is" without express or
   12|   implied warranty.
   13| */
   14| 
   15| #ifndef _mop_h
   16| #define _mop_h
   17| 
   18| #include <iosfwd>
   19| #include "types.h"
   20| #include "ptree-core.h"
   21| #include "env.h"
   22| #include "typeinfo.h"
   23| #include "member.h"
   24| 
   25| class ClassArray;
   26| class Member;
   27| class MemberList;
   28| class ChangedMemberList;
   29| struct ChangedMemberList::Cmem;
   30| 
   31| class OCXXMOP Class : public Object {
   32| public:
   33|     Class() {}
   34|     Class(Environment* e, char* name) { Construct(e, Ptree::Make(name)); }
   35|     Class(Environment* e, Ptree* name) { Construct(ename); }
   36| 
   37|     virtual void InitializeInstance(Ptree* def, Ptree* margs);
   38|     virtual ~Class();
   39| 
   40| // introspection
   41| 
   42|     PtreeComments();
   43|     PtreeName();
   44|     PtreeBaseClasses();
   45|     PtreeMembers();
   46|     PtreeDefinition() { return definition; }
   47|     virtual charMetaclassName();      // automaticallly implemented
   48|                       // by Metaclass
   49|     ClassNthBaseClass(int nth);
   50|     PtreeNthBaseClassName(int nth);
   51|     bool IsSubclassOf(Ptree* name);
   52|     bool IsImmediateSubclassOf(Ptree* name);
   53| 
   54|     bool NthMember(int nth, Member& member);
   55|     bool LookupMember(Ptree* name);
   56|     bool LookupMember(Ptree* name, Member& member, int index = 0);
   57|     bool LookupMember(char* name);
   58|     bool LookupMember(char* name, Member& member, int index = 0);
   59|     MemberListGetMemberList();
   60| 
   61|     // These are available only within Finalize()
   62|     static ClassArray& AllClasses();
   63|     int Subclasses(ClassArray& subclasses);
   64|     static int Subclasses(Ptree* name, ClassArray& subclasses);
   65|     int ImmediateSubclasses(ClassArray& subclasses);
   66|     static int ImmediateSubclasses(Ptree* name, ClassArray& subclasses);
   67|     static int InstancesOf(char* metaclass_name, ClassArray& classes);
   68| 
   69|     // obsolete
   70|     PtreeNthMemberName(int);
   71|     int IsMember(Ptree*);
   72|     bool LookupMemberType(Ptree*, TypeInfo&);
   73| 
   74| // translation
   75| 
   76|     // these must be consistent with PUBLIC, PRIVATE, PROTECTED in token.h
   77|     enum { Public = 298, Protected = 297, Private = 296, Undefined = 0 };
   78| 
   79|     virtual void TranslateClass(Environment*);
   80|     void RemoveClass() { removed = TRUE; }
   81|     void AddClassSpecifier(Ptree* spec);        // only for MSVC++
   82|     void ChangeName(Ptree* name);
   83|     void ChangeBaseClasses(Ptree*);
   84|     void RemoveBaseClasses();
   85|     void AppendBaseClass(Class* c, int specifier = Public,
   86|                        bool is_virtual = false);
   87|     void AppendBaseClass(char* class_name, int specifier = Public,
   88|                        bool is_virtual = false);
   89|     void AppendBaseClass(Ptree* class_name, int specifier = Public,
   90|                        bool is_virtual = false);
   91| 
   92|     void ChangeMember(Member& changed_member);
   93|     void AppendMember(Member& added_member, int specifier = Public);
   94|     void AppendMember(Ptree* added_member);
   95|     void RemoveMember(Member&);
   96| 
   97|     virtual void TranslateMemberFunction(Environment*, Member&);
   98| 
   99|     virtual PtreeTranslateInitializer(Environment*, Ptree* var_name,
  100|                       Ptree* initializer);
  101| 
  102|     virtual PtreeTranslateNew(Environment*,
  103|                              Ptree* header, Ptree* new_operator,
  104|                              Ptree* placement, Ptree* type_name,
  105|                       Ptree* arglist);
  106|     virtual PtreeTranslateDelete(Environment*, Ptree* op, Ptree* obj);
  107|     virtual PtreeTranslateAssign(Environment*, Ptree* left,
  108|                                 Ptree* assign_op, Ptree* right);
  109|     virtual PtreeTranslateBinary(Environment*, Ptree* left,
  110|                                 Ptree* binary_op, Ptree* right);
  111|     virtual PtreeTranslateUnary(Environment*,
  112|                                Ptree* unary_op, Ptree* object);
  113|     virtual PtreeTranslateSubscript(Environment*,
  114|                                    Ptree* object, Ptree* index);
  115|     virtual PtreeTranslatePostfix(Environment*,
  116|                                  Ptree* object, Ptree* postfix_op);
  117|     virtual PtreeTranslateFunctionCall(Environment*,
  118|                                     Ptree* object, Ptree* arglist);
  119|     virtual PtreeTranslateMemberCall(Environment*,
  120|                                     Ptree* object, Ptree* access_op,
  121|                              Ptree* member_name,
  122|                              Ptree* arglist);
  123|     virtual PtreeTranslateMemberCall(Environment*,
  124|                                     Ptree* member_name, Ptree* arglist);
  125|     virtual PtreeTranslateMemberRead(Environment*,
  126|                                     Ptree* object, Ptree* access_op,
  127|                              Ptree* member_name);
  128|     virtual PtreeTranslateMemberRead(Environment*, Ptree* member_name);
  129|     virtual PtreeTranslateMemberWrite(Environment*,
  130|                                     Ptree* object, Ptree* access_op,
  131|                       Ptree* member_name,
  132|                                     Ptree* assign_op, Ptree* expr);
  133|     virtual PtreeTranslateMemberWrite(Environment*,
  134|                       Ptree* member_name,
  135|                                     Ptree* assign_op, Ptree* expr);
  136|     virtual PtreeTranslateUnaryOnMember(Environment*, Ptree* unary_op,
  137|                                     Ptree* object, Ptree* access_op,
  138|                              Ptree* member_name);
  139|     virtual PtreeTranslateUnaryOnMember(Environment*, Ptree* unary_op,
  140|                              Ptree* member_name);
  141|     virtual PtreeTranslatePostfixOnMember(Environment*,
  142|                                     Ptree* object, Ptree* access_op,
  143|                              Ptree* member_name,
  144|                              Ptree* postfix_op);
  145|     virtual PtreeTranslatePostfixOnMember(Environment*,
  146|                              Ptree* member_name,
  147|                              Ptree* postfix_op);
  148|     virtual PtreeTranslatePointer(Environment*, Ptree* var_name);
  149| 
  150|     virtual PtreeTranslateUserStatement(Environment*,
  151|                                     Ptree* object, Ptree* access_op,
  152|                                     Ptree* keyword, Ptree* rest);
  153|     virtual PtreeTranslateStaticUserStatement(Environment*,
  154|                                     Ptree* keyword, Ptree* rest);
  155| 
  156|     static PtreeStripClassQualifier(Ptree* qualified_name);
  157| 
  158|     PtreeTranslateExpression(Environment*, Ptree* expr);
  159|     PtreeTranslateExpression(Environment*, Ptree* expr, TypeInfo& type);
  160|     PtreeTranslateStatement(Environment* env, Ptree* expr);   // obsolete
  161|     PtreeTranslateNewType(Environment* env, Ptree* type);
  162|     PtreeTranslateArguments(Environment*, Ptree* arglist);
  163|     PtreeTranslateFunctionBody(Environment*, Member& m, Ptree* body);
  164| 
  165| // others
  166| 
  167|     EnvironmentGetEnvironment() { return class_environment; }
  168|     virtual bool AcceptTemplate();
  169|     static bool Initialize();
  170|     static void FinalizeAll(std::ostream& out);
  171|     virtual PtreeFinalizeInstance();
  172|     virtual PtreeFinalize();         // obsolete
  173|     static PtreeFinalizeClass();
  174| 
  175|     static void RegisterNewModifier(char* keyword);
  176|     static void RegisterNewAccessSpecifier(char* keyword);
  177|     static void RegisterNewMemberModifier(char* keyword);
  178|     static void RegisterNewWhileStatement(char* keyword);
  179|     static void RegisterNewForStatement(char* keyword);
  180|     static void RegisterNewClosureStatement(char* keyword);
  181|     static void RegisterMetaclass(char* keyword, char* class_name);
  182| 
  183|     static void ChangeDefaultMetaclass(char* name);
  184|     static void SetMetaclassForFunctions(char* name);
  185| 
  186|     static void InsertBeforeStatement(Environment*, Ptree*);
  187|     static void AppendAfterStatement(Environment*, Ptree*);
  188|     static void InsertBeforeToplevel(Environment*, Class*);
  189|     static void InsertBeforeToplevel(Environment*, Member&);
  190|     static void InsertBeforeToplevel(Environment*, Ptree*);
  191|     static void AppendAfterToplevel(Environment*, Class*);
  192|     static void AppendAfterToplevel(Environment*, Member&);
  193|     static void AppendAfterToplevel(Environment*, Ptree*);
  194|     bool InsertDeclaration(Environment*, Ptree* declaration);
  195|     bool InsertDeclaration(Environment*, Ptree* declaration,
  196|                          Ptree* key, void* client_data);
  197|     voidLookupClientData(Environment*, Ptree* key);
  198| 
  199|     void ErrorMessage(Environment*, char* message, Ptree* name,
  200|                     Ptree* where);
  201|     void WarningMessage(Environment*, char* message, Ptree* name,
  202|                Ptree* where);
  203|     void ErrorMessage(char* message, Ptree* name, Ptree* where);
  204|     void WarningMessage(char* message, Ptree* name, Ptree* where);
  205| 
  206|     static bool RecordCmdLineOption(char* key, char* value);
  207|     static bool LookupCmdLineOption(char* key);
  208|     static bool LookupCmdLineOption(char* key, char*& value);
  209|     static void WarnObsoleteness(char*, char* = nil);
  210| 
  211|     static void do_init_static();
  212| 
  213| private:
  214|     void Construct(Environment*, Ptree*);
  215| 
  216|     void SetEnvironment(Environment*);
  217|     PtreeGetClassSpecifier() { return new_class_specifier; }
  218|     PtreeGetNewName() { return new_class_name; }
  219|     PtreeGetBaseClasses() { return new_base_classes; }
  220|     ChangedMemberList::CmemGetChangedMember(Ptree*);
  221|     ChangedMemberListGetAppendedMembers() { return appended_member_list; }
  222|     PtreeGetAppendedCode() { return appended_code; }
  223|     void TranslateClassHasFinished() { done_decl_translation = TRUE; }
  224|     void CheckValidity(char*);
  225| 
  226| private:
  227|     Ptreedefinition;
  228|     Ptreefull_definition;     // including a user keyword
  229|     Environmentclass_environment;
  230|     MemberListmember_list;
  231| 
  232|     bool done_decl_translation;
  233|     bool removed;
  234|     ChangedMemberListchanged_member_list;
  235|     ChangedMemberListappended_member_list;
  236|     Ptreeappended_code;
  237|     Ptreenew_base_classes;
  238|     Ptreenew_class_specifier;
  239|     Ptreenew_class_name;
  240| 
  241|     static ClassArray* class_list;
  242| 
  243|     enum { MaxOptions = 8 };
  244|     static int num_of_cmd_options;
  245|     static charcmd_options[MaxOptions * 2];
  246| 
  247|     static charmetaclass_for_c_functions;
  248|     static Classfor_c_functions;
  249| 
  250|     static Ptreeclass_t;
  251|     static Ptreeempty_block_t;
  252|     static Ptreepublic_t;
  253|     static Ptreeprotected_t;
  254|     static Ptreeprivate_t;
  255|     static Ptreevirtual_t;
  256|     static Ptreecolon_t;
  257|     static Ptreecomma_t;
  258|     static Ptreesemicolon_t;
  259| 
  260| friend class Walker;
  261| friend class ClassWalker;
  262| friend class ClassBodyWalker;
  263| friend class Member;
  264| };
  265| 
  266| class OCXXMOP TemplateClass : public Class {
  267| public:
  268|     void InitializeInstance(Ptree* def, Ptree* margs);
  269|     static bool Initialize();
  270|     charMetaclassName();
  271| 
  272|     PtreeTemplateDefinition() { return template_definition; }
  273|     PtreeTemplateArguments();
  274|     bool AcceptTemplate();
  275|     virtual PtreeTranslateInstantiation(Environment*, Ptree*);
  276| 
  277| private:
  278|     static PtreeGetClassInTemplate(Ptree* def);
  279| 
  280|     Ptreetemplate_definition;
  281| };
  282| 
  283| class OCXXMOP ClassArray : public LightObject {
  284| public:
  285|     ClassArray(int = 16);
  286|     uint Number() { return num; }
  287|     Class*& operator [] (uint index) { return Ref(index); }
  288|     Class*& Ref(uint index);
  289|     void Append(Class*);
  290|     void Clear() { num = 0; }
  291| 
  292| private:
  293|     uint numsize;
  294|     Class** array;
  295| };
  296| 
  297| 
  298| // not documented class --- internal use only
  299| 
  300| typedef Class* (*opcxx_MetaclassCreator)(Ptree*, Ptree*);
  301| 
  302| class OCXXMOP opcxx_ListOfMetaclass {
  303| public:
  304|     opcxx_ListOfMetaclass(char*, opcxx_MetaclassCreator,
  305|                         bool (*)(), Ptree* (*)());
  306|     static ClassNew(Ptree*, Ptree*, Ptree*);
  307|     static ClassNew(char*, Ptree*, Ptree*);
  308|     static void FinalizeAll(std::ostream&);
  309|     static bool AlreadyRecorded(char*);
  310|     static bool AlreadyRecorded(Ptree*);
  311|     static void PrintAllMetaclasses();
  312| 
  313| private:
  314|     opcxx_ListOfMetaclassnext;
  315|     charname;
  316|     opcxx_MetaclassCreator proc;
  317|     Ptree* (*finalizer)();      // pointer to FinalizeClass()
  318|     static opcxx_ListOfMetaclasshead;
  319| };
  320| 
  321| #endif /* _mop_h */