From f4d01ce6456302a1d262cd0ca949b0d503f378c6 Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Tue, 17 Dec 2019 15:36:43 +0700 Subject: [PATCH] DfaAssist: fix class loader mocking; support null context loader GitOrigin-RevId: 38ef9b85c6e66306d694c4361ca4e22f276ec90e --- .../engine/dfaassist/DebuggerDfaRunner.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/java/debugger/impl/src/com/intellij/debugger/engine/dfaassist/DebuggerDfaRunner.java b/java/debugger/impl/src/com/intellij/debugger/engine/dfaassist/DebuggerDfaRunner.java index 02a9556608b3..521814108a54 100644 --- a/java/debugger/impl/src/com/intellij/debugger/engine/dfaassist/DebuggerDfaRunner.java +++ b/java/debugger/impl/src/com/intellij/debugger/engine/dfaassist/DebuggerDfaRunner.java @@ -204,7 +204,7 @@ class DebuggerDfaRunner extends DataFlowRunner { private class StateBuilder { private final @NotNull PsiElementFactory myPsiFactory = JavaPsiFacade.getElementFactory(myProject); private final @NotNull DfaValueFactory myFactory = getFactory(); - private final @NotNull ClassLoaderReference myContextLoader; + private final @Nullable ClassLoaderReference myContextLoader; private final @NotNull DfaMemoryState myMemState; private final @NotNull Map myCanonicalMap = new HashMap<>(); private @Nullable List myParentLoaders = null; @@ -285,15 +285,17 @@ class DebuggerDfaRunner extends DataFlowRunner { private List getParentLoaders() { if (myParentLoaders == null) { List loaders = Collections.emptyList(); - ClassType classLoaderClass = (ClassType)myContextLoader.referenceType(); - while (classLoaderClass != null && !"java.lang.ClassLoader".equals(classLoaderClass.name())) { - classLoaderClass = classLoaderClass.superclass(); - } - if (classLoaderClass != null) { - Field parent = classLoaderClass.fieldByName("parent"); - if (parent != null) { - loaders = StreamEx.iterate( - myContextLoader, Objects::nonNull, loader -> ObjectUtils.tryCast(loader.getValue(parent), ClassLoaderReference.class)).toList(); + if (myContextLoader != null) { + ClassType classLoaderClass = (ClassType)myContextLoader.referenceType(); + while (classLoaderClass != null && !"java.lang.ClassLoader".equals(classLoaderClass.name())) { + classLoaderClass = classLoaderClass.superclass(); + } + if (classLoaderClass != null) { + Field parent = classLoaderClass.fieldByName("parent"); + if (parent != null) { + loaders = StreamEx.iterate( + myContextLoader, Objects::nonNull, loader -> ObjectUtils.tryCast(loader.getValue(parent), ClassLoaderReference.class)).toList(); + } } } myParentLoaders = loaders;