Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Betterparsingerr #110

Merged
merged 11 commits into from
Oct 21, 2015
24 changes: 20 additions & 4 deletions src/main/java/com/cflint/CFLint.java
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand Down Expand Up @@ -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){
Expand All @@ -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,
Expand Down
5 changes: 4 additions & 1 deletion src/main/java/com/cflint/plugins/Context.java
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/com/cflint/TestCFBugs_SimpleComplexity.java
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ public void testComplexScriptBased() throws ParseException, IOException {
+ "}\r\n"
+ "}";
cfBugs.process(cfcSrc, "test");
final List<BugInfo> result = cfBugs.getBugs().getBugList().values().iterator().next();
final List<BugInfo> 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());
Expand Down
2 changes: 1 addition & 1 deletion src/test/java/com/cflint/TestComponentLengthChecker.java
Original file line number Diff line number Diff line change
Expand Up @@ -671,7 +671,7 @@ public void testBadFunction() throws ParseException, IOException{
"}\r\n" +
"}";
cfBugs.process(cfcSrc,"test");
final List<BugInfo> result = cfBugs.getBugs().getBugList().values().iterator().next();
final List<BugInfo> result = cfBugs.getBugs().getBugList().get("EXCESSIVE_COMPONENT_LENGTH");
assertEquals(1, result.size());
assertEquals("EXCESSIVE_COMPONENT_LENGTH", result.get(0).getMessageCode());
}
Expand Down
66 changes: 66 additions & 0 deletions src/test/java/com/cflint/TestParsingErrors.java
Original file line number Diff line number Diff line change
@@ -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 = "<cfcomponent>\r\n" +
"<cffunction name=\"test\">\r\n" +
" <cfscript>\r\n" +
" var xx = 123\r\n" +
" yy = 123;\r\n" +
" </cfscript>\r\n" +
"</cffunction>\r\n" +
"</cfcomponent>";
cfBugs.process(cfcSrc,"test");

assertEquals(2,cfBugs.getBugs().getFlatBugList().size());
System.out.println(cfBugs.getBugs().getFlatBugList());
final List<BugInfo> 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<BugInfo> 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());
}
}