diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/impl/PsiClassStubImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/impl/PsiClassStubImpl.java index 0e63de678ec1..38009e798eb6 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/impl/PsiClassStubImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/java/stubs/impl/PsiClassStubImpl.java @@ -15,8 +15,10 @@ */ package com.intellij.psi.impl.java.stubs.impl; +import com.intellij.extapi.psi.StubBasedPsiElementBase; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.PsiClass; +import com.intellij.psi.impl.DebugUtil; import com.intellij.psi.impl.java.stubs.JavaClassElementType; import com.intellij.psi.impl.java.stubs.PsiClassStub; import com.intellij.psi.stubs.StubBase; @@ -65,6 +67,10 @@ public class PsiClassStubImpl extends StubBase implements myName = name; myBaseRefText = baseRefText; myFlags = flags; + if (StubBasedPsiElementBase.ourTraceStubAstBinding) { + String creationTrace = "Stub creation thread: " + Thread.currentThread() + "\n" + DebugUtil.currentStackTrace(); + putUserData(StubBasedPsiElementBase.CREATION_TRACE, creationTrace); + } } @Override diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java index f94bd2a132a9..3ce5161b4ff9 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassImpl.java @@ -22,6 +22,7 @@ import com.intellij.navigation.ItemPresentationProviders; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.ui.Queryable; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.UserDataHolder; import com.intellij.psi.*; import com.intellij.psi.impl.*; import com.intellij.psi.impl.java.stubs.JavaStubElementTypes; @@ -67,17 +68,27 @@ public class PsiClassImpl extends JavaStubPsiElement> implements protected PsiClassImpl(final PsiClassStub stub, final IStubElementType type) { super(stub, type); - addTrace(); + addTrace(null); } public PsiClassImpl(final ASTNode node) { super(node); - addTrace(); + addTrace(null); } - private void addTrace() { + private void addTrace(@Nullable PsiClassStub stub) { if (ourTraceStubAstBinding) { - putUserData(CREATION_TRACE, Thread.currentThread() + "\n" + DebugUtil.currentStackTrace()); + String creationTrace = "Creation thread: " + Thread.currentThread() + "\n" + DebugUtil.currentStackTrace(); + if (stub != null) { + creationTrace += "\nfrom stub " + stub + "@" + System.identityHashCode(stub) + "\n"; + if (stub instanceof UserDataHolder) { + String stubTrace = ((UserDataHolder)stub).getUserData(CREATION_TRACE); + if (stubTrace != null) { + creationTrace += stubTrace; + } + } + } + putUserData(CREATION_TRACE, creationTrace); } } diff --git a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java index 54bb866daace..73bcfa820984 100644 --- a/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java +++ b/platform/core-impl/src/com/intellij/extapi/psi/StubBasedPsiElementBase.java @@ -53,7 +53,7 @@ import java.lang.reflect.Array; public class StubBasedPsiElementBase extends ASTDelegatePsiElement { public static final Key CREATION_TRACE = Key.create("CREATION_TRACE"); private static final Logger LOG = Logger.getInstance("#com.intellij.extapi.psi.StubBasedPsiElementBase"); - protected static final boolean ourTraceStubAstBinding = "true".equals(System.getProperty("trace.stub.ast.binding", "false")); + public static final boolean ourTraceStubAstBinding = "true".equals(System.getProperty("trace.stub.ast.binding", "false")); private volatile T myStub; private volatile ASTNode myNode; private final IElementType myElementType; @@ -105,6 +105,7 @@ public class StubBasedPsiElementBase extends ASTDelegateP @NonNls String message = "Failed to bind stub to AST for element " + getClass() + " in " + (vFile == null ? "" : vFile.getPath()) + + "\nFile:\n" + file.toString() + "@" + System.identityHashCode(file) + "\nFile stub tree:\n" + stubString + "\nLoaded file AST:\n" + astString; if (ourTraceStubAstBinding) { @@ -122,7 +123,7 @@ public class StubBasedPsiElementBase extends ASTDelegateP public void visitComposite(CompositeElement composite) { PsiElement psi = composite.getPsi(); if (psi != null) { - traces.append(psi.toString()).append("\n"); + traces.append(psi.toString()).append("@").append(System.identityHashCode(psi)).append("\n"); String trace = psi.getUserData(CREATION_TRACE); if (trace != null) { traces.append(trace).append("\n");