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