Skip to content

Commit abf6f93

Browse files
Merge branch 'forge'
2 parents e65080c + e51fb36 commit abf6f93

File tree

9 files changed

+179
-7
lines changed

9 files changed

+179
-7
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
release/bin
22
release/bin_ff
3+
release/bin_forge
34

45
# Logs
56
logs

build.fsx

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
// --------------------------------------------------------------------------------------
44

55
#I "packages/FAKE/tools"
6-
#r "packages/FAKE/tools/FakeLib.dll"
6+
#r "packages/FAKE/tools/FakeLib.dll"
77
open System
88
open System.Diagnostics
99
open System.IO
@@ -30,7 +30,8 @@ open Fake.ZipHelper
3030
#load "src/Components/Fsi.fs"
3131
#load "src/Components/QuickInfo.fs"
3232
#load "src/Components/FSharpFormatting.fs"
33-
#load "src/Components/WebPreview.fs"
33+
#load "src/Components/Webpreview.fs"
34+
#load "src/Components/Forge.fs"
3435
#load "src/fsharp.fs"
3536
#load "src/main.fs"
3637

@@ -113,6 +114,18 @@ Target "CopyFSAC" (fun _ ->
113114
|> CopyFiles releaseBin
114115
)
115116

117+
let releaseBinForge = "release/bin_forge"
118+
let forgeBin = "paket-files/github.com/fsprojects/Forge/temp/bin"
119+
120+
Target "CopyForge" (fun _ ->
121+
ensureDirectory releaseBinForge
122+
CleanDir releaseBinForge
123+
124+
!! (forgeBin </> "Forge.exe" )
125+
++ (forgeBin </> "Mono.Posix.dll")
126+
|> CopyFiles releaseBinForge
127+
)
128+
116129
let releaseBinFF = "release/bin_ff"
117130
let ffbin = "paket-files/github.com/ionide/FSharpFormatting.CLI/build"
118131

@@ -234,6 +247,7 @@ Target "Release" DoNothing
234247
==> "RunScript"
235248
==> "CopyFSAC"
236249
==> "CopyFSharpFormatting"
250+
==> "CopyForge"
237251
==> "CopyGrammar"
238252
==> "Build"
239253

paket.dependencies

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ source https://nuget.org/api/v2
33
git https://github.com/ionide/ionide-vscode-helpers.git master build:"build.cmd"
44
git https://github.com/ionide/FSharpFormatting.CLI.git master build:"build.cmd"
55
git https://github.com/ionide/FsAutoComplete.git dotnetcore build:"build.cmd LocalRelease"
6+
git https://github.com/fsprojects/Forge.git master build:"build.cmd"
67
git [email protected]:ionide/ionide-fsgrammar.git
78

89
nuget FAKE

paket.lock

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,9 @@ GIT
2323
remote: https://github.com/ionide/FsAutoComplete.git
2424
(e291884b2b52da09f24924a899e8ac84be42c9bc)
2525
build: build.cmd LocalRelease
26+
remote: https://github.com/fsprojects/Forge.git
27+
(0ce0281d45e8f7368f447fc33bf22406b4992801)
28+
build: build.cmd
2629
remote: [email protected]:ionide/ionide-fsgrammar.git
2730
(8061b5296321522633b16d7df66af8cf5fcd3784)
2831
GITHUB

release/fsharp.configuration.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,7 @@
1212
["[", "]"],
1313
["(", ")"],
1414
["\"", "\""],
15-
["'", "'"],
1615
["(*", "*)"],
17-
["'", "'"],
1816
["<@", "@>"]
1917
]
2018
}

release/package.json

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,10 +77,35 @@
7777
{
7878
"command": "webpreview.Refresh",
7979
"title": "Ionide: Refresh Web View"
80+
},
81+
{
82+
"command": "fsharp.MoveFileUp",
83+
"title": "F#: Move File Up"
84+
},
85+
{
86+
"command": "fsharp.MoveFileDown",
87+
"title": "F#: Move File Down"
88+
},
89+
{
90+
"command": "fsharp.NewProject",
91+
"title": "F#: New Project"
92+
},
93+
{
94+
"command": "fsharp.RefreshProjectTemplates",
95+
"title": "F#: Refresh Project Templates"
96+
},
97+
{
98+
"command": "fsharp.AddFileToProject",
99+
"title": "F#: Add Current File To Project"
100+
},
101+
{
102+
"command": "fsharp.RemoveFileFromProject",
103+
"title": "F#: Remove Current File From Project"
80104
}
81105
],
82106
"outputChannels": [
83-
"F# Interactive"
107+
"F# Interactive",
108+
"Forge"
84109
],
85110
"keybindings": [
86111
{
@@ -92,6 +117,14 @@
92117
"command": "fsi.SendSelection",
93118
"key": "alt+Enter",
94119
"mac": "alt+Enter"
120+
},
121+
{
122+
"command": "fsharp.MoveFileUp",
123+
"key": "ctrl+shift+up"
124+
},
125+
{
126+
"command": "fsharp.MoveFileDown",
127+
"key": "ctrl+shift+down"
95128
}
96129
]
97130
},
@@ -102,7 +135,9 @@
102135
"onCommand:fsi.SendSelection",
103136
"onCommand:fsi.SendFile",
104137
"onCommand:fsharp.Methods",
105-
"onCommand:webpreview.Show"
138+
"onCommand:webpreview.Show",
139+
"onCommand:fsharp.NewProject",
140+
"onCommand:fsharp.RefreshProjectTemplates"
106141
],
107142
"extensionDependencies": [
108143
"vscode.fsharp"

src/Components/Forge.fs

Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
namespace Ionide.VSCode.FSharp
2+
3+
open System
4+
open FunScript
5+
open FunScript.TypeScript
6+
open FunScript.TypeScript.vscode
7+
open FunScript.TypeScript.vscode.languages
8+
open FunScript.TypeScript.path
9+
open FunScript.TypeScript.fs
10+
11+
open DTO
12+
open Ionide.VSCode.Helpers
13+
14+
[<ReflectedDefinition>]
15+
module Forge =
16+
17+
let (</>) a b =
18+
if Process.isWin ()
19+
then a + @"\" + b
20+
else a + "/" + b
21+
22+
let private location = (VSCode.getPluginPath "Ionide.Ionide-fsharp") </> "bin_forge" </> "Forge.exe"
23+
24+
let private spawnForge (cmd : string) =
25+
let cmd = cmd.Replace("\r", "").Replace("\n", "")
26+
let outputChannel = window.Globals.createOutputChannel "Forge"
27+
outputChannel.clear ()
28+
outputChannel.append ("forge " + cmd + "\n")
29+
30+
Process.spawnWithNotification location "mono" cmd outputChannel
31+
32+
33+
let private execForge cmd =
34+
Process.exec location "mono" cmd
35+
36+
let private handleForgeList (error : FunScript.TypeScript.Error, stdout : Buffer, stderr : Buffer) =
37+
if(stdout.toString() = "") then
38+
[||]
39+
else
40+
stdout.toString().Split('\n')
41+
|> Array.filter((<>) "" )
42+
43+
let onFsFileCreateHandler (uri : Uri) =
44+
sprintf "add file -n %s" uri.fsPath |> spawnForge
45+
46+
let onFsFileRemovedHandler (uri : Uri) =
47+
sprintf "remove file -n %s" uri.fsPath |> spawnForge
48+
49+
let moveFileUp () =
50+
let editor = vscode.window.Globals.activeTextEditor
51+
if editor.document.languageId = "fsharp" then
52+
sprintf "move file -n %s -u" editor.document.fileName |> spawnForge |> ignore
53+
54+
let moveFileDown () =
55+
let editor = vscode.window.Globals.activeTextEditor
56+
if editor.document.languageId = "fsharp" then
57+
sprintf "move file -n %s -d" editor.document.fileName |> spawnForge |> ignore
58+
59+
let refreshTemplates () =
60+
let cp = "refresh" |> spawnForge
61+
cp.on("exit", (fun _ -> window.Globals.showInformationMessage "Templates refreshed") |> unbox )
62+
63+
let addCurrentFileToProject () =
64+
let editor = vscode.window.Globals.activeTextEditor
65+
if editor.document.languageId = "fsharp" then
66+
sprintf "add file -n %s" editor.document.fileName |> spawnForge |> ignore
67+
68+
let removeCurrentFileFromProject () =
69+
let editor = vscode.window.Globals.activeTextEditor
70+
if editor.document.languageId = "fsharp" then
71+
sprintf "remove file -n %s" editor.document.fileName |> spawnForge |> ignore
72+
73+
let newProject () =
74+
"list templates"
75+
|> execForge
76+
|> Promise.success handleForgeList
77+
|> Promise.success (fun n ->
78+
if n.length <> 0. then
79+
window.Globals.showQuickPick (Promise.lift n)
80+
|> Promise.toPromise
81+
|> Promise.success (fun template ->
82+
if JS.isDefined template then
83+
let opts = createEmpty<InputBoxOptions> ()
84+
opts.prompt <- "Project directory"
85+
window.Globals.showInputBox (opts)
86+
|> Promise.toPromise
87+
|> Promise.success (fun dir ->
88+
let opts = createEmpty<InputBoxOptions> ()
89+
opts.prompt <- "Project name"
90+
window.Globals.showInputBox(opts)
91+
|> Promise.toPromise
92+
|> Promise.success (fun name ->
93+
sprintf "new project -n %s -t %s --folder %s" name template dir
94+
|> spawnForge
95+
)
96+
)
97+
|> ignore
98+
())
99+
else
100+
window.Globals.showInformationMessage "No templates found. Run `F#: Refresh Project Templates` command"
101+
|> Promise.toPromise
102+
|> Promise.success ignore )
103+
|> Promise.success (fun _ ->
104+
window.Globals.showInformationMessage "Project created"
105+
)
106+
107+
108+
let activate disposables =
109+
let watcher = workspace.Globals.createFileSystemWatcher ("**/*.fs")
110+
watcher.onDidCreate.Add(onFsFileCreateHandler, null, disposables)
111+
watcher.onDidDelete.Add(onFsFileRemovedHandler, null, disposables)
112+
commands.Globals.registerCommand("fsharp.MoveFileUp", moveFileUp |> unbox) |> ignore
113+
commands.Globals.registerCommand("fsharp.MoveFileDown", moveFileDown |> unbox) |> ignore
114+
commands.Globals.registerCommand("fsharp.NewProject", newProject |> unbox) |> ignore
115+
commands.Globals.registerCommand("fsharp.RefreshProjectTemplates", refreshTemplates |> unbox) |> ignore
116+
commands.Globals.registerTextEditorCommand("fsharp.AddFileToProject", addCurrentFileToProject |> unbox) |> ignore
117+
commands.Globals.registerTextEditorCommand("fsharp.RemoveFileFromProject", removeCurrentFileFromProject |> unbox) |> ignore
118+
()

src/Ionide.FSharp.fsproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<Compile Include="Components\QuickInfo.fs" />
5252
<Compile Include="Components\FSharpFormatting.fs" />
5353
<Compile Include="Components\WebPreview.fs" />
54+
<Compile Include="Components\Forge.fs" />
5455
<Compile Include="fsharp.fs" />
5556
<Compile Include="main.fs" />
5657
<None Include="vscode-bindings.fsx" />

src/fsharp.fs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ type FSharp() =
2020
let df' = [|df|]
2121

2222
LanguageService.start ()
23-
Project.activate ()
23+
Project.activate () |> ignore
2424
Linter.activate disposables
2525
Tooltip.activate df' disposables
2626
Autocomplete.activate df' disposables
@@ -34,6 +34,7 @@ type FSharp() =
3434
QuickInfo.activate disposables
3535
FSharpFormatting.activate disposables
3636
WebPreview.activate disposables
37+
Forge.activate disposables
3738

3839
()
3940

0 commit comments

Comments
 (0)