Skip to content

Commit ec24a07

Browse files
Error Panel using F#
1 parent 36bd7cf commit ec24a07

File tree

7 files changed

+346
-75
lines changed

7 files changed

+346
-75
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,4 @@ Test/bin/
3434
packages
3535
paket.lock
3636
Test/Script.fsx
37+
Test/Script.fsx

build.fsx

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -76,26 +76,18 @@ let translateModules() =
7676
let moduleJS =
7777
[ yield "var CompositeDisposable = require('atom').CompositeDisposable;"
7878
yield "var child_process = require('child_process');"
79+
yield "window.$ = require('jquery');"
7980
yield ""
8081
yield "function wrappedFunScript() { \n" + coreJS + "\n }"
8182
yield "var _funcs = wrappedFunScript();"
8283
yield "var _self = _funcs[0]();"
8384
yield ""
84-
yield "var provider = {"
85-
yield "selector: '.source.fsharp',"
86-
yield "inclusionPriority: 1,"
87-
yield "excludeLowerPriority: true,"
88-
yield "getSuggestions: function(p1) {"
89-
yield "return _funcs[1](_self)(p1); }"
90-
yield "};"
9185
yield "module.exports = " + moduleName + " = {"
92-
yield "provide: function() {"
93-
yield "return provider; },"
94-
for i, m in Seq.zip [1 .. meths.Length] meths.[1 ..] do
86+
for i, m in Seq.zip [1 .. meths.Length] meths do
9587
let parNames = String.concat "" [ for j in 1 .. m.GetParameters().Length -> sprintf "p%i" j ]
9688
let parArgs = String.concat "" [ for j in 1 .. m.GetParameters().Length -> sprintf "(p%i)" j ]
9789
yield m.Name + ": function(" + parNames + ") {"
98-
yield " return _funcs[" + string (i+1) + "](_self)" + parArgs + "; }" +
90+
yield " return _funcs[" + string i + "](_self)" + parArgs + "; }" +
9991
( if i = meths.Length then "" else "," )
10092
yield "};" ]
10193
|> String.concat "\n"

src/atom-bindings.fsx

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,4 +101,21 @@ module Promise =
101101
let getRow (o: Options) : int = failwith "JS"
102102

103103
[<JSEmitInline("{0}.prefix")>]
104-
let getPrefix (o : Options) : string = failwith "JS"
104+
let getPrefix (o : Options) : string = failwith "JS"
105+
106+
module Workspace =
107+
type Options = {item : obj; visible : bool; priority : int}
108+
109+
type Panel = class end
110+
111+
[<JSEmitInline("atom.workspace.addBottomPanel({0})")>]
112+
let addBotomPanel(o : Options) : Panel = failwith "JS"
113+
114+
[<JSEmitInline("{0}.hide()")>]
115+
let hidePanel(p : Panel) : unit = failwith "JS"
116+
117+
[<JSEmitInline("{0}.show()")>]
118+
let showPanel(p : Panel) : unit = failwith "JS"
119+
120+
121+

src/autocomplete-fs/lib/autocomplete-fs.js

Lines changed: 207 additions & 53 deletions
Large diffs are not rendered by default.

src/autocomplete-fs/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
"atom": ">=0.174.0 <2.0.0"
1313
},
1414
"dependencies": {
15+
"jquery": "2.1.3"
1516
},
1617
"providedServices": {
1718
"autocomplete.provider": {

src/autocomplete-fs/styles/autocomplete-fs.less

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,53 @@
66

77
.autocomplete-fs {
88
}
9+
10+
.border-flip (@a) when (lightness(@a) >= 50%) {
11+
border: 1px solid darken(@tool-panel-background-color, 30%);
12+
}
13+
.border-flip (@a) when (lightness(@a) < 50%) {
14+
border: 1px solid lighten(@tool-panel-background-color, 20%);
15+
}
16+
17+
.error-pane {
18+
overflow-y: scroll;
19+
height:150px;
20+
position:relative;
21+
.error-table {
22+
width:100%;
23+
line-height: 1.42;
24+
th {
25+
.border-flip(@tool-panel-background-color);
26+
border-top: 1px solid transparent;
27+
padding:2px;
28+
padding-top:0px;
29+
}
30+
tr.selected {
31+
background-color: @background-color-selected;
32+
}
33+
tr:hover {
34+
background-color: @background-color-selected;
35+
color: @text-color-selected;
36+
cursor:pointer;
37+
}
38+
td {
39+
}
40+
}
41+
42+
pre {
43+
background: #161719;
44+
font-size: 10px;
45+
margin: 0px;
46+
padding: 0px;
47+
border:none;
48+
}
49+
.pending {
50+
color: @text-color-warning;
51+
}
52+
.success {
53+
color: @text-color-success;
54+
}
55+
.fail {
56+
color: @text-color-error;
57+
}
58+
}

src/autocomplete.fsx

Lines changed: 66 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,23 @@ open Atom.Promise
1414

1515
module AutocompleteResults =
1616
type CompletionResult = {Kind : string; Data : string []}
17-
type ParseResult = {Kind : string; Data : string []}
17+
18+
19+
type Error = {
20+
StartLine : int
21+
StartLineAlternate : int
22+
StartColumn : int
23+
StartColumnAlternate : int
24+
EndLine : int
25+
EndLineAlternate : int
26+
EndColumn : int
27+
EndColumnAlternate : int
28+
Message : string
29+
Severity : string
30+
Subcategory : string
31+
}
32+
33+
type ParseResult = {Kind : string; Data : Error []}
1834

1935
module AutocompleteService =
2036
type State =
@@ -109,6 +125,11 @@ module AutocompleteHandler =
109125
service |> AutocompleteService.ask str 1 cb
110126

111127
module AutocompleteProvider =
128+
129+
type Provider = {selector : string; inclusionPriority : int; excludeLowerPriority: bool; getSuggestions : Options.Options -> Promise }
130+
131+
132+
112133
let getSuggestion service options =
113134
let path = options |> Atom.Promise.Options.getPath
114135
let row = (options |> Atom.Promise.Options.getRow) + 1
@@ -134,13 +155,14 @@ module AutocompleteProvider =
134155
| ex -> Atom.Promise.resolve [||]
135156
service |> AutocompleteHandler.parseCurrent (fun _ -> service |> AutocompleteHandler.completion path row col action |> ignore) |> ignore)
136157

158+
159+
let create service = { selector = ".source.fsharp"; inclusionPriority = 1; excludeLowerPriority = true; getSuggestions = getSuggestion service}
160+
137161
module HighlighterHandler =
138162
let mutable marked = Array.empty<Marker>
139163

140164
let handle lst =
141-
//iter(marked, destroyMarker)
142-
//NOT WORKING
143-
marked |> Array.iter(fun i -> i|> destroyMarker)
165+
marked |> Array.iter(destroyMarker)
144166
marked <- Array.empty<Marker>
145167
let editor = getActiveTextEditor()
146168
let action item =
@@ -149,24 +171,58 @@ module HighlighterHandler =
149171
let cls = if getItemSeverity(item) = "Warning" then "highlight-warning" else "highlight-error"
150172
marked <- Array.append [|marker|] marked
151173
decorateMarker(editor, marker, cls)
152-
iter(lst, action)
174+
lst |> Array.iter(action)
153175
()
154-
//NOT WORKING
155-
//lst |> List.iter(action)
156176

177+
module Views =
178+
let jq(selector : string) = Globals.Dollar.Invoke selector
179+
let (?) jq name = jq("#" + name)
180+
181+
module ErrorRowView =
182+
let create (e : AutocompleteResults.Error) =
183+
sprintf "<tr><td>%d : %d</td><td>%s</td><td>%s</td><td>%s</td></tr>"
184+
e.StartLineAlternate
185+
e.StartColumn
186+
e.Message
187+
e.Severity
188+
e.Subcategory
189+
|> jq
190+
191+
192+
module ErrorPanelView =
193+
let handle lst =
194+
let list = jq("#errorList")
195+
list.children().remove() |> ignore
196+
lst |> Array.iter(fun e -> let t = e |> ErrorRowView.create
197+
let r = t |> list.append
198+
())
199+
200+
let create () =
201+
"<div class='tool-panel panel-bottom error-pane' id='pane'><div class='inset-panel'><div class='panel-heading clearfix'>Errors</div><table class='error-table'><thead><th>Position</th><th>Message</th><th>Type</th><th>Category</th></thead><tbody id='errorList'></table></div></div>"
202+
|> jq
203+
204+
let hadnleEditorChange panel editor =
205+
if editor |> getEditorGrammarName = "F#" then Workspace.showPanel panel else Workspace.hidePanel panel
157206

158207
type Autocomplete() =
159208
let cd = CompositeDisposable.create()
160209
let service = AutocompleteService.create
161210
|> AutocompleteService.start
162211
|> AutocompleteService.send "outputmode json\n"
163-
164-
member x.getSuggestion(options : Atom.Promise.Options.Options) =
165-
AutocompleteProvider.getSuggestion service options
212+
213+
let panel =
214+
let t = Views.ErrorPanelView.create ()
215+
Workspace.addBotomPanel {Workspace.item = t; Workspace.priority = 100; Workspace.visible = false}
216+
217+
member x.provide ()=
218+
AutocompleteProvider.create service
166219

167220
member x.activate(state:obj) =
168221
onDidChangeActivePaneItem (fun ed -> AutocompleteHandler.parseEditor ed (fun _ -> ()) service |> ignore)
222+
onDidChangeActivePaneItem (Views.ErrorPanelView.hadnleEditorChange panel)
169223
on("FSharp.Atom:Highlight", HighlighterHandler.handle)
224+
on("FSharp.Atom:Highlight", Views.ErrorPanelView.handle)
225+
()
170226

171227
member x.deactivate() =
172228
CompositeDisposable.dispose(cd)

0 commit comments

Comments
 (0)