Recommending Method Invocation Context Changes
-
Upload
beat-fluri -
Category
Technology
-
view
1.046 -
download
1
Transcript of Recommending Method Invocation Context Changes
software evolution & architecture lab
University of ZurichDepartment of Informatics
ChangeCommander
Beat Fluri, Jonas Zuberbühler, and Harald C. Galls.e.a.l. - software evolution & architecture labDepartment of InformaticsUniversity of Zurich, Switzerland
Recommending Method InvocationContext Changes
Which changes fix bugs?
Bug fix change study on Eclipse43 plugins from Platform, JDT, and PDE
15% of bugs fixes contain context changes of method invocation statements
Which changes fix bugs?
Bug fix change study on Eclipse43 plugins from Platform, JDT, and PDE
15% of bugs fixes contain context changes of method invocation statements
Method Invocation Context ChangeMoving a method invocation into the then or the else-part of an if-statement.
Which changes fix bugs?
Bug fix change study on Eclipse43 plugins from Platform, JDT, and PDE
15% of bugs fixes contain context changes of method invocation statements
Method Invocation Context ChangeMoving a method invocation into the then or the else-part of an if-statement.
visited.add(outputFolder);
Which changes fix bugs?
Bug fix change study on Eclipse43 plugins from Platform, JDT, and PDE
15% of bugs fixes contain context changes of method invocation statements
Method Invocation Context ChangeMoving a method invocation into the then or the else-part of an if-statement.
visited.add(outputFolder);
if (!visited.contains(outputFolder)) {
}
Similar conditions for all methods
Context changes tend to be similar
Similar conditions for specific methods
Similar conditions for all methods
Context changes tend to be similar
Similar conditions for specific methods
if (myObject != null) { list.add(myObject);}
if (list != null) { list.add(myObject);}
Similar conditions for all methods
Context changes tend to be similar
Similar conditions for specific methods
if (myObject != null) { list.add(myObject);}
if (list != null) { list.add(myObject);}
if (!list.contains(myObject)) { list.add(myObject);}
Pattern extraction process
Pattern extraction process
Contextchanges
Pattern extraction process
Contextchanges
Pattern extraction process
Contextchanges
Pattern extraction process
Contextchanges
Invocationaggregation
Pattern extraction process
Contextchanges
Invocationaggregation
Patternextraction
Pattern extraction process
Contextchanges
Invocationaggregation
Patternextraction
Invocation aggregation
list.add(myObject) java.util.List.add(MyClass)
Method invocations Invocation signature
Invocation aggregation
list.add(myObject) java.util.List.add(MyClass)
Method invocations Invocation signature
Invocation aggregation
list.add(myObject) java.util.List.add(MyClass)
Method invocations Invocation signature
Invocation aggregation
list.add(anObject) java.util.List.add(MyClass)Method invocation Invocation signature
Same Package
Invocation aggregation
list.add(anObject) java.util.List.add(MyClass)Method invocation Invocation signature
Imports
Same Package
Invocation aggregation
list.add(anObject) java.util.List.add(MyClass)Method invocation Invocation signature
Imports
Same Package
Invocation aggregation
list.add(anObject) java.util.List.add(MyClass)
JDT
Method invocation Invocation signature
Imports
Same Package
Invocation aggregation
list.add(anObject) java.util.List.add(MyClass)
JDT
Method invocation Invocation signature
Imports
Same Package
Invocation aggregation
list.add(anObject) java.util.List.add(MyClass)
JDT
Method invocation Invocation signature
Post Resolver
Match in scopevariables
Match in imports
...
Imports
Same Package
Invocation aggregation
list.add(anObject) java.util.List.add(MyClass)
JDT
Method invocation Invocation signature
Post Resolver
Match in scopevariables
Match in imports
...
!<qualifier>.contains(<argument_0>)
Pattern extraction
list.add(myObject)
Aggregated invocations Context change patterns
!list.contains(myObject)
list != null && <qualifier> != null
!<qualifier>.contains(<argument_0>)
Pattern extraction
list.add(myObject)
Aggregated invocations Context change patterns
!list.contains(myObject)
list != null && <qualifier> != null
!<qualifier>.contains(<argument_0>)
Pattern extraction
list.add(myObject)
Aggregated invocations Context change patterns
!list.contains(myObject)
list != null && <qualifier> != null
!<qualifier>.contains(<argument_0>)
Pattern extraction
Aggregated invocations Context change patterns
!list.contains(myObject)list != null && <qualifier> != null
Split compound conditions into single conditions
!<qualifier>.contains(<argument_0>)
Pattern extraction
Aggregated invocations Context change patterns
!list.contains(myObject)list != null && <qualifier> != null
Split compound conditions into single conditions
Token streams for- conditions- method invocation
!<qualifier>.contains(<argument_0>)
Pattern extraction
Aggregated invocations Context change patterns
!list.contains(myObject)list != null && <qualifier> != null
Split compound conditions into single conditions
Token streams for- conditions- method invocation
!<qualifier>.contains(<argument_0>)
Pattern extraction
Aggregated invocations Context change patterns
!list.contains(myObject)list != null && <qualifier> != null
Split compound conditions into single conditions
Token streams for- conditions- method invocation
list.add(myObject)
!<qualifier>.contains(<argument_0>)
Pattern extraction
Aggregated invocations Context change patterns
!list.contains(myObject)list != null && <qualifier> != null
Split compound conditions into single conditions
Token streams for- conditions- method invocation
list.add(myObject)
!<qualifier>.contains(<argument_0>)
Pattern extraction
Aggregated invocations Context change patterns
!list.contains(myObject)list != null && <qualifier> != null
Split compound conditions into single conditions
Token streams for- conditions- method invocation
list.add(myObject)
Recommendation
Recommendation
Recommendation
Recommendation
java.util.List.add(MyClass)
Recommendation
java.util.List.add(MyClass)
Recommendation
java.util.List.add(MyClass)
Recommendation
java.util.List.add(MyClass)
Surrounding if already contains condition
Filter predefined method invocations
xx
Recommendation
java.util.List.add(MyClass)
Surrounding if already contains condition
Filter predefined method invocations
xx
ChangeCommander
A first validation
Split history
Training set: Past context changes up to a certain release
Test set: Context changes after that particular release
Recommended context change
True positive (TP): in test setFalse positive (FP): not in test setFalse negative (FN): context change in test set but not recommended
A first validation
Project TP #B FP FN
ArgoUML 29 11 4675 75
Azureus 15 3 - 82
Eclipse JDT 51 27 - 158
Eclipse PDE 35 25 8011 46
jEdit 1 0 1307 13
A first validation
Project TP #B FP FN
ArgoUML 29 11 4675 75
Azureus 15 3 - 82
Eclipse JDT 51 27 - 158
Eclipse PDE 35 25 8011 46
jEdit 1 0 1307 13
Conclusions
Recommending context changesWe leverages context change data to suggest corresponding modifications on existing or newly added method invocations.
ChangeCommanderBy integrating our recommendation approach into the development process, we aim at reducing future bugs.