v.util: add set_source_for_path/2 to enable external tools to use util.formatted_error on pathless sources

pull/13629/head
Delyan Angelov 2022-03-01 18:55:25 +02:00
parent 996bd41ce8
commit fd91811fe2
No known key found for this signature in database
GPG Key ID: 66886C0F12D595ED
1 changed files with 12 additions and 14 deletions

View File

@ -1,6 +1,7 @@
// Copyright (c) 2019-2022 Alexander Medvednikov. All rights reserved. // Copyright (c) 2019-2022 Alexander Medvednikov. All rights reserved.
// Use of this source code is governed by an MIT license // Use of this source code is governed by an MIT license
// that can be found in the LICENSE file. // that can be found in the LICENSE file.
[has_globals]
module util module util
import os import os
@ -102,27 +103,24 @@ mut:
lines map[string][]string lines map[string][]string
} }
[unsafe] __global lines_cache = &LinesCache{}
pub fn cached_file2sourcelines(path string) []string { pub fn cached_file2sourcelines(path string) []string {
mut static cache := &LinesCache(0) if res := lines_cache.lines[path] {
if isnil(cache) {
cache = &LinesCache{}
}
if path.len == 0 {
unsafe { cache.lines.free() }
unsafe { free(cache) }
cache = &LinesCache(0)
return []string{}
}
if res := cache.lines[path] {
return res return res
} }
source := read_file(path) or { '' } source := read_file(path) or { '' }
res := source.split_into_lines() res := set_source_for_path(path, source)
cache.lines[path] = res
return res return res
} }
// set_source_for_path should be called for every file, over which you want to use util.formatted_error
pub fn set_source_for_path(path string, source string) []string {
lines := source.split_into_lines()
lines_cache.lines[path] = lines
return lines
}
pub fn source_file_context(kind string, filepath string, pos token.Pos) []string { pub fn source_file_context(kind string, filepath string, pos token.Pos) []string {
mut clines := []string{} mut clines := []string{}
source_lines := unsafe { cached_file2sourcelines(filepath) } source_lines := unsafe { cached_file2sourcelines(filepath) }