diff --git a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/IDELightClassGenerationSupport.java b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/IDELightClassGenerationSupport.java index 8d9745f9f93..351708222b0 100644 --- a/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/IDELightClassGenerationSupport.java +++ b/idea/idea-analysis/src/org/jetbrains/jet/plugin/caches/resolve/IDELightClassGenerationSupport.java @@ -19,6 +19,7 @@ package org.jetbrains.jet.plugin.caches.resolve; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.libraries.LibraryUtil; +import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.psi.ClassFileViewProvider; import com.intellij.psi.PsiClass; @@ -396,7 +397,7 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport @NotNull final JetFile decompiledKotlinFile, @NotNull VirtualFile virtualFile ) { - final PsiJavaFileStubImpl javaFileStub = (PsiJavaFileStubImpl) createStub(virtualFile); + final PsiJavaFileStubImpl javaFileStub = getOrCreateJavaFileStub(virtualFile); if (javaFileStub == null) { return null; } @@ -418,6 +419,32 @@ public class IDELightClassGenerationSupport extends LightClassGenerationSupport return (ClsClassImpl) single(fakeFile.getClasses()); } + private final static Key cachedJavaStubKey = Key.create("CACHED_JAVA_STUB"); + + private static class CachedJavaStub { + public CachedJavaStub(long modificationStamp, @NotNull PsiJavaFileStubImpl javaFileStub) { + this.modificationStamp = modificationStamp; + this.javaFileStub = javaFileStub; + } + + public long modificationStamp; + public PsiJavaFileStubImpl javaFileStub; + } + + @Nullable + private static PsiJavaFileStubImpl getOrCreateJavaFileStub(@NotNull VirtualFile virtualFile) { + CachedJavaStub cachedJavaStub = virtualFile.getUserData(cachedJavaStubKey); + long fileModificationStamp = virtualFile.getModificationStamp(); + if (cachedJavaStub != null && cachedJavaStub.modificationStamp == fileModificationStamp) { + return cachedJavaStub.javaFileStub; + } + PsiJavaFileStubImpl stub = (PsiJavaFileStubImpl) createStub(virtualFile); + if (stub != null) { + virtualFile.putUserData(cachedJavaStubKey, new CachedJavaStub(fileModificationStamp, stub)); + } + return stub; + } + @Nullable private static PsiJavaFileStub createStub(@NotNull VirtualFile file) { try {