Skip to content

Commit b90d989

Browse files
committed
Merge pull request #2686 from ldoblies/master
Added quickfix framework
2 parents f8ebaa7 + e18f45c commit b90d989

File tree

10 files changed

+634
-5
lines changed

10 files changed

+634
-5
lines changed
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
define(function(require, exports, module) {
2+
"use strict";
3+
4+
var markerResolution = require('ext/language/MarkerResolution').MarkerResolution;
5+
var Range = require("ace/range").Range;
6+
7+
var JSResolver = function(value, ast){
8+
this.addResolutions = function(markers){
9+
var _self = this;
10+
markers.forEach(function(curMarker) {
11+
curMarker.resolutions = _self.getResolutions(curMarker);
12+
});
13+
};
14+
15+
this.getResolutions = function(marker){
16+
var type = this.getType(marker);
17+
if (type){
18+
if (typeof this[type] === 'function'){
19+
return this[type](marker);
20+
}
21+
}
22+
return [];
23+
};
24+
25+
this.getType = function(marker){
26+
var msg = marker.message;
27+
if (msg.indexOf("Missing semicolon") !== -1){
28+
return "missingSemicolon";
29+
} else if (msg.indexOf("Unnecessary semicolon") !== -1){
30+
return "unnecessarySemicolon";
31+
}
32+
};
33+
34+
this.missingSemicolon = function(marker){
35+
console.log(marker.pos);
36+
var label = "Add semicolon";
37+
var image = "";
38+
var row = marker.pos.sl;
39+
var column = marker.pos.sc;
40+
41+
var lines = value.split("\n");
42+
var before = lines[row].substring(0, column);
43+
var after = lines[row].substring(column);
44+
var preview = "<b>Add semicolon</b><p>" + before + "<b>; </b>" + after + "</p>";
45+
46+
var insert = ";";
47+
if (after.length){
48+
insert += " ";
49+
}
50+
51+
var delta = {
52+
action: "insertText",
53+
range: new Range(row, column, row, column + insert.length),
54+
text: insert
55+
};
56+
57+
return [markerResolution(label, image, preview, [delta])];
58+
};
59+
60+
this.unnecessarySemicolon = function(marker){
61+
console.log(marker.pos);
62+
var label = "Remove semicolon";
63+
var image = "";
64+
var row = marker.pos.sl;
65+
var column = marker.pos.sc;
66+
67+
var lines = value.split("\n");
68+
var before = lines[row].substring(0, column);
69+
var after = lines[row].substring(column + 1);
70+
var preview = "<b>Remove semicolon</b><p>" + before + "<del>;</del>" + after + "</p>";
71+
72+
var delta = {
73+
action: "removeText",
74+
range: new Range(row, column, row, column + 1)
75+
};
76+
77+
return [markerResolution(label, image, preview, [delta])];
78+
};
79+
80+
};
81+
82+
exports.JSResolver = JSResolver;
83+
84+
});

plugins-client/ext.jslanguage/jshint.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ handler.analyzeSync = function(value, ast) {
7474
if(disabledJSHintWarnings[i].test(warning.reason))
7575
return;
7676
markers.push({
77-
pos: {
77+
pos: { // TODO quickfix framework needs el/ec in order to be able to select the issue in the editor
7878
sl: warning.line-1,
7979
sc: warning.character-1
8080
},
@@ -83,9 +83,11 @@ handler.analyzeSync = function(value, ast) {
8383
message: warning.reason
8484
});
8585
});
86+
8687
return markers;
8788
};
8889

90+
8991
/**
9092
* Gets an object like { foo: true } for JSHint global comments
9193
* like / * global foo: true * /

plugins-client/ext.jslanguage/scope_analyzer.js

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ var completeUtil = require("ext/codecomplete/complete_util");
1919
var handler = module.exports = Object.create(baseLanguageHandler);
2020
var outline = require("ext/jslanguage/outline");
2121
var jshint = require("ext/jslanguage/jshint");
22+
var JSResolver = require('ext/jslanguage/JSResolver').JSResolver;
23+
2224
require("treehugger/traverse"); // add traversal functions to trees
2325

2426
var CALLBACK_METHODS = ["forEach", "map", "reduce", "filter", "every", "some"];
@@ -260,6 +262,21 @@ handler.handlesLanguage = function(language) {
260262
return language === 'javascript';
261263
};
262264

265+
handler.getResolutions = function(value, ast, markers, callback){
266+
var resolver = new JSResolver(value, ast);
267+
resolver.addResolutions(markers);
268+
callback(markers);
269+
};
270+
271+
handler.hasResolution = function(value, ast, marker) {
272+
if (marker.resolutions && marker.resolutions.length){
273+
return true;
274+
}
275+
var resolver = new JSResolver(value, ast);
276+
return resolver.getType(marker);
277+
};
278+
279+
263280
var scopeId = 0;
264281

265282
var Variable = module.exports.Variable = function Variable(declaration) {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
2+
define(function(require, exports, module) {
3+
"use strict";
4+
5+
/**
6+
* data structure for resolutions, containing
7+
* a label (short description, to be displayed in the list of resolutions),
8+
* an image (to be displayed in the list of resolutions),
9+
* a preview,
10+
* an array of deltas (containing the changes to be applied),
11+
* the position where the cursor should be after applying
12+
*/
13+
var MarkerResolution = function(label, image, preview, deltas, cursorTarget){
14+
return {
15+
label: label,
16+
image: image,
17+
preview: preview,
18+
deltas: deltas,
19+
cursorTarget: cursorTarget
20+
};
21+
};
22+
23+
exports.MarkerResolution = MarkerResolution;
24+
25+
});

plugins-client/ext.language/base_handler.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,22 @@ module.exports = {
229229
*/
230230
jumpToDefinition: function(doc, fullAst, pos, currentNode, callback) {
231231
callback();
232+
},
233+
234+
/**
235+
* Invoked after markers were generated in analyze()
236+
* @return marker array with attached resolutions
237+
*/
238+
getResolutions: function(doc, fullAst, markers, callback) {
239+
callback();
240+
},
241+
242+
/**
243+
* @return true iff the resolver for this marker could generate
244+
* at least one resolution for it
245+
*/
246+
hasResolution: function(doc, fullAst, marker, callback) {
247+
callback();
232248
}
233249
};
234250

plugins-client/ext.language/language.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ var UIWorkerClient = require("ace/worker/worker_client").UIWorkerClient;
1717
var useUIWorker = window.location && /[?&]noworker=1/.test(window.location.search);
1818

1919
var complete = require("ext/language/complete");
20+
var quickfix = require("ext/language/quickfix");
2021
var marker = require("ext/language/marker");
2122
var refactor = require("ext/language/refactor");
2223
var outline = require("ext/language/outline");
@@ -92,6 +93,7 @@ module.exports = ext.register("ext/language/language", {
9293
outline.hook(_self, worker);
9394
keyhandler.hook(_self, worker);
9495
jumptodef.hook(_self, worker);
96+
quickfix.hook(_self);
9597

9698
ide.dispatchEvent("language.worker", {worker: worker});
9799
ide.addEventListener("$event.language.worker", function(callback){

plugins-client/ext.language/language.xml

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,4 +124,27 @@
124124
</a:hbox>
125125
</a:bar>
126126

127+
<a:bar id="barQuickfixCont" skinset="language_skin" skin="codecomplete" width="600" visible="false">
128+
<a:hbox id="txtQuickfixHolder" class="code_complete_text_holder" anchors="0 0 0 0" edge="5" width="290">
129+
<a:text id="txtQuickfix" skin="codecomplete_text" flex="1" />
130+
<a:scrollbar
131+
for = "txtQuickfix"
132+
id = "sbQuickfix"
133+
margin = "2"
134+
skin = "sbios"
135+
width = "7"
136+
overflow2 = "auto"/>
137+
</a:hbox>
138+
<a:hbox class="code_complete_text_holder" anchors="0 0 0 330" edge="5" minheight="100">
139+
<a:text id="txtQuickfixDoc" skin="codecompletedoc_text" flex="1" />
140+
<a:scrollbar
141+
for = "txtQuickfixDoc"
142+
id = "sbQuickfixDoc"
143+
margin = "2"
144+
skin = "sbios"
145+
width = "7"
146+
overflow2 = "auto"/>
147+
</a:hbox>
148+
</a:bar>
149+
127150
</a:application>

plugins-client/ext.language/marker.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,9 @@ module.exports = {
8383
var gutterAnno = {
8484
guttertext: anno.message,
8585
type: anno.level || "warning",
86-
text: anno.message
86+
text: anno.message,
87+
pos: anno.pos,
88+
resolutions: anno.resolutions
8789
// row will be filled in updateFloat()
8890
};
8991

0 commit comments

Comments
 (0)