classPath.ml 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. type class_path_scope =
  2. | Std
  3. | StdTarget
  4. | Lib
  5. | User
  6. type file_kind =
  7. | FFile
  8. class virtual class_path (path : string) (scope : class_path_scope) (file_kind : file_kind) = object(self)
  9. method path = path;
  10. method scope = scope;
  11. method file_kind = file_kind;
  12. method virtual clone : class_path
  13. method virtual clear_cache : unit
  14. method virtual get_directory_path : string option
  15. method virtual get_uncached_dir_listing : string -> (string * string array) option
  16. method virtual dump : unit
  17. method is_std_path = match scope with
  18. | Std -> true
  19. | _ -> false
  20. method scope_string = match scope with
  21. | Std -> "Std"
  22. | StdTarget -> "StdTarget"
  23. | Lib -> "Lib"
  24. | User -> "User"
  25. end
  26. class directory_class_path (path : string) (scope : class_path_scope) = object(self)
  27. inherit class_path path scope FFile
  28. val readdir_cache = new Lookup.hashtbl_lookup
  29. method clear_cache =
  30. readdir_cache#clear
  31. method get_directory_path =
  32. Some path
  33. method clone =
  34. new directory_class_path path scope
  35. method get_uncached_dir_listing (f : string) =
  36. let file = path ^ f in
  37. let dir = Filename.dirname file in
  38. if readdir_cache#mem dir then
  39. None
  40. else begin
  41. let dir_listing =
  42. try Some (dir,Sys.readdir dir);
  43. with Sys_error _ -> None
  44. in
  45. readdir_cache#add dir dir_listing;
  46. dir_listing
  47. end
  48. method dump =
  49. print_endline (Printf.sprintf " dir %-9s: %s" (self#scope_string) path)
  50. end