1 /* 2 * Copyright (c) 1999, 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 import java.util.Enumeration; 42 import java.util.Hashtable; 43 import java.util.Vector; 44 45 import com.sun.tools.corba.se.idl.constExpr.Expression; 46 47 /** 48 * This is the symbol table entry for unions. 49 **/ 50 public class UnionEntry extends SymtabEntry 51 { 52 protected UnionEntry () 53 { 54 super (); 55 } // ctor 56 57 protected UnionEntry (UnionEntry that) 58 { 59 super (that); 60 if (!name ().equals ("")) 61 { 62 module (module () + name ()); 63 name (""); 64 } 65 _branches = (Vector)that._branches.clone (); 66 _defaultBranch = that._defaultBranch; 67 _contained = that._contained; 68 } // ctor 69 70 protected UnionEntry (SymtabEntry that, IDLID clone) 71 { 72 super (that, clone); 73 if (module ().equals ("")) 74 module (name ()); 75 else if (!name ().equals ("")) 76 module (module () + "/" + name ()); 77 } // ctor 78 79 public Object clone () 80 { 81 return new UnionEntry (this); 82 } // clone 83 84 /** Invoke the union generator. 85 @param symbolTable the symbol table is a hash table whose key is 86 a fully qualified type name and whose value is a SymtabEntry or 87 a subclass of SymtabEntry. 88 @param stream the stream to which the generator should sent its output. 89 @see SymtabEntry */ 90 public void generate (Hashtable symbolTable, PrintWriter stream) 91 { 92 unionGen.generate (symbolTable, this, stream); 93 } // generate 94 95 /** Access the union generator. 96 @returns an object which implements the UnionGen interface. 97 @see UnionGen */ 98 public Generator generator () 99 { 100 return unionGen; 101 } // generator 102 103 public void addBranch (UnionBranch branch) 104 { 105 _branches.addElement (branch); 106 } // addBranch 107 108 /** This is a vector of UnionBranch's. */ 109 public Vector branches () 110 { 111 return _branches; 112 } // branches 113 114 /** This TypedefEntry describes the type and name for the default branch. 115 Like the entries in the branches vector, only the type and name fields 116 are pertinent. */ 117 public void defaultBranch (TypedefEntry branch) 118 { 119 _defaultBranch = branch; 120 } // defaultBranch 121 122 /** This TypedefEntry describes the type and name for the default branch. 123 Like the entries in the branches vector, only the type and name fields 124 are pertinent. */ 125 public TypedefEntry defaultBranch () 126 { 127 return _defaultBranch; 128 } // defaultBranch 129 130 public void addContained (SymtabEntry entry) 131 { 132 _contained.addElement (entry); 133 } // addContained 134 135 /** This is a vector of SymtabEntry's. It itemizes any types which 136 this union contains. For example: 137 138 <pre> 139 union A 140 switch (long) 141 { 142 case 0: long x; 143 case 1: 144 Struct B 145 { 146 long a; 147 long b; 148 } y; 149 } 150 </pre> 151 Struct B is contained within union A. */ 152 public Vector contained () 153 { 154 return _contained; 155 } // contained 156 157 boolean has (Expression label) 158 { 159 Enumeration eBranches = _branches.elements (); 160 while (eBranches.hasMoreElements ()) 161 { 162 Enumeration eLabels = ((UnionBranch)eBranches.nextElement ()).labels.elements (); 163 while (eLabels.hasMoreElements ()) 164 { 165 Expression exp = (Expression)eLabels.nextElement (); 166 if (exp.equals (label) || exp.value ().equals (label.value ())) 167 return true; 168 } 169 } 170 return false; 171 } // has 172 173 boolean has (TypedefEntry typedef) 174 { 175 Enumeration e = _branches.elements (); 176 while (e.hasMoreElements ()) 177 { 178 UnionBranch branch = (UnionBranch)e.nextElement (); 179 if (!branch.typedef.equals (typedef) && branch.typedef.name ().equals (typedef.name ())) 180 return true; 181 } 182 return false; 183 } // has 184 185 /** A vector of UnionBranch's. */ 186 private Vector _branches = new Vector (); 187 private TypedefEntry _defaultBranch = null; 188 private Vector _contained = new Vector (); 189 190 static UnionGen unionGen; 191 } // class UnionEntry