diff --git a/src/main/java/edu/lu/uni/serval/gumtree/regroup/HierarchicalRegrouperForC.java b/src/main/java/edu/lu/uni/serval/gumtree/regroup/HierarchicalRegrouperForC.java index 9f7ef12..bf2554c 100644 --- a/src/main/java/edu/lu/uni/serval/gumtree/regroup/HierarchicalRegrouperForC.java +++ b/src/main/java/edu/lu/uni/serval/gumtree/regroup/HierarchicalRegrouperForC.java @@ -27,6 +27,8 @@ public class HierarchicalRegrouperForC { System.out.println(actionSet); } + List actionSets = new ArrayList<>(); + public List regroupGumTreeResults(List actions) { /* * First, sort actions by their positions. @@ -39,10 +41,10 @@ public class HierarchicalRegrouperForC { /* * Second, group actions by their positions. */ - List actionSets = new ArrayList<>(); HierarchicalActionSet actionSet = null; for(Action act : actions){ Action parentAct = findParentAction(act, actions); + if (parentAct == null) { actionSet = createActionSet(act, parentAct, null); actionSets.add(actionSet); @@ -66,7 +68,7 @@ public class HierarchicalRegrouperForC { } else { // TypeDeclaration, FieldDeclaration, MethodDeclaration, Statement. // CatchClause, ConstructorInvocation, SuperConstructorInvocation, SwitchCase - String astNodeType = actSet.getAstNodeType(); +// String astNodeType = actSet.getAstNodeType(); // if (astNodeType.endsWith("TypeDeclaration") || astNodeType.endsWith("FieldDeclaration") || astNodeType.endsWith("EnumDeclaration") || // astNodeType.endsWith("MethodDeclaration") || astNodeType.endsWith("Statement") || // astNodeType.endsWith("ConstructorInvocation") || astNodeType.endsWith("CatchClause") || astNodeType.endsWith("SwitchCase")) { @@ -191,30 +193,15 @@ public class HierarchicalRegrouperForC { return false; } + List newParentActions = new ArrayList<>(); private Action findParentAction(Action action, List actions) { ITree parent = action.getNode().getParent(); + if (parent == null) return null; if (action instanceof Addition) { parent = ((Addition) action).getParent(); // parent in the fixed source code tree } - if (parent.getType() == 55) { - int type = action.getNode().getType(); - // Modifier, NormalAnnotation, MarkerAnnotation, SingleMemberAnnotation - if (type != 83 && type != 77 && type != 78 && type != 79 - && type != 5 && type != 39 && type != 43 && type != 74 && type != 75 - && type != 76 && type != 84 && type != 87 && type != 88 && type != 42) { - // ArrayType, PrimitiveType, SimpleType, ParameterizedType, - // QualifiedType, WildcardType, UnionType, IntersectionType, NameQualifiedType, SimpleName - return null; - } -// } else if (parent.getType() == 31) { // method declaration -// int type = action.getNode().getType(); -// if (Checker.isStatement(type)) {// statements -// return null; -// } - } - for (Action act : actions) { if (act.getNode().equals(parent)) { if (areRelatedActions(act, action)) { @@ -222,17 +209,54 @@ public class HierarchicalRegrouperForC { } } } - return null; + for (Action act : newParentActions) { + if (act.getNode().equals(parent)) { + if (areRelatedActions(act, action)) { + return act; + } + } + } + + ITree tree = action.getNode(); + Action parentAction = null; + if (!isStatement(tree)) { + parentAction = new Update(parent, action.getNode().getParent()); + newParentActions.add(parentAction); + + Action higherParentAct = findParentAction(parentAction, actions); + HierarchicalActionSet actionSet = null; + if (higherParentAct == null) { + actionSet = createActionSet(parentAction, higherParentAct, null); + actionSets.add(actionSet); + } else { + if (!addToAactionSet(parentAction, higherParentAct, actionSets)) { + // The index of the parent action in the actions' list is larger than the index of this action. + actionSet = createActionSet(parentAction, higherParentAct, null); + actionSets.add(actionSet); + } + } + } + return parentAction; } + private boolean isStatement(ITree tree) { + int nodeType = tree.getType(); + if (nodeType == 280002 || nodeType == 280001 || nodeType == 310200 || nodeType == 280100 + || nodeType == 300100 || nodeType == 280003 || nodeType == 310100 || nodeType == 310300 + || 260300 == nodeType || nodeType == 460000) {// TODO + return true; + } + return false; + } + private boolean areRelatedActions(Action parent, Action child) { if (parent instanceof Move && !(child instanceof Move)) {// If action is MOV, its children must be MOV. return false; } - if (parent instanceof Delete && !(child instanceof Delete)) {// If action is INS, its children must be MOV or INS. + if (parent instanceof Delete && !(child instanceof Delete)) {// If action is DEL, its children must be DEL. return false; } - if (parent instanceof Insert && !(child instanceof Addition)) {// If action is DEL, its children must be DEL. + if (parent instanceof Insert && !(child instanceof Addition)) {// If action is INS, its children must be MOV or INS. return false; } return true;