1 /*
   2  * Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 /*
  26  * COMPONENT_NAME: idl.parser
  27  *
  28  * ORIGINS: 27
  29  *
  30  * Licensed Materials - Property of IBM
  31  * 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
  32  * RMI-IIOP v1.0
  33  *
  34  */
  35 
  36 package com.sun.tools.corba.se.idl;
  37 
  38 // NOTES:
  39 
  40 import java.io.PrintWriter;
  41 
  42 import java.util.Hashtable;
  43 import java.util.Stack;
  44 import java.util.Vector;
  45 
  46 /**
  47  * This is the base class for all symbol table entries.
  48  * @see AttributeEntry
  49  * @see ConstEntry
  50  * @see EnumEntry
  51  * @see ExceptionEntry
  52  * @see IncludeEntry
  53  * @see InterfaceEntry
  54  * @see MethodEntry
  55  * @see ModuleEntry
  56  * @see ParameterEntry
  57  * @see PragmaEntry
  58  * @see PrimitiveEntry
  59  * @see SequenceEntry
  60  * @see StructEntry
  61  * @see TypedefEntry
  62  * @see UnionEntry
  63  **/
  64 public class SymtabEntry
  65 {
  66   public SymtabEntry ()
  67   {
  68     initDynamicVars ();
  69   } // ctor
  70 
  71   SymtabEntry (SymtabEntry that, IDLID clone)
  72   {
  73     _module     = that._module;
  74     _name       = that._name;
  75     _type       = that._type;
  76     _typeName   = that._typeName;
  77     _sourceFile = that._sourceFile;
  78     _info       = that._info;
  79     _repID      = (RepositoryID)clone.clone ();
  80     ((IDLID)_repID).appendToName (_name);
  81     if (that instanceof InterfaceEntry || that instanceof ModuleEntry || that instanceof StructEntry || that instanceof UnionEntry || (that instanceof SequenceEntry && this instanceof SequenceEntry))
  82       _container = that;
  83     else
  84       _container = that._container;
  85     initDynamicVars ();
  86         _comment = that._comment;       // <21jul1997daz>
  87   } // ctor
  88 
  89   /** This is a shallow copy constructor */
  90   SymtabEntry (SymtabEntry that)
  91   {
  92     _module     = that._module;
  93     _name       = that._name;
  94     _type       = that._type;
  95     _typeName   = that._typeName;
  96     _sourceFile = that._sourceFile;
  97     _info       = that._info;
  98     _repID      = (RepositoryID)that._repID.clone ();
  99     _container  = that._container;
 100 
 101     if (_type instanceof ForwardEntry)
 102       ((ForwardEntry)_type).types.addElement (this);
 103 
 104     initDynamicVars ();
 105         // <21JUL1997>
 106         _comment = that._comment;
 107   } // ctor
 108 
 109   void initDynamicVars ()
 110   {
 111     _dynamicVars = new Vector (maxKey + 1);
 112     for (int i = 0; i <= maxKey; ++i)
 113       _dynamicVars.addElement (null);
 114   } // initDynamicVars
 115 
 116   /** This is a shallow copy clone */
 117   public Object clone ()
 118   {
 119     return new SymtabEntry (this);
 120   } // clone
 121 
 122   /** @return the concatenation of the module and the name, delimited by '/'. */
 123   public final String fullName ()
 124   {
 125     return _module.equals ("") ? _name : _module + '/' + _name;
 126   } // fullName
 127 
 128   /** Get the name of this entry's module.  If there are modules within
 129       modules, each module name is separated by '/'.
 130       @returns this entry's module name. */
 131   public String module ()
 132   {
 133     return _module;
 134   } // module
 135 
 136   /** Set the module for this entry.
 137       @param newName the new name of the module. */
 138   public void module (String newName)
 139   {
 140     if (newName == null)
 141       _module = "";
 142     else
 143       _module = newName;
 144   } // module
 145 
 146   /** @return the name of this entry. */
 147   public String name ()
 148   {
 149     return _name;
 150   } // name
 151 
 152   /** Set the name.
 153       @param newName the new name. */
 154   public void name (String newName)
 155   {
 156     if (newName == null)
 157       _name = "";
 158     else
 159       _name = newName;
 160 
 161     // Update the RepositoryID
 162     if (_repID instanceof IDLID)
 163       ((IDLID)_repID).replaceName (newName);
 164   } // name
 165 
 166   /** @return the type name of this entry. */
 167   public String typeName ()
 168   {
 169     return _typeName;
 170   } // typeName
 171 
 172   protected void typeName (String typeName)
 173   {
 174     _typeName = typeName;
 175   } // typeName
 176 
 177   /** @return the type entry of this entry */
 178   public SymtabEntry type ()
 179   {
 180     return _type;
 181   } // type
 182 
 183   public void type (SymtabEntry newType)
 184   {
 185     if (newType == null)
 186       typeName ("");
 187     else
 188       typeName (newType.fullName ());
 189     _type = newType;
 190 
 191     if (_type instanceof ForwardEntry)
 192       ((ForwardEntry)_type).types.addElement (this);
 193   } // type
 194 
 195   /** The file name in which this entry was defined. */
 196   public IncludeEntry sourceFile ()
 197   {
 198     return _sourceFile;
 199   } // sourceFile
 200 
 201   /** The file name in which this entry was defined. */
 202   public void sourceFile (IncludeEntry file)
 203   {
 204     _sourceFile = file;
 205   } // sourceFile
 206 
 207   /** This must be either an InterfaceEntry or a ModuleEntry.
 208       It can be nothing else. */
 209   public SymtabEntry container ()
 210   {
 211     return _container;
 212   } // container
 213 
 214   /** This must be either an InterfaceEntry or a ModuleEntry.
 215       It can be nothing else. */
 216   public void container (SymtabEntry newContainer)
 217   {
 218     if (newContainer instanceof InterfaceEntry || newContainer instanceof ModuleEntry)
 219       _container = newContainer;
 220   } // container
 221 
 222   /** @return the repository ID for this entry. */
 223   public RepositoryID repositoryID ()
 224   {
 225     return _repID;
 226   } // repositoryID
 227 
 228   /** Set the repository ID for this entry.
 229       @param id the new repository ID. */
 230   public void repositoryID (RepositoryID id)
 231   {
 232     _repID = id;
 233   } // repositoryID
 234 
 235   /** Should this type be emitted? */
 236   public boolean emit ()
 237   {
 238     return _emit && _isReferencable ;
 239   } // emit
 240 
 241   public void emit (boolean emit)
 242   {
 243     _emit = emit;
 244   } // emit
 245 
 246   /* <21jul1997daz> Accessors for comment */
 247 
 248   public Comment comment()
 249   {
 250     return _comment;
 251   }
 252 
 253   public void comment( Comment comment )
 254   {
 255     _comment = comment;
 256   }
 257 
 258   public boolean isReferencable()
 259   {
 260     return _isReferencable ;
 261   }
 262 
 263   public void isReferencable( boolean value )
 264   {
 265     _isReferencable = value ;
 266   }
 267 
 268   static Stack includeStack = new Stack ();
 269 
 270   static void enteringInclude ()
 271   {
 272     includeStack.push (new Boolean (setEmit));
 273     setEmit = false;
 274   } // enteringInclude
 275 
 276   static void exitingInclude ()
 277   {
 278     setEmit = ((Boolean)includeStack.pop ()).booleanValue ();
 279   } // exitingInclude
 280 
 281   /** Other variables besides the default ones can be dynamically placed
 282       into SymTabEntry (and therefore on all symbol table entries) by
 283       extenders.  Before such a variable can exist, its key must be
 284       obtained by calling getVariableKey. */
 285   public static int getVariableKey ()
 286   {
 287     return ++maxKey;
 288   } // dynamicVariable
 289 
 290   /** Other variables besides the default ones can be dynamically placed
 291       into SymTabEntry (and therefore on all symbol table entries) by
 292       extenders.  This method assigns the value to the variable of the
 293       given key.  A valid key must be obtained by calling the method
 294       getVariableKey.  If the key is invalid, NoSuchFieldException is
 295       thrown. */
 296   public void dynamicVariable (int key, Object value) throws NoSuchFieldException
 297   {
 298     if (key > maxKey)
 299       throw new NoSuchFieldException (Integer.toString (key));
 300     else
 301     {
 302       if (key >= _dynamicVars.size ())
 303         growVars ();
 304       _dynamicVars.setElementAt (value, key);
 305     }
 306   } // dynamicVariable
 307 
 308   /** Other variables besides the default ones can be dynamically placed
 309       into SymTabEntry (and therefore on all symbol table entries) by
 310       extenders.  This method gets the value of the variable of the
 311       given key.  A valid key must be obtained by calling the method
 312       getVariableKey.  If the key is invalid, NoSuchFieldException is
 313       thrown. */
 314   public Object dynamicVariable (int key) throws NoSuchFieldException
 315   {
 316     if (key > maxKey)
 317       throw new NoSuchFieldException (Integer.toString (key));
 318     else
 319     {
 320       if (key >= _dynamicVars.size ())
 321         growVars ();
 322       return _dynamicVars.elementAt (key);
 323     }
 324   } // dynamicVariable
 325 
 326   void growVars ()
 327   {
 328     int diff = maxKey - _dynamicVars.size () + 1;
 329     for (int i = 0; i < diff; ++i)
 330       _dynamicVars.addElement (null);
 331   } // growVars
 332 
 333   /** Invoke a generator.  A call to this method is only meaningful
 334       for subclasses of SymtabEntry.  If called on this class, it
 335       is a no-op.
 336       @param symbolTable the symbol table is a hash table whose key is
 337        a fully qualified type name and whose value is a SymtabEntry or
 338        a subclass of SymtabEntry.
 339       @param stream the stream to which the generator should sent its output. */
 340   public void generate (Hashtable symbolTable, PrintWriter stream)
 341   {
 342   } // generate
 343 
 344   /** Access a generator.  A call to this method is only meaningful
 345       for subclasses of SymtabEntry.  If called on this class, it
 346       is a no-op.
 347       @return an object which implements the Generator interface. */
 348   public Generator generator ()
 349   {
 350     return null;
 351   } // generator
 352 
 353           static boolean setEmit   = true;
 354           static int   maxKey      = -1;
 355 
 356   private SymtabEntry  _container  = null;
 357   private String       _module     = "";
 358   private String       _name       = "";
 359   private String       _typeName   = "";
 360   private SymtabEntry  _type       = null;
 361   private IncludeEntry _sourceFile = null;
 362   private Object       _info       = null;
 363   private RepositoryID _repID      = new IDLID ("", "", "1.0");
 364   private boolean      _emit       = setEmit;
 365   private Comment      _comment    = null;
 366   private Vector       _dynamicVars;
 367   private boolean      _isReferencable = true ;
 368 } // class SymtabEntry
 369 
 370 /*=======================================================================================
 371   DATE<AUTHOR>   ACTION
 372   ---------------------------------------------------------------------------------------
 373   21jul1997<daz> Added _comment data member to afford transferring comments from source
 374                  file to target; added acessor methods for comment.
 375   =======================================================================================*/