get java language level from the root model when pushers haven't finished yet

This commit is contained in:
peter
2014-05-30 15:26:51 +02:00
parent bd93483946
commit ac9d1e864f
7 changed files with 54 additions and 28 deletions
@@ -24,8 +24,13 @@ import org.jetbrains.annotations.Nullable;
* @author yole
*/
public class LanguageLevelUtil extends EffectiveLanguageLevelUtil {
private LanguageLevelUtil() { }
/**
* @deprecated use {@link com.intellij.psi.impl.JavaPsiImplementationHelper#getEffectiveLanguageLevel(com.intellij.openapi.vfs.VirtualFile)}
* todo remove in IDEA 15
* @param file
* @return
*/
@NotNull
public static LanguageLevel getLanguageLevelForFile(@Nullable VirtualFile file) {
if (file == null) return LanguageLevel.HIGHEST;
@@ -20,12 +20,12 @@ import com.intellij.openapi.fileTypes.FileType;
import com.intellij.openapi.fileTypes.SyntaxHighlighter;
import com.intellij.openapi.fileTypes.SyntaxHighlighterFactory;
import com.intellij.openapi.fileTypes.SyntaxHighlighterProvider;
import com.intellij.openapi.module.LanguageLevelUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiManager;
import com.intellij.psi.impl.JavaPsiImplementationHelper;
import com.intellij.psi.impl.compiled.ClsFileImpl;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -37,7 +37,7 @@ public class JavaSyntaxHighlighterFactory extends SyntaxHighlighterFactory imple
@Override
@NotNull
public SyntaxHighlighter getSyntaxHighlighter(@Nullable Project project, @Nullable VirtualFile file) {
return new JavaFileHighlighter(LanguageLevelUtil.getLanguageLevelForFile(file));
return new JavaFileHighlighter(project == null ? LanguageLevel.HIGHEST : JavaPsiImplementationHelper.getInstance(project).getEffectiveLanguageLevel(file));
}
/**
@@ -23,6 +23,7 @@ import com.intellij.lang.java.JavaLanguage;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.module.EffectiveLanguageLevelUtil;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.progress.ProcessCanceledException;
import com.intellij.openapi.project.Project;
@@ -39,6 +40,7 @@ import com.intellij.psi.impl.compiled.ClsClassImpl;
import com.intellij.psi.impl.source.codeStyle.ImportHelper;
import com.intellij.psi.search.GlobalSearchScope;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.psi.util.PsiUtil;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashSet;
@@ -137,9 +139,35 @@ public class JavaPsiImplementationHelperImpl extends JavaPsiImplementationHelper
return clsFile;
}
@Nullable
@NotNull
@Override
public LanguageLevel getClassesLanguageLevel(VirtualFile virtualFile) {
public LanguageLevel getEffectiveLanguageLevel(@Nullable VirtualFile virtualFile) {
if (virtualFile == null) return PsiUtil.getLanguageLevel(myProject);
final VirtualFile folder = virtualFile.getParent();
if (folder != null) {
final LanguageLevel level = folder.getUserData(LanguageLevel.KEY);
if (level != null) return level;
}
final ProjectFileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex();
Module module = index.getModuleForFile(virtualFile);
if (module != null && index.isInSourceContent(virtualFile)) {
return EffectiveLanguageLevelUtil.getEffectiveLanguageLevel(module);
}
LanguageLevel classesLanguageLevel = getClassesLanguageLevel(virtualFile);
return classesLanguageLevel != null ? classesLanguageLevel : PsiUtil.getLanguageLevel(myProject);
}
/**
* 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
private LanguageLevel getClassesLanguageLevel(VirtualFile virtualFile) {
final ProjectFileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex();
final VirtualFile sourceRoot = index.getSourceRootForFile(virtualFile);
final VirtualFile folder = virtualFile.getParent();
@@ -16,16 +16,25 @@
package com.intellij.core;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.pom.java.LanguageLevel;
import com.intellij.psi.*;
import com.intellij.psi.impl.JavaPsiImplementationHelper;
import com.intellij.psi.util.PsiUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* @author yole
*/
public class CoreJavaPsiImplementationHelper extends JavaPsiImplementationHelper {
private final Project myProject;
public CoreJavaPsiImplementationHelper(Project project) {
myProject = project;
}
@Override
public PsiClass getOriginalClass(PsiClass psiClass) {
return psiClass;
@@ -37,9 +46,10 @@ public class CoreJavaPsiImplementationHelper extends JavaPsiImplementationHelper
return clsFile;
}
@NotNull
@Override
public LanguageLevel getClassesLanguageLevel(VirtualFile virtualFile) {
return null;
public LanguageLevel getEffectiveLanguageLevel(@Nullable VirtualFile virtualFile) {
return PsiUtil.getLanguageLevel(myProject);
}
@Override
@@ -63,7 +63,7 @@ public class JavaCoreProjectEnvironment extends CoreProjectEnvironment {
}
protected CoreJavaPsiImplementationHelper createJavaPsiImplementationHelper() {
return new CoreJavaPsiImplementationHelper();
return new CoreJavaPsiImplementationHelper(myProject);
}
protected JavaFileManager createCoreFileManager() {
@@ -37,14 +37,8 @@ public abstract class JavaPsiImplementationHelper {
@NotNull
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);
@NotNull
public abstract LanguageLevel getEffectiveLanguageLevel(@Nullable VirtualFile virtualFile);
public abstract ASTNode getDefaultImportAnchor(PsiImportList list, PsiImportStatementBase statement);
@@ -466,18 +466,7 @@ public abstract class PsiJavaFileBaseImpl extends PsiFileImpl implements PsiJava
return LanguageLevelProjectExtension.getInstance(project).getLanguageLevel();
}
final VirtualFile folder = virtualFile.getParent();
if (folder != null) {
final LanguageLevel level = folder.getUserData(LanguageLevel.KEY);
if (level != null) return level;
}
final LanguageLevel classesLanguageLevel = JavaPsiImplementationHelper.getInstance(project).getClassesLanguageLevel(virtualFile);
if (classesLanguageLevel != null) {
return classesLanguageLevel;
}
return PsiUtil.getLanguageLevel(project);
return JavaPsiImplementationHelper.getInstance(project).getEffectiveLanguageLevel(virtualFile);
}
private static class MyCacheBuilder implements CachedValueProvider<MostlySingularMultiMap<String, SymbolCollectingProcessor.ResultWithContext>> {