1 /* 2 * Copyright (c) 1998, 2013, 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 package org.openjdk.buildtools.jdwpgen; 27 28 import java.util.*; 29 import java.io.*; 30 31 class AltNode extends AbstractGroupNode implements TypeNode { 32 33 SelectNode select = null; 34 35 void constrain(Context ctx) { 36 super.constrain(ctx); 37 38 if (!(nameNode instanceof NameValueNode)) { 39 error("Alt name must have value: " + nameNode); 40 } 41 if (parent instanceof SelectNode) { 42 select = (SelectNode)parent; 43 } else { 44 error("Alt must be in Select"); 45 } 46 } 47 48 void document(PrintWriter writer) { 49 writer.println("<tr>"); 50 writer.println("<th colspan=\"2\" scope=\"row\">" 51 + indentElement(structIndent, 52 "Case " + nameNode.name 53 + " - if <i>" + ((SelectNode)parent).typeNode.name + "</i>" + 54 " is " + nameNode.value() + ":")); 55 writer.println("<td>" + comment() + " "); 56 writer.println("</tr>"); 57 58 ++structIndent; 59 super.document(writer); 60 --structIndent; 61 } 62 63 String javaClassImplements() { 64 return " extends " + select.commonBaseClass(); 65 } 66 67 void genJavaClassSpecifics(PrintWriter writer, int depth) { 68 indent(writer, depth); 69 writer.print("static final " + select.typeNode.javaType()); 70 writer.println(" ALT_ID = " + nameNode.value() + ";"); 71 if (context.isWritingCommand()) { 72 genJavaCreateMethod(writer, depth); 73 } else { 74 indent(writer, depth); 75 writer.println(select.typeNode.javaParam() + "() {"); 76 indent(writer, depth+1); 77 writer.println("return ALT_ID;"); 78 indent(writer, depth); 79 writer.println("}"); 80 } 81 super.genJavaClassSpecifics(writer, depth); 82 } 83 84 void genJavaWriteMethod(PrintWriter writer, int depth) { 85 genJavaWriteMethod(writer, depth, ""); 86 } 87 88 void genJavaReadsSelectCase(PrintWriter writer, int depth, String common) { 89 indent(writer, depth); 90 writer.println("case " + nameNode.value() + ":"); 91 indent(writer, depth+1); 92 writer.println(common + " = new " + name + "(vm, ps);"); 93 indent(writer, depth+1); 94 writer.println("break;"); 95 } 96 97 void genJavaCreateMethod(PrintWriter writer, int depth) { 98 indent(writer, depth); 99 writer.print("static " + select.name() + " create("); 100 writer.print(javaParams()); 101 writer.println(") {"); 102 indent(writer, depth+1); 103 writer.print("return new " + select.name() + "("); 104 writer.print("ALT_ID, new " + javaClassName() + "("); 105 for (Iterator<Node> it = components.iterator(); it.hasNext();) { 106 TypeNode tn = (TypeNode)it.next(); 107 writer.print(tn.name()); 108 if (it.hasNext()) { 109 writer.print(", "); 110 } 111 } 112 writer.println("));"); 113 indent(writer, depth); 114 writer.println("}"); 115 } 116 117 }