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+ ()
0 commit comments