diff --git a/infer/src/base/SourceFile.ml b/infer/src/base/SourceFile.ml index 4ff3cd3f7..6176227ee 100644 --- a/infer/src/base/SourceFile.ml +++ b/infer/src/base/SourceFile.ml @@ -65,14 +65,18 @@ let from_abs_path ?(warn_on_error = true) fname = Absolute fname_real +let die_missing_workspace ~rel_path ~foreign_rel_project_root = + L.die UserError + "Missing workspace: please provide the --workspace option. A file (relative path: '%s') was \ + encountered whose project root at the time of capture is relative to a workspace (project \ + root: '%s'). The same workspace must be specified now." + rel_path foreign_rel_project_root + + let reroot_rel_path ~foreign_rel_project_root rel_path = match (workspace_real, foreign_rel_project_root) with | None, Some foreign_rel_project_root -> - L.die UserError - "Missing workspace: please provide the --workspace option. A file (relative path: '%s') \ - was encountered whose project root at the time of capture is relative to a workspace \ - (project root: '%s'). The same workspace must be specified now." - rel_path foreign_rel_project_root + die_missing_workspace ~rel_path ~foreign_rel_project_root | Some workspace, foreign_offset_opt when not (Option.equal String.equal foreign_offset_opt workspace_rel_root_opt) -> (* re-root rel_path relative to the current project_root *) @@ -120,12 +124,19 @@ let pp fmt fname = Format.pp_print_string fmt (to_string fname) let to_abs_path fname = match fname with | Invalid {ml_source_file} -> - L.(die InternalError) - "cannot be called with Invalid source file originating in %s" ml_source_file + L.die InternalError "cannot be called with Invalid source file originating in %s" + ml_source_file | RelativeProjectRoot rel_path -> Config.project_root ^/ rel_path | RelativeProjectRootAndWorkspace {workspace_rel_root; rel_path} -> - workspace_rel_root ^/ Config.project_root ^/ rel_path + let workspace_abs = + match Config.workspace with + | Some workspace -> + workspace + | None -> + die_missing_workspace ~rel_path ~foreign_rel_project_root:workspace_rel_root + in + workspace_abs ^/ workspace_rel_root ^/ rel_path | Absolute path -> path