Update parser of fixed violations.

This commit is contained in:
Kui LIU
2017-09-14 15:16:51 +02:00
parent 211d9e990b
commit 80c6108971
4 changed files with 64 additions and 34 deletions
@@ -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<HierarchicalActionSet> 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<Violation> violations = readPositionsAndAlarmTypes();
List<DiffEntryHunk> 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<Violation> violations = readViolations(revFile.getName());
if (violations.size() == 0) {
this.resultType = 3;
return;
}
// List<DiffEntryHunk> 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;
}
}
@@ -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<Violation> 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<HierarchicalActionSet> sorter = new ListSorter<>(actionSets);
actionSets = sorter.sortAscending();
return actionSets;
}
}
protected List<Violation> readPositionsAndAlarmTypes() {
protected List<Violation> readViolations(String fileName) {
List<Violation> 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<Violation> uselessViolations) {
this.uselessViolations = uselessViolations;
}
}
@@ -39,7 +39,7 @@ public class FixedViolationSingleStatementParser extends FixedViolationParser {
}
// Read the positions of checked violations
List<Violation> violations = readPositionsAndAlarmTypes();
List<Violation> violations = readViolations(revFile.getName());
for (HierarchicalActionSet actionSet : actionSets) {
// position of buggy statements
int startPosition = 0;
@@ -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());