diff --git a/java/java-psi-impl/src/com/intellij/core/CoreJavaDirectoryService.java b/java/java-psi-impl/src/com/intellij/core/CoreJavaDirectoryService.java index 23ce0c9ce054..b07f20df3b5a 100644 --- a/java/java-psi-impl/src/com/intellij/core/CoreJavaDirectoryService.java +++ b/java/java-psi-impl/src/com/intellij/core/CoreJavaDirectoryService.java @@ -17,8 +17,10 @@ package com.intellij.core; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.diagnostic.Logger; +import com.intellij.openapi.roots.FileIndexFacade; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; +import com.intellij.psi.impl.compiled.ClsFileImpl; import com.intellij.util.IncorrectOperationException; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -42,8 +44,13 @@ public class CoreJavaDirectoryService extends JavaDirectoryService { public PsiClass[] getClasses(@NotNull PsiDirectory dir) { LOG.assertTrue(dir.isValid()); + boolean onlyCompiled = FileIndexFacade.getInstance(dir.getProject()).isInLibraryClasses(dir.getVirtualFile()); + List classes = null; for (PsiFile file : dir.getFiles()) { + if (onlyCompiled && !(file instanceof ClsFileImpl)) { + continue; + } if (file instanceof PsiClassOwner && file.getViewProvider().getLanguages().size() == 1) { PsiClass[] psiClasses = ((PsiClassOwner)file).getClasses(); if (psiClasses.length == 0) continue; diff --git a/java/java-tests/testData/libResolve/classesAndSources/classesAndSources.jar b/java/java-tests/testData/libResolve/classesAndSources/classesAndSources.jar new file mode 100644 index 000000000000..b4cf119b3d68 Binary files /dev/null and b/java/java-tests/testData/libResolve/classesAndSources/classesAndSources.jar differ diff --git a/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInLibrariesTest.groovy b/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInLibrariesTest.groovy index 4d7d3930bbe7..2c24ba632bb7 100644 --- a/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInLibrariesTest.groovy +++ b/java/java-tests/testSrc/com/intellij/psi/resolve/ResolveInLibrariesTest.groovy @@ -16,8 +16,10 @@ package com.intellij.psi.resolve import com.intellij.openapi.application.ex.PathManagerEx import com.intellij.openapi.vfs.LocalFileSystem +import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.JavaPsiFacade import com.intellij.psi.PsiClass +import com.intellij.psi.PsiFile import com.intellij.psi.PsiMethod import com.intellij.psi.search.GlobalSearchScope import com.intellij.psi.search.searches.ClassInheritorsSearch @@ -132,4 +134,22 @@ class ResolveInLibrariesTest extends JavaCodeInsightFixtureTestCase { private PsiMethod fooMethod(PsiClass c) { c.findMethodsByName('foo', false)[0] } private Set fooInheritors(PsiClass c) { OverridingMethodsSearch.search(fooMethod(c)).findAll() as Set } + public void "test do not parse not stubbed sources in class jars"() { + def lib = LocalFileSystem.getInstance().refreshAndFindFileByPath(PathManagerEx.getTestDataPath() + "/libResolve/classesAndSources") + PsiTestUtil.addLibrary(myModule, 'cas', lib.path, ["/classesAndSources.jar!/"] as String[], ["/classesAndSources.jar!/"] as String[]) + + def facade = JavaPsiFacade.getInstance(project) + def scope = GlobalSearchScope.allScope(project) + + assert facade.findClasses('LibraryClass', scope).size() == 1 + + def pkg = facade.findPackage("") + assert pkg.classes.size() == 1 + + Collection pkgDirs = pkg.directories.collect { it.virtualFile } + Collection pkgChildren = pkgDirs.collect { it.children as List }.flatten() + PsiFile javaSrc = psiManager.findFile(pkgChildren.find { it.name == 'LibraryClass.java' }) + assert !javaSrc.node.parsed + } + }