blob: fc4a433cbe2652f726f51243789111e7ee7a2e3b [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.apache.myfaces.buildtools.maven2.plugin.javascript.javascriptcompiler;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.StringTokenizer;
import org.apache.myfaces.buildtools.maven2.plugin.javascript.javascript20parser.*;
public class DepthFirstTraversal implements JSParser20Visitor
{
protected PrintStream out;
private boolean _debug;
private int depth;
private HashMap<String, String> nameTable;
public DepthFirstTraversal()
{
out = System.out;
_debug = true;
depth = 0;
}
public DepthFirstTraversal(PrintStream o)
{
out = o;
_debug = true;
depth = 0;
}
public DepthFirstTraversal(PrintStream o, HashMap<String, String> tMap)
{
out = o;
_debug = true;
depth = 0;
nameTable = tMap;
}
public Object depthFirstTraversal(SimpleNode node, Object data)
{
depth++;
Token t1 = node.getFirstToken();
Token t = new Token();
t.next = t1;
SimpleNode n;
for (int ord = 0; ord < node.jjtGetNumChildren(); ord++)
{
//
// Get the next chid node in sequence.
//
n = (SimpleNode) node.jjtGetChild(ord);
//
// Loop through all the Tokens that are attached to this node.
//
if (_debug == true)
{
while (true)
{
t = t.next;
if (t == n.getFirstToken()) break;
print(t);
}
}
//
// Depth Fist search so visit this nodes children before siblings
//
n.jjtAccept(this, data);
t = n.getLastToken();
}
if (_debug == true)
{
while (t != node.getLastToken())
{
if (t.next == null) {
break;
}
t = t.next;
print(t);
}
}
depth--;
return data;
}
protected void printNode(SimpleNode node)
{
Token t = node.getFirstToken();
while (t != node.getLastToken())
{
print(t);
t = t.next;
}
print(node.getLastToken());
}
protected void print(Token t)
{
//
// Hack Alert: Due to an error with the leaf node ASTEolWithComments
// Wich only matches special and no regular tokens thus we get the next
// valid leafs token stuck in here. Thus we get duplicate info in each file.
// Fixed this with simple flag to recognizes if the token has already been
// written out.Need to refactor that terminal.
//
if (t.hasPrinted == true) return;
Token tt = t.specialToken;
if (tt != null)
{
while (tt.specialToken != null)
tt = tt.specialToken;
while (tt != null)
{
out.print(addUnicodeEscapes(tt.image));
tt = tt.next;
}
}
//
// Check to see if the Token is an identifier kind.
//
if (t.kind == 78)
{
//
// Potential item to swap out.
//
String temp = nameTable.get(t.image);
if (temp != null)
{
t.image = temp;
}
} else if (t.kind == 70 || t.kind == 72 || t.kind == 77)
{
//
// Got string that could have a potential class in it (like Eval or
// RegExp so need to scan the string.
//
StringTokenizer st;
if (t.image.charAt(0) == '"' && t.image.length() > 2)
{
st = new StringTokenizer(t.image.substring(1, (t.image.length()-1)));
} else
{
st = new StringTokenizer(t.image);
}
StringBuilder replacementString = new StringBuilder(t.image);
boolean update = false;
while (st.hasMoreTokens()) {
String temp1 = st.nextToken();
String temp = nameTable.get(temp1);
if (temp != null)
{
int start = replacementString.indexOf(temp1);
int end = start + temp1.length();
update = true;
replacementString.delete(start, end);
replacementString.insert(start, temp);
}
}
if (update == true)
{
System.out.println("Old String is:" + t.image);
t.image = replacementString.toString();
System.out.println("New String is:" + t.image);
}
}
out.print(addUnicodeEscapes(t.image));
t.hasPrinted = true;
}
private String addUnicodeEscapes(String str)
{
String retval = "";
char ch;
for (int i = 0; i < str.length(); i++)
{
ch = str.charAt(i);
if (((ch < 0x20) || (ch > 0x7e)) && (ch != '\t') && (ch != '\n') &&
(ch != '\r') && (ch != '\f'))
{
String s = "0000" + Integer.toString(ch, 16);
retval += ("\\u" + s.substring(s.length() - 4, s.length()));
}
else
{
retval += ch;
}
}
return retval;
}
private String buildPaddedString(String s)
{
StringBuffer sb = new StringBuffer();
for (int count = 0; count <= depth; count++)
{
sb = sb.append(" ");
}
sb = sb.append(s);
return sb.toString();
}
public Object visit(SimpleNode node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTProgram node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTIdentifier node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTSimpleQualifiedIdentifier node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTExpressionQualifiedIdentifier node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTQualifiedIdentifier node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPrimaryExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTReservedNamespace node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFunctionExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTObjectLiteral node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFieldList node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTLiteralField node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFieldName node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTArrayLiteral node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTElementList node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTLiteralElement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTSuperExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPostfixExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTAttributeExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFullPostfixExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFullNewExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFunctionConstructor node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFullNewSubexpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPostfixOp node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPropertyOrArguments node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPropertyOperator node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTArguments node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTUnaryExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTMulOp node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTMultiplicativeExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTAddOp node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTAdditiveExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTShiftOp node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTShiftExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTRelOp node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTRelationalExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTRelationalExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTEqualOp node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTEqualityExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTEqualityExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBitwiseANDOp node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBitwiseANDExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBitwiseANDExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBitwiseXOROp node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBitwiseXORExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBitwiseXORExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBitwiseOROp node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBitwiseORExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBitwiseORExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTLogicalANDExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTLogicalANDExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTLogicalORExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTLogicalORExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTConditionalExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTConditionalExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTNonAssignmentExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTNonAssignmentExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTAssignementOperator node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTAssignmentExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTAssignmentExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTListExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTListExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTTypeExpression node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTTypeExpressionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTTypeExpressionList node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTSubstatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTSubstatements node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTSc node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTEolCommentSkipWs node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTEmptyStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTExpressionStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTSuperStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBlock node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTLabeledStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTIfStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTSwitchStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTCaseElements node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTCaseElement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTCaseLabel node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTDoStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTWhileStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTForStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTForInitializer node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTForInBinding node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTWithStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTContinueStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTBreakStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTReturnStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTThrowStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTTryStatement node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTDirectives node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTDirective node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTAnnotatableDirective node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTAttributes node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTAttribute node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTUseDirective node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTImportDirective node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTIncludeDirective node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPragma node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPragmaItems node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPragmaItem node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPragmaExpr node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPragmaArgument node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTExportDefinition node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTExportBindingList node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTExportBinding node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableDefinition node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableDefinitionNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableDefinitionKind node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableBindingList node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableBindingListNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableBinding node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableBindingNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableInitialisation node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableInitialisationNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableInitializer node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTVariableInitializerNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTTypedIdentifier node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTTypedIdentifierNoIN node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTSimpleVariableDefinition node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTUntypedVariableBindingList node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTUntypedVariableBinding node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFunctionDefinition node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFunctionName node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTFunctionCommon node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTParameters node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTParameter node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTParameterInit node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTRestParameters node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTResult node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTClassDefinition node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTInterfaceDefinition node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTInheritance node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTNamespaceDefinition node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPackageDefinition node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPackageName node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
public Object visit(ASTPackageIdentifiers node, Object data)
{
depthFirstTraversal(node, data);
return data;
}
}