From fd91811fe2103ec7b3879577c0ca5205527c8d39 Mon Sep 17 00:00:00 2001 From: Delyan Angelov Date: Tue, 1 Mar 2022 18:55:25 +0200 Subject: [PATCH] v.util: add set_source_for_path/2 to enable external tools to use util.formatted_error on pathless sources --- vlib/v/util/errors.v | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/vlib/v/util/errors.v b/vlib/v/util/errors.v index c278fc8678..c4f50dcae2 100644 --- a/vlib/v/util/errors.v +++ b/vlib/v/util/errors.v @@ -1,6 +1,7 @@ // Copyright (c) 2019-2022 Alexander Medvednikov. All rights reserved. // Use of this source code is governed by an MIT license // that can be found in the LICENSE file. +[has_globals] module util import os @@ -102,27 +103,24 @@ mut: lines map[string][]string } -[unsafe] +__global lines_cache = &LinesCache{} + pub fn cached_file2sourcelines(path string) []string { - mut static cache := &LinesCache(0) - 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] { + if res := lines_cache.lines[path] { return res } source := read_file(path) or { '' } - res := source.split_into_lines() - cache.lines[path] = res + res := set_source_for_path(path, source) 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 { mut clines := []string{} source_lines := unsafe { cached_file2sourcelines(filepath) }