1. Eclipse Code
Recommenders
IDE
2.0:
Leveraging
the
Wisdom
of
the
So:ware
Engineering
Crowds eim
nh
tw:
@MarcelBruch an
g+:
+Marcel
Bruch up
M
ro
r
G
se
a
U
Jav
5. Code
Comple+on…
@Override
protected Control createDialogArea(final Composite parent) {
Composite container = (Composite) super.createDialogArea(parent);
swtTextWidget = new Text(container, SWT.BORDER);
swtTextWidget.|
return container;
}
What
does
the
developer
need,
i.e.,
which
methods
should
the
code
compleKon
present
to
the
user?
5
9. Code
Comple+on…
@Override
protected Control createDialogArea(final Composite parent) {
final Composite container = (Composite) super.createDialogArea(parent);
swtTextWidget = new Text(container, SWT.BORDER);
swtTextWidget.|
return container;
}
What
does
the
developer
need,
i.e.,
which
methods
should
the
code
compleKon
present
to
the
user?
8
13. How
it
works
-‐
in
a
nutshell
Framework
Example
Example
...
ApplicaKon
1 ApplicaKon
n
10
14. How
it
works
-‐
in
a
nutshell
Framework
Example
Example
...
ApplicaKon
1 ApplicaKon
n
extract
facts
about
how
the
framework
is
reused
«extends:A» «extends:A»
«overrides:A.b» ... «overrides:A.d»
«calls:B.c» «calls:B.c»
… …
10
15. How
it
works
-‐
in
a
nutshell
Framework
Example
Example
...
ApplicaKon
1 ApplicaKon
n
extract
facts
about
how
the
framework
is
reused
«extends:A» «extends:A»
«overrides:A.b» ... «overrides:A.d»
«calls:B.c» «calls:B.c»
… …
10
16. How
it
works
-‐
in
a
nutshell
Framework
If
you
extend
A,
Example
Example
you
should
... call
B.c
ApplicaKon
1 ApplicaKon
n
extract
facts
about
how
the
framework
is
reused
«extends:A» «extends:A»
«overrides:A.b» ... «overrides:A.d»
«calls:B.c» «calls:B.c»
… …
10
17. From
code
to
models...
()
ts
en ()
nt Ok
Co rm
te fo () t() t() t()
ea er t> ex on ex
cr .p ni tT tF tT
e. ge <i se se ge
ag Pa t. t. t. t.
class Example extends Page { :P n: ex ex ex ex ..
Text t; in i T T T T .
@Override 1 0 1 1 0 0 …
void createContents() {
t = new Text();
t.setText(..);
..
} 0 1 0 0 0 1 …
} … … … … … … …
11
18. From
code
to
models...
()
ts
en ()
nt Ok
Co rm
te fo () t() t() t()
ea er t> ex on ex
cr .p ni tT tF tT
e. ge <i se se ge
ag Pa t. t. t. t.
class Example extends Page { :P n: ex ex ex ex ..
Text t; in i T T T T .
@Override 1 0 1 1 0 0 …
void performOk() {
t.getText();
..
} 0 1 0 0 0 1 …
} … … … … … … …
12
19. From
models
to
recommenda+ons...
()
ts
en ()
nt Ok
Co rm
class MyPage extends Page { te fo () t() t() t()
ea er t> ex on ex
Text t; cr .p ni tT tF tT
@Override e. ge <i se se ge
ag Pa t. t. t. t.
void createContents() { :P n: ex ex ex ex ..
t = new Text(); in i T T T T .
t.|<^space> 1 0 1 ? ? ? …
}
}
13
20. From
models
to
recommenda+ons...
()
ts
en ()
nt Ok
Co rm
te fo () t() t() t()
ea er t> ex on ex
cr .p ni tT tF tT
e. ge <i se se ge
ag Pa t. t. t. t.
:P n: ex ex ex ex ..
in i T T T T .
1 0 1 1 1 0 …
1 0 1 0 0 0 …
1 0 1 1 0 0 …
0 1 0 0 0 1 …
… … … … … … …
1 0 1 ? ? ? …
14
21. From
models
to
recommenda+ons...
()
ts
en ()
nt Ok
Co rm
te fo () t() t() t()
ea er t> ex on ex
cr .p ni tT tF tT
e. ge <i se se ge
ag Pa t. t. t. t.
:P n: ex ex ex ex ..
in i T T T T .
1 0 1 1 1 0 …
1 0 1 0 0 0 …
1 0 1 1 0 0 …
0 1 0 0 0 1 …
… … … … … … …
1 0 1 ⅔
? ? ? …
14
22. From
models
to
recommenda+ons...
()
ts
en ()
nt Ok
Co rm
te fo () t() t() t()
ea er t> ex on ex
cr .p ni tT tF tT
e. ge <i se se ge
ag Pa t. t. t. t.
:P n: ex ex ex ex ..
in i T T T T .
1 0 1 1 1 0 …
1 0 1 0 0 0 …
1 0 1 1 0 0 …
0 1 0 0 0 1 …
… … … … … … …
1 0 1 ⅔
? ⅓
? ? …
14
23. From
models
to
recommenda+ons...
()
ts
en ()
nt Ok
Co rm
te fo () t() t() t()
ea er t> ex on ex
cr .p ni tT tF tT
e. ge <i se se ge
ag Pa t. t. t. t.
:P n: ex ex ex ex ..
in i T T T T .
1 0 1 1 1 0 …
1 0 1 0 0 0 …
1 0 1 1 0 0 …
0 1 0 0 0 1 …
… … … … … … …
1 0 1 ⅔
? ⅓
? 0
? …
14
25. How
to
obtain
an
instance
of...
public class MyView extends ViewPart {
public void updateMessage(final String newMessage) {
// How do I get an instance of IStatusLineManager?
final IStatusLineManager manager = |
manager.setMessage(newMessage);
}
There is no trivial solution anymore.
Again, what should code completion return?
26. What
we
need...
!"#$%&'(
5#(!"#$*"(#67
public void updateMessage(final String newMessage) {
// How do I get an instance of
)!"#$*"(#
final IStatusLineManager manager =
this
.getViewSite() 5#(+,-./8&'167
.getActionBars()
.getStatusLineManager();
manager.setMessage(newMessage); )+,-./0&'1
}
5#(*(&(213"/#4&/&5#'67
)*(&(213"/#4&/&5#'
17
28. However,
someEmes
you
get...
Here,
implicit
user
feedbacks
(“clicks”)
will
help
to
find
the
nt...
right
(read
“the
most
commonly
used”)
paths. me
e lop
ev
In
d
33. Tools
Outline
Intelligent
Code
CompleEon Smart
Bug
DetecEon
What
have
I
missed?
Extended
DocumentaEon Code
Example
Recommender
How
do
I
get
an
instance
of…?
20
34. Tools
Outline
Intelligent
Code
CompleEon Smart
Bug
DetecEon
What
have
I
missed?
Stacktrace
Search
Engine
Extended
DocumentaEon Code
Example
Recommender
What
caused
that
stacktrace?
How
do
I
get
an
instance
of…?
20
35. Tools
Outline
Intelligent
Code
CompleEon Smart
Bug
DetecEon
What
have
I
missed?
Stacktrace
Search
Engine
Extended
DocumentaEon Code
Example
Recommender
What
caused
that
stacktrace?
How
do
I
get
an
instance
of…?
20
36. Tools
Outline
Intelligent
Code
CompleEon Smart
Bug
DetecEon
What
have
I
missed?
Stacktrace
Search
Engine
Extended
DocumentaEon Code
Example
Recommender
x=
What
caused
that
stacktrace?
How
do
I
get
an
instance
of…?
20
37. “The
good
ones
in
the
crock,
the
bad
ones
in…
the
problem
view.”
SMART
BUG
DETECTION
–
DRIVEN
BY
REAL
USAGES
40. ...and
a
lengthy
stacktrace
org.eclipse.core.runEme.AsserEonFailedExcepEon:
null
argument:
at
org.eclipse.core.runEme.Assert.isNotNull(Assert.java:85)
at
org.eclipse.core.runEme.Assert.isNotNull(Assert.java:73)
at
org.eclipse.jface.wizard.Wizard.createPageControls(Wizard.java:174)
at
org.eclipse.jface.wizard.WizardDialog.createPageControls(WizardDialog.java:734)
at
org.eclipse.jface.wizard.WizardDialog.setWizard(WizardDialog.java:1162)
at
org.eclipse.jface.wizard.WizardDialog.updateForPage(WizardDialog.java:1221)
at
org.eclipse.jface.wizard.WizardDialog.access$4(WizardDialog.java:1218)
at
org.eclipse.jface.wizard.WizardDialog$6.run(WizardDialog.java:1207)
at
org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
at
org.eclipse.jface.wizard.WizardDialog.showPage(WizardDialog.java:1205)
at
org.eclipse.ui.internal.dialogs.ImportExportPage.treeDoubleClicked(ImportExportPage.java)
at
org.eclipse.ui.internal.dialogs.ImportPage$2.doubleClick(ImportPage.java:72)
at
org.eclipse.jface.viewers.StructuredViewer$1.run(StructuredViewer.java:824)
at
org.eclipse.core.runEme.SafeRunner.run(SafeRunner.java:42)
at
org.eclipse.ui.internal.JFaceUEl$1.run(JFaceUEl.java:49)
at
org.eclipse.jface.uEl.SafeRunnable.run(SafeRunnable.java:175)
at
org.eclipse.jface.viewers.StructuredViewer.fireDoubleClick(StructuredViewer.java:822)
at
org.eclipse.jface.viewers.AbstractTreeViewer.handleDoubleSelect(AbstractTreeViewer.java)
at
org.eclipse.jface.viewers.StructuredViewer$4.widgetDefaultSelected(StructuredViewer.java)
... 24
50. Just
one
formula…
0 .5 .9 1
x = {observed method calls on a variable}
E(x) = {exact similar usages for variables of type x in the code base}
A(x) = {almost similar usages, i.e., x+1 method call}
29
53. “Developers
who
bought
overwrote
this
method
typically
also
overwrote...”
USAGE-‐DRIVEN
JAVADOC
54. In
good
documenta+on
we
trust...
/**
* Rollsback the transaction if any and clears different lists to
* start with an empty resource again.
* Note that the super.doUnload is not called because that clears
* the list resulting in all kinds of undesirable inverseremoves.
*/
@Override
protected void doUnload() {
super.doUnload();
}
33
55. In
good
documenta+on
we
trust...
/**
* Rollsback the transaction if any and clears different lists to
* start with an empty resource again.
* Note that the super.doUnload is not called because that clears
* the list resulting in all kinds of undesirable inverseremoves.
*/
@Override
protected void doUnload() {
super.doUnload();
}
33
56. In
good
documenta+on
we
trust...
/**
* Rollsback the transaction if any and clears different lists to
* start with an empty resource again.
* Note that the super.doUnload is not called because that clears
* the list resulting in all kinds of undesirable inverseremoves.
*/
@Override
protected void doUnload() {
super.doUnload();
}
No?
Are
you
sure?
33
57. In
good documenta+on
we
trust...
good
/**
* Rollsback the transaction if any and clears different lists to
* start with an empty resource again.
* Note that the super.doUnload is not called because that clears
* the list resulting in all kinds of undesirable inverseremoves.
*/
@Override
protected void doUnload() {
super.doUnload();
}
No?
Are
you
sure?
33
59. Genera+ng
high-‐quality
API
documenta+on
/**
* The number of questions.
*/
private int numberOfQuestions;
/**
* Sets the number of questions.
*
* @param numberOfQuestions the number of questions
* @throws IllegalArgumentException the illegal argument exception
*/
public void setNumberOfQuestions(int numberOfQuestions)
throws IllegalArgumentException {
if (numberOfQuestions < 0) {
throw new IllegalArgumentException("numberOfQuestions < 0");
}
this.numberOfQuestions = numberOfQuestions;
}
34
60. Genera+ng
high-‐quality
API
documenta+on
/**
* The number of questions.
*/
private int numberOfQuestions;
/**
* Sets the number of questions.
*
* @param numberOfQuestions the number of questions
* @throws IllegalArgumentException the illegal argument exception
*/
public void setNumberOfQuestions(int numberOfQuestions)
throws IllegalArgumentException {
if (numberOfQuestions < 0) {
throw new IllegalArgumentException("numberOfQuestions < 0");
}
this.numberOfQuestions = numberOfQuestions;
}
34
61. Genera+ng
high-‐quality
API
documenta+on
/**
* The number of questions.
*/
private int numberOfQuestions;
/**
* Sets the number of questions.
*
* @param numberOfQuestions the number of questions
* @throws IllegalArgumentException the illegal argument exception
*/
public void setNumberOfQuestions(int numberOfQuestions)
throws IllegalArgumentException {
if (numberOfQuestions < 0) {
throw new IllegalArgumentException("numberOfQuestions < 0");
}
this.numberOfQuestions = numberOfQuestions;
}
34
62. Genera+ng
high-‐quality
API
documenta+on
/**
* The number of questions.
*/
private int numberOfQuestions;
/**
* Sets the number of questions.
*
* @param numberOfQuestions the number of questions
* @throws IllegalArgumentException the illegal argument exception
*/
public void setNumberOfQuestions(int numberOfQuestions)
throws IllegalArgumentException {
if (numberOfQuestions < 0) {
throw new IllegalArgumentException("numberOfQuestions < 0");
}
this.numberOfQuestions = numberOfQuestions;
}
34
63. Genera+ng
high-‐quality
API
documenta+on
/**
* The number of questions.
*/
private int numberOfQuestions;
/**
* Sets the number of questions.
*
* @param numberOfQuestions the number of questions
* @throws IllegalArgumentException the illegal argument exception
*/
public void setNumberOfQuestions(int numberOfQuestions)
throws IllegalArgumentException {
if (numberOfQuestions < 0) {
throw new IllegalArgumentException("numberOfQuestions < 0");
}
this.numberOfQuestions = numberOfQuestions;
}
34
64. Genera+ng
high-‐quality
API
documenta+on
/**
* The number of questions.
*/
private int numberOfQuestions;
/**
* Sets the number of questions.
*
* @param numberOfQuestions the number of questions
* @throws IllegalArgumentException the illegal argument exception
*/
public void setNumberOfQuestions(int numberOfQuestions)
throws IllegalArgumentException {
if (numberOfQuestions < 0) {
throw new IllegalArgumentException("numberOfQuestions < 0");
}
this.numberOfQuestions = numberOfQuestions;
}
34
65. Genera+ng
high-‐quality
API
documenta+on
/**
* The number of questions.
*/
private int numberOfQuestions;
/**
* Sets the number of questions.
*
* @param numberOfQuestions the number of questions
* @throws IllegalArgumentException the illegal argument exception
*/
public void setNumberOfQuestions(int numberOfQuestions)
throws IllegalArgumentException {
if (numberOfQuestions < 0) {
throw new IllegalArgumentException("numberOfQuestions < 0");
}
this.numberOfQuestions = numberOfQuestions;
}
34
66. Genera+ng
high-‐quality API
documenta+on
high-‐quality
/**
* The number of questions.
*/
private int numberOfQuestions;
/**
* Sets the number of questions.
*
* @param numberOfQuestions the number of questions
* @throws IllegalArgumentException the illegal argument exception
*/
public void setNumberOfQuestions(int numberOfQuestions)
throws IllegalArgumentException {
if (numberOfQuestions < 0) {
throw new IllegalArgumentException("numberOfQuestions < 0");
}
this.numberOfQuestions = numberOfQuestions;
}
35
67. Genera+ng
high-‐quality
API
documenta+on
/**
* The number of questions.
*/
private int numberOfQuestions;
/**
* Sets the number of questions.
*
* @param numberOfQuestions the number of questions
* @throws IllegalArgumentException the illegal argument exception
*/
public void setNumberOfQuestions(int numberOfQuestions)
throws IllegalArgumentException {
if (numberOfQuestions < 0) {
throw new IllegalArgumentException("numberOfQuestions < 0");
}
this.numberOfQuestions = numberOfQuestions;
}
35
69. What
people
say
about
JAutodoc...
User: Anonymous Rating: 9 2009-08-02 11:32:37
Wow exactly what I needed!
36
70. What
people
say
about
JAutodoc...
User: Anonymous Rating: 9 2009-08-02 11:32:37
Wow exactly what I needed!
User: Anonymous Rating: 9 2009-02-13 19:58:32
Thank you... this plugin rocks!
36
71. What
people
say
about
JAutodoc...
User: Anonymous Rating: 9 2009-08-02 11:32:37
Wow exactly what I needed!
User: Anonymous Rating: 9 2009-02-13 19:58:32
Thank you... this plugin rocks!
User: Anonymous Rating: 9 2009-02-13 19:58:32
Works perfectly. Smarter than I expected!
36
72. What
people
say
about
JAutodoc...
User: Anonymous Rating: 9 2009-08-02 11:32:37
Wow exactly what I needed!
User: Anonymous Rating: 9 2009-02-13 19:58:32
Thank you... this plugin rocks!
User: Anonymous Rating: 9 2009-02-13 19:58:32
Works perfectly. Smarter than I expected!
WTH?
What
did
you
expect?!
36
74. Some
facts
about
the
documentaEon
of
overridable
methods
Overridable 2.074
Overridden 623
0 700 1400 2100
38
75. What
clients
do
with
your
API...
Overridden 623
Documented * 155
0 325 650
*
documented
as
overridable
by
using
phrases
like
“clients
may/should/must
override/extend
this
method” 39
76. What
clients
do
with
your
API...
Overridden 623
Documented * 155 468
0 325 650
*
documented
as
overridable
by
using
phrases
like
“clients
may/should/must
override/extend
this
method” 39
77. What
documenta+on
would
you
expect
when
subclassing
Dialog?
package org.eclipse.recommenders.examples.demo;
import org.eclipse.jface.dialogs.Dialog;
import org.eclipse.jface.window.IShellProvider;
public class MyDialog extends Dialog {
protected MyDialog(final IShellProvider parentShell) {
super(parentShell);
}
}
40
79. What
Javadoc
gives
you...
org.eclipse.jface.dialogs.Dialog
A
dialog
is
a
specialized
window
used
for
narrow-‐focused
communicaEon
with
the
user.
41
80. What
Javadoc
gives
you...
org.eclipse.jface.dialogs.Dialog
A
dialog
is
a
specialized
window
used
for
narrow-‐focused
communicaEon
with
the
user.
Dialogs
are
usually
modal.
Consequently,
it
is
generally
bad
pracEce
to
open
a
dialog
without
a
parent.
A
modal
dialog
without
a
parent
is
not
prevented
from
disappearing
behind
the
applicaEon's
other
windows,
making
it
very
confusing
for
the
user.
If
there
is
more
than
one
modal
dialog
is
open
the
second
one
should
be
parented
off
of
the
shell
of
the
first
one
otherwise
it
is
possible
that
the
OS
will
cus
to
the
first
dialog
potenEally
blocking
the
UI.
41
81. What
Javadoc
gives
you...
org.eclipse.jface.dialogs.Dialog
A
dialog
is
a
specialized
window
used
for
narrow-‐focused
communicaEon
with
the
user.
Dialogs
are
usually
modal.
Consequently,
it
is
generally
bad
pracEce
to
open
a
dialog
without
a
parent.
A
modal
dialog
without
a
parent
is
not
prevented
from
But what are the
disappearing
behind
the
applicaEon's
other
windows,
making
it
very
confusing
for
the
user.
hot-spots of Dialog?
If
there
is
more
than
one
modal
dialog
is
open
the
second
one
should
be
parented
off
of
the
shell
of
the
first
one
otherwise
it
is
possible
that
the
OS
will
cus
to
the
first
dialog
potenEally
blocking
the
UI.
41
95. 20
Number
for
koders.com
in
2009
according
to
“Analyzing
and
mining
a
code
search
engine
usage
log”
h`p://dx.doi.org/10.1007/s10664-‐010-‐9144-‐6 53
96. Naviga+ng
the
API
jungle…
private CompilationUnit createCompilationUnit(String source) {
// how can I create and configure an ASTParser?
ASTParser parser = null;
parser.setSource(source.toCharArray());
// ASTParser --> CompilationUnit: how?
CompilationUnit cu = null;
return cu;
}
54
97. Naviga+ng
the
API
jungle…
private CompilationUnit createCompilationUnit(String source) {
// how can I create and configure an ASTParser?
ASTParser parser = null;
parser.setSource(source.toCharArray());
// ASTParser --> CompilationUnit: how?
CompilationUnit cu = null;
return cu;
}
How
to
solve
String
-‐>
ASTParser
-‐>
CompilaKonUnit?
54
106. Example
code
search
engine
public class MyJavaEditor extends EditorPart {
private CompilationUnit createCompilationUnit(String source) {
// how can I create and configure an ASTParser?
ASTParser parser = null;
parser.setSource(source.toCharArray());
// ASTParser --> CompilationUnit: how?
CompilationUnit cu = null;
return cu;
}
57
107. Example
code
search
engine
public class MyJavaEditor extends EditorPart {
private CompilationUnit createCompilationUnit(String source) {
// how can I create and configure an ASTParser?
ASTParser parser = null;
parser.setSource(source.toCharArray());
// ASTParser --> CompilationUnit: how?
CompilationUnit cu = null;
return cu;
}
57
108. Example
code
search
engine
public class MyJavaEditor extends EditorPart {
private CompilationUnit createCompilationUnit(String source) {
// how can I create and configure an ASTParser?
ASTParser parser = null;
parser.setSource(source.toCharArray());
Query
// ASTParser --> CompilationUnit: how?
CompilationUnit cu = null;
return cu;
}
57
109. Example
code
search
engine
public class MyJavaEditor extends EditorPart {
private CompilationUnit createCompilationUnit(String source) {
// how can I create and configure an ASTParser?
ASTParser parser = null;
parser.setSource(source.toCharArray());
Query
// ASTParser --> CompilationUnit: how?
CompilationUnit cu = null;
return cu;
}
57
110. Example
code
search
engine
public class MyJavaEditor extends EditorPart {
private CompilationUnit createCompilationUnit(String source) {
// how can I create and configure an ASTParser?
ASTParser parser = null;
parser.setSource(source.toCharArray());
Query
// ASTParser --> CompilationUnit: how?
CompilationUnit cu = null;
return cu;
}
57
111. Example
code
search
engine
public class MyJavaEditor extends EditorPart {
private CompilationUnit createCompilationUnit(String source) {
// how can I create and configure an ASTParser?
ASTParser parser = null;
parser.setSource(source.toCharArray());
Query
// ASTParser --> CompilationUnit: how?
CompilationUnit cu = null;
return cu;
}
57
112. Example
code
search
engine
public class MyJavaEditor extends EditorPart {
private CompilationUnit createCompilationUnit(String source) {
// how can I create and configure an ASTParser?
ASTParser parser = null;
parser.setSource(source.toCharArray());
Query
// ASTParser --> CompilationUnit: how?
CompilationUnit cu = null;
return cu;
}
57
113. Sample
search
query
Extracted from MyJavaEditor.createCompilationUnit():
--- data ---
extends: org.eclipse.ui.EditorPart
uses: org.eclipse.jdt.core.CompilationUnit
uses: org.eclipse.jdt.core.ASTParser
calls: org.eclipse.jdt.core.ASTParser.setSource(char[])
--- requested ---
def: org.eclipse.jdt.core.CompilationUnit (def=null)
def: org.eclipse.jdt.core.ASTParser (def=null)
.
t..
m en
elop
dev
In
58
114. “Why
is
Google
Codesearch
not
‘google
for
code
search’?
”
LEVERAGING
USER
FEEDBACK
TO
IMPROVE
CODE
SEARCH
ENGINES
137. So
far
we
have…
Intelligent
Code
CompleEon
69
138. So
far
we
have…
Intelligent
Code
CompleEon Extended
DocumentaEon
69
139. So
far
we
have…
Intelligent
Code
CompleEon Extended
DocumentaEon
Code
Example
Recommender
How
do
I
get
an
instance
of…?
69
140. So
far
we
have…
Intelligent
Code
CompleEon Extended
DocumentaEon
Smart
Bug
DetecEon Code
Example
Recommender
What
have
I
missed? How
do
I
get
an
instance
of…?
69
146. How
can
we
fix
that?
Don’t
stacktraces
share
some
commonali+es?
74
147. How
can
we
fix
that?
Don’t
stacktraces
share
some
commonali+es?
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3884)
at org.eclipse.swt.SWT.error(SWT.java:3799)
at org.eclipse.swt.SWT.error(SWT.java:3770)
at org.eclipse.swt.widgets.Widget.error(Widget.java:463)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355)
at org.eclipse.swt.widgets.ProgressBar.setSelection(ProgressBar.java:317)
at org.eclipselabs.cr.stacktraces.demo.ThreadDemo$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:619)
74
148. How
can
we
fix
that?
Don’t
stacktraces
share
some
commonali+es?
excepEon
type
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3884)
at org.eclipse.swt.SWT.error(SWT.java:3799)
at org.eclipse.swt.SWT.error(SWT.java:3770)
at org.eclipse.swt.widgets.Widget.error(Widget.java:463)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355)
at org.eclipse.swt.widgets.ProgressBar.setSelection(ProgressBar.java:317)
at org.eclipselabs.cr.stacktraces.demo.ThreadDemo$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:619)
74
149. How
can
we
fix
that?
Don’t
stacktraces
share
some
commonali+es?
excepEon
type message
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3884)
at org.eclipse.swt.SWT.error(SWT.java:3799)
at org.eclipse.swt.SWT.error(SWT.java:3770)
at org.eclipse.swt.widgets.Widget.error(Widget.java:463)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355)
at org.eclipse.swt.widgets.ProgressBar.setSelection(ProgressBar.java:317)
at org.eclipselabs.cr.stacktraces.demo.ThreadDemo$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:619)
74
150. How
can
we
fix
that?
Don’t
stacktraces
share
some
commonali+es?
excepEon
type message
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3884)
at org.eclipse.swt.SWT.error(SWT.java:3799)
at org.eclipse.swt.SWT.error(SWT.java:3770)
at org.eclipse.swt.widgets.Widget.error(Widget.java:463)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355)
at org.eclipse.swt.widgets.ProgressBar.setSelection(ProgressBar.java:317)
at org.eclipselabs.cr.stacktraces.demo.ThreadDemo$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:619)
stackframes
74
151. How
can
we
fix
that?
Don’t
stacktraces
share
some
commonali+es?
excepEon
type message
org.eclipse.swt.SWTException: Invalid thread access
at org.eclipse.swt.SWT.error(SWT.java:3884)
at org.eclipse.swt.SWT.error(SWT.java:3799)
at org.eclipse.swt.SWT.error(SWT.java:3770)
at org.eclipse.swt.widgets.Widget.error(Widget.java:463)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:355)
at org.eclipse.swt.widgets.ProgressBar.setSelection(ProgressBar.java:317)
at org.eclipselabs.cr.stacktraces.demo.ThreadDemo$1.run(Unknown Source)
at java.lang.Thread.run(Thread.java:619)
stackframes other
informaEon
74
185. Summary
Intelligent
Code
CompleEon Usage-‐Driven
Javadocs
Stacktrace
Search
Engine
Smart
Bug
DetecEon Code
Example
Recommender
x=
What
caused
that
stacktrace?
What
have
I
missed? How
do
I
get
an
instance
of…?
96
187. Where
does
IDE
2.0
improve
the
process?
Edit Code
Testing
Comprehend Task
Handling
Interruptions
…
98
188. Contributors
so
far…
Jan
Kassens,
Peter
Schroeder,
Daniel
Glöckner,
Maik
Görtz,
Johannes
Lerch,
Johannes
Born,
Mohsen
Parisay,
Andreas
Sewe,
SebasKan
Ahlfeld,
SebasKan
Kasten,
Daniel
Staesche,
David
Kalnischkies,
SebasKan
Wörner,
Boyan
Yurukov,
Jan
Stolzenburg,
Nico
Wombacher,
Dirk
Kröhan,
Florianrian
Jakob,
Julius
Rückert,
Steffen
Remus,
Christopher
Mann,
Stefan
Henss,
Andreas
Kaluza,
Nikolay
Shindov,
Michael
Novotny,
KrisKn
Arand,
Sinem
Emeröz,
Michael
Kutschke,
SebasKan
Proksch,
Tomasz
Kalbarczyk,
Marko
MarKn,
Sheip
Dargutev,
David
Schuld,
Jens
Krause,
KrisKjan
Madunic,
Daniel
Brandtner,
Roman
GeSo,
ChrisKan
Kilb,
Johannes
Kastl,
Dennis
Sänger,
Annie
Liu,
Markus
Migenda,
Tjark
Vandommele,
SebasKan
Denel,
Florian
Nöll,
Gary
Fritz,
Dennis
Siebert,
Peter
Sinzig,
Laura
Altmüller,
Paul
Schatygin,
Jan-‐Michael
Heller,
Minh
Hoang
Nguyen,
Sascha
Nordquist,
Paul
Emmanuel
Faidherbe,
...
99
190. Q
&
A
Intelligent
Code
CompleEon Usage-‐Driven
Javadocs
Stacktrace
Search
Engine
Smart
Bug
DetecEon Code
Example
Recommender
What
caused
that
stacktrace?
What
have
I
missed? How
do
I
get
an
instance
of…?
101