<html>
<body>
<div style="font-family: Verdana, Arial, Helvetica, Sans-Serif;">
<table bgcolor="#f9f3c9" width="100%" cellpadding="8" style="border: 1px #c9c399 solid;">
<tr>
<td>
This is an automatically generated e-mail. To reply, visit:
<a href="https://git.reviewboard.kde.org/r/118465/">https://git.reviewboard.kde.org/r/118465/</a>
</td>
</tr>
</table>
<br />
<p>Ship it!</p>
<pre style="white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">I'm not sure if this is all which is needed, but it's certainly a very good start which will be easy to extend now. Thanks!</pre>
<br />
<div>
<table width="100%" border="0" bgcolor="white" style="border: 1px solid #C0C0C0; border-collapse: collapse; margin: 2px padding: 2px;">
<thead>
<tr>
<th colspan="4" bgcolor="#F0F0F0" style="border-bottom: 1px solid #C0C0C0; font-size: 9pt; padding: 4px 8px; text-align: left;">
<a href="https://git.reviewboard.kde.org/r/118465/diff/3/?file=277468#file277468line134" style="color: black; font-weight: bold; text-decoration: underline;">codecompletion/context.cpp</a>
<span style="font-weight: normal;">
(Diff revision 3)
</span>
</th>
</tr>
</thead>
<tbody>
<tr>
<th bgcolor="#b1ebb0" style="border-right: 1px solid #C0C0C0;" align="right"><font size="2"></font></th>
<td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "></pre></td>
<th bgcolor="#b1ebb0" style="border-left: 1px solid #C0C0C0; border-right: 1px solid #C0C0C0;" align="right"><font size="2">134</font></th>
<td bgcolor="#c5ffc4" width="50%"><pre style="font-size: 8pt; line-height: 140%; margin: 0; "> <span class="c1">// expression is an incomplete expression. Try to parse as much as possible</span></pre></td>
</tr>
</tbody>
</table>
<pre style="margin-left: 2em; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">What you actually want to do is not necessarily parse the largest possible expression, but the one which is relevant for your completion context. Which usually happens to be the largest one. ;)</pre>
</div>
<br />
<p>- Sven Brauch</p>
<br />
<p>On June 2nd, 2014, 1:57 p.m. UTC, Denis Steckelmacher wrote:</p>
<table bgcolor="#fefadf" width="100%" cellspacing="0" cellpadding="8" style="background-image: url('https://git.reviewboard.kde.org/static/rb/images/review_request_box_top_bg.ab6f3b1072c9.png'); background-position: left top; background-repeat: repeat-x; border: 1px black solid;">
<tr>
<td>
<div>Review request for KDevelop.</div>
<div>By Denis Steckelmacher.</div>
<p style="color: grey;"><i>Updated June 2, 2014, 1:57 p.m.</i></p>
<div style="margin-top: 1.5em;">
<b style="color: #575012; font-size: 10pt;">Repository: </b>
kdev-qmljs
</div>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Description </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
<tr>
<td>
<pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">This patch adds support for field member expressions ("base.identifier") to the QML/JS code-completion. When "something." is typed by the user, KDevelop displays the list of symbols accessible from the inner context of something. "something" can be any expression recognized by ExpressionVisitor, so this will continue to work when ExpressionVisitor will be able to recognize "table["test"][repository.getIndice()].".
The patch is inspired from how Python handles such completion. The idea is to try to parse as much as possible of the line being edited, in order to have the most complete AST possible. When this is done, ExpressionVisitor is given the current context and visits this partial AST. The declaration it returns (if any) is used to get the code-completion items.
The only thing that doesn't quite please me in this patch is that I parse the current line several times (each time with one character removed from the left). It means that if the user is editing a very long line (say 200 characters), QmlJS::Document::parse will be called up to 200 times! Is there another mean to detect which part of the current line contains a valid expression? Do you think that it would be worth it to complexify the code by trying to skip more than one character each time (for instance, by skipping directly to the next dot or bracket).</pre>
</td>
</tr>
</table>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Testing </h1>
<table width="100%" bgcolor="#ffffff" cellspacing="0" cellpadding="10" style="border: 1px solid #b8b5a0">
<tr>
<td>
<pre style="margin: 0; padding: 0; white-space: pre-wrap; white-space: -moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; word-wrap: break-word;">Manual testing shows that everything work as expected. For instance, the completions shown at the cursor (|) in this snippet are all the completions valid in button:
Label {
id: foo
bar: "baz"
Button {
id: button
property int my_property;
}
onTest: {
console.log(button.|); // my_property listed
}
}</pre>
</td>
</tr>
</table>
<h1 style="color: #575012; font-size: 10pt; margin-top: 1.5em;">Diffs</b> </h1>
<ul style="margin-left: 3em; padding-left: 0;">
<li>codecompletion/CMakeLists.txt <span style="color: grey">(9b62fb4)</span></li>
<li>codecompletion/context.h <span style="color: grey">(0683974)</span></li>
<li>codecompletion/context.cpp <span style="color: grey">(1e57197)</span></li>
</ul>
<p><a href="https://git.reviewboard.kde.org/r/118465/diff/" style="margin-left: 3em;">View Diff</a></p>
</td>
</tr>
</table>
</div>
</body>
</html>