Skip to content

Commit 886d5dc

Browse files
cknittclaude
andcommitted
Follow a functor's aliases to its file for the members it creates
Review fix: a functor from another file applied through a local alias, such as `module Make = AppliedFunctor.MakeSet` then `Make(IntOrd)`, kept the alias as the members' source, so Go to Definition and type-definition links pointed into the caller at the functor's line numbers, and uses didn't reach the functor's references and renames. The source is now the path the compiler resolved the alias chain to, through modules too. Analysis modified (go to definition of an applied member): Example: module Make = AppliedFunctor.MakeSet module Aliased = Make(AppliedFunctor.IntOrd) let a = Aliased.add([], 1) Before (text): definition of `add` file:///AppliedFunctorUse.res 7:6-7:9 After (text): definition of `add` file:///AppliedFunctor.res 7:6-7:9 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Kr4cjoUi2f5VpMvE6wT9bo Signed-off-by: Christoph Knittel <ck@cca.io>
1 parent 2216ed4 commit 886d5dc

4 files changed

Lines changed: 246 additions & 0 deletions

File tree

‎analysis/src/process_cmt.ml‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,10 @@ let rec get_module_path mod_desc =
503503
| Tmod_functor (_ident, _argName, _maybeType, _resultExpr) -> None
504504
| Tmod_apply (functor_, _arg, _coercion) -> get_module_path functor_.mod_desc
505505
| Tmod_unpack (_expr, _moduleType) -> None
506+
(* A module alias used as a functor or included is wrapped with the path
507+
the compiler resolved its chain of aliases to: the module's own file. *)
508+
| Tmod_constraint (_expr, _typ, _constraint, Tcoerce_alias (path, _)) ->
509+
Some path
506510
| Tmod_constraint (expr, _typ, _constraint, _coercion) ->
507511
get_module_path expr.mod_desc
508512

‎tests/analysis_tests/tests/src/AppliedFunctorUse.res‎

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,30 @@ let px2 = p.x
7474

7575
let box2 = Shapes.Box(2)
7676
// ^ren Square
77+
78+
module Make = AppliedFunctor.MakeSet
79+
80+
module Aliased = Make(AppliedFunctor.IntOrd)
81+
82+
let a = Aliased.add([], 1)
83+
// ^def
84+
85+
let av: Aliased.t = []
86+
// ^typ
87+
88+
module Make2 = Make
89+
90+
module Functors = {
91+
module Make = Make2
92+
}
93+
94+
module Chained = Functors.Make(AppliedFunctor.IntOrd)
95+
96+
let c = Chained.add([], 1)
97+
// ^def
98+
99+
let cv: Chained.t = []
100+
// ^typ
101+
102+
let a2 = Aliased.add([], 2)
103+
// ^ref

‎tests/analysis_tests/tests/src/expected/AppliedFunctor.res.txt‎

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,27 @@ References src/AppliedFunctor.res 7:7
2121
},
2222
"uri": "file:///AppliedFunctorUse.res"
2323
},
24+
{
25+
"range": {
26+
"end": { "character": 19, "line": 81 },
27+
"start": { "character": 16, "line": 81 }
28+
},
29+
"uri": "file:///AppliedFunctorUse.res"
30+
},
31+
{
32+
"range": {
33+
"end": { "character": 19, "line": 95 },
34+
"start": { "character": 16, "line": 95 }
35+
},
36+
"uri": "file:///AppliedFunctorUse.res"
37+
},
38+
{
39+
"range": {
40+
"end": { "character": 20, "line": 101 },
41+
"start": { "character": 17, "line": 101 }
42+
},
43+
"uri": "file:///AppliedFunctorUse.res"
44+
},
2445
{
2546
"range": {
2647
"end": { "character": 9, "line": 7 },
@@ -82,6 +103,27 @@ References src/AppliedFunctor.res 19:16
82103
},
83104
"uri": "file:///AppliedFunctorUse.res"
84105
},
106+
{
107+
"range": {
108+
"end": { "character": 19, "line": 81 },
109+
"start": { "character": 16, "line": 81 }
110+
},
111+
"uri": "file:///AppliedFunctorUse.res"
112+
},
113+
{
114+
"range": {
115+
"end": { "character": 19, "line": 95 },
116+
"start": { "character": 16, "line": 95 }
117+
},
118+
"uri": "file:///AppliedFunctorUse.res"
119+
},
120+
{
121+
"range": {
122+
"end": { "character": 20, "line": 101 },
123+
"start": { "character": 17, "line": 101 }
124+
},
125+
"uri": "file:///AppliedFunctorUse.res"
126+
},
85127
{
86128
"range": {
87129
"end": { "character": 9, "line": 7 },
@@ -136,6 +178,27 @@ Rename src/AppliedFunctor.res 22:16 insert
136178
"end": { "character": 19, "line": 62 },
137179
"start": { "character": 16, "line": 62 }
138180
}
181+
},
182+
{
183+
"newText": "insert",
184+
"range": {
185+
"end": { "character": 19, "line": 81 },
186+
"start": { "character": 16, "line": 81 }
187+
}
188+
},
189+
{
190+
"newText": "insert",
191+
"range": {
192+
"end": { "character": 19, "line": 95 },
193+
"start": { "character": 16, "line": 95 }
194+
}
195+
},
196+
{
197+
"newText": "insert",
198+
"range": {
199+
"end": { "character": 20, "line": 101 },
200+
"start": { "character": 17, "line": 101 }
201+
}
139202
}
140203
],
141204
"textDocument": { "uri": "file:///AppliedFunctorUse.res", "version": 0 }

‎tests/analysis_tests/tests/src/expected/AppliedFunctorUse.res.txt‎

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,27 @@ References src/AppliedFunctorUse.res 17:16
8484
},
8585
"uri": "file:///AppliedFunctorUse.res"
8686
},
87+
{
88+
"range": {
89+
"end": { "character": 19, "line": 81 },
90+
"start": { "character": 16, "line": 81 }
91+
},
92+
"uri": "file:///AppliedFunctorUse.res"
93+
},
94+
{
95+
"range": {
96+
"end": { "character": 19, "line": 95 },
97+
"start": { "character": 16, "line": 95 }
98+
},
99+
"uri": "file:///AppliedFunctorUse.res"
100+
},
101+
{
102+
"range": {
103+
"end": { "character": 20, "line": 101 },
104+
"start": { "character": 17, "line": 101 }
105+
},
106+
"uri": "file:///AppliedFunctorUse.res"
107+
},
87108
{
88109
"range": {
89110
"end": { "character": 9, "line": 7 },
@@ -367,6 +388,27 @@ Rename src/AppliedFunctorUse.res 62:16 addItem
367388
"end": { "character": 19, "line": 62 },
368389
"start": { "character": 16, "line": 62 }
369390
}
391+
},
392+
{
393+
"newText": "addItem",
394+
"range": {
395+
"end": { "character": 19, "line": 81 },
396+
"start": { "character": 16, "line": 81 }
397+
}
398+
},
399+
{
400+
"newText": "addItem",
401+
"range": {
402+
"end": { "character": 19, "line": 95 },
403+
"start": { "character": 16, "line": 95 }
404+
}
405+
},
406+
{
407+
"newText": "addItem",
408+
"range": {
409+
"end": { "character": 20, "line": 101 },
410+
"start": { "character": 17, "line": 101 }
411+
}
370412
}
371413
],
372414
"textDocument": { "uri": "file:///AppliedFunctorUse.res", "version": 0 }
@@ -655,3 +697,113 @@ Rename src/AppliedFunctorUse.res 74:18 Square
655697
}
656698
]
657699

700+
Definition src/AppliedFunctorUse.res 81:17
701+
{
702+
"range": {
703+
"end": { "character": 9, "line": 7 },
704+
"start": { "character": 6, "line": 7 }
705+
},
706+
"uri": "file:///AppliedFunctor.res"
707+
}
708+
709+
TypeDefinition src/AppliedFunctorUse.res 84:4
710+
{
711+
"range": {
712+
"end": { "character": 21, "line": 6 },
713+
"start": { "character": 2, "line": 6 }
714+
},
715+
"uri": "file:///AppliedFunctor.res"
716+
}
717+
718+
Definition src/AppliedFunctorUse.res 95:17
719+
{
720+
"range": {
721+
"end": { "character": 9, "line": 7 },
722+
"start": { "character": 6, "line": 7 }
723+
},
724+
"uri": "file:///AppliedFunctor.res"
725+
}
726+
727+
TypeDefinition src/AppliedFunctorUse.res 98:4
728+
{
729+
"range": {
730+
"end": { "character": 21, "line": 6 },
731+
"start": { "character": 2, "line": 6 }
732+
},
733+
"uri": "file:///AppliedFunctor.res"
734+
}
735+
736+
References src/AppliedFunctorUse.res 101:18
737+
[
738+
{
739+
"range": {
740+
"end": { "character": 18, "line": 5 },
741+
"start": { "character": 15, "line": 5 }
742+
},
743+
"uri": "file:///AppliedFunctorUse.res"
744+
},
745+
{
746+
"range": {
747+
"end": { "character": 19, "line": 17 },
748+
"start": { "character": 16, "line": 17 }
749+
},
750+
"uri": "file:///AppliedFunctorUse.res"
751+
},
752+
{
753+
"range": {
754+
"end": { "character": 19, "line": 62 },
755+
"start": { "character": 16, "line": 62 }
756+
},
757+
"uri": "file:///AppliedFunctorUse.res"
758+
},
759+
{
760+
"range": {
761+
"end": { "character": 19, "line": 81 },
762+
"start": { "character": 16, "line": 81 }
763+
},
764+
"uri": "file:///AppliedFunctorUse.res"
765+
},
766+
{
767+
"range": {
768+
"end": { "character": 19, "line": 95 },
769+
"start": { "character": 16, "line": 95 }
770+
},
771+
"uri": "file:///AppliedFunctorUse.res"
772+
},
773+
{
774+
"range": {
775+
"end": { "character": 20, "line": 101 },
776+
"start": { "character": 17, "line": 101 }
777+
},
778+
"uri": "file:///AppliedFunctorUse.res"
779+
},
780+
{
781+
"range": {
782+
"end": { "character": 9, "line": 7 },
783+
"start": { "character": 6, "line": 7 }
784+
},
785+
"uri": "file:///AppliedFunctor.res"
786+
},
787+
{
788+
"range": {
789+
"end": { "character": 18, "line": 16 },
790+
"start": { "character": 15, "line": 16 }
791+
},
792+
"uri": "file:///AppliedFunctor.res"
793+
},
794+
{
795+
"range": {
796+
"end": { "character": 19, "line": 19 },
797+
"start": { "character": 16, "line": 19 }
798+
},
799+
"uri": "file:///AppliedFunctor.res"
800+
},
801+
{
802+
"range": {
803+
"end": { "character": 19, "line": 22 },
804+
"start": { "character": 16, "line": 22 }
805+
},
806+
"uri": "file:///AppliedFunctor.res"
807+
}
808+
]
809+

0 commit comments

Comments
 (0)