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 95d2994..faf01d2 100644 --- a/src/main/java/edu/lu/uni/serval/FixPatternParser/Parser.java +++ b/src/main/java/edu/lu/uni/serval/FixPatternParser/Parser.java @@ -170,6 +170,68 @@ public abstract class Parser implements ParserInterface { return editScript; } + + /** + * + * @param hunkActionSets + * @param bugStartLine + * @param bugEndLine + * @param fixStartLine + * @param fixEndLine + * @return + */ + protected String getASTEditScripts(List hunkActionSets, int bugEndPosition, int fixEndPosition) { + String editScript = ""; + + for (HierarchicalActionSet hunkActionSet : hunkActionSets) { + editScript += getASTEditScripts(hunkActionSet, bugEndPosition, fixEndPosition); + } + return editScript; + } + + private String getASTEditScripts(HierarchicalActionSet hunkActionSet, int bugEndPosition, int fixEndPosition) { + String editScript = ""; + List actionSets = new ArrayList<>(); + actionSets.add(hunkActionSet); + while (actionSets.size() != 0) { + List subSets = new ArrayList<>(); + for (HierarchicalActionSet set : actionSets) { + int bugS = set.getStartPosition(); + int fixS = set.getFixStartLineNum(); + + if (bugS > bugEndPosition || fixS > 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"); + } + } + } + + editScript += singleEdit + " "; + } + actionSets.clear(); + actionSets.addAll(subSets); + } + return editScript; + } + 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/violations/FixedViolationHunkParser.java b/src/main/java/edu/lu/uni/serval/FixPatternParser/violations/FixedViolationHunkParser.java index 418e8b0..c2b8a2d 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 @@ -107,6 +107,8 @@ public class FixedViolationHunkParser extends FixedViolationParser { // Range of fixing source code int fixStartLine = 0; int fixEndLine = 0; + int bugEndPosition = 0; + int fixEndPosition = 0; /* * Convert the ITree of buggy code to a simple tree. * It will be used to compute the similarity. @@ -117,15 +119,15 @@ public class FixedViolationHunkParser extends FixedViolationParser { List children = new ArrayList<>(); String astEditScripts = ""; for (HierarchicalActionSet hunkActionSet : hunkActionSets) { - /** - * Select edit scripts for deep learning. - * Edit scripts will be used to mine common fix patterns. - */ - // 1. First level: AST node type. - astEditScripts += getASTEditScripts(hunkActionSet); - // 2. source code: raw tokens - // 3. abstract identifiers: - // 4. semi-source code: +// /** +// * Select edit scripts for deep learning. +// * Edit scripts will be used to mine common fix patterns. +// */ +// // 1. First level: AST node type. +// astEditScripts += getASTEditScripts(hunkActionSet); +// // 2. source code: raw tokens +// // 3. abstract identifiers: +// // 4. semi-source code: int actionBugStart = hunkActionSet.getBugStartLineNum(); int actionBugEnd = hunkActionSet.getBugEndLineNum(); @@ -141,8 +143,14 @@ public class FixedViolationHunkParser extends FixedViolationParser { } else if (actionFixStart != 0 && actionFixStart < fixStartLine) { fixStartLine = actionFixStart; } - if (bugEndLine < actionBugEnd) bugEndLine = actionBugEnd; - if (fixEndLine < actionFixEnd) fixEndLine = actionFixEnd; + if (bugEndLine < actionBugEnd) { + bugEndLine = actionBugEnd; + bugEndPosition = hunkActionSet.getBugEndPosition(); + } + if (fixEndLine < actionFixEnd) { + fixEndLine = actionFixEnd; + fixEndPosition = hunkActionSet.getFixEndPosition(); + } SimplifyTree abstractIdentifier = new SimplifyTree(); abstractIdentifier.abstractTree(hunkActionSet); @@ -168,12 +176,22 @@ public class FixedViolationHunkParser extends FixedViolationParser { // Source Code of patches. String patchSourceCode = getPatchSourceCode(prevFile, revFile, bugStartLine, bugEndLine, fixStartLine, fixEndLine, isInsert); if ("".equals(patchSourceCode)) continue; + + /** + * Select edit scripts for deep learning. + * Edit scripts will be used to mine common fix patterns. + */ + // 1. First level: AST node type. + astEditScripts += getASTEditScripts(hunkActionSets, bugEndPosition, fixEndPosition); + // 2. source code: raw tokens + // 3. abstract identifiers: + // 4. semi-source code: int size = astEditScripts.split(" ").length; 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) + "\n"; + this.patchesSourceCode += Configuration.PATCH_SIGNAL + "\n" + patchPosition + patchSourceCode + "\nAST diff:\n" + getAstEditScripts(hunkActionSets, bugEndPosition, fixEndPosition) + "\n"; this.sizes += size + "\n"; this.astEditScripts += astEditScripts + "\n"; this.alarmTypes += violation.getAlarmType() + "\n"; @@ -194,4 +212,30 @@ public class FixedViolationHunkParser extends FixedViolationParser { 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 bugS = subActionSet.getStartPosition(); + int fixS = subActionSet.getFixStartLineNum(); + if (bugS > bugEndPosition || fixS > fixEndPosition) { + continue; + } else { + editScripts += getActionString(subActionSet, bugEndPosition, fixEndPosition, startStr + "---"); + } + + } + + return editScripts; + } + } 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 369c5ee..c1e8ec4 100644 --- a/src/main/java/edu/lu/uni/serval/config/Configuration.java +++ b/src/main/java/edu/lu/uni/serval/config/Configuration.java @@ -27,7 +27,7 @@ public class Configuration { public static final String PATCH_SOURCECODE_FILE = GUM_TREE_OUTPUT + "patchSourceCode.list"; public static final String BUGGYTREES_FILE = GUM_TREE_OUTPUT + "buggyTrees.list"; public static final String BUGGY_CODE_TOKENS_FILE = GUM_TREE_OUTPUT + "tokens.list"; - public static final String EDITSCRIPT_SIZES_FILE = GUM_TREE_OUTPUT + "editScriptSizes.list"; + public static final String EDITSCRIPT_SIZES_FILE = GUM_TREE_OUTPUT + "editScriptSizes.csv"; public static final String ALARM_TYPES_FILE = GUM_TREE_OUTPUT + "alarmTypes.list"; public static final int VECTOR_SIZE_OF_EMBEDED_TOKEN1 = 100; // tokens of edit scripts. diff --git a/src/main/java/edu/lu/uni/serval/gumtree/regroup/HierarchicalActionSet.java b/src/main/java/edu/lu/uni/serval/gumtree/regroup/HierarchicalActionSet.java index 5a55c22..683794e 100644 --- a/src/main/java/edu/lu/uni/serval/gumtree/regroup/HierarchicalActionSet.java +++ b/src/main/java/edu/lu/uni/serval/gumtree/regroup/HierarchicalActionSet.java @@ -32,6 +32,9 @@ public class HierarchicalActionSet implements Comparable private SimpleTree abstractIdentifierTree = null; // abstract identifier tree private SimpleTree simpleTree = null; // source code tree and AST node type tree private SimpleTree originalTree = null; // source code tree. + + private int bugEndPosition; + private int fixEndPosition; public ITree getNode() { return node; @@ -171,6 +174,22 @@ public class HierarchicalActionSet implements Comparable this.originalTree = originalTree; } + public int getBugEndPosition() { + return bugEndPosition; + } + + public void setBugEndPosition(int bugEndPosition) { + this.bugEndPosition = bugEndPosition; + } + + public int getFixEndPosition() { + return fixEndPosition; + } + + public void setFixEndPosition(int fixEndPosition) { + this.fixEndPosition = fixEndPosition; + } + @Override public int compareTo(HierarchicalActionSet o) { return this.action.compareTo(o.action);