blob: 52b8f40157a7b30804be64e6204b95520cc3e5f0 [file] [log] [blame]
/*
* Copyright (c) 1999, 2004, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation. Oracle designates this
* particular file as subject to the "Classpath" exception as provided
* by Oracle in the LICENSE file that accompanied this code.
*
* This code 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
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/*
* COMPONENT_NAME: idl.parser
*
* ORIGINS: 27
*
* Licensed Materials - Property of IBM
* 5639-D57 (C) COPYRIGHT International Business Machines Corp. 1997, 1999
* RMI-IIOP v1.0
*
*/
package com.sun.tools.corba.se.idl;
// NOTES:
import java.io.PrintWriter;
import java.util.Hashtable;
import java.util.Stack;
import java.util.Vector;
/**
* This is the base class for all symbol table entries.
* @see AttributeEntry
* @see ConstEntry
* @see EnumEntry
* @see ExceptionEntry
* @see IncludeEntry
* @see InterfaceEntry
* @see MethodEntry
* @see ModuleEntry
* @see ParameterEntry
* @see PragmaEntry
* @see PrimitiveEntry
* @see SequenceEntry
* @see StructEntry
* @see TypedefEntry
* @see UnionEntry
**/
public class SymtabEntry
{
public SymtabEntry ()
{
initDynamicVars ();
} // ctor
SymtabEntry (SymtabEntry that, IDLID clone)
{
_module = that._module;
_name = that._name;
_type = that._type;
_typeName = that._typeName;
_sourceFile = that._sourceFile;
_info = that._info;
_repID = (RepositoryID)clone.clone ();
((IDLID)_repID).appendToName (_name);
if (that instanceof InterfaceEntry || that instanceof ModuleEntry || that instanceof StructEntry || that instanceof UnionEntry || (that instanceof SequenceEntry && this instanceof SequenceEntry))
_container = that;
else
_container = that._container;
initDynamicVars ();
_comment = that._comment; // <21jul1997daz>
} // ctor
/** This is a shallow copy constructor */
SymtabEntry (SymtabEntry that)
{
_module = that._module;
_name = that._name;
_type = that._type;
_typeName = that._typeName;
_sourceFile = that._sourceFile;
_info = that._info;
_repID = (RepositoryID)that._repID.clone ();
_container = that._container;
if (_type instanceof ForwardEntry)
((ForwardEntry)_type).types.addElement (this);
initDynamicVars ();
// <21JUL1997>
_comment = that._comment;
} // ctor
void initDynamicVars ()
{
_dynamicVars = new Vector (maxKey + 1);
for (int i = 0; i <= maxKey; ++i)
_dynamicVars.addElement (null);
} // initDynamicVars
/** This is a shallow copy clone */
public Object clone ()
{
return new SymtabEntry (this);
} // clone
/** @return the concatenation of the module and the name, delimited by '/'. */
public final String fullName ()
{
return _module.equals ("") ? _name : _module + '/' + _name;
} // fullName
/** Get the name of this entry's module. If there are modules within
modules, each module name is separated by '/'.
@returns this entry's module name. */
public String module ()
{
return _module;
} // module
/** Set the module for this entry.
@param newName the new name of the module. */
public void module (String newName)
{
if (newName == null)
_module = "";
else
_module = newName;
} // module
/** @return the name of this entry. */
public String name ()
{
return _name;
} // name
/** Set the name.
@param newName the new name. */
public void name (String newName)
{
if (newName == null)
_name = "";
else
_name = newName;
// Update the RepositoryID
if (_repID instanceof IDLID)
((IDLID)_repID).replaceName (newName);
} // name
/** @return the type name of this entry. */
public String typeName ()
{
return _typeName;
} // typeName
protected void typeName (String typeName)
{
_typeName = typeName;
} // typeName
/** @return the type entry of this entry */
public SymtabEntry type ()
{
return _type;
} // type
public void type (SymtabEntry newType)
{
if (newType == null)
typeName ("");
else
typeName (newType.fullName ());
_type = newType;
if (_type instanceof ForwardEntry)
((ForwardEntry)_type).types.addElement (this);
} // type
/** The file name in which this entry was defined. */
public IncludeEntry sourceFile ()
{
return _sourceFile;
} // sourceFile
/** The file name in which this entry was defined. */
public void sourceFile (IncludeEntry file)
{
_sourceFile = file;
} // sourceFile
/** This must be either an InterfaceEntry or a ModuleEntry.
It can be nothing else. */
public SymtabEntry container ()
{
return _container;
} // container
/** This must be either an InterfaceEntry or a ModuleEntry.
It can be nothing else. */
public void container (SymtabEntry newContainer)
{
if (newContainer instanceof InterfaceEntry || newContainer instanceof ModuleEntry)
_container = newContainer;
} // container
/** @return the repository ID for this entry. */
public RepositoryID repositoryID ()
{
return _repID;
} // repositoryID
/** Set the repository ID for this entry.
@param id the new repository ID. */
public void repositoryID (RepositoryID id)
{
_repID = id;
} // repositoryID
/** Should this type be emitted? */
public boolean emit ()
{
return _emit && _isReferencable ;
} // emit
public void emit (boolean emit)
{
_emit = emit;
} // emit
/* <21jul1997daz> Accessors for comment */
public Comment comment()
{
return _comment;
}
public void comment( Comment comment )
{
_comment = comment;
}
public boolean isReferencable()
{
return _isReferencable ;
}
public void isReferencable( boolean value )
{
_isReferencable = value ;
}
static Stack includeStack = new Stack ();
static void enteringInclude ()
{
includeStack.push (new Boolean (setEmit));
setEmit = false;
} // enteringInclude
static void exitingInclude ()
{
setEmit = ((Boolean)includeStack.pop ()).booleanValue ();
} // exitingInclude
/** Other variables besides the default ones can be dynamically placed
into SymTabEntry (and therefore on all symbol table entries) by
extenders. Before such a variable can exist, its key must be
obtained by calling getVariableKey. */
public static int getVariableKey ()
{
return ++maxKey;
} // dynamicVariable
/** Other variables besides the default ones can be dynamically placed
into SymTabEntry (and therefore on all symbol table entries) by
extenders. This method assigns the value to the variable of the
given key. A valid key must be obtained by calling the method
getVariableKey. If the key is invalid, NoSuchFieldException is
thrown. */
public void dynamicVariable (int key, Object value) throws NoSuchFieldException
{
if (key > maxKey)
throw new NoSuchFieldException (Integer.toString (key));
else
{
if (key >= _dynamicVars.size ())
growVars ();
_dynamicVars.setElementAt (value, key);
}
} // dynamicVariable
/** Other variables besides the default ones can be dynamically placed
into SymTabEntry (and therefore on all symbol table entries) by
extenders. This method gets the value of the variable of the
given key. A valid key must be obtained by calling the method
getVariableKey. If the key is invalid, NoSuchFieldException is
thrown. */
public Object dynamicVariable (int key) throws NoSuchFieldException
{
if (key > maxKey)
throw new NoSuchFieldException (Integer.toString (key));
else
{
if (key >= _dynamicVars.size ())
growVars ();
return _dynamicVars.elementAt (key);
}
} // dynamicVariable
void growVars ()
{
int diff = maxKey - _dynamicVars.size () + 1;
for (int i = 0; i < diff; ++i)
_dynamicVars.addElement (null);
} // growVars
/** Invoke a generator. A call to this method is only meaningful
for subclasses of SymtabEntry. If called on this class, it
is a no-op.
@param symbolTable the symbol table is a hash table whose key is
a fully qualified type name and whose value is a SymtabEntry or
a subclass of SymtabEntry.
@param stream the stream to which the generator should sent its output. */
public void generate (Hashtable symbolTable, PrintWriter stream)
{
} // generate
/** Access a generator. A call to this method is only meaningful
for subclasses of SymtabEntry. If called on this class, it
is a no-op.
@return an object which implements the Generator interface. */
public Generator generator ()
{
return null;
} // generator
static boolean setEmit = true;
static int maxKey = -1;
private SymtabEntry _container = null;
private String _module = "";
private String _name = "";
private String _typeName = "";
private SymtabEntry _type = null;
private IncludeEntry _sourceFile = null;
private Object _info = null;
private RepositoryID _repID = new IDLID ("", "", "1.0");
private boolean _emit = setEmit;
private Comment _comment = null;
private Vector _dynamicVars;
private boolean _isReferencable = true ;
} // class SymtabEntry
/*=======================================================================================
DATE<AUTHOR> ACTION
---------------------------------------------------------------------------------------
21jul1997<daz> Added _comment data member to afford transferring comments from source
file to target; added acessor methods for comment.
=======================================================================================*/