11import * as path from "path" ;
22import * as fs from "fs" ;
33import * as os from "os" ;
4+ import { DocumentUri } from "vscode-languageclient" ;
5+
6+ /*
7+ * Much of the code in here is duplicated from the server code.
8+ * At some point we should move the functionality powered by this
9+ * to the server itself.
10+ */
11+
12+ type binaryName = "rescript-editor-analysis.exe" | "rescript-tools.exe" ;
413
514const platformDir =
615 process . arch === "arm64" ? process . platform + process . arch : process . platform ;
716
8- const analysisDevPath = path . join (
9- path . dirname ( __dirname ) ,
10- ".." ,
11- "analysis" ,
12- "rescript-editor-analysis.exe"
13- ) ;
14-
15- export const analysisProdPath = path . join (
16- path . dirname ( __dirname ) ,
17- ".." ,
18- "server" ,
19- "analysis_binaries" ,
20- platformDir ,
21- "rescript-editor-analysis.exe"
22- ) ;
23-
24- export const getAnalysisBinaryPath = ( ) : string | null => {
25- if ( fs . existsSync ( analysisDevPath ) ) {
26- return analysisDevPath ;
27- } else if ( fs . existsSync ( analysisProdPath ) ) {
28- return analysisProdPath ;
17+ const getLegacyBinaryDevPath = ( b : binaryName ) =>
18+ path . join ( path . dirname ( __dirname ) , ".." , "analysis" , b ) ;
19+
20+ export const getLegacyBinaryProdPath = ( b : binaryName ) =>
21+ path . join (
22+ path . dirname ( __dirname ) ,
23+ ".." ,
24+ "server" ,
25+ "analysis_binaries" ,
26+ platformDir ,
27+ b
28+ ) ;
29+
30+ export const getBinaryPath = (
31+ binaryName : "rescript-editor-analysis.exe" | "rescript-tools.exe" ,
32+ projectRootPath : string
33+ ) : string | null => {
34+ const binaryFromCompilerPackage = path . join (
35+ projectRootPath ,
36+ "node_modules" ,
37+ "rescript" ,
38+ platformDir ,
39+ binaryName
40+ ) ;
41+
42+ if ( fs . existsSync ( binaryFromCompilerPackage ) ) {
43+ return binaryFromCompilerPackage ;
44+ } else if ( fs . existsSync ( getLegacyBinaryDevPath ( binaryName ) ) ) {
45+ return getLegacyBinaryDevPath ( binaryName ) ;
46+ } else if ( fs . existsSync ( getLegacyBinaryProdPath ( binaryName ) ) ) {
47+ return getLegacyBinaryProdPath ( binaryName ) ;
2948 } else {
3049 return null ;
3150 }
@@ -39,3 +58,22 @@ export const createFileInTempDir = (prefix = "", extension = "") => {
3958 tempFileId = tempFileId + 1 ;
4059 return path . join ( os . tmpdir ( ) , tempFileName ) ;
4160} ;
61+
62+ export let findProjectRootOfFileInDir = (
63+ source : DocumentUri
64+ ) : null | DocumentUri => {
65+ let dir = path . dirname ( source ) ;
66+ if (
67+ fs . existsSync ( path . join ( dir , "rescript.json" ) ) ||
68+ fs . existsSync ( path . join ( dir , "bsconfig.json" ) )
69+ ) {
70+ return dir ;
71+ } else {
72+ if ( dir === source ) {
73+ // reached top
74+ return null ;
75+ } else {
76+ return findProjectRootOfFileInDir ( dir ) ;
77+ }
78+ }
79+ } ;
0 commit comments