@@ -36,6 +36,7 @@ type package_warning_info = {
3636 current_package : Package .pos_id option ;
3737 target_package : Package .pos_id option ;
3838 target_package_before_override : string option ;
39+ classptr_reference_warning : bool ;
3940}
4041
4142type package_error_info = {
@@ -48,6 +49,7 @@ type package_error_info = {
4849
4950type check_reason =
5051 [ `Yes of Typing_error.Primary.Package .target_symbol_spec
52+ | `ClassPtrLinterOnly
5153 | `No
5254 ]
5355
@@ -91,6 +93,73 @@ let package_includes current_pkg target_pkg =
9193 false )
9294 | _ -> false
9395
96+ (* triggers a linter error if the edge introduces a new dependency from a file in a package
97+ * due to another file, ingoring package rules to a file with a packageoverride; used *)
98+ let can_access_ignoring_package_override
99+ ~(env : Typing_env_types.env )
100+ ~(current_package : Package.pos_id option )
101+ ~(target_package : Package.pos_id option )
102+ ~(target_file : Relative_path.t )
103+ ~(classptr_reference_warning : bool ) =
104+ let tcopt = Env. get_tcopt env in
105+ let target_package_before_override =
106+ Option. map
107+ (Package_info. get_package_for_file
108+ ~support_multifile_tests:
109+ (TypecheckerOptions. package_support_multifile_tests tcopt)
110+ (TypecheckerOptions. package_info tcopt)
111+ (Relative_path. suffix target_file))
112+ ~f: Package. get_package_name
113+ in
114+ let is_target_package_before_override_included =
115+ match (current_package, target_package_before_override) with
116+ | (Some (_, current_package_name), Some target_package_before_override_name)
117+ ->
118+ let target_package_before_override =
119+ Env. get_package_by_name env target_package_before_override_name
120+ in
121+ package_includes
122+ (Env. get_package_by_name env current_package_name)
123+ target_package_before_override
124+ | _ -> true
125+ in
126+ let is_target_package_before_override_loaded =
127+ match target_package_before_override with
128+ | Some pkg_name -> Env. is_package_loaded env pkg_name
129+ | None -> true
130+ in
131+ let is_target_package_before_override_soft_required =
132+ match
133+ (Env. get_soft_package_requirement env, target_package_before_override)
134+ with
135+ | (Some soft_required_package_name , Some pkg_name ) ->
136+ let soft_required_package =
137+ Env. get_package_by_name env (snd soft_required_package_name)
138+ in
139+ let target_package_before_override =
140+ Env. get_package_by_name env pkg_name
141+ in
142+ package_includes soft_required_package target_package_before_override
143+ | (Some _ , None) -> true
144+ | _ -> false
145+ in
146+ if
147+ is_target_package_before_override_included
148+ || is_target_package_before_override_loaded
149+ || is_target_package_before_override_soft_required
150+ then
151+ `Yes
152+ else
153+ let warn_info =
154+ {
155+ current_package;
156+ target_package;
157+ target_package_before_override;
158+ classptr_reference_warning;
159+ }
160+ in
161+ `YesWarning warn_info
162+
94163let can_access_by_package_rules
95164 ~(env : Typing_env_types.env )
96165 ~(target_package_membership : Aast_defs.package_membership option )
@@ -122,55 +191,18 @@ let can_access_by_package_rules
122191 in
123192 match get_package_violation env current_pkg target_pkg with
124193 | None ->
125- (* There are no package errrors, but emit a warning if the edge introduces a new
126- * dependency a file in a package due to package rules and a file with a packageoverride *)
194+ (* There are no package errrors, but emit a warning if the edge introduces a new dependency
195+ * from a file in a package due to package rules to a file with a packageoverride *)
127196 (match (current_package_membership, target_package_membership) with
128197 | ( Some (Aast_defs. PackageConfigAssignment _),
129198 Some (Aast_defs. PackageOverride _) )
130199 when package_includes current_pkg target_pkg ->
131- let target_package_before_override =
132- let tcopt = Env. get_tcopt env in
133- Option. map
134- (Package_info. get_package_for_file
135- ~support_multifile_tests:
136- (TypecheckerOptions. package_support_multifile_tests tcopt)
137- (TypecheckerOptions. package_info tcopt)
138- (Relative_path. suffix target_file))
139- ~f: Package. get_package_name
140- in
141- let is_target_package_before_override_loaded =
142- match target_package_before_override with
143- | Some pkg_name -> Env. is_package_loaded env pkg_name
144- | None -> true
145- in
146- let is_target_package_before_override_soft_required =
147- match
148- ( Env. get_soft_package_requirement env,
149- target_package_before_override )
150- with
151- | (Some soft_required_package_name , Some pkg_name ) ->
152- let soft_required_package =
153- Env. get_package_by_name env (snd soft_required_package_name)
154- in
155- let target_package_before_override =
156- Env. get_package_by_name env pkg_name
157- in
158- package_includes
159- soft_required_package
160- target_package_before_override
161- | (Some _ , None) -> true
162- | _ -> false
163- in
164- if
165- is_target_package_before_override_loaded
166- || is_target_package_before_override_soft_required
167- then
168- `Yes
169- else
170- let warn_info =
171- { current_package; target_package; target_package_before_override }
172- in
173- `YesWarning warn_info
200+ can_access_ignoring_package_override
201+ ~env
202+ ~current_package
203+ ~target_package
204+ ~target_file
205+ ~classptr_reference_warning: false
174206 | _ -> `Yes )
175207 | Some pkg_relationship ->
176208 let err_info =
0 commit comments