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
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);
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;
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;
* @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();
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());
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;
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();
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;