get_scope: scopes for records update/access, constants and applications

This commit is contained in:
Lesenechal Remi 2020-07-01 15:37:49 +02:00
parent 728cf3f1ba
commit 6a3ab09f7c
5 changed files with 191 additions and 27 deletions

View File

@ -6,10 +6,21 @@ let%expect_test _ =
run_ligo_good [ "get-scope" ; gs "lambda_letin.mligo" ; "--format=dev" ] ; run_ligo_good [ "get-scope" ; gs "lambda_letin.mligo" ; "--format=dev" ] ;
[%expect {| [%expect {|
Scopes: Scopes:
[ f#5 a#0 ] in file "lambda_letin.mligo", line 9, characters 2-7 [ f#5 a#0 ] in file "lambda_letin.mligo", line 9, characters 6-7
[ k#4 j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 7, characters 4-21 [ f#5 a#0 ] in file "lambda_letin.mligo", line 9, characters 4-5
[ j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 6, character 4 to line 7, character 21 [ f#5 a#0 ] in file "lambda_letin.mligo", line 9, characters 2-3
[ j#2 i#1 a#0 ] in file "lambda_letin.mligo", line 5, character 4 to line 7, character 21 [ k#4 j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 7, characters 20-21
[ k#4 j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 7, characters 16-17
[ k#4 j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 7, characters 12-13
[ k#4 j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 7, characters 8-9
[ k#4 j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 7, characters 4-5
[ j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 6, characters 24-25
[ j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 6, characters 20-21
[ j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 6, characters 16-17
[ j#2 i#1 g#3 a#0 ] in file "lambda_letin.mligo", line 6, characters 12-13
[ j#2 i#1 a#0 ] in file "lambda_letin.mligo", line 5, characters 20-21
[ j#2 i#1 a#0 ] in file "lambda_letin.mligo", line 5, characters 16-17
[ j#2 i#1 a#0 ] in file "lambda_letin.mligo", line 5, characters 12-13
[ ] in file "lambda_letin.mligo", line 1, characters 0-9 [ ] in file "lambda_letin.mligo", line 1, characters 0-9
Variable definitions: Variable definitions:
@ -25,11 +36,20 @@ let%expect_test _ =
run_ligo_good [ "get-scope" ; gs "letin.mligo" ; "--format=dev" ] ; run_ligo_good [ "get-scope" ; gs "letin.mligo" ; "--format=dev" ] ;
[%expect {| [%expect {|
Scopes: Scopes:
[ d#4 c#1 a#0 ] in file "letin.mligo", line 10, characters 2-11 [ d#4 c#1 a#0 ] in file "letin.mligo", line 10, characters 10-11
[ f#3 e#2 c#1 a#0 ] in file "letin.mligo", line 8, characters 4-17 [ d#4 c#1 a#0 ] in file "letin.mligo", line 10, characters 6-7
[ e#2 c#1 a#0 ] in file "letin.mligo", line 7, character 4 to line 8, character 17 [ d#4 c#1 a#0 ] in file "letin.mligo", line 10, characters 2-3
[ c#1 a#0 ] in file "letin.mligo", line 6, character 4 to line 8, character 17 [ f#3 e#2 c#1 a#0 ] in file "letin.mligo", line 8, characters 16-17
[ a#0 ] in file "letin.mligo", line 4, character 2 to line 10, character 11 [ f#3 e#2 c#1 a#0 ] in file "letin.mligo", line 8, characters 12-13
[ f#3 e#2 c#1 a#0 ] in file "letin.mligo", line 8, characters 8-9
[ f#3 e#2 c#1 a#0 ] in file "letin.mligo", line 8, characters 4-5
[ e#2 c#1 a#0 ] in file "letin.mligo", line 7, characters 20-21
[ e#2 c#1 a#0 ] in file "letin.mligo", line 7, characters 16-17
[ e#2 c#1 a#0 ] in file "letin.mligo", line 7, characters 12-13
[ c#1 a#0 ] in file "letin.mligo", line 6, characters 16-17
[ c#1 a#0 ] in file "letin.mligo", line 6, characters 12-13
[ a#0 ] in file "letin.mligo", line 4, characters 14-15
[ a#0 ] in file "letin.mligo", line 4, characters 10-11
[ ] in file "letin.mligo", line 1, characters 0-9 [ ] in file "letin.mligo", line 1, characters 0-9
Variable definitions: Variable definitions:
@ -44,8 +64,11 @@ let%expect_test _ =
run_ligo_good [ "get-scope" ; gs "lambda.mligo" ; "--format=dev" ] ; run_ligo_good [ "get-scope" ; gs "lambda.mligo" ; "--format=dev" ] ;
[%expect {| [%expect {|
Scopes: Scopes:
[ f#3 a#0 ] in file "lambda.mligo", line 5, characters 2-7 [ f#3 a#0 ] in file "lambda.mligo", line 5, characters 6-7
[ j#2 i#1 a#0 ] in file "lambda.mligo", line 4, characters 58-63 [ f#3 a#0 ] in file "lambda.mligo", line 5, characters 4-5
[ f#3 a#0 ] in file "lambda.mligo", line 5, characters 2-3
[ j#2 i#1 a#0 ] in file "lambda.mligo", line 4, characters 62-63
[ j#2 i#1 a#0 ] in file "lambda.mligo", line 4, characters 58-59
[ ] in file "lambda.mligo", line 1, characters 0-9 [ ] in file "lambda.mligo", line 1, characters 0-9
Variable definitions: Variable definitions:
@ -59,17 +82,23 @@ let%expect_test _ =
run_ligo_good [ "get-scope" ; gs "match.mligo" ; "--format=dev" ] ; run_ligo_good [ "get-scope" ; gs "match.mligo" ; "--format=dev" ] ;
[%expect {| [%expect {|
Scopes: Scopes:
[ s#11 mytype#0 c#9 b#5 a#1 ] in file "match.mligo", line 19, characters 16-21 [ s#11 mytype#0 c#9 b#5 a#1 ] in file "match.mligo", line 19, characters 20-21
[ s#11 mytype#0 c#9 b#5 a#1 ] in file "match.mligo", line 19, characters 16-17
[ mytype#0 c#9 b#5 a#1 ] in file "match.mligo", line 20, characters 12-13 [ mytype#0 c#9 b#5 a#1 ] in file "match.mligo", line 20, characters 12-13
[ mytype#0 d#10 c#9 b#5 a#1 ] in file "match.mligo", line 18, characters 22-32 [ mytype#0 d#10 c#9 b#5 a#1 ] in file "match.mligo", line 18, characters 30-31
[ mytype#0 d#10 c#9 b#5 a#1 ] in file "match.mligo", line 18, characters 28-29
[ mytype#0 c#9 b#5 a#1 ] in file "match.mligo", line 18, characters 9-32 [ mytype#0 c#9 b#5 a#1 ] in file "match.mligo", line 18, characters 9-32
[ tl#8 mytype#0 hd#7 b#5 a#1 ] in file "match.mligo", line 15, characters 14-15 [ tl#8 mytype#0 hd#7 b#5 a#1 ] in file "match.mligo", line 15, characters 14-15
[ mytype#0 c#6 b#5 a#1 ] in file "match.mligo", line 14, characters 4-5 [ mytype#0 c#6 b#5 a#1 ] in file "match.mligo", line 14, characters 4-5
[ mytype#0 b#5 a#1 ] in file "match.mligo", line 13, character 4 to line 14, character 5 [ mytype#0 b#5 a#1 ] in file "match.mligo", line 13, character 4 to line 14, character 5
[ mytype#0 b#5 a#1 ] in file "match.mligo", line 11, characters 9-21 [ mytype#0 b#5 a#1 ] in file "match.mligo", line 11, characters 18-19
[ y#4 mytype#0 a#1 ] in file "match.mligo", line 8, characters 13-18 [ mytype#0 b#5 a#1 ] in file "match.mligo", line 11, characters 15-16
[ x#3 mytype#0 a#1 ] in file "match.mligo", line 7, characters 13-18 [ mytype#0 b#5 a#1 ] in file "match.mligo", line 11, characters 11-12
[ mytype#0 c#2 a#1 ] in file "match.mligo", line 6, characters 22-27 [ y#4 mytype#0 a#1 ] in file "match.mligo", line 8, characters 17-18
[ y#4 mytype#0 a#1 ] in file "match.mligo", line 8, characters 13-14
[ x#3 mytype#0 a#1 ] in file "match.mligo", line 7, characters 17-18
[ x#3 mytype#0 a#1 ] in file "match.mligo", line 7, characters 13-14
[ mytype#0 c#2 a#1 ] in file "match.mligo", line 6, characters 26-27
[ mytype#0 a#1 ] in file "match.mligo", line 6, characters 9-27 [ mytype#0 a#1 ] in file "match.mligo", line 6, characters 9-27
[ mytype#0 ] in file "match.mligo", line 3, characters 0-9 [ mytype#0 ] in file "match.mligo", line 3, characters 0-9
@ -92,10 +121,16 @@ let%expect_test _ =
run_ligo_good [ "get-scope" ; gs "rec.mligo" ; "--format=dev" ] ; run_ligo_good [ "get-scope" ; gs "rec.mligo" ; "--format=dev" ] ;
[%expect {| [%expect {|
Scopes: Scopes:
[ c#5 b#6 a#0 ] in file "rec.mligo", line 9, characters 2-10 [ c#5 b#6 a#0 ] in file "rec.mligo", line 9, characters 5-6
[ c#5 b#6 a#0 ] in file "rec.mligo", line 9, characters 8-9
[ c#5 b#6 a#0 ] in file "rec.mligo", line 9, characters 2-3
[ c#5 a#0 ] in file "rec.mligo", line 8, character 2 to line 9, character 10 [ c#5 a#0 ] in file "rec.mligo", line 8, character 2 to line 9, character 10
[ k#4 j#3 i#2 c#1 a#0 ] in file "rec.mligo", line 6, characters 4-11 [ k#4 j#3 i#2 c#1 a#0 ] in file "rec.mligo", line 6, characters 7-8
[ j#3 i#2 c#1 a#0 ] in file "rec.mligo", line 5, character 4 to line 6, character 11 [ k#4 j#3 i#2 c#1 a#0 ] in file "rec.mligo", line 6, characters 9-10
[ k#4 j#3 i#2 c#1 a#0 ] in file "rec.mligo", line 6, characters 4-5
[ j#3 i#2 c#1 a#0 ] in file "rec.mligo", line 5, characters 20-21
[ j#3 i#2 c#1 a#0 ] in file "rec.mligo", line 5, characters 16-17
[ j#3 i#2 c#1 a#0 ] in file "rec.mligo", line 5, characters 12-13
[ i#2 c#1 a#0 ] in file "rec.mligo", line 4, characters 36-49 [ i#2 c#1 a#0 ] in file "rec.mligo", line 4, characters 36-49
[ c#1 a#0 ] in file "rec.mligo", line 4, characters 36-49 [ c#1 a#0 ] in file "rec.mligo", line 4, characters 36-49
[ c#1 a#0 ] [ c#1 a#0 ]
@ -115,11 +150,19 @@ let%expect_test _ =
run_ligo_good [ "get-scope" ; gs "shadowing.mligo" ; "--format=dev" ] ; run_ligo_good [ "get-scope" ; gs "shadowing.mligo" ; "--format=dev" ] ;
[%expect {| [%expect {|
Scopes: Scopes:
[ d#4 c#1 a#0 ] in file "shadowing.mligo", line 10, characters 2-11 [ d#4 c#1 a#0 ] in file "shadowing.mligo", line 10, characters 10-11
[ e#2 c#1 a#3 ] in file "shadowing.mligo", line 8, characters 4-13 [ d#4 c#1 a#0 ] in file "shadowing.mligo", line 10, characters 6-7
[ e#2 c#1 a#0 ] in file "shadowing.mligo", line 7, character 4 to line 8, character 13 [ d#4 c#1 a#0 ] in file "shadowing.mligo", line 10, characters 2-3
[ c#1 a#0 ] in file "shadowing.mligo", line 6, character 4 to line 8, character 13 [ e#2 c#1 a#3 ] in file "shadowing.mligo", line 8, characters 12-13
[ a#0 ] in file "shadowing.mligo", line 4, character 2 to line 10, character 11 [ e#2 c#1 a#3 ] in file "shadowing.mligo", line 8, characters 8-9
[ e#2 c#1 a#3 ] in file "shadowing.mligo", line 8, characters 4-5
[ e#2 c#1 a#0 ] in file "shadowing.mligo", line 7, characters 20-21
[ e#2 c#1 a#0 ] in file "shadowing.mligo", line 7, characters 16-17
[ e#2 c#1 a#0 ] in file "shadowing.mligo", line 7, characters 12-13
[ c#1 a#0 ] in file "shadowing.mligo", line 6, characters 16-17
[ c#1 a#0 ] in file "shadowing.mligo", line 6, characters 12-13
[ a#0 ] in file "shadowing.mligo", line 4, characters 14-15
[ a#0 ] in file "shadowing.mligo", line 4, characters 10-11
[ ] in file "shadowing.mligo", line 1, characters 0-9 [ ] in file "shadowing.mligo", line 1, characters 0-9
Variable definitions: Variable definitions:
@ -129,4 +172,72 @@ let%expect_test _ =
(b#5 -> b) in file "shadowing.mligo", line 3, characters 4-5 (b#5 -> b) in file "shadowing.mligo", line 3, characters 4-5
(a#3 -> a) in file "shadowing.mligo", line 7, characters 8-9 (a#3 -> a) in file "shadowing.mligo", line 7, characters 8-9
(a#0 -> a) in file "shadowing.mligo", line 1, characters 4-5 (a#0 -> a) in file "shadowing.mligo", line 1, characters 4-5
Type definitions: |} ] ;
run_ligo_good [ "get-scope" ; gs "records.mligo" ; "--format=dev" ] ;
[%expect {|
Scopes:
[ myrec#0 g#5 b#4 a#1 ] in file "records.mligo", line 16, characters 40-41
[ myrec#0 g#5 b#4 a#1 ] in file "records.mligo", line 16, characters 32-37
[ myrec#0 g#5 b#4 a#1 ] in file "records.mligo", line 16, characters 28-29
[ myrec#0 b#4 a#1 ] in file "records.mligo", line 16, characters 15-41
[ myrec#0 b#4 a#1 ]
[ myrec#0 a#1 ] in file "records.mligo", line 6, characters 53-55
[ myrec#0 j#3 i#2 a#1 ] in file "records.mligo", line 6, characters 44-45
[ myrec#0 j#3 i#2 a#1 ] in file "records.mligo", line 6, characters 42-43
[ myrec#0 j#3 i#2 a#1 ] in file "records.mligo", line 6, characters 40-41
[ myrec#0 i#2 a#1 ] in file "records.mligo", line 6, characters 27-45
[ myrec#0 a#1 ] in file "records.mligo", line 6, characters 14-45
[ myrec#0 ] in file "records.mligo", line 3, characters 0-9
Variable definitions:
(j#3 -> j) in file "records.mligo", line 6, characters 31-32
(i#2 -> i) in file "records.mligo", line 6, characters 18-19
(g#5 -> g) in file "records.mligo", line 16, characters 19-20
(e#6 -> e) in file "records.mligo", line 15, characters 4-5
(b#4 -> b) in file "records.mligo", line 6, characters 4-5
(a#1 -> a) in file "records.mligo", line 3, characters 4-5
Type definitions:
(myrec#0 -> myrec) in file "records.mligo", line 1, characters 0-36 |} ] ;
run_ligo_good [ "get-scope" ; gs "constant.mligo" ; "--format=dev" ] ;
[%expect {|
Scopes:
[ e#3 a#0 ] in file "constant.mligo", line 6, characters 29-30
[ e#3 a#0 ] in file "constant.mligo", line 6, characters 27-28
[ e#3 a#0 ] in file "constant.mligo", line 6, characters 22-23
[ e#3 a#0 ] in file "constant.mligo", line 6, characters 20-21
[ a#0 ] in file "constant.mligo", line 6, characters 5-32
[ d#2 c#1 a#0 ] in file "constant.mligo", line 5, characters 43-44
[ d#2 c#1 a#0 ] in file "constant.mligo", line 5, characters 39-40
[ d#2 c#1 a#0 ] in file "constant.mligo", line 5, characters 35-36
[ c#1 a#0 ] in file "constant.mligo", line 5, characters 22-44
[ ] in file "constant.mligo", line 1, characters 0-9
Variable definitions:
(e#3 -> e) in file "constant.mligo", line 6, characters 9-10
(d#2 -> d) in file "constant.mligo", line 5, characters 26-27
(c#1 -> c) in file "constant.mligo", line 5, characters 10-11
(b#4 -> b) in file "constant.mligo", line 3, characters 4-5
(a#0 -> a) in file "constant.mligo", line 1, characters 4-5
Type definitions: |} ] ;
run_ligo_good [ "get-scope" ; gs "application.mligo" ; "--format=dev" ] ;
[%expect {|
Scopes:
[ f#2 c#4 ] in file "application.mligo", line 3, characters 35-36
[ f#2 ] in file "application.mligo", line 3, characters 22-36
[ f#2 b#3 ] in file "application.mligo", line 3, characters 18-19
[ f#2 b#3 ] in file "application.mligo", line 3, characters 16-17
[ f#2 ] in file "application.mligo", line 3, characters 3-19
[ j#1 i#0 ] in file "application.mligo", line 2, characters 62-63
[ j#1 i#0 ] in file "application.mligo", line 2, characters 58-59
Variable definitions:
(j#1 -> j) in file "application.mligo", line 2, characters 46-47
(i#0 -> i) in file "application.mligo", line 2, characters 36-37
(f#2 -> f) in file "application.mligo", line 2, characters 6-7
(c#4 -> c) in file "application.mligo", line 3, characters 26-27
(b#3 -> b) in file "application.mligo", line 3, characters 7-8
(a#5 -> a) in file "application.mligo", line 1, characters 4-5
Type definitions: |} ] ; Type definitions: |} ] ;

View File

@ -77,10 +77,38 @@ let scopes : with_types:bool -> string -> string -> ((def_map * scopes), Main_er
(i,all_defs,env,scopes) (i,all_defs,env,scopes)
) )
) )
| E_ascription { anno_expr ; _ } -> find_scopes' (i,all_defs,env,scopes,anno_expr.location) anno_expr | E_record emap -> (
| _ -> let aux = fun (i,all_defs,scopes) (exp:Ast_core.expression) ->
let (i,all_defs,_,scopes) = find_scopes' (i,all_defs,env,scopes,exp.location) exp in
(i,all_defs,scopes)
in
let (i,all_defs,scopes) = List.fold_left aux (i,all_defs,scopes) (Ast_core.LMap.to_list emap) in
(i,all_defs,env,scopes)
)
| E_record_update { record ; update ; _ } -> (
(*TODO: here record has a virtual location, check this out.. not normal *)
let (i,all_defs,_,scopes) = find_scopes' (i,all_defs,env,scopes,record.location) record in
find_scopes' (i,all_defs,env,scopes,update.location) update
)
| E_constant { arguments ; _ } -> (
let aux = fun (i,all_defs,scopes) (exp:Ast_core.expression) ->
let (i,all_defs,_,scopes) = find_scopes' (i,all_defs,env,scopes,exp.location) exp in
(i,all_defs,scopes)
in
let (i,all_defs,scopes) = List.fold_left aux (i,all_defs,scopes) arguments in
(i,all_defs,env,scopes)
)
| E_application { lamb ; args } -> (
let (i,all_defs,_,scopes) = find_scopes' (i,all_defs,env,scopes,lamb.location) lamb in
find_scopes' (i,all_defs,env,scopes,args.location) args
)
| E_ascription { anno_expr=e;_ } | E_record_accessor { record=e;_ } | E_constructor { element=e;_ } -> (
find_scopes' (i,all_defs,env,scopes,e.location) e
)
| E_literal _ | E_raw_code _ | E_variable _ -> (
let scopes = add_scope (lastloc, env) scopes in let scopes = add_scope (lastloc, env) scopes in
(i,all_defs,env,scopes) (i,all_defs,env,scopes)
)
in in
let find_scopes (i,top_lvl_defs,scopes,loc) e = let find_scopes (i,top_lvl_defs,scopes,loc) e =
let (i,defs,_,scopes) = find_scopes' (i,top_lvl_defs,top_lvl_defs,scopes,loc) e in let (i,defs,_,scopes) = find_scopes' (i,top_lvl_defs,top_lvl_defs,scopes,loc) e in

View File

@ -0,0 +1,3 @@
let a =
let f : (int-> int -> int) = fun (i : int) (j : int) -> j + i in
(let b = 1 in f 1) (let c = 2 in c)

View File

@ -0,0 +1,6 @@
let a = 1
let b =
List.map
(fun (c : int) -> let d = 1 in d + c + a)
(let e = 1 in [ e+a ; e+a ])

View File

@ -0,0 +1,16 @@
type myrec = {foo : int ; bar : int}
let a = 1
// record
let b = {foo=(let i = 1 in let j = 2 in a+i+j) ; bar=24}
// record accessor
// let c = (let d = 1 in b).bar
// record update
// let e =
// {(let f = 2 in b) with bar=(let g = a in g);}
let e =
{b with bar=(let g = a in g + b.bar + a);}