/** * @see parser.IDLParserVisitor#visit(ASTcasex, Object) */ public Object visit(ASTcasex node, Object data) { if (!(data is UnionBuildInfo)) { throw new InternalCompilerException("invalid parameter in visit ASTswitch_body"); } UnionBuildInfo buildInfo = (UnionBuildInfo)data; // REFACTORING possiblity: replace direct use of values by using the Literals // case node consists of one or more case-labels followed by an element spec // collect the data for this switch-case object[] discriminatorValues = CollectDiscriminatorValuesForCase(node, buildInfo.GetGenerationHelper().DiscriminatorType, buildInfo); ASTelement_spec elemSpec = (ASTelement_spec)node.jjtGetChild(node.jjtGetNumChildren() - 1); ASTtype_spec typeSpecNode = (ASTtype_spec)elemSpec.jjtGetChild(0); TypeContainer elemType = (TypeContainer)typeSpecNode.jjtAccept(this, buildInfo); if (elemType == null) { throw new InvalidIdlException( String.Format("union elem type not defined for {0}", node.GetIdentification())); } elemType = ReplaceByCustomMappedIfNeeded(elemType); Node elemDecl = elemSpec.jjtGetChild(1); string elemDeclIdent = DetermineTypeAndNameForDeclarator((ASTdeclarator)elemDecl, data, ref elemType); // generate the methods/field for this switch-case buildInfo.GetGenerationHelper().GenerateSwitchCase(elemType, elemDeclIdent, discriminatorValues); return null; }
/* Production 75, chapter 3.4, corba 2.3.1 (renamed case -> casex, because case is a keyword in java) */ public void casex() { /*@bgen(jjtree) casex */ ASTcasex jjtn000 = new ASTcasex(this, IDLParserTreeConstants.JJTCASEX); bool jjtc000 = true; jjtree.openNodeScope(jjtn000); try { while (true) { case_label(); switch ((jj_ntk==-1)?jj_ntk_calc():jj_ntk) { case 64: case 65: ; break; default: jj_la1[65] = jj_gen; goto label_20; break; } } label_20: ; element_spec(); jj_consume_token(12); } catch (Exception jjte000) { if (jjtc000) { jjtree.clearNodeScope(jjtn000); jjtc000 = false; } else { jjtree.popNode(); } {if (true) throw ;} } finally { if (jjtc000) { jjtree.closeNodeScope(jjtn000, true); } } }
/// <summary>helper methods to collect discriminator values for casex node; checks if const-type is ok</summary> private object[] CollectDiscriminatorValuesForCase(ASTcasex node, TypeContainer discrType, BuildInfo unionInfo) { object[] result = new object[node.jjtGetNumChildren() - 1]; for (int i = 0; i < node.jjtGetNumChildren() - 1; i++) { if (!((ASTcase_label)node.jjtGetChild(i)).isDefault()) { Literal litVal = ((Literal)node.jjtGetChild(i).jjtAccept(this, unionInfo)); if (litVal == null) { throw new InvalidIdlException( String.Format("invalid {0}, discrimitator value for case not retrievable", node.GetIdentification())); } // check if val ok ... CheckDiscrValAssignableToDiscrType(litVal, discrType); result[i] = litVal.GetValue(); } else { // default case result[i] = UnionGenerationHelper.DefaultCaseDiscriminator; } } return result; }