1919import java .util .zip .ZipFile ;
2020
2121import com .github .codeql .Logger ;
22- import static com .github .codeql .ClassNamesKt .getIrDeclBinaryName ;
22+ import static com .github .codeql .ClassNamesKt .getIrElementBinaryName ;
2323import static com .github .codeql .ClassNamesKt .getIrClassVirtualFile ;
2424
25+ import org .jetbrains .kotlin .ir .IrElement ;
2526import org .jetbrains .kotlin .ir .declarations .IrClass ;
2627
2728import com .intellij .openapi .vfs .VirtualFile ;
@@ -212,20 +213,19 @@ private File trapFileFor(File file) {
212213 PathTransformer .std ().fileAsDatabaseString (file ) + ".trap.gz" );
213214 }
214215
215- private File getTrapFileForDecl (IrDeclaration sym , String signature ) {
216+ private File getTrapFileForDecl (IrElement sym , String signature ) {
216217 if (currentSpecFileEntry == null )
217218 return null ;
218219 return trapFileForDecl (sym , signature );
219220 }
220221
221- private File trapFileForDecl (IrDeclaration sym , String signature ) {
222+ private File trapFileForDecl (IrElement sym , String signature ) {
222223 return FileUtil .fileRelativeTo (currentSpecFileEntry .getTrapFolder (),
223224 trapFilePathForDecl (sym , signature ));
224225 }
225226
226- private String trapFilePathForDecl (IrDeclaration sym , String signature ) {
227- String binaryName = getIrDeclBinaryName (sym );
228- String binaryNameWithSignature = binaryName + signature ;
227+ private String trapFilePathForDecl (IrElement sym , String signature ) {
228+ String binaryName = getIrElementBinaryName (sym );
229229 // TODO: Reinstate this?
230230 //if (getTrackClassOrigins())
231231 // classId += "-" + StringDigestor.digest(sym.getSourceFileId());
@@ -241,7 +241,7 @@ private String trapFilePathForDecl(IrDeclaration sym, String signature) {
241241 * Deletion of existing trap files.
242242 */
243243
244- private void deleteTrapFileAndDependencies (IrDeclaration sym , String signature ) {
244+ private void deleteTrapFileAndDependencies (IrElement sym , String signature ) {
245245 File trap = trapFileForDecl (sym , signature );
246246 if (trap .exists ()) {
247247 trap .delete ();
@@ -269,7 +269,7 @@ private void deleteTrapFileAndDependencies(IrDeclaration sym, String signature)
269269 * Any unique suffix needed to distinguish `sym` from other declarations with the same name.
270270 * For functions for example, this means its parameter signature.
271271 */
272- private TrapFileManager getMembersWriterForDecl (File trap , File trapFileBase , TrapClassVersion trapFileVersion , IrDeclaration sym , String signature ) {
272+ private TrapFileManager getMembersWriterForDecl (File trap , File trapFileBase , TrapClassVersion trapFileVersion , IrElement sym , String signature ) {
273273 if (use_trap_locking ) {
274274 TrapClassVersion currVersion = TrapClassVersion .fromSymbol (sym , log );
275275 String shortName = sym instanceof IrDeclarationWithName ? ((IrDeclarationWithName )sym ).getName ().asString () : "(name unknown)" ;
@@ -326,7 +326,7 @@ private TrapFileManager getMembersWriterForDecl(File trap, File trapFileBase, Tr
326326 return trapWriter (trap , sym , signature );
327327 }
328328
329- private TrapFileManager trapWriter (File trapFile , IrDeclaration sym , String signature ) {
329+ private TrapFileManager trapWriter (File trapFile , IrElement sym , String signature ) {
330330 if (!trapFile .getName ().endsWith (".trap.gz" ))
331331 throw new CatastrophicError ("OdasaOutput only supports writing to compressed trap files" );
332332 String relative = FileUtil .relativePath (trapFile , currentSpecFileEntry .getTrapFolder ());
@@ -335,7 +335,7 @@ private TrapFileManager trapWriter(File trapFile, IrDeclaration sym, String sign
335335 return concurrentWriter (trapFile , relative , log , sym , signature );
336336 }
337337
338- private TrapFileManager concurrentWriter (File trapFile , String relative , Logger log , IrDeclaration sym , String signature ) {
338+ private TrapFileManager concurrentWriter (File trapFile , String relative , Logger log , IrElement sym , String signature ) {
339339 if (trapFile .exists ())
340340 return null ;
341341 return new TrapFileManager (trapFile , relative , true , log , sym , signature );
@@ -345,11 +345,11 @@ public class TrapFileManager implements AutoCloseable {
345345
346346 private TrapDependencies trapDependenciesForClass ;
347347 private File trapFile ;
348- private IrDeclaration sym ;
348+ private IrElement sym ;
349349 private String signature ;
350350 private boolean hasError = false ;
351351
352- private TrapFileManager (File trapFile , String relative , boolean concurrentCreation , Logger log , IrDeclaration sym , String signature ) {
352+ private TrapFileManager (File trapFile , String relative , boolean concurrentCreation , Logger log , IrElement sym , String signature ) {
353353 trapDependenciesForClass = new TrapDependencies (relative );
354354 this .trapFile = trapFile ;
355355 this .sym = sym ;
@@ -360,7 +360,7 @@ public File getFile() {
360360 return trapFile ;
361361 }
362362
363- public void addDependency (IrDeclaration dep , String signature ) {
363+ public void addDependency (IrElement dep , String signature ) {
364364 trapDependenciesForClass .addDependency (trapFilePathForDecl (dep , signature ));
365365 }
366366
@@ -460,19 +460,19 @@ public TrapLocker getTrapLockerForModule(String moduleName) {
460460 *
461461 * @return a {@link TrapLocker} for the trap file corresponding to the given class symbol.
462462 */
463- public TrapLocker getTrapLockerForDecl (IrDeclaration sym , String signature , boolean fromSource ) {
463+ public TrapLocker getTrapLockerForDecl (IrElement sym , String signature , boolean fromSource ) {
464464 return new TrapLocker (sym , signature , fromSource );
465465 }
466466
467467 public class TrapLocker implements AutoCloseable {
468- private final IrDeclaration sym ;
468+ private final IrElement sym ;
469469 private final File trapFile ;
470470 // trapFileBase is used when doing lockless TRAP file writing.
471471 // It is trapFile without the #metadata.trap.gz suffix.
472472 private File trapFileBase = null ;
473473 private TrapClassVersion trapFileVersion = null ;
474474 private final String signature ;
475- private TrapLocker (IrDeclaration decl , String signature , boolean fromSource ) {
475+ private TrapLocker (IrElement decl , String signature , boolean fromSource ) {
476476 this .sym = decl ;
477477 this .signature = signature ;
478478 if (sym ==null ) {
@@ -720,11 +720,18 @@ private static long getVirtualFileTimeStamp(VirtualFile vf, Logger log) {
720720 return vf .getTimeStamp ();
721721 }
722722
723- private static TrapClassVersion fromSymbol (IrDeclaration sym , Logger log ) {
724- VirtualFile vf = sym instanceof IrClass ? getIrClassVirtualFile ((IrClass )sym ) :
725- sym .getParent () instanceof IrClass ? getIrClassVirtualFile ((IrClass )sym .getParent ()) :
726- null ;
727- if (vf == null )
723+ private static VirtualFile getVirtualFileIfClass (IrElement e ) {
724+ if (e instanceof IrClass )
725+ return getIrClassVirtualFile ((IrClass )e );
726+ else
727+ return null ;
728+ }
729+
730+ private static TrapClassVersion fromSymbol (IrElement sym , Logger log ) {
731+ VirtualFile vf = getVirtualFileIfClass (sym );
732+ if (vf == null && sym instanceof IrDeclaration )
733+ vf = getVirtualFileIfClass (((IrDeclaration )sym ).getParent ());
734+ if (vf == null )
728735 return new TrapClassVersion (-1 , 0 , 0 , null );
729736
730737 final int [] versionStore = new int [1 ];
0 commit comments