diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/TokenMgrError.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/TokenMgrError.java
new file mode 100644
index 0000000000..90ca6c69e4
--- /dev/null
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/TokenMgrError.java
@@ -0,0 +1,148 @@
+
+package net.sourceforge.pmd.lang.vf;
+
+import net.sourceforge.pmd.lang.ast.AbstractTokenManager;
+
+/** Token Manager Error. */
+public class TokenMgrError extends RuntimeException
+{
+
+ /**
+ * The version identifier for this Serializable class.
+ * Increment only if the serialized form of the
+ * class changes.
+ */
+ private static final long serialVersionUID = 1L;
+
+ /*
+ * Ordinals for various reasons why an Error of this type can be thrown.
+ */
+
+ /**
+ * Lexical error occurred.
+ */
+ public static final int LEXICAL_ERROR = 0;
+
+ /**
+ * An attempt was made to create a second instance of a static token manager.
+ */
+ public static final int STATIC_LEXER_ERROR = 1;
+
+ /**
+ * Tried to change to an invalid lexical state.
+ */
+ public static final int INVALID_LEXICAL_STATE = 2;
+
+ /**
+ * Detected (and bailed out of) an infinite loop in the token manager.
+ */
+ public static final int LOOP_DETECTED = 3;
+
+ /**
+ * Indicates the reason why the exception is thrown. It will have
+ * one of the above 4 values.
+ */
+ int errorCode;
+
+ /**
+ * Replaces unprintable characters by their escaped (or unicode escaped)
+ * equivalents in the given string
+ */
+ public static final String addEscapes(String str) {
+ StringBuffer retval = new StringBuffer();
+ char ch;
+ for (int i = 0; i < str.length(); i++) {
+ switch (str.charAt(i))
+ {
+ case 0 :
+ continue;
+ case '\b':
+ retval.append("\\b");
+ continue;
+ case '\t':
+ retval.append("\\t");
+ continue;
+ case '\n':
+ retval.append("\\n");
+ continue;
+ case '\f':
+ retval.append("\\f");
+ continue;
+ case '\r':
+ retval.append("\\r");
+ continue;
+ case '\"':
+ retval.append("\\\"");
+ continue;
+ case '\'':
+ retval.append("\\\'");
+ continue;
+ case '\\':
+ retval.append("\\\\");
+ continue;
+ default:
+ if ((ch = str.charAt(i)) < 0x20 || ch > 0x7e) {
+ String s = "0000" + Integer.toString(ch, 16);
+ retval.append("\\u" + s.substring(s.length() - 4, s.length()));
+ } else {
+ retval.append(ch);
+ }
+ continue;
+ }
+ }
+ return retval.toString();
+ }
+
+ /**
+ * Returns a detailed message for the Error when it is thrown by the
+ * token manager to indicate a lexical error.
+ * Parameters :
+ * EOFSeen : indicates if EOF caused the lexical error
+ * curLexState : lexical state in which this error occurred
+ * errorLine : line number when the error occurred
+ * errorColumn : column number when the error occurred
+ * errorAfter : prefix that was seen before this error occurred
+ * curchar : the offending character
+ * Note: You can customize the lexical error message by modifying this method.
+ */
+ protected static String LexicalError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar) {
+ return("Lexical error in file " + AbstractTokenManager.getFileName() + " at line " +
+ errorLine + ", column " +
+ errorColumn + ". Encountered: " +
+ (EOFSeen ? " " : ("\"" + addEscapes(String.valueOf(curChar)) + "\"") + " (" + (int)curChar + "), ") +
+ "after : \"" + addEscapes(errorAfter) + "\"");
+ }
+
+ /**
+ * You can also modify the body of this method to customize your error messages.
+ * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
+ * of end-users concern, so you can return something like :
+ *
+ * "Internal Error : Please file a bug report .... "
+ *
+ * from this method for such cases in the release version of your parser.
+ */
+ public String getMessage() {
+ return super.getMessage();
+ }
+
+ /*
+ * Constructors of various flavors follow.
+ */
+
+ /** No arg constructor. */
+ public TokenMgrError() {
+ }
+
+ /** Constructor with message and reason. */
+ public TokenMgrError(String message, int reason) {
+ super(message);
+ errorCode = reason;
+ }
+
+ /** Full Constructor. */
+ public TokenMgrError(boolean EOFSeen, int lexState, int errorLine, int errorColumn, String errorAfter, char curChar, int reason) {
+ this(LexicalError(EOFSeen, lexState, errorLine, errorColumn, errorAfter, curChar), reason);
+ }
+}
+/* JavaCC - OriginalChecksum=c85aad4d5805fc96f6457a5c4cee44ab (do not edit this line) */
diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTExpression.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTExpression.java
new file mode 100644
index 0000000000..ec6055597f
--- /dev/null
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTExpression.java
@@ -0,0 +1,21 @@
+/**
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+package net.sourceforge.pmd.lang.vf.ast;
+
+public class ASTExpression extends AbstractVFNode {
+ public ASTExpression(int id) {
+ super(id);
+ }
+
+ public ASTExpression(VfParser p, int id) {
+ super(p, id);
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(VfParserVisitor visitor, Object data) {
+
+ return visitor.visit(this, data);
+ }
+}
diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTFunctionCall.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTFunctionCall.java
new file mode 100644
index 0000000000..5c522c0217
--- /dev/null
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTFunctionCall.java
@@ -0,0 +1,21 @@
+/**
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+package net.sourceforge.pmd.lang.vf.ast;
+
+public class ASTFunctionCall extends AbstractVFNode {
+ public ASTFunctionCall(int id) {
+ super(id);
+ }
+
+ public ASTFunctionCall(VfParser p, int id) {
+ super(p, id);
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(VfParserVisitor visitor, Object data) {
+
+ return visitor.visit(this, data);
+ }
+}
diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTIdentifier.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTIdentifier.java
new file mode 100644
index 0000000000..1286ee029f
--- /dev/null
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTIdentifier.java
@@ -0,0 +1,21 @@
+/**
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+package net.sourceforge.pmd.lang.vf.ast;
+
+public class ASTIdentifier extends AbstractVFNode {
+ public ASTIdentifier(int id) {
+ super(id);
+ }
+
+ public ASTIdentifier(VfParser p, int id) {
+ super(p, id);
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(VfParserVisitor visitor, Object data) {
+
+ return visitor.visit(this, data);
+ }
+}
diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTLiteral.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTLiteral.java
new file mode 100644
index 0000000000..9694247107
--- /dev/null
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/ASTLiteral.java
@@ -0,0 +1,21 @@
+/**
+ * BSD-style license; for more info see http://pmd.sourceforge.net/license.html
+ */
+
+package net.sourceforge.pmd.lang.vf.ast;
+
+public class ASTLiteral extends AbstractVFNode {
+ public ASTLiteral(int id) {
+ super(id);
+ }
+
+ public ASTLiteral(VfParser p, int id) {
+ super(p, id);
+ }
+
+ /** Accept the visitor. **/
+ public Object jjtAccept(VfParserVisitor visitor, Object data) {
+
+ return visitor.visit(this, data);
+ }
+}
diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java
index 06b07ffd51..98aee17a00 100644
--- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/ast/VfParserVisitorAdapter.java
@@ -67,4 +67,20 @@ public class VfParserVisitorAdapter implements VfParserVisitor {
public Object visit(ASTHtmlStyle node, Object data) {
return visit((VfNode) node, data);
}
+
+ @Override
+ public Object visit(ASTLiteral node, Object data) {
+ return visit((VfNode) node, data);
+ }
+
+ @Override
+ public Object visit(ASTIdentifier node, Object data) {
+ return visit((VfNode) node, data);
+ }
+
+ @Override
+ public Object visit(ASTExpression node, Object data) {
+ return visit((VfNode) node, data);
+ }
+
}
diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java
index 265d6e37ac..a76e0d691e 100644
--- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/AbstractVfRule.java
@@ -22,8 +22,12 @@ import net.sourceforge.pmd.lang.vf.ast.ASTDoctypeDeclaration;
import net.sourceforge.pmd.lang.vf.ast.ASTDoctypeExternalId;
import net.sourceforge.pmd.lang.vf.ast.ASTElExpression;
import net.sourceforge.pmd.lang.vf.ast.ASTElement;
+import net.sourceforge.pmd.lang.vf.ast.ASTExpression;
+import net.sourceforge.pmd.lang.vf.ast.ASTFunctionCall;
import net.sourceforge.pmd.lang.vf.ast.ASTHtmlScript;
import net.sourceforge.pmd.lang.vf.ast.ASTHtmlStyle;
+import net.sourceforge.pmd.lang.vf.ast.ASTIdentifier;
+import net.sourceforge.pmd.lang.vf.ast.ASTLiteral;
import net.sourceforge.pmd.lang.vf.ast.ASTText;
import net.sourceforge.pmd.lang.vf.ast.ASTUnparsedText;
import net.sourceforge.pmd.lang.vf.ast.VfNode;
@@ -111,4 +115,21 @@ public abstract class AbstractVfRule extends AbstractRule implements VfParserVis
public Object visit(ASTHtmlStyle node, Object data) {
return visit((VfNode) node, data);
}
+
+ public Object visit(ASTLiteral node, Object data) {
+ return visit((VfNode) node, data);
+ }
+
+ public Object visit(ASTIdentifier node, Object data) {
+ return visit((VfNode) node, data);
+ }
+
+ public Object visit(ASTExpression node, Object data) {
+ return visit((VfNode) node, data);
+ }
+
+ public Object visit(ASTFunctionCall node, Object data) {
+ return visit((VfNode) node, data);
+ }
+
}
diff --git a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/security/VfUnescapeElRule.java b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/security/VfUnescapeElRule.java
index 074c32fbb9..b7959994b1 100644
--- a/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/security/VfUnescapeElRule.java
+++ b/pmd-visualforce/src/main/java/net/sourceforge/pmd/lang/vf/rule/security/VfUnescapeElRule.java
@@ -30,6 +30,7 @@ public class VfUnescapeElRule extends AbstractVfRule {
private static final String APEX_SELECT_OPTION = "apex:selectoption ";
private static final String FALSE = "false";
+
@Override
public Object visit(ASTElement node, Object data) {
if (doesTagSupportEscaping(node)) {