Merge branch 'GumTreeRegrouper' of https://bitbucket.org/kui_liu/fixpatternminer into GumTreeRegrouper
This commit is contained in:
@@ -27,6 +27,8 @@ public class HierarchicalRegrouperForC {
|
|||||||
System.out.println(actionSet);
|
System.out.println(actionSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<HierarchicalActionSet> actionSets = new ArrayList<>();
|
||||||
|
|
||||||
public List<HierarchicalActionSet> regroupGumTreeResults(List<Action> actions) {
|
public List<HierarchicalActionSet> regroupGumTreeResults(List<Action> actions) {
|
||||||
/*
|
/*
|
||||||
* First, sort actions by their positions.
|
* First, sort actions by their positions.
|
||||||
@@ -39,10 +41,10 @@ public class HierarchicalRegrouperForC {
|
|||||||
/*
|
/*
|
||||||
* Second, group actions by their positions.
|
* Second, group actions by their positions.
|
||||||
*/
|
*/
|
||||||
List<HierarchicalActionSet> actionSets = new ArrayList<>();
|
|
||||||
HierarchicalActionSet actionSet = null;
|
HierarchicalActionSet actionSet = null;
|
||||||
for(Action act : actions){
|
for(Action act : actions){
|
||||||
Action parentAct = findParentAction(act, actions);
|
Action parentAct = findParentAction(act, actions);
|
||||||
|
|
||||||
if (parentAct == null) {
|
if (parentAct == null) {
|
||||||
actionSet = createActionSet(act, parentAct, null);
|
actionSet = createActionSet(act, parentAct, null);
|
||||||
actionSets.add(actionSet);
|
actionSets.add(actionSet);
|
||||||
@@ -66,7 +68,7 @@ public class HierarchicalRegrouperForC {
|
|||||||
} else {
|
} else {
|
||||||
// TypeDeclaration, FieldDeclaration, MethodDeclaration, Statement.
|
// TypeDeclaration, FieldDeclaration, MethodDeclaration, Statement.
|
||||||
// CatchClause, ConstructorInvocation, SuperConstructorInvocation, SwitchCase
|
// CatchClause, ConstructorInvocation, SuperConstructorInvocation, SwitchCase
|
||||||
String astNodeType = actSet.getAstNodeType();
|
// String astNodeType = actSet.getAstNodeType();
|
||||||
// if (astNodeType.endsWith("TypeDeclaration") || astNodeType.endsWith("FieldDeclaration") || astNodeType.endsWith("EnumDeclaration") ||
|
// if (astNodeType.endsWith("TypeDeclaration") || astNodeType.endsWith("FieldDeclaration") || astNodeType.endsWith("EnumDeclaration") ||
|
||||||
// astNodeType.endsWith("MethodDeclaration") || astNodeType.endsWith("Statement") ||
|
// astNodeType.endsWith("MethodDeclaration") || astNodeType.endsWith("Statement") ||
|
||||||
// astNodeType.endsWith("ConstructorInvocation") || astNodeType.endsWith("CatchClause") || astNodeType.endsWith("SwitchCase")) {
|
// astNodeType.endsWith("ConstructorInvocation") || astNodeType.endsWith("CatchClause") || astNodeType.endsWith("SwitchCase")) {
|
||||||
@@ -191,30 +193,15 @@ public class HierarchicalRegrouperForC {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
List<Action> newParentActions = new ArrayList<>();
|
||||||
private Action findParentAction(Action action, List<Action> actions) {
|
private Action findParentAction(Action action, List<Action> actions) {
|
||||||
|
|
||||||
ITree parent = action.getNode().getParent();
|
ITree parent = action.getNode().getParent();
|
||||||
|
if (parent == null) return null;
|
||||||
if (action instanceof Addition) {
|
if (action instanceof Addition) {
|
||||||
parent = ((Addition) action).getParent(); // parent in the fixed source code tree
|
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) {
|
for (Action act : actions) {
|
||||||
if (act.getNode().equals(parent)) {
|
if (act.getNode().equals(parent)) {
|
||||||
if (areRelatedActions(act, action)) {
|
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) {
|
private boolean areRelatedActions(Action parent, Action child) {
|
||||||
if (parent instanceof Move && !(child instanceof Move)) {// If action is MOV, its children must be MOV.
|
if (parent instanceof Move && !(child instanceof Move)) {// If action is MOV, its children must be MOV.
|
||||||
return false;
|
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;
|
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 false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
Reference in New Issue
Block a user