--- Simplify absolute paths to relative paths and add `use` declarations
local inspect = require "inspect" 

local Visitor = {}

function Visitor.new(transform_ctx)
   self = {}
   self.cur_path = {}
   self.ctx = transform_ctx

   setmetatable(self, Visitor)
   Visitor.__index = Visitor

   return self
end

function Visitor:flat_map_item(item, walk)
   if item:kind_name() == "Mod" then
      table.insert(self.cur_path, item:get_ident():get_name())
      walk(item)
      table.remove(self.cur_path)
   else
      self.ctx:visit_paths(
         item,
         function(id, qself, path, def)
            -- Ignore paths with <..>
            if path:has_generic_args() then
               return qself, path
            end

            local segments = path:get_segments()
            local same_count = 0
            for i,segment in ipairs(segments) do
               if ((i == 1 and segment == "crate" and self.cur_path[i] == "") or
                   segment == self.cur_path[i]) then
                  same_count = same_count + 1
               else
                  break
               end
            end
            if same_count > 1 then
               while same_count > 0 do
                  table.remove(segments, 1)
                  same_count = same_count - 1
               end
            end
            path:set_segments(segments)
            return qself, path
         end
      )
   end

   return {item}
end


refactor:transform(
   function(transform_ctx)
      transform_ctx:visit_crate_new(Visitor.new(transform_ctx))
   end
)
