diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/Parser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/Parser.java index a09611b..94e4134 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/Parser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/Parser.java @@ -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 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 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 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 hunkActionSets, int bugEndPosition, int fixEndPosition) { + protected String getASTEditScriptsBreadthFirst(List 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 actionSets = new ArrayList<>(); actionSets.add(hunkActionSet); @@ -197,37 +215,16 @@ public abstract class Parser implements ParserInterface { List 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 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 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()) { diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/patch/CommitPatchHunkParser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/patch/CommitPatchHunkParser.java index 4eb7a77..a100e28 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/patch/CommitPatchHunkParser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/patch/CommitPatchHunkParser.java @@ -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: diff --git a/src/main/java/edu/lu/uni/serval/FixPatternParser/patch/CommitPatchSingleStatementParser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/patch/CommitPatchSingleStatementParser.java index a4595e2..63e31b7 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/patch/CommitPatchSingleStatementParser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/patch/CommitPatchSingleStatementParser.java @@ -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); 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 c50b2ea..4e53234 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 @@ -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 actionSets) { - String editScripts = ""; - for (HierarchicalActionSet actionSet : actionSets) { - editScripts += actionSet.toString(); - } - return editScripts; - } - - private String getAstEditScripts(List 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; - } } 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 370c950..7f3365a 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 @@ -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; diff --git a/src/main/java/edu/lu/uni/serval/config/Configuration.java b/src/main/java/edu/lu/uni/serval/config/Configuration.java index c1e8ec4..4ab912c 100644 --- a/src/main/java/edu/lu/uni/serval/config/Configuration.java +++ b/src/main/java/edu/lu/uni/serval/config/Configuration.java @@ -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/";