Skip to content

Commit d6866d8

Browse files
committed
Clean up references: represent explicitly references to toplevel modules.
1 parent 1d8a004 commit d6866d8

File tree

7 files changed

+49
-50
lines changed

7 files changed

+49
-50
lines changed

analysis/src/Commands.ml

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,12 @@ let references ~path ~line ~col =
126126
let allLocs =
127127
allReferences
128128
|> List.fold_left
129-
(fun acc {References.uri = uri2; loc} ->
129+
(fun acc {References.uri = uri2; locOpt} ->
130+
let loc =
131+
match locOpt with
132+
| Some loc -> loc
133+
| None -> Utils.topLoc (Uri2.toPath uri2)
134+
in
130135
Protocol.stringifyLocation
131136
{uri = Uri2.toString uri2; range = Utils.cmtLocToRange loc}
132137
:: acc)
@@ -182,16 +187,20 @@ let rename ~path ~line ~col ~newName =
182187
| None -> Protocol.null
183188
| Some locItem ->
184189
let allReferences = References.allReferencesForLocItem ~full locItem in
185-
let referencesToToplevelModules, referencesToItems =
190+
let referencesToToplevelModules =
186191
allReferences
187-
|> List.fold_left
188-
(fun acc {References.uri = uri2; loc} -> (uri2, loc) :: acc)
189-
[]
190-
|> List.partition (fun (_, loc) -> Utils.isTopLoc loc)
192+
|> Utils.filterMap (fun {References.uri = uri2; locOpt} ->
193+
if locOpt = None then Some uri2 else None)
194+
in
195+
let referencesToItems =
196+
allReferences
197+
|> Utils.filterMap (function
198+
| {References.uri = uri2; locOpt = Some loc} -> Some (uri2, loc)
199+
| {locOpt = None} -> None)
191200
in
192201
let fileRenames =
193202
referencesToToplevelModules
194-
|> List.map (fun (uri, _) ->
203+
|> List.map (fun uri ->
195204
let path = Uri2.toPath uri in
196205
let dir = Filename.dirname path in
197206
let newPath =

analysis/src/References.ml

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -379,7 +379,10 @@ let rec pathFromVisibility visibilityPath current =
379379
let pathFromVisibility visibilityPath tipName =
380380
pathFromVisibility visibilityPath (Tip tipName)
381381

382-
type references = {uri : Uri2.t; loc : Location.t}
382+
type references = {
383+
uri : Uri2.t;
384+
locOpt : Location.t option; (* None: reference to a toplevel module *)
385+
}
383386

384387
let forLocalStamp ~full:{file; extra; package} stamp tip =
385388
let env = QueryEnv.fromFile file in
@@ -419,7 +422,9 @@ let forLocalStamp ~full:{file; extra; package} stamp tip =
419422
with
420423
| None -> []
421424
| Some locs ->
422-
locs |> List.map (fun loc -> {uri = file.uri; loc})))
425+
locs
426+
|> List.map (fun loc -> {uri = file.uri; locOpt = Some loc})
427+
))
423428
(* if this file has a corresponding interface or implementation file
424429
also find the references in that file *)
425430
in
@@ -450,8 +455,9 @@ let forLocalStamp ~full:{file; extra; package} stamp tip =
450455
if p = path && t = tip then Some locs
451456
else None)
452457
in
453-
locs |> List.map (fun loc -> {uri = file.uri; loc})
454-
)))
458+
locs
459+
|> List.map (fun loc ->
460+
{uri = file.uri; locOpt = Some loc}))))
455461
|> List.concat
456462
in
457463
alternativeReferences @ externals)
@@ -460,7 +466,7 @@ let forLocalStamp ~full:{file; extra; package} stamp tip =
460466
[])
461467
in
462468
List.append
463-
(locs |> List.map (fun loc -> {uri = file.uri; loc}))
469+
(locs |> List.map (fun loc -> {uri = file.uri; locOpt = Some loc}))
464470
externals)
465471

466472
let allReferencesForLocItem ~full:({file; package} as full) locItem =
@@ -480,21 +486,15 @@ let allReferencesForLocItem ~full:({file; package} as full) locItem =
480486
|> List.map (fun loc ->
481487
{
482488
uri = Uri2.fromPath loc.Location.loc_start.pos_fname;
483-
loc;
489+
locOpt = Some loc;
484490
}))
485491
|> List.flatten
486492
in
487493
let targetModuleReferences =
488494
match Hashtbl.find_opt package.pathsForModule moduleName with
489495
| None -> []
490496
| Some paths ->
491-
let moduleSrcToRef src =
492-
{
493-
uri = Uri2.fromPath src;
494-
(* XXX TODO use different runtime representation *)
495-
loc = Utils.topLoc src;
496-
}
497-
in
497+
let moduleSrcToRef src = {uri = Uri2.fromPath src; locOpt = None} in
498498
getSrc paths |> List.map moduleSrcToRef
499499
in
500500
List.append targetModuleReferences otherModulesReferences

analysis/src/Utils.ml

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,6 @@ let topLoc fname =
77
loc_ghost = false;
88
}
99

10-
let isTopLoc (loc : Warnings.loc) =
11-
let isTopPos (pos : Lexing.position) =
12-
pos.pos_lnum = 1 && pos.pos_bol = 0 && pos.pos_cnum = 0
13-
in
14-
isTopPos loc.loc_start && isTopPos loc.loc_end && loc.loc_ghost = false
15-
1610
(**
1711
* `startsWith(string, prefix)`
1812
* true if the string starts with the prefix
@@ -32,15 +26,11 @@ let endsWith s suffix =
3226

3327
let protocolLineColToCmtLoc ~line ~col = (line + 1, col)
3428

35-
let cmtPosToPosition {Lexing.pos_lnum; pos_cnum; pos_bol} = Protocol.{
36-
line = pos_lnum - 1;
37-
character = pos_cnum - pos_bol;
38-
}
29+
let cmtPosToPosition {Lexing.pos_lnum; pos_cnum; pos_bol} =
30+
Protocol.{line = pos_lnum - 1; character = pos_cnum - pos_bol}
3931

40-
let cmtLocToRange {Location.loc_start; loc_end} = Protocol.{
41-
start = cmtPosToPosition loc_start;
42-
end_ = cmtPosToPosition loc_end;
43-
}
32+
let cmtLocToRange {Location.loc_start; loc_end} =
33+
Protocol.{start = cmtPosToPosition loc_start; end_ = cmtPosToPosition loc_end}
4434

4535
let locWithinLoc inner outer =
4636
let open Location in

analysis/tests/src/expected/Cross.res.txt

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,24 @@ Rename tests/src/Cross.res 21:13 RenameWithInterfacePrime
2121
[
2222
{
2323
"kind": "rename",
24-
"oldUri": "RenameWithInterface.res",
25-
"newUri": "RenameWithInterfacePrime.res"
24+
"oldUri": "RenameWithInterface.resi",
25+
"newUri": "RenameWithInterfacePrime.resi"
2626
},
2727
{
2828
"kind": "rename",
29-
"oldUri": "RenameWithInterface.resi",
30-
"newUri": "RenameWithInterfacePrime.resi"
29+
"oldUri": "RenameWithInterface.res",
30+
"newUri": "RenameWithInterfacePrime.res"
3131
},
3232
{
3333
"textDocument": {
3434
"version": null,
3535
"uri": "Cross.res"
3636
},
3737
"edits": [{
38-
"range": {"start": {"line": 24, "character": 8}, "end": {"line": 24, "character": 27}},
38+
"range": {"start": {"line": 21, "character": 8}, "end": {"line": 21, "character": 27}},
3939
"newText": "RenameWithInterfacePrime"
4040
}, {
41-
"range": {"start": {"line": 21, "character": 8}, "end": {"line": 21, "character": 27}},
41+
"range": {"start": {"line": 24, "character": 8}, "end": {"line": 24, "character": 27}},
4242
"newText": "RenameWithInterfacePrime"
4343
}]
4444
}
@@ -72,10 +72,10 @@ Rename tests/src/Cross.res 24:28 xPrime
7272
"uri": "Cross.res"
7373
},
7474
"edits": [{
75-
"range": {"start": {"line": 24, "character": 28}, "end": {"line": 24, "character": 29}},
75+
"range": {"start": {"line": 21, "character": 28}, "end": {"line": 21, "character": 29}},
7676
"newText": "xPrime"
7777
}, {
78-
"range": {"start": {"line": 21, "character": 28}, "end": {"line": 21, "character": 29}},
78+
"range": {"start": {"line": 24, "character": 28}, "end": {"line": 24, "character": 29}},
7979
"newText": "xPrime"
8080
}]
8181
}

analysis/tests/src/expected/Rename.res.txt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@ Rename tests/src/Rename.res 0:4 y
66
"uri": "Rename.res"
77
},
88
"edits": [{
9-
"range": {"start": {"line": 7, "character": 8}, "end": {"line": 7, "character": 9}},
9+
"range": {"start": {"line": 0, "character": 4}, "end": {"line": 0, "character": 5}},
1010
"newText": "y"
1111
}, {
1212
"range": {"start": {"line": 3, "character": 8}, "end": {"line": 3, "character": 9}},
1313
"newText": "y"
1414
}, {
15-
"range": {"start": {"line": 0, "character": 4}, "end": {"line": 0, "character": 5}},
15+
"range": {"start": {"line": 7, "character": 8}, "end": {"line": 7, "character": 9}},
1616
"newText": "y"
1717
}]
1818
}
@@ -26,10 +26,10 @@ Rename tests/src/Rename.res 9:19 yy
2626
"uri": "Rename.res"
2727
},
2828
"edits": [{
29-
"range": {"start": {"line": 9, "character": 19}, "end": {"line": 9, "character": 21}},
29+
"range": {"start": {"line": 9, "character": 12}, "end": {"line": 9, "character": 14}},
3030
"newText": "yy"
3131
}, {
32-
"range": {"start": {"line": 9, "character": 12}, "end": {"line": 9, "character": 14}},
32+
"range": {"start": {"line": 9, "character": 19}, "end": {"line": 9, "character": 21}},
3333
"newText": "yy"
3434
}]
3535
}

analysis/tests/src/expected/RenameWithInterface.res.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ Rename tests/src/RenameWithInterface.res 0:4 y
2626
"uri": "Cross.res"
2727
},
2828
"edits": [{
29-
"range": {"start": {"line": 24, "character": 28}, "end": {"line": 24, "character": 29}},
29+
"range": {"start": {"line": 21, "character": 28}, "end": {"line": 21, "character": 29}},
3030
"newText": "y"
3131
}, {
32-
"range": {"start": {"line": 21, "character": 28}, "end": {"line": 21, "character": 29}},
32+
"range": {"start": {"line": 24, "character": 28}, "end": {"line": 24, "character": 29}},
3333
"newText": "y"
3434
}]
3535
}

analysis/tests/src/expected/RenameWithInterface.resi.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,10 @@ Rename tests/src/RenameWithInterface.resi 0:4 y
2626
"uri": "Cross.res"
2727
},
2828
"edits": [{
29-
"range": {"start": {"line": 24, "character": 28}, "end": {"line": 24, "character": 29}},
29+
"range": {"start": {"line": 21, "character": 28}, "end": {"line": 21, "character": 29}},
3030
"newText": "y"
3131
}, {
32-
"range": {"start": {"line": 21, "character": 28}, "end": {"line": 21, "character": 29}},
32+
"range": {"start": {"line": 24, "character": 28}, "end": {"line": 24, "character": 29}},
3333
"newText": "y"
3434
}]
3535
}

0 commit comments

Comments
 (0)