lines and offsets properties (#291)

This commit is contained in:
Rijnard van Tonder 2021-05-26 03:19:45 -07:00 committed by GitHub
parent e97f8663c5
commit 7a7a2a53e9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 185 additions and 0 deletions

View File

@ -343,6 +343,13 @@ module Matchers : sig
type kind =
| Value
| Length
| Lines
| OffsetStart
| OffsetEnd
| LineStart
| LineEnd
| ColumnStart
| ColumnEnd
| LsifHover
| FileName
| FilePath

View File

@ -78,6 +78,16 @@ module Make (Metasyntax : Types.Metasyntax.S) = struct
let attribute_to_kind = function
| "value" -> Value
| "length" -> Length
| "lines" -> Lines
| "offset"
| "offset.start" -> OffsetStart
| "offset.end" -> OffsetEnd
| "line"
| "line.start" -> LineStart
| "line.end" -> LineEnd
| "column"
| "column.start" -> ColumnStart
| "column.end" -> ColumnEnd
| "lsif.hover" -> LsifHover
| "file.path" -> FilePath
| "file.name" -> FileName
@ -96,6 +106,16 @@ module Make (Metasyntax : Types.Metasyntax.S) = struct
char '.' *> choice
[ string "value"
; string "length"
; string "lines"
; string "offset.start"
; string "offset.end"
; string "offset"
; string "line.start"
; string "line.end"
; string "line"
; string "column.start"
; string "column.end"
; string "column"
; string "lsif.hover"
; string "file.path"
; string "file.name"
@ -192,6 +212,55 @@ module Make (Metasyntax : Types.Metasyntax.S) = struct
match kind with
| Value -> Environment.lookup env variable
| Length -> Environment.lookup env variable >>| length_to_string
| Lines ->
Environment.lookup env variable
>>| String.count ~f:(Char.(=) '\n')
>>| (fun v -> if v = 0 then 1 else v)
>>| Int.to_string
| OffsetStart ->
Environment.lookup_range env variable
>>| fun { match_start = { offset; _ }; _ } ->
Int.to_string offset
| OffsetEnd ->
Environment.lookup_range env variable
>>| fun { match_end = { offset; _ }; _ } ->
Int.to_string offset
| LineStart ->
filepath >>= fun filepath ->
Environment.lookup_range env variable
>>| fun { match_start = { offset; _ }; _ } ->
let source = In_channel.read_all filepath in (* Inefficient. *)
let index = Match.Offset.index ~source in
let line, _ = Match.Offset.convert_fast ~offset index in
Int.to_string line
| LineEnd ->
filepath >>= fun filepath ->
Environment.lookup_range env variable
>>| fun { match_end = { offset; _ }; _ } ->
let source = In_channel.read_all filepath in (* Inefficient. *)
let index = Match.Offset.index ~source in
let line, _ = Match.Offset.convert_fast ~offset index in
Int.to_string line
| ColumnStart ->
filepath >>= fun filepath ->
Environment.lookup_range env variable
>>| fun { match_start = { offset; _ }; _ } ->
let source = In_channel.read_all filepath in (* Inefficient. *)
let index = Match.Offset.index ~source in
let _, column = Match.Offset.convert_fast ~offset index in
Int.to_string column
| ColumnEnd ->
filepath >>= fun filepath ->
Environment.lookup_range env variable
>>| fun { match_end = { offset; _ }; _ } ->
let source = In_channel.read_all filepath in (* Inefficient. *)
let index = Match.Offset.index ~source in
let _, column = Match.Offset.convert_fast ~offset index in
Int.to_string column
| LsifHover ->
filepath >>= fun filepath ->
if debug then Format.printf "File for lsif.hover lookup: %s@." filepath;

View File

@ -125,6 +125,13 @@ module Template = struct
type kind =
| Value
| Length
| Lines
| OffsetStart
| OffsetEnd
| LineStart
| LineEnd
| ColumnStart
| ColumnEnd
| LsifHover
| FileName
| FilePath

View File

@ -70,3 +70,105 @@ let%expect_test "filepath_rule" =
[%expect_exact {|ok: this/is/a/path|}];
run (module Matchers.Omega.Generic) ~filepath source ~rule match_template "ok: :[x]";
[%expect_exact {|ok: this/is/a/path|}]
let%expect_test "lines" =
let source = {|
{
foo
}
{
bar
baz
}
|} in
let match_template = "{:[x]}" in
let rewrite_template = {|:[x].lines|}
in
run (module Matchers.Alpha.Generic) source match_template rewrite_template;
[%expect_exact {|
2
3
|}];
run (module Matchers.Omega.Generic) source match_template rewrite_template;
[%expect_exact {|
2
3
|}]
let%expect_test "offsets" =
let source = {|
first
< >things
< >first
|} in
let match_template = ":[[x]]" in
let rewrite_template = {|
offset: :[[x]].offset
offset.start: :[[x]].offset.start
offset.end: :[[x]].offset.end
line.start: :[[x]].line.start // can't compute without source yet
line.end: :[[x]].line.end // can't compute without source yet
column.start: :[[x]].column.start // can't compute without source yet
column.end: :[[x]].column.end // can't compute without source yet
|}
in
run (module Matchers.Alpha.Generic) source match_template rewrite_template;
[%expect_exact {|
offset: 1
offset.start: 1
offset.end: 6
line.start: :[[x]].line.start // can't compute without source yet
line.end: :[[x]].line.end // can't compute without source yet
column.start: :[[x]].column.start // can't compute without source yet
column.end: :[[x]].column.end // can't compute without source yet
< >
offset: 11
offset.start: 11
offset.end: 17
line.start: :[[x]].line.start // can't compute without source yet
line.end: :[[x]].line.end // can't compute without source yet
column.start: :[[x]].column.start // can't compute without source yet
column.end: :[[x]].column.end // can't compute without source yet
< >
offset: 25
offset.start: 25
offset.end: 30
line.start: :[[x]].line.start // can't compute without source yet
line.end: :[[x]].line.end // can't compute without source yet
column.start: :[[x]].column.start // can't compute without source yet
column.end: :[[x]].column.end // can't compute without source yet
|}];
run (module Matchers.Omega.Generic) source match_template rewrite_template;
[%expect_exact {|
offset: 1
offset.start: 1
offset.end: 6
line.start: :[[x]].line.start // can't compute without source yet
line.end: :[[x]].line.end // can't compute without source yet
column.start: :[[x]].column.start // can't compute without source yet
column.end: :[[x]].column.end // can't compute without source yet
< >
offset: 11
offset.start: 11
offset.end: 17
line.start: :[[x]].line.start // can't compute without source yet
line.end: :[[x]].line.end // can't compute without source yet
column.start: :[[x]].column.start // can't compute without source yet
column.end: :[[x]].column.end // can't compute without source yet
< >
offset: 25
offset.start: 25
offset.end: 30
line.start: :[[x]].line.start // can't compute without source yet
line.end: :[[x]].line.end // can't compute without source yet
column.start: :[[x]].column.start // can't compute without source yet
column.end: :[[x]].column.end // can't compute without source yet
|}]