Summary: In this diff, we just load the info from the storage. Next diff will be actually using this information to infer nullability. `ThirdPartyAnnotationGlobalRepo.get_repo` will be used in the next diff, hence #skipdeadcode Reviewed By: artempyanykh Differential Revision: D18347647 fbshipit-source-id: 82a9223c6master
parent
7ea42938fe
commit
3d2df4cc3c
@ -0,0 +1,45 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
open! IStd
|
||||||
|
|
||||||
|
let load_third_party_repo ~absolute_path_to_repo_dir =
|
||||||
|
match Sys.is_directory absolute_path_to_repo_dir with
|
||||||
|
| `Yes -> (
|
||||||
|
match ThirdPartyAnnotationInfoLoader.load ~path_to_repo_dir:absolute_path_to_repo_dir with
|
||||||
|
| Ok storage ->
|
||||||
|
storage
|
||||||
|
| Error error ->
|
||||||
|
Logging.die Logging.InternalError "Error while reading 3rd party annotation repo: %a"
|
||||||
|
ThirdPartyAnnotationInfoLoader.pp_load_error error )
|
||||||
|
| _ ->
|
||||||
|
Logging.die Logging.InternalError
|
||||||
|
"Could not locate 3rd party annotation repository: expected location %s"
|
||||||
|
absolute_path_to_repo_dir
|
||||||
|
|
||||||
|
|
||||||
|
let get_absolute_path_to_repo_dir relative_path_to_repo_dir =
|
||||||
|
match Config.inferconfig_dir with
|
||||||
|
| None ->
|
||||||
|
Logging.die Logging.InternalError
|
||||||
|
"Could not locate .inferconfig directory, which is required for resolving the path to \
|
||||||
|
third party annotation repository"
|
||||||
|
| Some inferconfig_dir ->
|
||||||
|
inferconfig_dir ^/ relative_path_to_repo_dir
|
||||||
|
|
||||||
|
|
||||||
|
let create_global_storage () =
|
||||||
|
match Config.nullsafe_third_party_signatures with
|
||||||
|
| Some dir ->
|
||||||
|
load_third_party_repo ~absolute_path_to_repo_dir:(get_absolute_path_to_repo_dir dir)
|
||||||
|
(* Create empty *)
|
||||||
|
| None ->
|
||||||
|
ThirdPartyAnnotationInfo.create_storage ()
|
||||||
|
|
||||||
|
|
||||||
|
let init () =
|
||||||
|
let global_storage = create_global_storage () in
|
||||||
|
ThirdPartyAnnotationGlobalRepo.initialize global_storage
|
@ -0,0 +1,10 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
open! IStd
|
||||||
|
|
||||||
|
val init : unit -> unit
|
||||||
|
(** This function should be called once before nullsafe checker is called *)
|
@ -0,0 +1,25 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
|
||||||
|
open! IStd
|
||||||
|
|
||||||
|
let repo = ref None
|
||||||
|
|
||||||
|
let initialize storage =
|
||||||
|
match !repo with
|
||||||
|
| None ->
|
||||||
|
repo := Some storage
|
||||||
|
| Some _ ->
|
||||||
|
Logging.die Logging.InternalError "Attempt to initialize global 3rd party repository twice"
|
||||||
|
|
||||||
|
|
||||||
|
let get_repo () =
|
||||||
|
match !repo with
|
||||||
|
| None ->
|
||||||
|
Logging.die Logging.InternalError "Attempt to access not initialized 3rd party repository"
|
||||||
|
| Some repo ->
|
||||||
|
repo
|
@ -0,0 +1,16 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
|
||||||
|
open! IStd
|
||||||
|
|
||||||
|
(** A singleton. Should be initialized once prior to start of nullsafe. *)
|
||||||
|
|
||||||
|
val initialize : ThirdPartyAnnotationInfo.storage -> unit
|
||||||
|
(** Should be initialized exactly once before access. *)
|
||||||
|
|
||||||
|
val get_repo : unit -> ThirdPartyAnnotationInfo.storage
|
||||||
|
(** Can be accessed only when initialization was done *)
|
@ -0,0 +1,29 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
open! IStd
|
||||||
|
|
||||||
|
type load_error = {filename: string; parsing_error: ThirdPartyAnnotationInfo.file_parsing_error}
|
||||||
|
|
||||||
|
let pp_load_error fmt {filename; parsing_error} =
|
||||||
|
Format.fprintf fmt "Could not parse %s: %a" filename ThirdPartyAnnotationInfo.pp_parsing_error
|
||||||
|
parsing_error
|
||||||
|
|
||||||
|
|
||||||
|
let add_from_file storage ~path_to_repo_dir ~sig_file =
|
||||||
|
let lines = In_channel.read_lines (path_to_repo_dir ^ "/" ^ sig_file) in
|
||||||
|
ThirdPartyAnnotationInfo.add_from_signature_file storage ~lines
|
||||||
|
|> Result.map_error ~f:(fun parsing_error -> {filename= sig_file; parsing_error})
|
||||||
|
|> Result.bind ~f:(fun _ -> Ok storage)
|
||||||
|
|
||||||
|
|
||||||
|
let load ~path_to_repo_dir =
|
||||||
|
(* Sequentally load information from all .sig files *)
|
||||||
|
Sys.ls_dir path_to_repo_dir
|
||||||
|
|> List.filter ~f:(String.is_suffix ~suffix:".sig")
|
||||||
|
|> List.fold_result ~init:(ThirdPartyAnnotationInfo.create_storage ())
|
||||||
|
~f:(fun accumulated_storage sig_file ->
|
||||||
|
add_from_file accumulated_storage ~path_to_repo_dir ~sig_file )
|
@ -0,0 +1,17 @@
|
|||||||
|
(*
|
||||||
|
* Copyright (c) Facebook, Inc. and its affiliates.
|
||||||
|
*
|
||||||
|
* This source code is licensed under the MIT license found in the
|
||||||
|
* LICENSE file in the root directory of this source tree.
|
||||||
|
*)
|
||||||
|
open! IStd
|
||||||
|
|
||||||
|
type load_error
|
||||||
|
|
||||||
|
val pp_load_error : Format.formatter -> load_error -> unit
|
||||||
|
|
||||||
|
val load : path_to_repo_dir:string -> (ThirdPartyAnnotationInfo.storage, load_error) result
|
||||||
|
(** Given a path to a repo with 3rd annotation info, loads it from a disk to
|
||||||
|
in-memory representation.
|
||||||
|
After this is done, information can be requested via [ThirdPartyAnnotationInfo].
|
||||||
|
*)
|
@ -0,0 +1,2 @@
|
|||||||
|
some.test.pckg.SomeClass#getNullable() @Nullable
|
||||||
|
some.test.pckg.SomeClass#getNonnull()
|
Loading…
Reference in new issue