blob: 8f9b62208573c3c8c82194dacb61c1d63258d6fc [file] [log] [blame]
/*
* Copyright 2003-2007 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.codehaus.groovy.antlr.treewalker;
import java.io.PrintStream;
import java.util.Stack;
import org.codehaus.groovy.antlr.GroovySourceAST;
import org.codehaus.groovy.antlr.parser.GroovyTokenTypes;
/**
* A visitor that prints a html tags of each node to the supplied PrintStream
*
* @author <a href="mailto:groovy@ross-rayner.com">Jeremy Rayner</a>
* @version $Revision$
*/
public class NodeAsHTMLPrinter extends VisitorAdapter {
private final String[] tokenNames;
private final PrintStream out;
private final Stack stack;
/**
* A visitor that prints a html tags, for each node, to the supplied PrintStream.
* @param out supplied PrintStream to output nodes to
* @param tokenNames an array of token names to use
*/
public NodeAsHTMLPrinter(PrintStream out,String[] tokenNames) {
this.tokenNames = tokenNames;
this.out = out;
this.stack = new Stack();
}
public void setUp() {
out.println("<html><head></head><body><pre>");
}
public void visitDefault(GroovySourceAST t,int visit) {
if (visit == OPENING_VISIT) {
out.print("<code title=" + quote(tokenNames[t.getType()]) + "><font color='#" + colour(t) + "'>");
} else if (visit == CLOSING_VISIT) {
out.print("</font></code>");
}
}
private String quote(String tokenName) {
if (tokenName.length() > 0 && tokenName.charAt(0) != '\'')
return "'" + tokenName + "'";
else
return "\"" + tokenName + "\"";
}
public void tearDown() {
out.println("</pre></body></html>");
}
private String colour(GroovySourceAST t) {
String black = "000000";
String blue = "17178B";
String green = "008000";
//String purple = "7C308D";
String colour = black;
switch (t.getType()) {
case GroovyTokenTypes.ABSTRACT :
case GroovyTokenTypes.ANNOTATION :
case GroovyTokenTypes.ANNOTATIONS :
case GroovyTokenTypes.ANNOTATION_ARRAY_INIT :
case GroovyTokenTypes.ANNOTATION_DEF :
case GroovyTokenTypes.ANNOTATION_FIELD_DEF :
case GroovyTokenTypes.ANNOTATION_MEMBER_VALUE_PAIR :
case GroovyTokenTypes.ARRAY_DECLARATOR :
case GroovyTokenTypes.ASSIGN :
case GroovyTokenTypes.AT :
case GroovyTokenTypes.BAND :
case GroovyTokenTypes.BAND_ASSIGN :
case GroovyTokenTypes.BIG_SUFFIX :
case GroovyTokenTypes.BLOCK :
case GroovyTokenTypes.BNOT :
case GroovyTokenTypes.BOR :
case GroovyTokenTypes.BOR_ASSIGN :
case GroovyTokenTypes.BSR :
case GroovyTokenTypes.BSR_ASSIGN :
case GroovyTokenTypes.BXOR :
case GroovyTokenTypes.BXOR_ASSIGN :
case GroovyTokenTypes.CASE_GROUP :
case GroovyTokenTypes.CLOSABLE_BLOCK :
case GroovyTokenTypes.CLOSABLE_BLOCK_OP :
case GroovyTokenTypes.COLON :
case GroovyTokenTypes.COMMA :
case GroovyTokenTypes.COMPARE_TO :
case GroovyTokenTypes.CTOR_CALL :
case GroovyTokenTypes.CTOR_IDENT :
case GroovyTokenTypes.DEC :
case GroovyTokenTypes.DIGIT :
case GroovyTokenTypes.DIV :
case GroovyTokenTypes.DIV_ASSIGN :
case GroovyTokenTypes.DOLLAR :
case GroovyTokenTypes.DOT :
case GroovyTokenTypes.DYNAMIC_MEMBER :
case GroovyTokenTypes.ELIST :
case GroovyTokenTypes.EMPTY_STAT :
case GroovyTokenTypes.ENUM_CONSTANT_DEF :
case GroovyTokenTypes.ENUM_DEF :
case GroovyTokenTypes.EOF :
case GroovyTokenTypes.EQUAL :
case GroovyTokenTypes.ESC :
case GroovyTokenTypes.EXPONENT :
case GroovyTokenTypes.EXPR :
case GroovyTokenTypes.FINAL :
case GroovyTokenTypes.FLOAT_SUFFIX :
case GroovyTokenTypes.FOR_CONDITION :
case GroovyTokenTypes.FOR_EACH_CLAUSE :
case GroovyTokenTypes.FOR_INIT :
case GroovyTokenTypes.FOR_IN_ITERABLE :
case GroovyTokenTypes.FOR_ITERATOR :
case GroovyTokenTypes.GE :
case GroovyTokenTypes.GT :
case GroovyTokenTypes.HEX_DIGIT :
case GroovyTokenTypes.IDENT :
case GroovyTokenTypes.IMPLICIT_PARAMETERS :
case GroovyTokenTypes.INC :
case GroovyTokenTypes.INDEX_OP :
case GroovyTokenTypes.INSTANCE_INIT :
case GroovyTokenTypes.INTERFACE_DEF :
case GroovyTokenTypes.LABELED_ARG :
case GroovyTokenTypes.LABELED_STAT :
case GroovyTokenTypes.LAND :
case GroovyTokenTypes.LBRACK :
case GroovyTokenTypes.LCURLY :
case GroovyTokenTypes.LE :
case GroovyTokenTypes.LETTER :
case GroovyTokenTypes.LIST_CONSTRUCTOR :
case GroovyTokenTypes.LNOT :
case GroovyTokenTypes.LOR :
case GroovyTokenTypes.LPAREN :
case GroovyTokenTypes.LT :
case GroovyTokenTypes.MAP_CONSTRUCTOR :
case GroovyTokenTypes.MEMBER_POINTER :
case GroovyTokenTypes.METHOD_CALL :
case GroovyTokenTypes.METHOD_DEF :
case GroovyTokenTypes.MINUS :
case GroovyTokenTypes.MINUS_ASSIGN :
case GroovyTokenTypes.ML_COMMENT :
case GroovyTokenTypes.MOD :
case GroovyTokenTypes.MODIFIERS :
case GroovyTokenTypes.MOD_ASSIGN :
case GroovyTokenTypes.NLS :
case GroovyTokenTypes.NOT_EQUAL :
case GroovyTokenTypes.NULL_TREE_LOOKAHEAD :
case GroovyTokenTypes.NUM_BIG_DECIMAL :
case GroovyTokenTypes.NUM_BIG_INT :
case GroovyTokenTypes.NUM_DOUBLE :
case GroovyTokenTypes.NUM_FLOAT :
case GroovyTokenTypes.NUM_INT :
case GroovyTokenTypes.NUM_LONG :
case GroovyTokenTypes.OBJBLOCK :
case GroovyTokenTypes.ONE_NL :
case GroovyTokenTypes.OPTIONAL_DOT :
case GroovyTokenTypes.PARAMETERS :
case GroovyTokenTypes.PARAMETER_DEF :
case GroovyTokenTypes.PLUS :
case GroovyTokenTypes.PLUS_ASSIGN :
case GroovyTokenTypes.POST_DEC :
case GroovyTokenTypes.POST_INC :
case GroovyTokenTypes.QUESTION :
case GroovyTokenTypes.RANGE_EXCLUSIVE :
case GroovyTokenTypes.RANGE_INCLUSIVE :
case GroovyTokenTypes.RBRACK :
case GroovyTokenTypes.RCURLY :
case GroovyTokenTypes.REGEXP_CTOR_END :
case GroovyTokenTypes.REGEXP_SYMBOL :
case GroovyTokenTypes.REGEX_FIND :
case GroovyTokenTypes.REGEX_MATCH :
case GroovyTokenTypes.RPAREN :
case GroovyTokenTypes.SELECT_SLOT :
case GroovyTokenTypes.SEMI :
case GroovyTokenTypes.SH_COMMENT :
case GroovyTokenTypes.SL :
case GroovyTokenTypes.SLIST :
case GroovyTokenTypes.SL_ASSIGN :
case GroovyTokenTypes.SL_COMMENT :
case GroovyTokenTypes.SPREAD_ARG :
case GroovyTokenTypes.SPREAD_DOT :
case GroovyTokenTypes.SPREAD_MAP_ARG :
case GroovyTokenTypes.SR :
case GroovyTokenTypes.SR_ASSIGN :
case GroovyTokenTypes.STAR :
case GroovyTokenTypes.STAR_ASSIGN :
case GroovyTokenTypes.STAR_STAR :
case GroovyTokenTypes.STAR_STAR_ASSIGN :
case GroovyTokenTypes.STATIC_IMPORT :
case GroovyTokenTypes.STATIC_INIT :
case GroovyTokenTypes.STRICTFP :
case GroovyTokenTypes.STRING_CH :
case GroovyTokenTypes.STRING_CONSTRUCTOR :
case GroovyTokenTypes.STRING_CTOR_END :
case GroovyTokenTypes.STRING_CTOR_MIDDLE :
case GroovyTokenTypes.STRING_CTOR_START :
case GroovyTokenTypes.STRING_NL :
case GroovyTokenTypes.SUPER_CTOR_CALL :
case GroovyTokenTypes.TRIPLE_DOT :
case GroovyTokenTypes.TYPECAST :
case GroovyTokenTypes.TYPE_ARGUMENT :
case GroovyTokenTypes.TYPE_ARGUMENTS :
case GroovyTokenTypes.TYPE_LOWER_BOUNDS :
case GroovyTokenTypes.TYPE_PARAMETER :
case GroovyTokenTypes.TYPE_PARAMETERS :
case GroovyTokenTypes.TYPE_UPPER_BOUNDS :
case GroovyTokenTypes.UNARY_MINUS :
case GroovyTokenTypes.UNARY_PLUS :
case GroovyTokenTypes.UNUSED_CONST :
case GroovyTokenTypes.UNUSED_DO :
case GroovyTokenTypes.UNUSED_GOTO :
case GroovyTokenTypes.VARIABLE_DEF :
case GroovyTokenTypes.VARIABLE_PARAMETER_DEF :
case GroovyTokenTypes.VOCAB :
case GroovyTokenTypes.WILDCARD_TYPE :
case GroovyTokenTypes.WS :
colour = black;
break;
case GroovyTokenTypes.STRING_LITERAL :
case GroovyTokenTypes.REGEXP_LITERAL :
colour = green;
break;
case GroovyTokenTypes.CLASS_DEF :
case GroovyTokenTypes.EXTENDS_CLAUSE :
case GroovyTokenTypes.IMPLEMENTS_CLAUSE :
case GroovyTokenTypes.IMPORT :
case GroovyTokenTypes.LITERAL_as :
case GroovyTokenTypes.LITERAL_assert :
case GroovyTokenTypes.LITERAL_boolean :
case GroovyTokenTypes.LITERAL_break :
case GroovyTokenTypes.LITERAL_byte :
case GroovyTokenTypes.LITERAL_case :
case GroovyTokenTypes.LITERAL_catch :
case GroovyTokenTypes.LITERAL_char :
case GroovyTokenTypes.LITERAL_class :
case GroovyTokenTypes.LITERAL_continue :
case GroovyTokenTypes.LITERAL_def :
case GroovyTokenTypes.LITERAL_default :
case GroovyTokenTypes.LITERAL_double :
case GroovyTokenTypes.LITERAL_else :
case GroovyTokenTypes.LITERAL_enum :
case GroovyTokenTypes.LITERAL_extends :
case GroovyTokenTypes.LITERAL_false :
case GroovyTokenTypes.LITERAL_finally :
case GroovyTokenTypes.LITERAL_float :
case GroovyTokenTypes.LITERAL_for :
case GroovyTokenTypes.LITERAL_if :
case GroovyTokenTypes.LITERAL_implements :
case GroovyTokenTypes.LITERAL_import :
case GroovyTokenTypes.LITERAL_in :
case GroovyTokenTypes.LITERAL_instanceof :
case GroovyTokenTypes.LITERAL_int :
case GroovyTokenTypes.LITERAL_interface :
case GroovyTokenTypes.LITERAL_long :
case GroovyTokenTypes.LITERAL_native :
case GroovyTokenTypes.LITERAL_new :
case GroovyTokenTypes.LITERAL_null :
case GroovyTokenTypes.LITERAL_package :
case GroovyTokenTypes.LITERAL_private :
case GroovyTokenTypes.LITERAL_protected :
case GroovyTokenTypes.LITERAL_public :
case GroovyTokenTypes.LITERAL_return :
case GroovyTokenTypes.LITERAL_short :
case GroovyTokenTypes.LITERAL_static :
case GroovyTokenTypes.LITERAL_super :
case GroovyTokenTypes.LITERAL_switch :
case GroovyTokenTypes.LITERAL_synchronized :
case GroovyTokenTypes.LITERAL_this :
case GroovyTokenTypes.LITERAL_threadsafe :
case GroovyTokenTypes.LITERAL_throw :
case GroovyTokenTypes.LITERAL_throws :
case GroovyTokenTypes.LITERAL_transient :
case GroovyTokenTypes.LITERAL_true :
case GroovyTokenTypes.LITERAL_try :
case GroovyTokenTypes.LITERAL_void :
case GroovyTokenTypes.LITERAL_volatile :
case GroovyTokenTypes.LITERAL_while :
case GroovyTokenTypes.PACKAGE_DEF :
case GroovyTokenTypes.TYPE :
colour = blue;
break;
default:
colour = black;
break;
}
return colour;
}
public void push(GroovySourceAST t) {
stack.push(t);
}
public GroovySourceAST pop() {
if (!stack.empty()) {
return (GroovySourceAST) stack.pop();
}
return null;
}
}