diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationHunkParser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationHunkParser.java index 0552abd..d546377 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationHunkParser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationHunkParser.java @@ -7,12 +7,13 @@ import java.io.StringReader; import java.util.ArrayList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.github.gumtreediff.tree.ITree; import edu.lu.uni.serval.FixPatternParser.Tokenizer; import edu.lu.uni.serval.config.Configuration; -import edu.lu.uni.serval.diffentry.DiffEntryHunk; -import edu.lu.uni.serval.diffentry.DiffEntryReader; import edu.lu.uni.serval.gumtree.GumTreeGenerator; import edu.lu.uni.serval.gumtree.GumTreeGenerator.GumTreeType; import edu.lu.uni.serval.gumtree.regroup.HierarchicalActionSet; @@ -27,18 +28,23 @@ import edu.lu.uni.serval.gumtree.regroup.SimplifyTree; * */ public class FixedViolationHunkParser extends FixedViolationParser { + + @SuppressWarnings("unused") + private static Logger log = LoggerFactory.getLogger(FixedViolationHunkParser.class); public String testingInfo = ""; /* * ResultType: * 0: normal GumTree results. * 1: null GumTree result. * 2: No source code changes. + * 3: useless violations */ public int resultType = 0; public int nullMappingGumTreeResult = 0; public int pureDeletions = 0; public int largeHunk = 0; public int nullSourceCode = 0; + public int nullMatchedDiffEntry = 0; public FixedViolationHunkParser() { } @@ -50,7 +56,7 @@ public class FixedViolationHunkParser extends FixedViolationParser { @Override public void parseFixPatterns(File prevFile, File revFile, File diffentryFile) { // GumTree results - // TODO remove the modification of variable names or not? + // TODO remove the modification of variable names or not? FIXME List actionSets = parseChangedSourceCodeWithGumTree2(prevFile, revFile); // only remove non-statement source code, eg. method declaration if (actionSets == null) { @@ -58,32 +64,38 @@ public class FixedViolationHunkParser extends FixedViolationParser { } else if (actionSets.size() == 0) { this.resultType = 2; } else { - List violations = readPositionsAndAlarmTypes(); - - List diffentryHunks1 = new DiffEntryReader().readHunks2(diffentryFile); - // Select hunks by positions of violations. - for (Violation violation : violations) { - int violationStartLineNum = violation.getStartLineNum(); - int violationEndLineNum = violation.getEndLineNum(); - for (int index = 0, hunkListSize = diffentryHunks1.size(); index < hunkListSize; index ++) { - DiffEntryHunk hunk = diffentryHunks1.get(index); - int startLine = hunk.getBugLineStartNum(); - int range = hunk.getBugRange(); - if (violationStartLineNum > startLine + range - 1) continue; - if (violationEndLineNum < startLine) break; - - if (violation.getBugStartLineNum() == 0) { - violation.setBugStartLineNum(startLine); - violation.setFixStartLineNum(hunk.getFixLineStartNum()); - } - violation.setBugEndLineNum(startLine + range - 1); - violation.setFixEndLineNum(hunk.getFixLineStartNum() + hunk.getFixRange() - 1); - violation.getHunks().add(hunk); - } - if (violation.getBugStartLineNum() == 0 && violation.getBugEndLineNum() == 0) { - System.err.println("WRONG"); - } + List violations = readViolations(revFile.getName()); + if (violations.size() == 0) { + this.resultType = 3; + return; } +// List diffentryHunks1 = new DiffEntryReader().readHunks2(diffentryFile); +// // Select hunks by positions of violations. +// for (Violation violation : violations) { +// int violationStartLineNum = violation.getStartLineNum(); +// int violationEndLineNum = violation.getEndLineNum(); +// for (int index = 0, hunkListSize = diffentryHunks1.size(); index < hunkListSize; index ++) { +// DiffEntryHunk hunk = diffentryHunks1.get(index); +// int startLine = hunk.getBugLineStartNum(); +// int range = hunk.getBugRange(); +// if (violationStartLineNum > startLine + range - 1) continue; +// if (violationEndLineNum < startLine) break; +// +// if (violation.getBugStartLineNum() == 0) { +// violation.setBugStartLineNum(startLine); +// violation.setFixStartLineNum(hunk.getFixLineStartNum()); +// } +// violation.setBugEndLineNum(startLine + range - 1); +// violation.setFixEndLineNum(hunk.getFixLineStartNum() + hunk.getFixRange() - 1); +// violation.getHunks().add(hunk); +// } +// if (violation.getBugStartLineNum() == 0 && violation.getBugEndLineNum() == 0) { +// // This fixed violation cannot be matched with a DiffEntry, it is difficult to identify related source code change for it. +// nullMatchedDiffEntry ++; +// log.warn("#Null-DiffEntry: " + revFile.getName().replace("#", "/") + " : " +violation.getStartLineNum() + " : " + +// violation.getBugEndLineNum() + " : " + violation.getAlarmType()); +// } +// } //Filter out the modify actions, which are not in the DiffEntry hunks. HunkActionFilter hunkFilter = new HunkActionFilter(); @@ -233,8 +245,10 @@ public class FixedViolationHunkParser extends FixedViolationParser { String alarmType = violation.getAlarmType(); // String patchPosition = "\n" + revFile.getName() + "Position: " + violation.getStartLineNum() + " --> " + violation.getEndLineNum() + "\n@@ -" + bugStartLine + ", " + bugEndLine + " +" + fixStartLine + ", " + fixEndLine + "@@\n"; +// String patchPosition = "\n" + "Position: " + violation.getStartLineNum() + " --> " + violation.getEndLineNum() + "\n@@ -" + bugStartLine + ", " + bugEndLine + " +" + fixStartLine + ", " + fixEndLine + "@@\n"; +// String info = Configuration.PATCH_SIGNAL + "\nAlarm Type :" + violation.getAlarmType() + "\n" + patchPosition + patchSourceCode + "\nAST Diff###:\n" + getAstEditScripts(hunkActionSets, bugEndPosition, fixEndPosition) + "\n"; String patchPosition = "\n" + "Position: " + violation.getStartLineNum() + " --> " + violation.getEndLineNum() + "\n@@ -" + bugStartLine + ", " + bugEndLine + " +" + fixStartLine + ", " + fixEndLine + "@@\n"; - String info = Configuration.PATCH_SIGNAL + "\nAlarm Type :" + violation.getAlarmType() + "\n" + patchPosition + patchSourceCode + "\nAST Diff###:\n" + getAstEditScripts(hunkActionSets, bugEndPosition, fixEndPosition) + "\n"; + String info = Configuration.PATCH_SIGNAL + "\nAlarm Type :" + violation.getAlarmType() + "\n" + patchSourceCode + "\n" + patchPosition + revFile.getName() + "\n"; if (noUpdate(editScriptTokens)) { if (!"SE_NO_SERIALVERSIONID".equals(alarmType)) { @@ -352,5 +366,5 @@ public class FixedViolationHunkParser extends FixedViolationParser { } return true; } - + } diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationParser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationParser.java index 4791d18..a773d68 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationParser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationParser.java @@ -14,6 +14,7 @@ import edu.lu.uni.serval.gumtree.GumTreeComparer; import edu.lu.uni.serval.gumtree.regroup.HierarchicalActionSet; import edu.lu.uni.serval.gumtree.regroup.HierarchicalRegrouper; import edu.lu.uni.serval.utils.FileHelper; +import edu.lu.uni.serval.utils.ListSorter; /** * Parse fix patterns with GumTree. @@ -25,6 +26,7 @@ public class FixedViolationParser extends Parser { private File positionFile = null; protected String alarmTypes = ""; + protected List uselessViolations; public void setPositionFile(File positionFile) { this.positionFile = positionFile; @@ -59,11 +61,18 @@ public class FixedViolationParser extends Parser { } } + // Filter out modified actions of changing method names, method parameters, variable names and field names in declaration part. + // TODO: variable effects range, sub-actions are these kinds of modification? +// actionSets.addAll(new ActionFilter().filterOutUselessActions(allActionSets)); + + ListSorter sorter = new ListSorter<>(actionSets); + actionSets = sorter.sortAscending(); + return actionSets; } } - protected List readPositionsAndAlarmTypes() { + protected List readViolations(String fileName) { List violations = new ArrayList<>(); String fileContent = FileHelper.readFile(positionFile); BufferedReader reader = null; @@ -77,6 +86,10 @@ public class FixedViolationParser extends Parser { String alarmType = positionStr[0]; Violation violation = new Violation(startLine, endLine, alarmType); + violation.setFileName(fileName.replaceAll("#", "/")); + if (uselessViolations.contains(violation)) { + continue; + } violations.add(violation); } } catch (IOException e) { @@ -138,5 +151,8 @@ public class FixedViolationParser extends Parser { public String getAlarmTypes() { return alarmTypes; } - + + public void setUselessViolations(List uselessViolations) { + this.uselessViolations = uselessViolations; + } } diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationSingleStatementParser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationSingleStatementParser.java index 7f3365a..df0f92c 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationSingleStatementParser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationSingleStatementParser.java @@ -39,7 +39,7 @@ public class FixedViolationSingleStatementParser extends FixedViolationParser { } // Read the positions of checked violations - List violations = readPositionsAndAlarmTypes(); + List violations = readViolations(revFile.getName()); for (HierarchicalActionSet actionSet : actionSets) { // position of buggy statements int startPosition = 0; diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/TestHunkParser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/TestHunkParser.java index 6db9f80..a0aa1f8 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/TestHunkParser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/TestHunkParser.java @@ -51,7 +51,7 @@ public class TestHunkParser { StringBuilder alarmTypes = new StringBuilder(); int a = 0; - int counter = 0; +// int counter = 0; for (MessageFile msgFile : msgFiles) { FixedViolationHunkParser parser = new FixedViolationHunkParser(); parser.setPositionFile(msgFile.getPositionFile());