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 build.tools.jdwpgen; 27 28 29 import java.util.*; 30 import java.io.*; 31 32 abstract class Node { 33 34 String kind; 35 List<Node> components; 36 int lineno; 37 List<String> commentList = new ArrayList<>(); 38 Node parent = null; 39 Context context = null; 40 41 static final int maxStructIndent = 5; 42 static int structIndent = 0; // horrible hack 43 document(PrintWriter writer)44 abstract void document(PrintWriter writer); 45 set(String kind, List<Node> components, int lineno)46 void set(String kind, List<Node> components, int lineno) { 47 this.kind = kind; 48 this.components = components; 49 this.lineno = lineno; 50 } 51 parentAndExtractComments()52 void parentAndExtractComments() { 53 for (Iterator<Node> it = components.iterator(); it.hasNext();) { 54 Node node = it.next(); 55 if (node instanceof CommentNode) { 56 it.remove(); 57 commentList.add(((CommentNode)node).text()); 58 } else { 59 node.parent = this; 60 node.parentAndExtractComments(); 61 } 62 } 63 } 64 prune()65 void prune() { 66 for (Node node : components) { 67 node.prune(); 68 } 69 } 70 constrain(Context ctx)71 void constrain(Context ctx) { 72 context = ctx; 73 for (Node node : components) { 74 constrainComponent(ctx, node); 75 } 76 } 77 constrainComponent(Context ctx, Node node)78 void constrainComponent(Context ctx, Node node) { 79 node.constrain(ctx); 80 } 81 indent(PrintWriter writer, int depth)82 void indent(PrintWriter writer, int depth) { 83 for (int i = 0; i < depth; i++) { 84 writer.print(" "); 85 } 86 } 87 documentIndex(PrintWriter writer)88 void documentIndex(PrintWriter writer) { 89 } 90 docRowStart(PrintWriter writer)91 void docRowStart(PrintWriter writer) { 92 writer.println("<tr>"); 93 if (structIndent > 0) { 94 writer.println("<td colspan=" + structIndent + ">"); 95 } 96 } 97 comment()98 String comment() { 99 StringBuffer comment = new StringBuffer(); 100 for (String st : commentList) { 101 comment.append(st); 102 } 103 return comment.toString(); 104 } 105 genJavaComment(PrintWriter writer, int depth)106 void genJavaComment(PrintWriter writer, int depth) { 107 if (commentList.size() > 0) { 108 indent(writer, depth); 109 writer.println("/**"); 110 for (String comment : commentList) { 111 indent(writer, depth); 112 writer.println(" * " + comment); 113 } 114 indent(writer, depth); 115 writer.println(" */"); 116 } 117 } 118 javaType()119 String javaType() { 120 return "-- WRONG ---"; 121 } 122 genJava(PrintWriter writer, int depth)123 void genJava(PrintWriter writer, int depth) { 124 for (Node node : components) { 125 node.genJava(writer, depth); 126 } 127 } 128 genCInclude(PrintWriter writer)129 void genCInclude(PrintWriter writer) { 130 for (Node node : components) { 131 node.genCInclude(writer); 132 } 133 } 134 debugValue(String label)135 String debugValue(String label) { 136 return label; 137 } 138 genJavaDebugWrite(PrintWriter writer, int depth, String writeLabel)139 void genJavaDebugWrite(PrintWriter writer, int depth, 140 String writeLabel) { 141 genJavaDebugWrite(writer, depth, writeLabel, debugValue(writeLabel)); 142 } 143 genJavaDebugWrite(PrintWriter writer, int depth, String writeLabel, String displayValue)144 void genJavaDebugWrite(PrintWriter writer, int depth, 145 String writeLabel, String displayValue) { 146 if (!Main.genDebug) { 147 return; 148 } 149 indent(writer, depth); 150 writer.println( 151 "if ((ps.vm.traceFlags & VirtualMachineImpl.TRACE_SENDS) != 0) {"); 152 indent(writer, depth+1); 153 writer.print("ps.vm.printTrace(\"Sending: "); 154 indent(writer, depth); // this is inside the quotes 155 writer.print(writeLabel + "(" + javaType() + "): \" + "); 156 writer.println(displayValue + ");"); 157 indent(writer, depth); 158 writer.println("}"); 159 } 160 genJavaRead(PrintWriter writer, int depth, String readLabel)161 public void genJavaRead(PrintWriter writer, int depth, 162 String readLabel) { 163 error("Internal - Should not call Node.genJavaRead()"); 164 } 165 genJavaDebugRead(PrintWriter writer, int depth, String readLabel, String displayValue)166 void genJavaDebugRead(PrintWriter writer, int depth, 167 String readLabel, String displayValue) { 168 if (!Main.genDebug) { 169 return; 170 } 171 indent(writer, depth); 172 writer.println( 173 "if (vm.traceReceives) {"); 174 indent(writer, depth+1); 175 writer.print("vm.printReceiveTrace(" + depth + ", \""); 176 writer.print(readLabel + "(" + javaType() + "): \" + "); 177 writer.println(displayValue + ");"); 178 indent(writer, depth); 179 writer.println("}"); 180 } 181 genJavaPreDef(PrintWriter writer, int depth)182 void genJavaPreDef(PrintWriter writer, int depth) { 183 for (Node node : components) { 184 node.genJavaPreDef(writer, depth); 185 } 186 } 187 error(String errmsg)188 void error(String errmsg) { 189 System.err.println(); 190 System.err.println(Main.specSource + ":" + lineno + ": " + 191 kind + " - " + errmsg); 192 System.err.println(); 193 throw new RuntimeException("Error: " + errmsg); 194 } 195 } 196