PsiJavaFileBaseImpl dependency on order entries moved to JavaPsiImplementationHelper
authorDmitry Jemerov <yole@jetbrains.com>
Fri, 23 Sep 2011 11:16:10 +0000 (13:16 +0200)
committerDmitry Jemerov <yole@jetbrains.com>
Fri, 23 Sep 2011 12:27:03 +0000 (14:27 +0200)
java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelper.java
java/java-impl/src/com/intellij/psi/impl/JavaPsiImplementationHelperImpl.java
java/java-impl/src/com/intellij/psi/impl/source/PsiJavaFileBaseImpl.java

index 36fb8fb77df07960b6fe71bc41fff3d43f732d27..81c2629453ae12f32e9779f3a5e67364e18f0b8e 100644 (file)
@@ -18,7 +18,10 @@ package com.intellij.psi.impl;
 import com.intellij.lang.ASTNode;
 import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.*;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * @author yole
@@ -32,6 +35,15 @@ public abstract class JavaPsiImplementationHelper {
 
   public abstract PsiElement getClsFileNavigationElement(PsiJavaFile clsFile);
 
+  /**
+   * For files under a library source root, returns the language level configured for the corresponding classes root.
+   *
+   * @param virtualFile virtual file for which language level is requested.
+   * @return language level for classes root or null if file is not under a library source root or no matching classes root is found.
+   */
+  @Nullable
+  public abstract LanguageLevel getClassesLanguageLevel(VirtualFile virtualFile);
+
   public abstract ASTNode getDefaultImportAnchor(PsiImportList list, PsiImportStatementBase statement);
 
   public abstract PsiElement getDefaultMemberAnchor(PsiClass psiClass, PsiMember firstPsi);
index ee72b3d7245ac36b9c273020c18dde5d9cf75baa..c685f965973b676ab29898ed01fb237827deb12a 100644 (file)
 package com.intellij.psi.impl;
 
 import com.intellij.lang.ASTNode;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.fileTypes.StdFileTypes;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.OrderEntry;
-import com.intellij.openapi.roots.OrderRootType;
-import com.intellij.openapi.roots.ProjectFileIndex;
-import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.roots.*;
+import com.intellij.openapi.roots.impl.DirectoryIndex;
+import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.*;
 import com.intellij.psi.codeStyle.CodeStyleSettings;
 import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
@@ -30,6 +32,7 @@ import com.intellij.psi.impl.compiled.ClsClassImpl;
 import com.intellij.psi.impl.source.codeStyle.ImportHelper;
 import com.intellij.psi.search.GlobalSearchScope;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.List;
 
@@ -37,6 +40,14 @@ import java.util.List;
  * @author yole
  */
 public class JavaPsiImplementationHelperImpl extends JavaPsiImplementationHelper {
+  private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.JavaPsiImplementationHelperImpl");
+
+  private final Project myProject;
+
+  public JavaPsiImplementationHelperImpl(Project project) {
+    myProject = project;
+  }
+
   @Override
   public PsiClass getOriginalClass(PsiClass psiClass) {
     PsiFile psiFile = psiClass.getContainingFile();
@@ -104,6 +115,43 @@ public class JavaPsiImplementationHelperImpl extends JavaPsiImplementationHelper
     return clsFile;
   }
 
+  @Nullable
+  @Override
+  public LanguageLevel getClassesLanguageLevel(VirtualFile virtualFile) {
+    final ProjectFileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex();
+    final VirtualFile sourceRoot = index.getSourceRootForFile(virtualFile);
+    final VirtualFile folder = virtualFile.getParent();
+    if (sourceRoot != null && folder != null) {
+      String relativePath = VfsUtilCore.getRelativePath(folder, sourceRoot, '/');
+      LOG.assertTrue(relativePath != null);
+      List<OrderEntry> orderEntries = index.getOrderEntriesForFile(virtualFile);
+      if (orderEntries.isEmpty()) {
+        LOG.error("Inconsistent: " + DirectoryIndex.getInstance(myProject).getInfoForDirectory(folder).toString());
+      }
+      final VirtualFile[] files = orderEntries.get(0).getFiles(OrderRootType.CLASSES);
+      for (VirtualFile rootFile : files) {
+        final VirtualFile classFile = rootFile.findFileByRelativePath(relativePath);
+        if (classFile != null) {
+          return getLanguageLevel(classFile);
+        }
+      }
+    }
+    return null;
+  }
+
+  private LanguageLevel getLanguageLevel(final VirtualFile dirFile) {
+    final VirtualFile[] children = dirFile.getChildren();
+    final LanguageLevel defaultLanguageLevel = LanguageLevelProjectExtension.getInstance(myProject).getLanguageLevel();
+    for (VirtualFile child : children) {
+      if (StdFileTypes.CLASS.equals(child.getFileType())) {
+        final PsiFile psiFile = PsiManager.getInstance(myProject).findFile(child);
+        if (psiFile instanceof PsiJavaFile) return ((PsiJavaFile)psiFile).getLanguageLevel();
+      }
+    }
+
+    return defaultLanguageLevel;
+  }
+
   @Override
   public ASTNode getDefaultImportAnchor(PsiImportList list, PsiImportStatementBase statement) {
     CodeStyleSettings settings = CodeStyleSettingsManager.getSettings(list.getProject());
index fab31e4faacf48cc57272e02b2e15a7e74d7e874..f4b65ce0302d2d9d8c97cb74eb684300caad58ed 100644 (file)
@@ -20,17 +20,15 @@ import com.intellij.lang.ASTNode;
 import com.intellij.lang.Language;
 import com.intellij.lang.java.JavaLanguage;
 import com.intellij.openapi.diagnostic.Logger;
-import com.intellij.openapi.fileTypes.StdFileTypes;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.roots.*;
-import com.intellij.openapi.roots.impl.DirectoryIndex;
+import com.intellij.openapi.roots.LanguageLevelProjectExtension;
 import com.intellij.openapi.util.Key;
 import com.intellij.openapi.util.NotNullLazyKey;
-import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.*;
 import com.intellij.psi.codeStyle.JavaCodeStyleManager;
+import com.intellij.psi.impl.JavaPsiImplementationHelper;
 import com.intellij.psi.impl.PsiImplUtil;
 import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
 import com.intellij.psi.impl.java.stubs.PsiJavaFileStub;
@@ -418,10 +416,11 @@ public abstract class PsiJavaFileBaseImpl extends PsiFileImpl implements PsiJava
       virtualFile = getUserData(IndexingDataKeys.VIRTUAL_FILE);
     }
 
+    final Project project = getProject();
     if (virtualFile == null) {
       final PsiFile originalFile = getOriginalFile();
       if (originalFile instanceof PsiJavaFile && originalFile != this) return ((PsiJavaFile)originalFile).getLanguageLevel();
-      return LanguageLevelProjectExtension.getInstance(getProject()).getLanguageLevel();
+      return LanguageLevelProjectExtension.getInstance(project).getLanguageLevel();
     }
 
     final VirtualFile folder = virtualFile.getParent();
@@ -430,41 +429,13 @@ public abstract class PsiJavaFileBaseImpl extends PsiFileImpl implements PsiJava
       if (level != null) return level;
     }
 
-    final Project project = getProject();
-    final ProjectFileIndex index = ProjectRootManager.getInstance(project).getFileIndex();
-    final VirtualFile sourceRoot = index.getSourceRootForFile(virtualFile);
-    if (sourceRoot != null && folder != null) {
-      String relativePath = VfsUtilCore.getRelativePath(folder, sourceRoot, '/');
-      LOG.assertTrue(relativePath != null);
-      List<OrderEntry> orderEntries = index.getOrderEntriesForFile(virtualFile);
-      if (orderEntries.isEmpty()) {
-        LOG.error("Inconsistent: " + DirectoryIndex.getInstance(project).getInfoForDirectory(folder).toString());
-      }
-      final VirtualFile[] files = orderEntries.get(0).getFiles(OrderRootType.CLASSES);
-      for (VirtualFile rootFile : files) {
-        final VirtualFile classFile = rootFile.findFileByRelativePath(relativePath);
-        if (classFile != null) {
-          return getLanguageLevel(classFile);
-        }
-      }
+    final LanguageLevel classesLanguageLevel = JavaPsiImplementationHelper.getInstance(project).getClassesLanguageLevel(virtualFile);
+    if (classesLanguageLevel != null) {
+      return classesLanguageLevel;
     }
-
     return LanguageLevelProjectExtension.getInstance(project).getLanguageLevel();
   }
 
-  private LanguageLevel getLanguageLevel(final VirtualFile dirFile) {
-    final VirtualFile[] children = dirFile.getChildren();
-    final LanguageLevel defaultLanguageLevel = LanguageLevelProjectExtension.getInstance(getProject()).getLanguageLevel();
-    for (VirtualFile child : children) {
-      if (StdFileTypes.CLASS.equals(child.getFileType())) {
-        final PsiFile psiFile = getManager().findFile(child);
-        if (psiFile instanceof PsiJavaFile) return ((PsiJavaFile)psiFile).getLanguageLevel();
-      }
-    }
-
-    return defaultLanguageLevel;
-  }
-
   private static class MyCacheBuilder implements CachedValueProvider<MostlySingularMultiMap<String, SymbolCollectingProcessor.ResultWithContext>> {
     private final PsiJavaFileBaseImpl myFile;