Skip to content

Commit a872156

Browse files
committed
refactor to clarify the structure
1 parent 13e4fc1 commit a872156

37 files changed

+629
-608
lines changed

nim.cfg

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
--outdir:out
33
--sourceMap
44

5+
--path:"src/"
6+
57
define:nimsuggest
68
define:nodejs
79
define:js

src/nimvscode/nimBuild.nim renamed to src/nimBuild.nim

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,14 @@
1-
import vscodeApi
2-
import nimSuggestExec
3-
import nimUtils
4-
import jsNode
5-
import jsNodeCp
6-
import jsffi
7-
import jsPromise
8-
import jsNodeOs
9-
import jsString
10-
import jsre
11-
import jsconsole
12-
import sequtils
1+
## does the work to build whatever file the user is asking for or running a
2+
## nim check and handling the diagnostics.
3+
4+
import platform/vscodeApi
5+
import platform/js/[jsNodeCp, jsNodeOs, jsString, jsre]
6+
import std/[jsconsole, sequtils]
7+
from std/strformat import fmt
8+
import nimSuggestExec, nimUtils
139
from nimProjects import getProjects, isProjectMode, getProjectFileInfo,
1410
ProjectFileInfo, toLocalFile
15-
from nimBinTools import getNimExecPath
11+
from tools/nimBinTools import getNimExecPath
1612

1713
type
1814
CheckStacktrace* = ref object
@@ -48,6 +44,9 @@ proc nimExec(
4844
) =
4945
var execPath = getNimExecPath()
5046
if execPath.isNil() or execPath.strip() == "":
47+
vscode.window.showInformationMessage(
48+
"Binary named 'nim' not found in PATH environment variable"
49+
)
5150
resolve(@[])
5251
return
5352
@@ -66,7 +65,7 @@ proc nimExec(
6665
}
6766
6867
var executor = cp.spawn(
69-
getNimExecPath(),
68+
execPath,
7069
@[cmd] & args,
7170
SpawnOptions{cwd: project.wsFolder.uri.fsPath}
7271
)
@@ -297,6 +296,11 @@ proc execSelectionInTerminal*(#[ doc:VscodeTextDocument ]#) {.async.} =
297296
return
298297

299298
var execPath = getNimExecPath(executable)
299+
if execPath.isNil() or execPath.strip() == "":
300+
vscode.window.showInformationMessage(
301+
fmt"Binary named '{executable}' not found in PATH environment variable"
302+
)
303+
return
300304
evalTerminal = vscode.window.createTerminal("Nim Console")
301305
evalTerminal.show(preserveFocus = true)
302306
# previously was a setTimeout 3s, perhaps a valid pid works better

src/nimvscode/nimDeclaration.nim renamed to src/nimDeclaration.nim

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
import vscodeApi
1+
## maps nimsuggest to vscode definition provider, this allows goto definition
2+
3+
import platform/vscodeApi
24
import nimSuggestExec
3-
import jsNode
45

56
proc provideDefinition*(
67
doc: VscodeTextDocument,

src/nimvscode/nimFormatting.nim renamed to src/nimFormatting.nim

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
1-
import vscodeApi
2-
import nimUtils
3-
import jsNodeCp
4-
import jsNodeFs
5-
import jsconsole
6-
from strformat import fmt
1+
## this extension ain't pretty, but maybe your code might be? This works with
2+
## nim pretty to clean things up.
3+
4+
import platform/vscodeApi
5+
import platform/js/[jsNodeCp, jsNodeFs]
76

8-
from nimBinTools import getNimPrettyExecPath
7+
import std/jsconsole
8+
from std/strformat import fmt
9+
10+
import nimUtils
11+
from tools/nimBinTools import getNimPrettyExecPath
912

1013
var extensionContext*: VscodeExtensionContext
1114

src/nimvscode/nimHover.nim renamed to src/nimHover.nim

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import vscodeApi
1+
## maps nimsuggest to vscode hover providing, which in turn shows hovers or
2+
## tooltips, with the signature or docs for various symbols
3+
4+
import platform/vscodeApi
25
import nimSuggestExec
36
import nimMode
47

src/nimvscode/nimImports.nim renamed to src/nimImports.nim

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,11 @@
1-
import vscodeApi
2-
import jsNodeCp
3-
import jsNodeFs
4-
import jsNodePath
5-
import jsPromise
6-
import jsString
7-
import jsre
8-
import jsconsole
9-
import jsffi
1+
## supports auto-completion of module imports... this feels a bit janky
2+
3+
import platform/vscodeApi
4+
import platform/js/[jsNodeCp, jsNodeFs, jsNodePath, jsString, jsre]
5+
import std/jsconsole
106

117
from nimProjects import getProjects, isProjectMode
12-
from nimBinTools import getNimExecPath, getNimbleExecPath
8+
from tools/nimBinTools import getNimExecPath, getNimbleExecPath
139

1410
type
1511
NimbleModuleInfo = ref object
@@ -31,8 +27,16 @@ proc getNimDirectories(projectDir: cstring, projectFile: cstring): Promise[seq[c
3127
return newPromise(proc(
3228
resolve: proc(v: seq[cstring]), reject: proc(reasons: JsObject)
3329
) =
30+
let execPath = getNimExecPath()
31+
if execPath.isNil() or execPath.strip() == "":
32+
vscode.window.showInformationMessage(
33+
"Binary named 'nim' not found in PATH environment variable"
34+
)
35+
resolve(@[])
36+
return
37+
3438
discard cp.exec(
35-
getNimExecPath() & " dump " & projectFile,
39+
execPath & " dump " & projectFile,
3640
ExecOptions{cwd: projectDir},
3741
proc(err: ExecError, stdout: cstring, stderr: cstring): void =
3842
var res: seq[cstring] = @[]
@@ -77,8 +81,18 @@ proc walkDir(projectDir: cstring, rootDir: cstring, dir: cstring,
7781
proc initNimDirectories(projectDir: cstring, projectFile: cstring): Promise[void] =
7882
if nimModules[projectDir].toJs().to(bool):
7983
nimModules[projectDir] = @[]
84+
let
85+
execPath = getNimExecPath()
86+
nimRoot = path.dirname(path.dirname(execPath))
87+
88+
# we check this after setting `nimRoot`, but it shouldn't matter
89+
if execPath.isNil() or execPath.strip() == "":
90+
vscode.window.showInformationMessage(
91+
"Binary named 'nim' not found in PATH environment variable"
92+
)
93+
return
94+
8095
getNimDirectories(projectDir, projectFile).then(proc(dirs: seq[cstring]) =
81-
var nimRoot = path.dirname(path.dirname(getNimExecPath()))
8296
for dir in dirs:
8397
walkDir(projectDir, dir, dir, dir.startsWith(nimRoot))
8498
).toJs().to(Promise[void])

src/nimvscode/nimIndexer.nim renamed to src/nimIndexer.nim

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,16 @@
1-
import vscodeApi
2-
import jsffi
3-
import sequtils
1+
## this crawls the file system and indexes files and types so they're available
2+
## for search providers (document, symbol, and outline). It caches this
3+
## data inside our silly little flatfile database and reuses it between runs
4+
## timestamps are used for invalidating the cache.
45

5-
import nimStatus
6-
import nimSuggestExec
6+
import platform/vscodeApi
7+
import platform/js/[jsNodeFs, jsNodePath, jsString, jsre]
8+
import store/flatdbnode
79

8-
import flatdbnode
10+
import std/[jsconsole, sequtils, asyncjs]
11+
from std/jscore import Math, max
912

10-
import jsNode
11-
import jsNodeFs
12-
import jsNodePath
13-
import jsPromise
14-
import asyncjs
15-
import jsre
16-
import jsString
17-
18-
import jsconsole
19-
20-
from jscore import Math, max
13+
import nimStatus, nimSuggestExec
2114

2215
let
2316
dbVersion: cint = 5

src/nimMode.nim

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
## this correspondes to the language mode for nim, better syntax highlighting
2+
## support for nims, nimble, cfg, fitlers, etc... will require this list to
3+
## grow and we'll need to support defaults.
4+
5+
import platform/vscodeApi
6+
7+
var mode*: VscodeDocumentFilter = VscodeDocumentFilter{
8+
language: "nim",
9+
scheme: "file"
10+
}

src/nimvscode/nimOutline.nim renamed to src/nimOutline.nim

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
1-
import vscodeApi
1+
## provides a list of symbols and documents so vscode can use them for search
2+
## results when you do symbol or document search.
3+
4+
import platform/vscodeApi
25
import nimIndexer
36

47
proc provideWorkspaceSymbols(

src/nimvscode/nimProjects.nim renamed to src/nimProjects.nim

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
# modules handles the concept of nim projects. Projects are the project file
22
# we pass to the compiler, nimsuggest, etc...
33

4-
from vscodeApi import VscodeWorkspaceFolder, VscodeWorkspaceConfiguration,
5-
vscode, getWorkspaceFolder, uriFile, asRelativePath, findFiles, get,
6-
newWorkspaceFolderLike, VscodeUri, VscodeUriChange, with, getConfiguration,
7-
VscodeConfigurationChangeEvent, affectsConfiguration
8-
import jsffi, jsPromise, jsString, jsNode, jsre
9-
from jsNodePath import path, isAbsolute, parse, ParsedPath, dirname
4+
from platform/vscodeApi import VscodeWorkspaceFolder,
5+
VscodeWorkspaceConfiguration, vscode, getWorkspaceFolder, uriFile,
6+
asRelativePath, findFiles, get, newWorkspaceFolderLike, VscodeUri,
7+
VscodeUriChange, with, getConfiguration, VscodeConfigurationChangeEvent,
8+
affectsConfiguration
9+
import std/jsffi
10+
import platform/js/[jsPromise, jsString, jsNode, jsre]
11+
from platform/js/jsNodePath import path, isAbsolute, parse, ParsedPath, dirname
1012

1113
type
1214
ProjectFileInfo* = ref object

0 commit comments

Comments
 (0)