This is an automated email from the ASF dual-hosted git repository.

joshtynjala pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/royale-compiler.git

commit dc79c93d41ce08257d4d04b5eae865040473299a
Author: Josh Tynjala <[email protected]>
AuthorDate: Wed Oct 5 10:32:15 2022 -0700

    linter: add ILinterProblem interface to allow for easier detection of 
linter problems
---
 .../ILinterProblem.java}                           | 32 ++--------------------
 .../apache/royale/linter/rules/ClassNameRule.java  |  3 +-
 .../royale/linter/rules/ConstantNameRule.java      |  3 +-
 .../royale/linter/rules/EmptyCommentRule.java      |  3 +-
 .../royale/linter/rules/EmptyFunctionBodyRule.java |  3 +-
 .../royale/linter/rules/EmptyNestedBlockRule.java  |  3 +-
 .../royale/linter/rules/EmptyStatementRule.java    |  3 +-
 .../apache/royale/linter/rules/FieldNameRule.java  |  3 +-
 .../royale/linter/rules/FunctionNameRule.java      |  3 +-
 .../royale/linter/rules/InterfaceNameRule.java     |  3 +-
 .../linter/rules/LineCommentPositionRule.java      |  3 +-
 .../linter/rules/LocalVarAndParameterNameRule.java |  5 ++--
 .../linter/rules/LocalVarShadowsFieldRule.java     |  3 +-
 .../linter/rules/MXMLEmptyAttributeRule.java       |  3 +-
 .../org/apache/royale/linter/rules/MXMLIDRule.java |  3 +-
 .../royale/linter/rules/MaxBlockDepthRule.java     |  3 +-
 .../royale/linter/rules/MaxParametersRule.java     |  3 +-
 .../royale/linter/rules/MissingASDocRule.java      |  5 ++--
 .../linter/rules/MissingConstructorSuperRule.java  |  3 +-
 .../royale/linter/rules/MissingNamespaceRule.java  | 13 +++++----
 .../royale/linter/rules/MissingSemicolonRule.java  |  3 +-
 .../royale/linter/rules/MissingTypeRule.java       |  7 +++--
 .../apache/royale/linter/rules/NoAnyTypeRule.java  |  7 +++--
 .../royale/linter/rules/NoBooleanEqualityRule.java |  3 +-
 .../rules/NoConstructorDispatchEventRule.java      |  5 ++--
 .../linter/rules/NoConstructorReturnTypeRule.java  |  3 +-
 .../linter/rules/NoDuplicateObjectKeysRule.java    |  3 +-
 .../royale/linter/rules/NoDynamicClassRule.java    |  3 +-
 .../linter/rules/NoIfBooleanLiteralRule.java       |  3 +-
 .../royale/linter/rules/NoLeadingZeroesRule.java   |  3 +-
 .../royale/linter/rules/NoSparseArrayRule.java     |  3 +-
 .../royale/linter/rules/NoStringEventNameRule.java |  7 +++--
 .../royale/linter/rules/NoThisInClosureRule.java   |  3 +-
 .../apache/royale/linter/rules/NoTraceRule.java    |  3 +-
 .../royale/linter/rules/NoVoidOperatorRule.java    |  3 +-
 .../royale/linter/rules/NoWildcardImportRule.java  |  3 +-
 .../org/apache/royale/linter/rules/NoWithRule.java |  4 ++-
 .../rules/OverrideContainsOnlySuperCallRule.java   |  3 +-
 .../royale/linter/rules/PackageNameRule.java       |  3 +-
 .../royale/linter/rules/StaticConstantsRule.java   |  3 +-
 .../royale/linter/rules/StrictEqualityRule.java    |  4 ++-
 .../linter/rules/SwitchWithoutDefaultRule.java     |  3 +-
 .../royale/linter/rules/UnsafeNegationRule.java    |  3 +-
 .../royale/linter/rules/ValidTypeofRule.java       |  3 +-
 .../royale/linter/rules/VariablesOnTopRule.java    |  3 +-
 45 files changed, 107 insertions(+), 87 deletions(-)

diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoWithRule.java 
b/linter/src/main/java/org/apache/royale/linter/problems/ILinterProblem.java
similarity index 51%
copy from linter/src/main/java/org/apache/royale/linter/rules/NoWithRule.java
copy to 
linter/src/main/java/org/apache/royale/linter/problems/ILinterProblem.java
index 388bd7a94..31eed863a 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/NoWithRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/problems/ILinterProblem.java
@@ -17,36 +17,10 @@
 //
 
////////////////////////////////////////////////////////////////////////////////
 
-package org.apache.royale.linter.rules;
+package org.apache.royale.linter.problems;
 
-import java.util.HashMap;
-import java.util.Map;
+import org.apache.royale.compiler.problems.ICompilerProblem;
 
-import org.apache.royale.compiler.internal.parsing.as.ASTokenTypes;
-import org.apache.royale.compiler.parsing.IASToken;
-import org.apache.royale.compiler.problems.CompilerProblem;
-import org.apache.royale.linter.LinterRule;
-import org.apache.royale.linter.TokenVisitor;
+public interface ILinterProblem extends ICompilerProblem {
 
-/**
- * Checks for uses of 'with(x)'.
- */
-public class NoWithRule extends LinterRule {
-       @Override
-       public Map<Integer, TokenVisitor> getTokenVisitors() {
-               Map<Integer, TokenVisitor> result = new HashMap<>();
-               result.put(ASTokenTypes.TOKEN_KEYWORD_WITH, (token, tokenQuery, 
problems) -> {
-                       problems.add(new NoWithLinterProblem(token));
-               });
-               return result;
-       }
-
-       public static class NoWithLinterProblem extends CompilerProblem {
-               public static final String DESCRIPTION = "Must not use 'with' 
statement";
-
-               public NoWithLinterProblem(IASToken token)
-               {
-                       super(token);
-               }
-       }
 }
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/ClassNameRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/ClassNameRule.java
index 462f28a6c..b0b208df7 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/ClassNameRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/ClassNameRule.java
@@ -32,6 +32,7 @@ import org.apache.royale.compiler.tree.as.IClassNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that class names match a specific pattern.
@@ -63,7 +64,7 @@ public class ClassNameRule extends LinterRule {
                problems.add(new ClassNameLinterProblem(classNode, thePattern));
        }
 
-       public static class ClassNameLinterProblem extends CompilerProblem {
+       public static class ClassNameLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Class name does not 
match the pattern '${pattern}'";
 
                public ClassNameLinterProblem(IClassNode node, Pattern pattern)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/ConstantNameRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/ConstantNameRule.java
index 16f8b1cec..24798269e 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/ConstantNameRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/ConstantNameRule.java
@@ -32,6 +32,7 @@ import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that constant names match a specific pattern.
@@ -66,7 +67,7 @@ public class ConstantNameRule extends LinterRule {
                problems.add(new ConstantNameLinterProblem(variableNode, 
thePattern));
        }
 
-       public static class ConstantNameLinterProblem extends CompilerProblem {
+       public static class ConstantNameLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Constant name does 
not match the pattern '${pattern}'";
 
                public ConstantNameLinterProblem(IVariableNode node, Pattern 
pattern)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/EmptyCommentRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/EmptyCommentRule.java
index 177c45b6c..31679040b 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/EmptyCommentRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/EmptyCommentRule.java
@@ -35,6 +35,7 @@ import org.apache.royale.linter.MXMLTokenQuery;
 import org.apache.royale.linter.MXMLTokenVisitor;
 import org.apache.royale.linter.TokenQuery;
 import org.apache.royale.linter.TokenVisitor;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for line or block comments that are empty.
@@ -95,7 +96,7 @@ public class EmptyCommentRule extends LinterRule {
                problems.add(new EmptyCommentLinterProblem(comment));
        }
 
-       public static class EmptyCommentLinterProblem extends CompilerProblem {
+       public static class EmptyCommentLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Comment must not be 
empty";
 
                public EmptyCommentLinterProblem(IASToken token) {
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/EmptyFunctionBodyRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/EmptyFunctionBodyRule.java
index bfa04a6f0..bf357d633 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/EmptyFunctionBodyRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/EmptyFunctionBodyRule.java
@@ -32,6 +32,7 @@ import org.apache.royale.compiler.tree.as.IFunctionNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for function bodies that are empty.
@@ -81,7 +82,7 @@ public class EmptyFunctionBodyRule extends LinterRule {
                return true;
        }
 
-       public static class EmptyFunctionBodyLinterProblem extends 
CompilerProblem {
+       public static class EmptyFunctionBodyLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Function body must 
not be empty";
 
                public EmptyFunctionBodyLinterProblem(IBlockNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/EmptyNestedBlockRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/EmptyNestedBlockRule.java
index 87319ce99..d168c2a6e 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/EmptyNestedBlockRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/EmptyNestedBlockRule.java
@@ -34,6 +34,7 @@ import org.apache.royale.compiler.tree.as.ITypeNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for empty blocks, as long as they aren't the bodies of classes,
@@ -77,7 +78,7 @@ public class EmptyNestedBlockRule extends LinterRule {
                return true;
        }
 
-       public static class EmptyNestedBlockLinterProblem extends 
CompilerProblem {
+       public static class EmptyNestedBlockLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Block must not be 
empty";
 
                public EmptyNestedBlockLinterProblem(IBlockNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/EmptyStatementRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/EmptyStatementRule.java
index ccfb3f841..62159539c 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/EmptyStatementRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/EmptyStatementRule.java
@@ -30,6 +30,7 @@ import org.apache.royale.compiler.problems.ICompilerProblem;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.TokenQuery;
 import org.apache.royale.linter.TokenVisitor;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for empty statements. An empty statement consists of only a semicolon
@@ -59,7 +60,7 @@ public class EmptyStatementRule extends LinterRule {
                problems.add(new EmptyStatementLinterProblem(semicolon));
        }
 
-       public static class EmptyStatementLinterProblem extends CompilerProblem 
{
+       public static class EmptyStatementLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Statement must not be 
empty";
 
                public EmptyStatementLinterProblem(IASToken token)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/FieldNameRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/FieldNameRule.java
index 974613e1c..68c26a093 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/FieldNameRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/FieldNameRule.java
@@ -35,6 +35,7 @@ import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that field names match a specific pattern.
@@ -77,7 +78,7 @@ public class FieldNameRule extends LinterRule {
                problems.add(new FieldNameLinterProblem(variableNode, 
thePattern));
        }
 
-       public static class FieldNameLinterProblem extends CompilerProblem {
+       public static class FieldNameLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Field name 
'${varName}' does not match the pattern '${pattern}'";
 
                public FieldNameLinterProblem(IVariableNode node, Pattern 
pattern)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/FunctionNameRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/FunctionNameRule.java
index 9cb10db3e..66618bb11 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/FunctionNameRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/FunctionNameRule.java
@@ -32,6 +32,7 @@ import org.apache.royale.compiler.tree.as.IFunctionNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that function names match a specific pattern.
@@ -70,7 +71,7 @@ public class FunctionNameRule extends LinterRule {
                problems.add(new FunctionNameLinterProblem(functionNode, 
thePattern));
        }
 
-       public static class FunctionNameLinterProblem extends CompilerProblem {
+       public static class FunctionNameLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Function name 
'${functionName}' does not match the pattern '${pattern}'";
 
                public FunctionNameLinterProblem(IFunctionNode node, Pattern 
pattern)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/InterfaceNameRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/InterfaceNameRule.java
index 23a4d2770..8629d8fae 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/InterfaceNameRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/InterfaceNameRule.java
@@ -32,6 +32,7 @@ import org.apache.royale.compiler.tree.as.IInterfaceNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that interface names match a specific pattern.
@@ -63,7 +64,7 @@ public class InterfaceNameRule extends LinterRule {
                problems.add(new InterfaceNameLinterProblem(interfaceNode, 
thePattern));
        }
 
-       public static class InterfaceNameLinterProblem extends CompilerProblem {
+       public static class InterfaceNameLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Interface name does 
not match the pattern '${pattern}'";
 
                public InterfaceNameLinterProblem(IInterfaceNode node, Pattern 
pattern)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/LineCommentPositionRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/LineCommentPositionRule.java
index ae3fc4b0f..6a58c927c 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/LineCommentPositionRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/LineCommentPositionRule.java
@@ -31,6 +31,7 @@ import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.TokenQuery;
 import org.apache.royale.linter.TokenVisitor;
 import org.apache.royale.linter.config.LineCommentPosition;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks if line comments appear beside code on the same line, or on a
@@ -65,7 +66,7 @@ public class LineCommentPositionRule extends LinterRule {
                }
        }
 
-       public static class LineCommentPositionLinterProblem extends 
CompilerProblem {
+       public static class LineCommentPositionLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Comment must be 
${position} code";
 
                public LineCommentPositionLinterProblem(IASToken token, 
LineCommentPosition position)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/LocalVarAndParameterNameRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/LocalVarAndParameterNameRule.java
index 6a1be14de..589d385cd 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/LocalVarAndParameterNameRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/LocalVarAndParameterNameRule.java
@@ -37,6 +37,7 @@ import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that local variable and parameter names match a specific pattern.
@@ -95,7 +96,7 @@ public class LocalVarAndParameterNameRule extends LinterRule {
                problems.add(new ParameterNameLinterProblem(paramNode, 
thePattern));
        }
 
-       public static class LocalVarNameLinterProblem extends CompilerProblem {
+       public static class LocalVarNameLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Variable name 
'${varName}' does not match the pattern '${pattern}'";
 
                public LocalVarNameLinterProblem(IVariableNode node, Pattern 
pattern)
@@ -109,7 +110,7 @@ public class LocalVarAndParameterNameRule extends 
LinterRule {
                public String varName;
        }
 
-       public static class ParameterNameLinterProblem extends CompilerProblem {
+       public static class ParameterNameLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Parameter name 
'${paramName}' does not match the pattern '${pattern}'";
 
                public ParameterNameLinterProblem(IVariableNode node, Pattern 
pattern)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/LocalVarShadowsFieldRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/LocalVarShadowsFieldRule.java
index 4fce9ce8c..125034139 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/LocalVarShadowsFieldRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/LocalVarShadowsFieldRule.java
@@ -35,6 +35,7 @@ import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 public class LocalVarShadowsFieldRule extends LinterRule {
        @Override
@@ -72,7 +73,7 @@ public class LocalVarShadowsFieldRule extends LinterRule {
                }
        }
 
-       public static class LocalVarShadowsFieldLinterProblem extends 
CompilerProblem {
+       public static class LocalVarShadowsFieldLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Local variable 
'${varName}' has the same name as field in class '${className}'";
 
                public LocalVarShadowsFieldLinterProblem(IVariableNode 
variableNode, IClassNode classNode)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/MXMLEmptyAttributeRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/MXMLEmptyAttributeRule.java
index 147ea2b56..3594e58d9 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/MXMLEmptyAttributeRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/MXMLEmptyAttributeRule.java
@@ -30,6 +30,7 @@ import org.apache.royale.compiler.problems.ICompilerProblem;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.MXMLTagVisitor;
 import org.apache.royale.linter.MXMLTokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that MXML attribute values are not empty.
@@ -52,7 +53,7 @@ public class MXMLEmptyAttributeRule extends LinterRule {
                }
        }
 
-       public static class MXMLEmptyAttributeLinterProblem extends 
CompilerProblem {
+       public static class MXMLEmptyAttributeLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "MXML attribute 
'${attributeName}' value is empty";
 
                public MXMLEmptyAttributeLinterProblem(IMXMLTagAttributeData 
attribute) {
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/MXMLIDRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/MXMLIDRule.java
index 428704443..d5dbe68f1 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/MXMLIDRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/MXMLIDRule.java
@@ -32,6 +32,7 @@ import org.apache.royale.compiler.problems.ICompilerProblem;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.MXMLTagVisitor;
 import org.apache.royale.linter.MXMLTokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that MXML id attribute values match a specific pattern.
@@ -66,7 +67,7 @@ public class MXMLIDRule extends LinterRule {
                problems.add(new MXMLIDLinterProblem(idAttribute, thePattern));
        }
 
-       public static class MXMLIDLinterProblem extends CompilerProblem {
+       public static class MXMLIDLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "MXML id '${idValue}' 
does not match the pattern '${pattern}'";
 
                public MXMLIDLinterProblem(IMXMLTagAttributeData attribute, 
Pattern pattern)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/MaxBlockDepthRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/MaxBlockDepthRule.java
index 49aa594eb..b8e195391 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/MaxBlockDepthRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/MaxBlockDepthRule.java
@@ -34,6 +34,7 @@ import org.apache.royale.compiler.tree.as.IStatementNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks the number of nested blocks in a function.
@@ -95,7 +96,7 @@ public class MaxBlockDepthRule extends LinterRule {
                return maxDepth;
        }
 
-       public static class MaxBlockDepthLinterProblem extends CompilerProblem {
+       public static class MaxBlockDepthLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Function 
'${functionName}' has blocks nested ${depth} levels deep, but expected no 
deeper than ${maxDepth} levels";
 
                public MaxBlockDepthLinterProblem(IFunctionNode node, int 
depth, int maxDepth)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/MaxParametersRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/MaxParametersRule.java
index b2005b30a..13acef074 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/MaxParametersRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/MaxParametersRule.java
@@ -30,6 +30,7 @@ import org.apache.royale.compiler.tree.as.IFunctionNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks the number of function parameters.
@@ -53,7 +54,7 @@ public class MaxParametersRule extends LinterRule {
                problems.add(new MaxParametersLinterProblem(functionNode, 
maximum));
        }
 
-       public static class MaxParametersLinterProblem extends CompilerProblem {
+       public static class MaxParametersLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Function 
'${functionName}' has ${params} parameters, but expected no more than 
${maxParams} parameters";
 
                public MaxParametersLinterProblem(IFunctionNode node, int 
maxParams)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/MissingASDocRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/MissingASDocRule.java
index 5459afd60..5c8e3ba86 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/MissingASDocRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/MissingASDocRule.java
@@ -37,6 +37,7 @@ import org.apache.royale.linter.MXMLTokenQuery;
 import org.apache.royale.linter.MXMLTokenVisitor;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for missing or empty ASDoc comments.
@@ -115,7 +116,7 @@ public class MissingASDocRule extends LinterRule {
                problems.add(new EmptyASDocLinterProblem(comment));
        }
 
-       public static class MissingASDocLinterProblem extends CompilerProblem {
+       public static class MissingASDocLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Public APIs must have 
ASDoc comments";
 
                public MissingASDocLinterProblem(IDocumentableDefinitionNode 
node)
@@ -124,7 +125,7 @@ public class MissingASDocRule extends LinterRule {
                }
        }
 
-       public static class EmptyASDocLinterProblem extends CompilerProblem {
+       public static class EmptyASDocLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "ASDoc comments must 
not be empty";
 
                public EmptyASDocLinterProblem(IASToken token)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/MissingConstructorSuperRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/MissingConstructorSuperRule.java
index f2863b768..1d186c788 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/MissingConstructorSuperRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/MissingConstructorSuperRule.java
@@ -35,6 +35,7 @@ import 
org.apache.royale.compiler.tree.as.ILanguageIdentifierNode.LanguageIdenti
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that all constructors include a call to super().
@@ -79,7 +80,7 @@ public class MissingConstructorSuperRule extends LinterRule {
                return false;
        }
 
-       public static class MissingConstructorSuperLinterProblem extends 
CompilerProblem {
+       public static class MissingConstructorSuperLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Constructor 
'${functionName}' does not include 'super()' call";
 
                public MissingConstructorSuperLinterProblem(IFunctionNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/MissingNamespaceRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/MissingNamespaceRule.java
index 1d0262680..13d032757 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/MissingNamespaceRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/MissingNamespaceRule.java
@@ -41,6 +41,7 @@ import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that symbols in package or class scopes have a namespace.
@@ -145,7 +146,7 @@ public class MissingNamespaceRule extends LinterRule {
                return ns != null;
        }
 
-       public static class MissingNamespaceOnClassLinterProblem extends 
CompilerProblem {
+       public static class MissingNamespaceOnClassLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing namespace on 
class '${className}'";
 
                public MissingNamespaceOnClassLinterProblem(IClassNode node)
@@ -157,7 +158,7 @@ public class MissingNamespaceRule extends LinterRule {
                public String className;
        }
 
-       public static class MissingNamespaceOnInterfaceLinterProblem extends 
CompilerProblem {
+       public static class MissingNamespaceOnInterfaceLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing namespace on 
interface '${interfaceName}'";
 
                public MissingNamespaceOnInterfaceLinterProblem(IInterfaceNode 
node)
@@ -169,7 +170,7 @@ public class MissingNamespaceRule extends LinterRule {
                public String interfaceName;
        }
 
-       public static class MissingNamespaceOnPackageFunctionLinterProblem 
extends CompilerProblem {
+       public static class MissingNamespaceOnPackageFunctionLinterProblem 
extends CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing namespace on 
package function '${functionName}'";
 
                public 
MissingNamespaceOnPackageFunctionLinterProblem(IFunctionNode node)
@@ -181,7 +182,7 @@ public class MissingNamespaceRule extends LinterRule {
                public String functionName;
        }
 
-       public static class MissingNamespaceOnMethodLinterProblem extends 
CompilerProblem {
+       public static class MissingNamespaceOnMethodLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing namespace on 
method '${functionName}'";
 
                public MissingNamespaceOnMethodLinterProblem(IFunctionNode node)
@@ -193,7 +194,7 @@ public class MissingNamespaceRule extends LinterRule {
                public String functionName;
        }
 
-       public static class MissingNamespaceOnPackageVariableLinterProblem 
extends CompilerProblem {
+       public static class MissingNamespaceOnPackageVariableLinterProblem 
extends CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing namespace on 
package variable '${variableName}'";
 
                public 
MissingNamespaceOnPackageVariableLinterProblem(IVariableNode node)
@@ -205,7 +206,7 @@ public class MissingNamespaceRule extends LinterRule {
                public String variableName;
        }
 
-       public static class MissingNamespaceOnFieldLinterProblem extends 
CompilerProblem {
+       public static class MissingNamespaceOnFieldLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing namespace on 
field '${variableName}'";
 
                public MissingNamespaceOnFieldLinterProblem(IVariableNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/MissingSemicolonRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/MissingSemicolonRule.java
index 50a5371f9..9aa1368c1 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/MissingSemicolonRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/MissingSemicolonRule.java
@@ -30,6 +30,7 @@ import org.apache.royale.compiler.problems.ICompilerProblem;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.TokenQuery;
 import org.apache.royale.linter.TokenVisitor;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for statements with missing semicolons.
@@ -51,7 +52,7 @@ public class MissingSemicolonRule extends LinterRule {
                problems.add(new MissingSemicolonLinterProblem(semicolon));
        }
 
-       public static class MissingSemicolonLinterProblem extends 
CompilerProblem {
+       public static class MissingSemicolonLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Semicolon is 
required";
 
                public MissingSemicolonLinterProblem(IASToken token)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/MissingTypeRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/MissingTypeRule.java
index 1b1903475..70227b73b 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/MissingTypeRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/MissingTypeRule.java
@@ -34,6 +34,7 @@ import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks that a type has been declared for all variables, function parameters,
@@ -94,7 +95,7 @@ public class MissingTypeRule extends LinterRule {
                return true;
        }
 
-       public static class MissingVariableTypeLinterProblem extends 
CompilerProblem {
+       public static class MissingVariableTypeLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing type for 
variable '${varName}'";
 
                public MissingVariableTypeLinterProblem(IVariableNode node)
@@ -106,7 +107,7 @@ public class MissingTypeRule extends LinterRule {
                public String varName;
        }
 
-       public static class MissingFunctionParameterTypeLinterProblem extends 
CompilerProblem {
+       public static class MissingFunctionParameterTypeLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing type for 
function parameter '${paramName}'";
 
                public MissingFunctionParameterTypeLinterProblem(IParameterNode 
node)
@@ -118,7 +119,7 @@ public class MissingTypeRule extends LinterRule {
                public String paramName;
        }
 
-       public static class MissingFunctionReturnTypeLinterProblem extends 
CompilerProblem {
+       public static class MissingFunctionReturnTypeLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing function 
return type";
 
                public MissingFunctionReturnTypeLinterProblem(IFunctionNode 
node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoAnyTypeRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/NoAnyTypeRule.java
index f1879710a..ac5b58bc7 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/NoAnyTypeRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/NoAnyTypeRule.java
@@ -36,6 +36,7 @@ import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for uses of the * type.
@@ -92,7 +93,7 @@ public class NoAnyTypeRule extends LinterRule {
                return true;
        }
 
-       public static class NoAnyTypeOnVariableLinterProblem extends 
CompilerProblem {
+       public static class NoAnyTypeOnVariableLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Must not use the * 
type for variable '${varName}'";
 
                public NoAnyTypeOnVariableLinterProblem(IVariableNode node)
@@ -104,7 +105,7 @@ public class NoAnyTypeRule extends LinterRule {
                public String varName;
        }
 
-       public static class NoAnyTypeOnParameterLinterProblem extends 
CompilerProblem {
+       public static class NoAnyTypeOnParameterLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Must not use the * 
type for function parameter '${paramName}'";
 
                public NoAnyTypeOnParameterLinterProblem(IParameterNode node)
@@ -116,7 +117,7 @@ public class NoAnyTypeRule extends LinterRule {
                public String paramName;
        }
 
-       public static class NoAnyTypeReturnLinterProblem extends 
CompilerProblem {
+       public static class NoAnyTypeReturnLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Must not use the * 
type for function return type";
 
                public NoAnyTypeReturnLinterProblem(IFunctionNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoBooleanEqualityRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/NoBooleanEqualityRule.java
index 8209e554c..5768718f5 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoBooleanEqualityRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoBooleanEqualityRule.java
@@ -31,6 +31,7 @@ import org.apache.royale.compiler.tree.as.IExpressionNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for redundant equality comparisons with 'true' and 'false' boolean
@@ -64,7 +65,7 @@ public class NoBooleanEqualityRule extends LinterRule {
                }
        }
 
-       public static class NoBooleanEqualityLinterProblem extends 
CompilerProblem {
+       public static class NoBooleanEqualityLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Must simplify 
statement to remove redundant comparison with true or false";
 
                public NoBooleanEqualityLinterProblem(IExpressionNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoConstructorDispatchEventRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/NoConstructorDispatchEventRule.java
index 6ab9109f4..50bb49668 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoConstructorDispatchEventRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoConstructorDispatchEventRule.java
@@ -31,11 +31,12 @@ import org.apache.royale.compiler.tree.as.IFunctionCallNode;
 import org.apache.royale.compiler.tree.as.IFunctionNode;
 import org.apache.royale.compiler.tree.as.IIdentifierNode;
 import org.apache.royale.compiler.tree.as.ILanguageIdentifierNode;
-import org.apache.royale.compiler.tree.as.IMemberAccessExpressionNode;
 import 
org.apache.royale.compiler.tree.as.ILanguageIdentifierNode.LanguageIdentifierKind;
+import org.apache.royale.compiler.tree.as.IMemberAccessExpressionNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that a constructor does not call `dispatchEvent` because it's likely
@@ -84,7 +85,7 @@ public class NoConstructorDispatchEventRule extends 
LinterRule {
                }
        }
 
-       public static class NoConstructorDispatchEventLinterProblem extends 
CompilerProblem {
+       public static class NoConstructorDispatchEventLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Constructor 
'${functionName}' must not call 'dispatchEvent'";
 
                public NoConstructorDispatchEventLinterProblem(IFunctionNode 
functionNode, IExpressionNode dispatchEventNode) {
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoConstructorReturnTypeRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/NoConstructorReturnTypeRule.java
index e3d547544..12c72a6d1 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoConstructorReturnTypeRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoConstructorReturnTypeRule.java
@@ -31,6 +31,7 @@ import org.apache.royale.compiler.tree.as.IFunctionNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that a constructor does not specify a return type (not even `void`).
@@ -56,7 +57,7 @@ public class NoConstructorReturnTypeRule extends LinterRule {
                problems.add(new 
NoConstructorReturnTypeLinterProblem(functionNode));
        }
 
-       public static class NoConstructorReturnTypeLinterProblem extends 
CompilerProblem {
+       public static class NoConstructorReturnTypeLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Constructor 
'${functionName}' must not specify '${returnType}' return type";
 
                public NoConstructorReturnTypeLinterProblem(IFunctionNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoDuplicateObjectKeysRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/NoDuplicateObjectKeysRule.java
index 601af9f01..48befed34 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoDuplicateObjectKeysRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoDuplicateObjectKeysRule.java
@@ -39,6 +39,7 @@ import 
org.apache.royale.compiler.tree.as.IObjectLiteralValuePairNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that each key in an object literal is unique.
@@ -90,7 +91,7 @@ public class NoDuplicateObjectKeysRule extends LinterRule {
                }
        }
 
-       public static class NoDuplicateObjectKeysLinterProblem extends 
CompilerProblem {
+       public static class NoDuplicateObjectKeysLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Object literal 
contains duplicate key '${keyName}'";
 
                public NoDuplicateObjectKeysLinterProblem(IExpressionNode node, 
String keyName)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoDynamicClassRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/NoDynamicClassRule.java
index f56b11e11..cb2af9d34 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoDynamicClassRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoDynamicClassRule.java
@@ -31,6 +31,7 @@ import org.apache.royale.compiler.tree.as.IClassNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that symbols in package or class scopes have a namespace.
@@ -52,7 +53,7 @@ public class NoDynamicClassRule extends LinterRule {
                problems.add(new NoDynamicClassLinterProblem(classNode));
        }
 
-       public static class NoDynamicClassLinterProblem extends CompilerProblem 
{
+       public static class NoDynamicClassLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Class '${className}' 
must not be dynamic";
 
                public NoDynamicClassLinterProblem(IClassNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoIfBooleanLiteralRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/NoIfBooleanLiteralRule.java
index 457520f7d..dd171c174 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoIfBooleanLiteralRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoIfBooleanLiteralRule.java
@@ -33,6 +33,7 @@ import 
org.apache.royale.compiler.tree.as.ILiteralNode.LiteralType;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that a boolean literal value is not used as an 'if' condition.
@@ -59,7 +60,7 @@ public class NoIfBooleanLiteralRule extends LinterRule {
                problems.add(new NoIfBooleanLiteralLinterProblem(literalNode));
        }
 
-       public static class NoIfBooleanLiteralLinterProblem extends 
CompilerProblem {
+       public static class NoIfBooleanLiteralLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Condition is always 
'${value}'";
 
                public NoIfBooleanLiteralLinterProblem(ILiteralNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoLeadingZeroesRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/NoLeadingZeroesRule.java
index d5470755d..c860e990b 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoLeadingZeroesRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoLeadingZeroesRule.java
@@ -31,6 +31,7 @@ import org.apache.royale.compiler.tree.as.INumericLiteralNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for use of numeric literals with leading zeroes, except when it 
starts
@@ -65,7 +66,7 @@ public class NoLeadingZeroesRule extends LinterRule {
                problems.add(new NoLeadingZeroesLinterProblem(numberNode));
        }
 
-       public static class NoLeadingZeroesLinterProblem extends 
CompilerProblem {
+       public static class NoLeadingZeroesLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Must remove leading 
zeros from numeric literal '${value}'";
 
                public NoLeadingZeroesLinterProblem(INumericLiteralNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoSparseArrayRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/NoSparseArrayRule.java
index 3420b55c3..91238b65d 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/NoSparseArrayRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/NoSparseArrayRule.java
@@ -33,6 +33,7 @@ import 
org.apache.royale.compiler.tree.as.ILiteralNode.LiteralType;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that an array literal contains no empty slots (multiple repeating 
commas with no values).
@@ -64,7 +65,7 @@ public class NoSparseArrayRule extends LinterRule {
                }
        }
 
-       public static class NoSparseArrayLinterProblem extends CompilerProblem {
+       public static class NoSparseArrayLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Array literals must 
not be sparse";
 
                public NoSparseArrayLinterProblem(ILiteralContainerNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoStringEventNameRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/NoStringEventNameRule.java
index c4541bbf1..f3e5ec7e2 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoStringEventNameRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoStringEventNameRule.java
@@ -36,6 +36,7 @@ import 
org.apache.royale.compiler.tree.as.IMemberAccessExpressionNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that calls to event dispatcher methods don't use string values for
@@ -90,13 +91,13 @@ public class NoStringEventNameRule extends LinterRule {
                if (!LiteralType.STRING.equals(literalNode.getLiteralType())) {
                        return;
                }
-               problems.add(new NoStringEventNameProblem(functionCallNode, 
functionName));
+               problems.add(new 
NoStringEventNameLinterProblem(functionCallNode, functionName));
        }
 
-       public static class NoStringEventNameProblem extends CompilerProblem {
+       public static class NoStringEventNameLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Calls to 
'${functionName}' must use constant value instead of string literal for event 
name";
 
-               public NoStringEventNameProblem(IFunctionCallNode node, String 
functionName)
+               public NoStringEventNameLinterProblem(IFunctionCallNode node, 
String functionName)
                {
                        super(node.getArgumentNodes()[0]);
                        this.functionName = functionName;
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoThisInClosureRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/NoThisInClosureRule.java
index 38db15c16..fa9dfbd0c 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoThisInClosureRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoThisInClosureRule.java
@@ -34,6 +34,7 @@ import org.apache.royale.compiler.tree.as.IFunctionNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for use of the 'this' keyword in closures.
@@ -75,7 +76,7 @@ public class NoThisInClosureRule extends LinterRule {
                return null;
        }
 
-       public static class NoThisInClosureLinterProblem extends 
CompilerProblem {
+       public static class NoThisInClosureLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Closure must not 
contain 'this' keyword";
 
                public NoThisInClosureLinterProblem(IASToken token)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoTraceRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/NoTraceRule.java
index 39ee54e5d..daf7f5543 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/NoTraceRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/NoTraceRule.java
@@ -32,6 +32,7 @@ import 
org.apache.royale.compiler.tree.as.IMemberAccessExpressionNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check for calls to the 'trace()' function.
@@ -57,7 +58,7 @@ public class NoTraceRule extends LinterRule {
                problems.add(new NoTraceLinterProblem(functionCallNode));
        }
 
-       public static class NoTraceLinterProblem extends CompilerProblem {
+       public static class NoTraceLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Must not call trace() 
function";
 
                public NoTraceLinterProblem(IFunctionCallNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoVoidOperatorRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/NoVoidOperatorRule.java
index 76e7e7d13..5f4c71bdf 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoVoidOperatorRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoVoidOperatorRule.java
@@ -31,6 +31,7 @@ import org.apache.royale.compiler.tree.as.IUnaryOperatorNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for uses of 'void' operator. Using 'void' as return type is allowed.
@@ -53,7 +54,7 @@ public class NoVoidOperatorRule extends LinterRule {
                problems.add(new 
NoVoidOperatorLinterProblem(unaryOperatorNode));
        }
 
-       public static class NoVoidOperatorLinterProblem extends CompilerProblem 
{
+       public static class NoVoidOperatorLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Must not use 'void' 
operator";
 
                public NoVoidOperatorLinterProblem(IUnaryOperatorNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoWildcardImportRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/NoWildcardImportRule.java
index 62b479112..6ed33246b 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/NoWildcardImportRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/NoWildcardImportRule.java
@@ -30,6 +30,7 @@ import org.apache.royale.compiler.tree.as.IImportNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check for import statements that import the entire package.
@@ -51,7 +52,7 @@ public class NoWildcardImportRule extends LinterRule {
                problems.add(new NoWildcardImportLinterProblem(importNode));
        }
 
-       public static class NoWildcardImportLinterProblem extends 
CompilerProblem {
+       public static class NoWildcardImportLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Must not use wildcard 
import";
 
                public NoWildcardImportLinterProblem(IImportNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/NoWithRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/NoWithRule.java
index 388bd7a94..5301d3c1e 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/NoWithRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/NoWithRule.java
@@ -27,6 +27,8 @@ import org.apache.royale.compiler.parsing.IASToken;
 import org.apache.royale.compiler.problems.CompilerProblem;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.TokenVisitor;
+import org.apache.royale.linter.problems.ILinterProblem;
+import org.apache.royale.linter.rules.NoWithRule.NoWithLinterProblem;
 
 /**
  * Checks for uses of 'with(x)'.
@@ -41,7 +43,7 @@ public class NoWithRule extends LinterRule {
                return result;
        }
 
-       public static class NoWithLinterProblem extends CompilerProblem {
+       public static class NoWithLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Must not use 'with' 
statement";
 
                public NoWithLinterProblem(IASToken token)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/OverrideContainsOnlySuperCallRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/OverrideContainsOnlySuperCallRule.java
index 2138aed72..1b0d9a13a 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/OverrideContainsOnlySuperCallRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/OverrideContainsOnlySuperCallRule.java
@@ -39,6 +39,7 @@ import org.apache.royale.compiler.tree.as.IScopedNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that an overridden function contains more than a call to super.
@@ -89,7 +90,7 @@ public class OverrideContainsOnlySuperCallRule extends 
LinterRule {
                problems.add(new 
OverrideContainsOnlySuperCallLinterProblem(functionNode));
        }
 
-       public static class OverrideContainsOnlySuperCallLinterProblem extends 
CompilerProblem {
+       public static class OverrideContainsOnlySuperCallLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Method override 
'${functionName}' must contain more than call to 'super.${functionName}'";
 
                public OverrideContainsOnlySuperCallLinterProblem(IFunctionNode 
node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/PackageNameRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/PackageNameRule.java
index de50e9a4d..9aaf7a8dd 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/PackageNameRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/PackageNameRule.java
@@ -32,6 +32,7 @@ import org.apache.royale.compiler.tree.as.IPackageNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that package names match a specific pattern.
@@ -66,7 +67,7 @@ public class PackageNameRule extends LinterRule {
                problems.add(new PackageNameLinterProblem(packageNode, 
thePattern));
        }
 
-       public static class PackageNameLinterProblem extends CompilerProblem {
+       public static class PackageNameLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Package name 
'${packageName}' does not match the pattern '${pattern}'";
 
                public PackageNameLinterProblem(IPackageNode node, Pattern 
pattern)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/StaticConstantsRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/StaticConstantsRule.java
index 59ddba9a9..bab41c9c6 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/StaticConstantsRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/StaticConstantsRule.java
@@ -34,6 +34,7 @@ import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Checks for constants that are declared on a class, but are not static.
@@ -63,7 +64,7 @@ public class StaticConstantsRule extends LinterRule {
                problems.add(new StaticConstantsLinterProblem(variableNode));
        }
 
-       public static class StaticConstantsLinterProblem extends 
CompilerProblem {
+       public static class StaticConstantsLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Constant must be 
static";
 
                public StaticConstantsLinterProblem(IVariableNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/StrictEqualityRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/StrictEqualityRule.java
index 457617cbf..4ba214e8a 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/StrictEqualityRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/StrictEqualityRule.java
@@ -28,6 +28,8 @@ import org.apache.royale.compiler.problems.CompilerProblem;
 import org.apache.royale.compiler.tree.as.IOperatorNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.TokenVisitor;
+import org.apache.royale.linter.problems.ILinterProblem;
+import 
org.apache.royale.linter.rules.StrictEqualityRule.StrictEqualityLinterProblem;
 
 /**
  * Checks for uses of the '==' and '!='' operators instead of the stricter 
'==='
@@ -46,7 +48,7 @@ public class StrictEqualityRule extends LinterRule {
                return result;
        }
 
-       public static class StrictEqualityLinterProblem extends CompilerProblem 
{
+       public static class StrictEqualityLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Must use 
${requiredTokenText} instead of ${tokenText}";
 
                public StrictEqualityLinterProblem(IASToken token)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/SwitchWithoutDefaultRule.java
 
b/linter/src/main/java/org/apache/royale/linter/rules/SwitchWithoutDefaultRule.java
index 3a9a7b667..fa30f1546 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/SwitchWithoutDefaultRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/SwitchWithoutDefaultRule.java
@@ -31,6 +31,7 @@ import org.apache.royale.compiler.tree.as.ITerminalNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check for 'switch' statements that are missing a 'default' clause.
@@ -53,7 +54,7 @@ public class SwitchWithoutDefaultRule extends LinterRule {
                problems.add(new SwitchWithoutDefaultLinterProblem(switchNode));
        }
 
-       public static class SwitchWithoutDefaultLinterProblem extends 
CompilerProblem {
+       public static class SwitchWithoutDefaultLinterProblem extends 
CompilerProblem implements ILinterProblem {
                public static final String DESCRIPTION = "Missing 'default' 
clause in 'switch' statement";
 
                public SwitchWithoutDefaultLinterProblem(ISwitchNode node)
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/UnsafeNegationRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/UnsafeNegationRule.java
index ab766f584..9f74ad101 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/UnsafeNegationRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/UnsafeNegationRule.java
@@ -34,6 +34,7 @@ import org.apache.royale.compiler.tree.as.IUnaryOperatorNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that the left side of in, is, and instanceof is not negated unsafely.
@@ -67,7 +68,7 @@ public class UnsafeNegationRule extends LinterRule {
                problems.add(new 
UnsafeNegationLinterProblem(binaryOperatorNode));
        }
 
-       public static class UnsafeNegationLinterProblem extends CompilerProblem 
{
+       public static class UnsafeNegationLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Must not use negation 
on left side of in, is, and instanceof operators. Did you mean to use 
parentheses?";
 
                public UnsafeNegationLinterProblem(IASNode node) {
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/ValidTypeofRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/ValidTypeofRule.java
index 0e3821597..1eb9eeb89 100644
--- a/linter/src/main/java/org/apache/royale/linter/rules/ValidTypeofRule.java
+++ b/linter/src/main/java/org/apache/royale/linter/rules/ValidTypeofRule.java
@@ -38,6 +38,7 @@ import org.apache.royale.compiler.tree.as.IUnaryOperatorNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that an array literal contains no empty slots (multiple repeating
@@ -97,7 +98,7 @@ public class ValidTypeofRule extends LinterRule {
                problems.add(new ValidTypeofLinterProblem(stringLiteral));
        }
 
-       public static class ValidTypeofLinterProblem extends CompilerProblem {
+       public static class ValidTypeofLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "String '${value}' is 
not a valid result for typeof operator";
 
                public ValidTypeofLinterProblem(ILiteralNode node) {
diff --git 
a/linter/src/main/java/org/apache/royale/linter/rules/VariablesOnTopRule.java 
b/linter/src/main/java/org/apache/royale/linter/rules/VariablesOnTopRule.java
index a6ae31f94..7ef51d642 100644
--- 
a/linter/src/main/java/org/apache/royale/linter/rules/VariablesOnTopRule.java
+++ 
b/linter/src/main/java/org/apache/royale/linter/rules/VariablesOnTopRule.java
@@ -33,6 +33,7 @@ import org.apache.royale.compiler.tree.as.IVariableNode;
 import org.apache.royale.linter.LinterRule;
 import org.apache.royale.linter.NodeVisitor;
 import org.apache.royale.linter.TokenQuery;
+import org.apache.royale.linter.problems.ILinterProblem;
 
 /**
  * Check that variables are always declared at the top of a function.
@@ -75,7 +76,7 @@ public class VariablesOnTopRule extends LinterRule {
                return afterNonVariable;
        }
 
-       public static class VariablesOnTopLinterProblem extends CompilerProblem 
{
+       public static class VariablesOnTopLinterProblem extends CompilerProblem 
implements ILinterProblem {
                public static final String DESCRIPTION = "Variable name 
'${varName}' must be declared at the top of this function";
 
                public VariablesOnTopLinterProblem(IVariableNode node)

Reply via email to