diff --git a/src/main/java/com/cflint/CFLint.java b/src/main/java/com/cflint/CFLint.java index 63b58d6ed..01665db1e 100644 --- a/src/main/java/com/cflint/CFLint.java +++ b/src/main/java/com/cflint/CFLint.java @@ -21,14 +21,13 @@ import org.antlr.runtime.RecognitionException; import org.antlr.v4.runtime.Parser; import org.antlr.v4.runtime.Recognizer; +import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.atn.ATNConfigSet; import org.antlr.v4.runtime.dfa.DFA; import cfml.CFSCRIPTLexer; import cfml.parsing.CFMLParser; import cfml.parsing.CFMLSource; -import cfml.parsing.cfml.ErrorEvent; -import cfml.parsing.cfml.IErrorObserver; import cfml.parsing.cfscript.CFAssignmentExpression; import cfml.parsing.cfscript.CFBinaryExpression; import cfml.parsing.cfscript.CFExpression; @@ -157,6 +156,7 @@ public CFLint(ConfigRuntime configuration,final CFLintScanner... bugsScanners) { allowedExtensions.add(cfcExtension); allowedExtensions.add(cfmExtenstion); } + cfmlParser.setErrorReporter(this); } public void scan(final String folder) { @@ -775,7 +775,13 @@ public void syntaxError(Recognizer recognizer, Object offendingSymbol, int line, int charPositionInLine, String msg, org.antlr.v4.runtime.RecognitionException e) { final String file = currentFile == null ? "" : currentFile + "\r\n"; - //System.err.println(file + "----syntax error ---" + line + " : " + charPositionInLine); + String expression=null; + if(offendingSymbol instanceof Token){ + expression = ((Token) offendingSymbol).getText(); + if(expression.length() > 50){ + expression=expression.substring(1,40) + "..."; + } + } if(!currentElement.isEmpty()){ Element elem = currentElement.peek(); if(line == 1){ @@ -785,7 +791,17 @@ public void syntaxError(Recognizer recognizer, line = elem.getSource().getRow(elem.getBegin()) + line - 1; } } - fireCFLintException(e,PARSE_ERROR,currentFile,line,charPositionInLine,"",offendingSymbol==null?"":offendingSymbol.toString()); + if(recognizer instanceof Parser && ((Parser)recognizer).getExpectedTokens().contains(65)){ + bugs.add(new BugInfo.BugInfoBuilder().setMessageCode("MISSING_SEMI") + .setFilename(file).setMessage("End of statement(;) expected instead of " + expression).setSeverity("ERROR") + .setExpression(expression) + .setLine(line).setColumn(charPositionInLine) + .build()); + + }else{ + + fireCFLintException(e,PARSE_ERROR,file,line,charPositionInLine,"",msg); + } } public void reportAmbiguity(Parser recognizer, DFA dfa, int startIndex, int stopIndex, boolean exact, java.util.BitSet ambigAlts, diff --git a/src/main/java/com/cflint/plugins/Context.java b/src/main/java/com/cflint/plugins/Context.java index 5381c1a82..53652a68b 100644 --- a/src/main/java/com/cflint/plugins/Context.java +++ b/src/main/java/com/cflint/plugins/Context.java @@ -144,7 +144,10 @@ public Context subContext(final Element elem){ } public int startLine() { - return element.getSource().getRow(element.getBegin()); + if(element != null && element.getSource() !=null) + return element.getSource().getRow(element.getBegin()); + else + return 0; } protected String componentFromFile(String filename) { diff --git a/src/test/java/com/cflint/TestCFBugs_SimpleComplexity.java b/src/test/java/com/cflint/TestCFBugs_SimpleComplexity.java index a4ba37c96..7470cb950 100644 --- a/src/test/java/com/cflint/TestCFBugs_SimpleComplexity.java +++ b/src/test/java/com/cflint/TestCFBugs_SimpleComplexity.java @@ -142,7 +142,7 @@ public void testComplexScriptBased() throws ParseException, IOException { + "}\r\n" + "}"; cfBugs.process(cfcSrc, "test"); - final List result = cfBugs.getBugs().getBugList().values().iterator().next(); + final List result = cfBugs.getBugs().getBugList().get("FUNCTION_TOO_COMPLEX"); assertEquals(1, result.size()); assertEquals("FUNCTION_TOO_COMPLEX", result.get(0).getMessageCode()); assertEquals(2, result.get(0).getLine()); diff --git a/src/test/java/com/cflint/TestComponentLengthChecker.java b/src/test/java/com/cflint/TestComponentLengthChecker.java index 62e47671f..8c94f6fe5 100644 --- a/src/test/java/com/cflint/TestComponentLengthChecker.java +++ b/src/test/java/com/cflint/TestComponentLengthChecker.java @@ -671,7 +671,7 @@ public void testBadFunction() throws ParseException, IOException{ "}\r\n" + "}"; cfBugs.process(cfcSrc,"test"); - final List result = cfBugs.getBugs().getBugList().values().iterator().next(); + final List result = cfBugs.getBugs().getBugList().get("EXCESSIVE_COMPONENT_LENGTH"); assertEquals(1, result.size()); assertEquals("EXCESSIVE_COMPONENT_LENGTH", result.get(0).getMessageCode()); } diff --git a/src/test/java/com/cflint/TestParsingErrors.java b/src/test/java/com/cflint/TestParsingErrors.java new file mode 100644 index 000000000..c388376a8 --- /dev/null +++ b/src/test/java/com/cflint/TestParsingErrors.java @@ -0,0 +1,66 @@ +package com.cflint; + +import static org.junit.Assert.assertEquals; + +import java.io.IOException; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; + +import cfml.parsing.reporting.ParseException; + +import com.cflint.config.ConfigRuntime; +import com.cflint.config.CFLintPluginInfo.PluginInfoRule; +import com.cflint.config.CFLintPluginInfo.PluginInfoRule.PluginMessage; +import com.cflint.plugins.core.VarScoper; + +public class TestParsingErrors { + + private CFLint cfBugs; + + @Before + public void setUp() { + ConfigRuntime conf = new ConfigRuntime(); + PluginInfoRule pluginRule = new PluginInfoRule(); + pluginRule.setName("VarScoper"); + conf.getRules().add(pluginRule); + PluginMessage pluginMessage = new PluginMessage("MISSING_VAR"); + pluginMessage.setSeverity("ERROR"); + pluginMessage + .setMessageText("Variable ${variable} is not declared with a var statement."); + pluginRule.getMessages().add(pluginMessage); + + cfBugs = new CFLint(conf, new VarScoper()); + } + + @Test + public void testMissingSemiColon() throws ParseException, IOException{ + final String cfcSrc = "\r\n" + + "\r\n" + + " \r\n" + + " var xx = 123\r\n" + + " yy = 123;\r\n" + + " \r\n" + + "\r\n" + + ""; + cfBugs.process(cfcSrc,"test"); + + assertEquals(2,cfBugs.getBugs().getFlatBugList().size()); + System.out.println(cfBugs.getBugs().getFlatBugList()); + final List result = cfBugs.getBugs().getBugList().get("MISSING_SEMI"); + assertEquals(1,result.size()); + assertEquals("MISSING_SEMI",result.get(0).getMessageCode()); + assertEquals(5,result.get(0).getLine()); + assertEquals("ERROR",result.get(0).getSeverity()); + assertEquals("End of statement(;) expected instead of yy",result.get(0).getMessage()); + + final List result2 = cfBugs.getBugs().getBugList().get("MISSING_VAR"); + assertEquals(1,result2.size()); + assertEquals("MISSING_VAR",result2.get(0).getMessageCode()); + assertEquals("yy",result2.get(0).getVariable()); + assertEquals(5,result2.get(0).getLine()); + assertEquals("ERROR",result2.get(0).getSeverity()); + assertEquals("Variable yy is not declared with a var statement.",result2.get(0).getMessage()); + } +}