diff --git a/java/java-psi-impl/src/com/intellij/core/CoreJavaPsiImplementationHelper.java b/java/java-psi-impl/src/com/intellij/core/CoreJavaPsiImplementationHelper.java index dd5df51e31e1..a0d9d0e02989 100644 --- a/java/java-psi-impl/src/com/intellij/core/CoreJavaPsiImplementationHelper.java +++ b/java/java-psi-impl/src/com/intellij/core/CoreJavaPsiImplementationHelper.java @@ -4,6 +4,7 @@ package com.intellij.core; import com.intellij.lang.ASTNode; import com.intellij.model.psi.PsiSymbolReference; import com.intellij.openapi.project.Project; +import com.intellij.openapi.util.Key; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; @@ -14,6 +15,8 @@ import com.intellij.psi.util.PsiUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Objects; + public class CoreJavaPsiImplementationHelper extends JavaPsiImplementationHelper { private final Project myProject; @@ -39,9 +42,24 @@ public class CoreJavaPsiImplementationHelper extends JavaPsiImplementationHelper @Override public @NotNull LanguageLevel getEffectiveLanguageLevel(@Nullable VirtualFile virtualFile) { + if (virtualFile != null) { + synchronized (virtualFile) { + LanguageLevel level = virtualFile.getUserData(FORCED_LANGUAGE_LEVEL_KEY); + if (level != null) return level; + } + } return PsiUtil.getLanguageLevel(myProject); } + public boolean setEffectiveLanguageLevel(@NotNull VirtualFile file, @Nullable LanguageLevel level) { + synchronized (file) { + LanguageLevel previousHolder = file.getUserData(FORCED_LANGUAGE_LEVEL_KEY); + if (Objects.equals(previousHolder, level)) return false; + file.putUserData(FORCED_LANGUAGE_LEVEL_KEY, level); + return true; + } + } + @Override public ASTNode getDefaultImportAnchor(@NotNull PsiImportList list, @NotNull PsiImportStatementBase statement) { throw new UnsupportedOperationException("TODO"); @@ -70,4 +88,6 @@ public class CoreJavaPsiImplementationHelper extends JavaPsiImplementationHelper public @NotNull Project getProject() { return myProject; } + + private static final Key FORCED_LANGUAGE_LEVEL_KEY = Key.create("FORCED_LANGUAGE_LEVEL_KEY"); } \ No newline at end of file