This commit is contained in:
Kui LIU
2017-08-13 19:20:26 +02:00
parent 7d86732c7f
commit 3b8592f56a
6 changed files with 131 additions and 98 deletions
@@ -90,15 +90,6 @@ public abstract class Parser implements ParserInterface {
return firstAndLastMoveActions;
}
protected String readActionSet(HierarchicalActionSet actionSet, String line) {
String str = line + actionSet.getActionString() + "\n";
List<HierarchicalActionSet> subActions = actionSet.getSubActions();
for (HierarchicalActionSet subAction : subActions) {
str += readActionSet(subAction, line + "---");
}
return str;
}
protected String getSemiSourceCodeEditScripts(HierarchicalActionSet actionSet) {
// TODO Auto-generated method stub
return null;
@@ -131,7 +122,7 @@ public abstract class Parser implements ParserInterface {
* @param actionSet
* @return
*/
protected String getASTEditScripts(HierarchicalActionSet actionSet) {
protected String getASTEditScriptsBreadthFirst(HierarchicalActionSet actionSet) {
String editScript = "";
List<HierarchicalActionSet> actionSets = new ArrayList<>();
@@ -144,23 +135,7 @@ public abstract class Parser implements ParserInterface {
int index = actionStr.indexOf("@@");
String singleEdit = actionStr.substring(0, index).replace(" ", "");
if (singleEdit.endsWith("SimpleName")) {
actionStr = actionStr.substring(index + 2);
if (actionStr.startsWith("MethodName")) {
singleEdit = singleEdit.replace("SimpleName", "MethodName");
} else {
if (actionStr.startsWith("Name")) {
char c = actionStr.charAt(5);
if (Character.isUpperCase(c)) {
singleEdit = singleEdit.replace("SimpleName", "Name");
} else {
singleEdit = singleEdit.replace("SimpleName", "Variable");
}
} else {
singleEdit = singleEdit.replace("SimpleName", "Variable");
}
}
}
singleEdit = handleSimpleNameNode(singleEdit, actionStr, index);
editScript += singleEdit + " ";
}
@@ -170,6 +145,49 @@ public abstract class Parser implements ParserInterface {
return editScript;
}
private String handleSimpleNameNode(String singleEdit, String actionStr, int index) {
if (singleEdit.endsWith("SimpleName")) {
actionStr = actionStr.substring(index + 2);
if (actionStr.startsWith("MethodName")) {
singleEdit = singleEdit.replace("SimpleName", "MethodName");
} else {
if (actionStr.startsWith("Name")) {
char c = actionStr.charAt(5);
if (Character.isUpperCase(c)) {
singleEdit = singleEdit.replace("SimpleName", "Name");
} else {
singleEdit = singleEdit.replace("SimpleName", "Variable");
}
} else {
singleEdit = singleEdit.replace("SimpleName", "Variable");
}
}
}
return singleEdit;
}
/**
* Get the AST node based edit script of patches in terms of deep first.
*
* @param actionSet
* @return
*/
protected String getASTEditScriptsDeepFirst(HierarchicalActionSet actionSet) {
String editScript = "";
String actionStr = actionSet.getActionString();
int index = actionStr.indexOf("@@");
String singleEdit = actionStr.substring(0, index).replace(" ", "");
singleEdit = handleSimpleNameNode(singleEdit, actionStr, index);
editScript = singleEdit + " ";
List<HierarchicalActionSet> subActionSets = actionSet.getSubActions();;
for (HierarchicalActionSet subActionSet : subActionSets) {
editScript += getASTEditScriptsDeepFirst(subActionSet);
}
return editScript;
}
/**
*
@@ -180,16 +198,16 @@ public abstract class Parser implements ParserInterface {
* @param fixEndLine
* @return
*/
protected String getASTEditScripts(List<HierarchicalActionSet> hunkActionSets, int bugEndPosition, int fixEndPosition) {
protected String getASTEditScriptsBreadthFirst(List<HierarchicalActionSet> hunkActionSets, int bugEndPosition, int fixEndPosition) {
String editScript = "";
for (HierarchicalActionSet hunkActionSet : hunkActionSets) {
editScript += getASTEditScripts(hunkActionSet, bugEndPosition, fixEndPosition);
editScript += getASTEditScriptsBreadthFirst(hunkActionSet, bugEndPosition, fixEndPosition);
}
return editScript;
}
private String getASTEditScripts(HierarchicalActionSet hunkActionSet, int bugEndPosition, int fixEndPosition) {
private String getASTEditScriptsBreadthFirst(HierarchicalActionSet hunkActionSet, int bugEndPosition, int fixEndPosition) {
String editScript = "";
List<HierarchicalActionSet> actionSets = new ArrayList<>();
actionSets.add(hunkActionSet);
@@ -197,37 +215,16 @@ public abstract class Parser implements ParserInterface {
List<HierarchicalActionSet> subSets = new ArrayList<>();
for (HierarchicalActionSet set : actionSets) {
int position = set.getAction().getPosition();
if (set.getActionString().startsWith("INS")) {
if (position > fixEndPosition) {
continue;
}
} else if (!set.getActionString().startsWith("MOV") && position > bugEndPosition) {
String actionStr = set.getActionString();
if (isOutofPosition(actionStr, position, bugEndPosition, fixEndPosition)) {
continue;
}
subSets.addAll(set.getSubActions());
String actionStr = set.getActionString();
int index = actionStr.indexOf("@@");
String singleEdit = actionStr.substring(0, index).replace(" ", "");
if (singleEdit.endsWith("SimpleName")) {
actionStr = actionStr.substring(index + 2);
if (actionStr.startsWith("MethodName")) {
singleEdit = singleEdit.replace("SimpleName", "MethodName");
} else {
if (actionStr.startsWith("Name")) {
char c = actionStr.charAt(5);
if (Character.isUpperCase(c)) {
singleEdit = singleEdit.replace("SimpleName", "Name");
} else {
singleEdit = singleEdit.replace("SimpleName", "Variable");
}
} else {
singleEdit = singleEdit.replace("SimpleName", "Variable");
}
}
}
singleEdit = handleSimpleNameNode(singleEdit, actionStr, index);
editScript += singleEdit + " ";
}
@@ -236,7 +233,80 @@ public abstract class Parser implements ParserInterface {
}
return editScript;
}
private boolean isOutofPosition(String actionStr, int actionPosition, int bugEndPosition, int fixEndPosition) {
if (actionStr.startsWith("INS")) {
if (actionPosition > fixEndPosition) {
return true;
}
} else if (!actionStr.startsWith("MOV") && actionPosition > bugEndPosition) {
return true;
}
return false;
}
protected String getASTEditScriptsDeepFirst(List<HierarchicalActionSet> hunkActionSets, int bugEndPosition, int fixEndPosition) {
String editScript = "";
for (HierarchicalActionSet hunkActionSet : hunkActionSets) {
editScript += getASTEditScriptsDeepFirst(hunkActionSet, bugEndPosition, fixEndPosition);
}
return editScript;
}
private String getASTEditScriptsDeepFirst(HierarchicalActionSet actionSet, int bugEndPosition, int fixEndPosition) {
String editScripts = "";
String actionStr = actionSet.getActionString();
int index = actionStr.indexOf("@@");
String singleEdit = actionStr.substring(0, index).replace(" ", "");
singleEdit = handleSimpleNameNode(singleEdit, actionStr, index);
editScripts += singleEdit + " ";
for (HierarchicalActionSet subActionSet : actionSet.getSubActions()) {
int position = subActionSet.getAction().getPosition();
actionStr = subActionSet.getActionString();
if (isOutofPosition(actionStr, position, bugEndPosition, fixEndPosition)) {
continue;
}
editScripts += getASTEditScriptsDeepFirst(subActionSet, bugEndPosition, fixEndPosition);
}
return editScripts;
}
protected String getAstEditScripts(List<HierarchicalActionSet> actionSets, int bugEndLine, int fixEndLine) {
String editScripts = "";
for (HierarchicalActionSet actionSet : actionSets) {
editScripts += getActionString(actionSet, bugEndLine, fixEndLine, "");
}
return editScripts;
}
private String getActionString(HierarchicalActionSet actionSet, int bugEndPosition, int fixEndPosition, String startStr) {
String editScripts = "";
String actionStr = actionSet.getActionString();
int index = actionStr.indexOf("@@");
String singleEdit = actionStr.substring(0, index);
singleEdit = handleSimpleNameNode(singleEdit, actionStr, index);
editScripts += startStr + singleEdit + "\n";
for (HierarchicalActionSet subActionSet : actionSet.getSubActions()) {
int position = subActionSet.getAction().getPosition();
actionStr = subActionSet.getActionString();
if (isOutofPosition(actionStr, position, bugEndPosition, fixEndPosition)) {
continue;
}
editScripts += getActionString(subActionSet, bugEndPosition, fixEndPosition, startStr + "---");
}
return editScripts;
}
protected void clearITree(HierarchicalActionSet actionSet) {
actionSet.getAction().setNode(null);
for (HierarchicalActionSet subActionSet : actionSet.getSubActions()) {
@@ -69,7 +69,7 @@ public class CommitPatchHunkParser extends CommitPatchParser {
* Edit scripts will be used to mine common fix patterns.
*/
// 1. First level: AST node type.
astEditScripts += getASTEditScripts(hunkActionSet);
astEditScripts += getASTEditScriptsBreadthFirst(hunkActionSet);
// 2. source code: raw tokens
// 3. abstract identifiers:
// 4. semi-source code:
@@ -121,7 +121,7 @@ public class CommitPatchSingleStatementParser extends CommitPatchParser {
* used to mine common fix patterns.
*/
// 1. First level: AST node type.
String astEditScripts = getASTEditScripts(actionSet);
String astEditScripts = getASTEditScriptsBreadthFirst(actionSet);
int size = astEditScripts.split(" ").length;
if (size < 2) {
// System.out.println(actionSet);
@@ -186,7 +186,7 @@ public class FixedViolationHunkParser extends FixedViolationParser {
* Edit scripts will be used to mine common fix patterns.
*/
// 1. First level: AST node type.
astEditScripts += getASTEditScripts(hunkActionSets, bugEndPosition, fixEndPosition);
astEditScripts += getASTEditScriptsDeepFirst(hunkActionSets, bugEndPosition, fixEndPosition);
// 2. source code: raw tokens
// 3. abstract identifiers:
// 4. semi-source code:
@@ -194,8 +194,8 @@ public class FixedViolationHunkParser extends FixedViolationParser {
if (size == 1) continue;
counter ++;
String patchPosition = "###:" + counter + "\n" + revFile.getName() + "\nPosition: " + violation.getStartLineNum() + " --> " + violation.getEndLineNum() + "\n@@ -" + bugStartLine + ", " + bugEndLine + " +" + fixStartLine + ", " + fixEndLine + "@@\n";
this.patchesSourceCode += Configuration.PATCH_SIGNAL + "\n" + patchPosition + patchSourceCode + "\nAST diff:\n" + getAstEditScripts(hunkActionSets, bugEndPosition, fixEndPosition) + "\n";
String patchPosition = "###:" + counter + "\n" + revFile.getName() + "Position: " + violation.getStartLineNum() + " --> " + violation.getEndLineNum() + "\n@@ -" + bugStartLine + ", " + bugEndLine + " +" + fixStartLine + ", " + fixEndLine + "@@\n";
this.patchesSourceCode += Configuration.PATCH_SIGNAL + "\nAlarm Type :" + violation.getAlarmType() + "\n" + patchPosition + patchSourceCode + "\nAST Diff###:\n" + getAstEditScripts(hunkActionSets, bugEndPosition, fixEndPosition) + "\n";
this.sizes += size + "\n";
this.astEditScripts += astEditScripts + "\n";
this.alarmTypes += violation.getAlarmType() + "\n";
@@ -207,42 +207,5 @@ public class FixedViolationHunkParser extends FixedViolationParser {
}
}
}
private String getAstEditScripts(List<HierarchicalActionSet> actionSets) {
String editScripts = "";
for (HierarchicalActionSet actionSet : actionSets) {
editScripts += actionSet.toString();
}
return editScripts;
}
private String getAstEditScripts(List<HierarchicalActionSet> actionSets, int bugEndLine, int fixEndLine) {
String editScripts = "";
for (HierarchicalActionSet actionSet : actionSets) {
editScripts += getActionString(actionSet, bugEndLine, fixEndLine, "");
}
return editScripts;
}
private String getActionString(HierarchicalActionSet actionSet, int bugEndPosition, int fixEndPosition, String startStr) {
String editScripts = "";
editScripts += startStr + actionSet.getActionString() + "\n";
for (HierarchicalActionSet subActionSet : actionSet.getSubActions()) {
int position = subActionSet.getAction().getPosition();
if (subActionSet.getActionString().startsWith("INS")) {
if (position > fixEndPosition) {
continue;
}
} else if (!subActionSet.getActionString().startsWith("MOV") && position > bugEndPosition) {
continue;
}
editScripts += getActionString(subActionSet, bugEndPosition, fixEndPosition, startStr + "---");
}
return editScripts;
}
}
@@ -116,7 +116,7 @@ public class FixedViolationSingleStatementParser extends FixedViolationParser {
* Edit scripts will be used to mine common fix patterns.
*/
// 1. First level: AST node type.
String astEditScripts = getASTEditScripts(actionSet);
String astEditScripts = getASTEditScriptsBreadthFirst(actionSet);
int size = astEditScripts.split(" ").length;
if (size == 1) {
continue;
@@ -15,7 +15,7 @@ public class Configuration {
// the output path of GumTree results.
private static final String GUM_TREE_OUTPUT = ROOT_PATH + "GumTreeResults/";
private static final String GUM_TREE_OUTPUT = ROOT_PATH + "GumTreeResults_2/";
public static final String EDITSCRIPTS_FILE_PATH = GUM_TREE_OUTPUT + "editScripts/";
public static final String PATCH_SOURCECODE_FILE_PATH = GUM_TREE_OUTPUT + "sourceCode/";
public static final String BUGGYTREE_FILE_PATH = GUM_TREE_OUTPUT + "buggyTrees/";