@@ -213,6 +213,62 @@ def is_candidate(pack: ResolvedCodeQLPack) -> bool:
213
213
with target_copy .path .open ("w" ) as fd :
214
214
yaml .dump (qlpack_spec , fd )
215
215
216
+ logging .debug (
217
+ f"Determining if standard library CodeQL library pack { target .name } is customizable."
218
+ )
219
+ if not (target_copy .path .parent / "Customizations.qll" ).exists ():
220
+ logging .debug (
221
+ f"Standard library CodeQL pack { target .name } does not have a 'Customizations' library, attempting to add one."
222
+ )
223
+ # Assume the CodeQL library pack has name `<language>-all`.
224
+ target_language = target_copy .get_pack_name ().removesuffix ("-all" )
225
+ target_language_library_path = (
226
+ target_copy .path .parent / f"{ target_language } .qll"
227
+ )
228
+ logging .debug (
229
+ f"Looking for standard library language module { target_language_library_path .name } "
230
+ )
231
+ if not target_language_library_path .exists ():
232
+ raise BundleException (
233
+ f"Unable to customize { target .name } , because it doesn't have a 'Customizations' library and we cannot determine the language library."
234
+ )
235
+ logging .debug (
236
+ f"Found standard library language module { target_language_library_path .name } , adding import of 'Customizations' library."
237
+ )
238
+ with target_language_library_path .open ("r" ) as fd :
239
+ target_language_library_lines = fd .readlines ()
240
+ logging .debug (f"Looking for the first import statement." )
241
+
242
+ first_import_idx = None
243
+ for idx , line in enumerate (target_language_library_lines ):
244
+ if line .startswith ("import" ):
245
+ first_import_idx = idx
246
+ break
247
+ if first_import_idx == None :
248
+ raise BundleException (
249
+ f"Unable to customize { target .name } , because we cannot determine the first import statement of { target_language_library_path .name } ."
250
+ )
251
+ logging .debug (
252
+ "Found first import statement and prepending import statement importing 'Customizations'"
253
+ )
254
+ target_language_library_lines .insert (
255
+ first_import_idx , "import Customizations\n "
256
+ )
257
+ with target_language_library_path .open ("w" ) as fd :
258
+ fd .writelines (target_language_library_lines )
259
+ logging .debug (
260
+ f"Writing modified language library to { target_language_library_path } "
261
+ )
262
+
263
+ target_customization_library_path = (
264
+ target_copy .path .parent / "Customizations.qll"
265
+ )
266
+ logging .debug (
267
+ f"Creating Customizations library with import of language { target_language } "
268
+ )
269
+ with target_customization_library_path .open ("w" ) as fd :
270
+ fd .write (f"import { target_language } \n " )
271
+
216
272
logging .debug (
217
273
f"Updating 'Customizations.qll' with imports of customization libraries."
218
274
)
0 commit comments