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