package.lua (2579B)
1 local M = {} 2 3 local function readfile(path) 4 local file = io.open(path, 'rb') 5 if not file then 6 return nil 7 end 8 local content = file:read('*a') 9 file:close() 10 return content 11 end 12 13 function M.config_path() 14 return vim.fn.getcwd() .. '/.dart_tool/package_config.json' 15 end 16 17 function M.config() 18 local config_path = M.config_path() 19 if vim.fn.filereadable(config_path) == 1 then 20 local content = readfile(config_path) 21 local json = vim.fn.json_decode(content) 22 if not json or not json.packages then 23 return nil 24 end 25 return json 26 end 27 -- vim.notify('cannot find package_config.json file', vim.log.levels.ERROR) 28 return nil 29 end 30 31 function M.packages() 32 local config = M.config() 33 if not config then 34 return nil 35 end 36 37 if config.configVersion ~= 2 then 38 -- vim.notify('unsupported version of package_config.json', vim.log.levels.ERROR) 39 return nil 40 end 41 42 local dart_tool_dir = vim.fs.dirname(M.config_path()) 43 44 local packages_map = {} 45 for _, package in pairs(config.packages) do 46 local uri = package.rootUri 47 local package_uri = package.packageUri 48 local lib_dir, root_dir 49 if string.find(uri, '^file:/') then 50 uri = string.gsub(uri, '^file://', '', 1) 51 root_dir = vim.fn.resolve(uri) 52 lib_dir = vim.fn.resolve(root_dir .. '/' .. package_uri) 53 else 54 root_dir = vim.fn.resolve(dart_tool_dir .. '/' .. uri) 55 lib_dir = vim.fn.resolve(root_dir .. '/' .. package_uri) 56 end 57 58 packages_map[package.name] = { root = root_dir, lib = lib_dir } 59 end 60 61 return packages_map 62 end 63 64 function M.package_name() 65 local file = io.open('pubspec.yaml', 'r') 66 if not file then 67 return nil 68 end 69 local firstLine = file:read('*l') 70 file:close() 71 local name = string.match(firstLine, 'name: (.*)') 72 if not name then 73 return nil 74 end 75 return name 76 end 77 78 function M.package_path(uri) 79 if not string.find(uri, 'package:') then 80 return nil 81 end 82 83 local package_name = string.match(uri, '^package:([^/.]+)/.*') 84 if not package_name then 85 return nil 86 end 87 88 local packages = M.packages() 89 if not packages then 90 return nil 91 end 92 93 local package_paths = packages[package_name] 94 if not package_paths then 95 -- vim.print('no package mapping for ' .. package_name) 96 return nil 97 end 98 local package_lib = package_paths.lib 99 100 -- HACK localhost%25 - wtf? 101 package_lib = string.gsub(package_lib, 'localhost%%25', 'localhost%%') 102 103 local package_lib_escaped = string.gsub(package_lib, '%%', '%%%%') 104 return string.gsub(uri, 'package:' .. package_name, package_lib_escaped) 105 end 106 107 return M;