@@ -1303,30 +1303,28 @@ let rec getCompletionsForContextPath ~package ~opens ~rawOpens ~allFiles ~pos
1303
1303
} =
1304
1304
package.builtInCompletionModules
1305
1305
in
1306
- let getModulePath path =
1307
- let rec loop (path : Path.t ) =
1308
- match path with
1309
- | Pident id -> [Ident. name id]
1310
- | Pdot (p , s , _ ) -> s :: loop p
1311
- | Papply _ -> []
1312
- in
1306
+ let getBuiltinTypePath path =
1307
+ match path with
1308
+ | Path. Pident id when Ident. name id = " array" -> Some arrayModulePath
1309
+ | Path. Pident id when Ident. name id = " option" -> Some optionModulePath
1310
+ | Path. Pident id when Ident. name id = " string" -> Some stringModulePath
1311
+ | Path. Pident id when Ident. name id = " int" -> Some intModulePath
1312
+ | Path. Pident id when Ident. name id = " float" -> Some floatModulePath
1313
+ | Path. Pident id when Ident. name id = " promise" ->
1314
+ Some promiseModulePath
1315
+ | Path. Pident id when Ident. name id = " list" -> Some listModulePath
1316
+ | Path. Pident id when Ident. name id = " result" -> Some resultModulePath
1317
+ | Path. Pident id when Ident. name id = " lazy_t" -> Some [" Lazy" ]
1318
+ | Path. Pident id when Ident. name id = " char" -> Some [" Char" ]
1319
+ | _ -> None
1320
+ in
1321
+ let rec expandPath (path : Path.t ) =
1313
1322
match path with
1314
- | Path. Pident id when Ident. name id = " array" -> arrayModulePath
1315
- | Path. Pident id when Ident. name id = " option" -> optionModulePath
1316
- | Path. Pident id when Ident. name id = " string" -> stringModulePath
1317
- | Path. Pident id when Ident. name id = " int" -> intModulePath
1318
- | Path. Pident id when Ident. name id = " float" -> floatModulePath
1319
- | Path. Pident id when Ident. name id = " promise" -> promiseModulePath
1320
- | Path. Pident id when Ident. name id = " list" -> listModulePath
1321
- | Path. Pident id when Ident. name id = " result" -> resultModulePath
1322
- | Path. Pident id when Ident. name id = " lazy_t" -> [" Lazy" ]
1323
- | Path. Pident id when Ident. name id = " char" -> [" Char" ]
1324
- | _ -> (
1325
- match loop path with
1326
- | _ :: rest -> List. rev rest
1327
- | [] -> [] )
1323
+ | Pident id -> [Ident. name id]
1324
+ | Pdot (p , s , _ ) -> s :: expandPath p
1325
+ | Papply _ -> []
1328
1326
in
1329
- let getConstrPath typ =
1327
+ let getTypePath typ =
1330
1328
match typ.Types. desc with
1331
1329
| Tconstr (path, _typeArgs, _)
1332
1330
| Tlink {desc = Tconstr (path, _typeArgs, _)}
@@ -1335,12 +1333,6 @@ let rec getCompletionsForContextPath ~package ~opens ~rawOpens ~allFiles ~pos
1335
1333
Some path
1336
1334
| _ -> None
1337
1335
in
1338
- let fromType typ =
1339
- match getConstrPath typ with
1340
- | None -> None
1341
- | Some path -> Some (getModulePath path)
1342
- in
1343
- let lhsPath = fromType typ in
1344
1336
let rec removeRawOpen rawOpen modulePath =
1345
1337
match (rawOpen, modulePath) with
1346
1338
| [_], _ -> Some modulePath
@@ -1357,64 +1349,52 @@ let rec getCompletionsForContextPath ~package ~opens ~rawOpens ~allFiles ~pos
1357
1349
| Some mp -> mp)
1358
1350
| [] -> modulePath
1359
1351
in
1360
- match lhsPath with
1361
- | Some lhsPath -> (
1362
- match lhsPath with
1363
- | _ :: _ ->
1364
- let lhsPathMinusOpens =
1365
- lhsPath
1366
- |> removeRawOpens package.opens
1367
- |> removeRawOpens rawOpens |> String. concat " ."
1368
- in
1369
- let completionName name =
1370
- if lhsPathMinusOpens = " " then name
1371
- else lhsPathMinusOpens ^ " ." ^ name
1372
- in
1373
- let completions =
1374
- lhsPath @ [funNamePrefix]
1375
- |> getCompletionsForPath ~completion Context:Value ~exact: false
1376
- ~package ~opens ~all Files ~pos ~env ~scope
1377
- in
1378
- completions
1379
- |> List. map (fun (completion : Completion.t ) ->
1380
- {
1381
- completion with
1382
- name = completionName completion.name;
1383
- env
1384
- (* Restore original env for the completion after x->foo()... *) ;
1385
- })
1386
- | [] ->
1387
- (* Module paths coming directly from a completion item is prefixed with
1388
- file module name it was found in. We pluck that off here if the env
1389
- we're in is the same as the completion item was found in. This ensures
1390
- that a correct qualified path can be produced. *)
1391
- let completionPath =
1392
- match ModulePath. toFullPath completionItemModulePath with
1393
- | topModule :: rest when topModule = env.file.moduleName -> rest
1394
- | modulePath -> modulePath
1395
- in
1396
- let completionPathMinusOpens =
1397
- completionPath
1398
- |> removeRawOpens package.opens
1399
- |> removeRawOpens rawOpens |> String. concat " ."
1400
- in
1401
- let completionName name =
1402
- if completionPathMinusOpens = " " then name
1403
- else completionPathMinusOpens ^ " ." ^ name
1404
- in
1405
- let completions =
1406
- completionPath @ [funNamePrefix]
1407
- |> getCompletionsForPath ~completion Context:Value ~exact: false
1408
- ~package ~opens ~all Files ~pos ~env ~scope
1409
- in
1410
- completions
1411
- |> List. map (fun (completion : Completion.t ) ->
1412
- {
1413
- completion with
1414
- name = completionName completion.name;
1415
- env
1416
- (* Restore original env for the completion after x->foo()... *) ;
1417
- }))
1352
+ let completionPath =
1353
+ match getTypePath typ with
1354
+ | Some typePath -> (
1355
+ match getBuiltinTypePath typePath with
1356
+ | Some path -> Some path
1357
+ | None -> (
1358
+ match expandPath typePath with
1359
+ | _ :: rest when rest <> [] ->
1360
+ (* Assume a non-empty type path is coming from the compiler and
1361
+ can be used as-is. *)
1362
+ Some (List. rev rest)
1363
+ | _ -> (
1364
+ (* Module paths coming directly from a completion item is prefixed with
1365
+ file module name it was found in. We pluck that off here if the env
1366
+ we're in is the same as the completion item was found in. This ensures
1367
+ that a correct qualified path can be produced. *)
1368
+ match ModulePath. toFullPath completionItemModulePath with
1369
+ | topModule :: rest when topModule = env.file.moduleName ->
1370
+ Some rest
1371
+ | path -> Some path)))
1372
+ | None -> None
1373
+ in
1374
+ match completionPath with
1375
+ | Some completionPath ->
1376
+ let completionPathMinusOpens =
1377
+ completionPath
1378
+ |> removeRawOpens package.opens
1379
+ |> removeRawOpens rawOpens |> String. concat " ."
1380
+ in
1381
+ let completionName name =
1382
+ if completionPathMinusOpens = " " then name
1383
+ else completionPathMinusOpens ^ " ." ^ name
1384
+ in
1385
+ let completions =
1386
+ completionPath @ [funNamePrefix]
1387
+ |> getCompletionsForPath ~completion Context:Value ~exact: false
1388
+ ~package ~opens ~all Files ~pos ~env ~scope
1389
+ in
1390
+ completions
1391
+ |> List. map (fun (completion : Completion.t ) ->
1392
+ {
1393
+ completion with
1394
+ name = completionName completion.name;
1395
+ env
1396
+ (* Restore original env for the completion after x->foo()... *) ;
1397
+ })
1418
1398
| None -> [] )
1419
1399
| None -> [] )
1420
1400
0 commit comments