Update LanguageLevel.forElement for directories (PY-37933)

Due to dependencies configuration we decided to move its implementation to PyPsiFacade

GitOrigin-RevId: 9f8f3cd56a3a01d62f9f558e0b0fe1c41a8e939a
This commit is contained in:
Semyon Proshev
2019-09-16 13:18:45 +00:00
committed by intellij-monorepo-bot
parent b57c568df4
commit 8b6907e608
5 changed files with 36 additions and 11 deletions
@@ -18,7 +18,6 @@ package com.jetbrains.python.psi;
import com.google.common.collect.ImmutableList;
import com.intellij.openapi.util.Key;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
@@ -204,11 +203,7 @@ public enum LanguageLevel {
@NotNull
public static LanguageLevel forElement(@NotNull PsiElement element) {
final PsiFile containingFile = element.getContainingFile();
if (containingFile instanceof PyFile) {
return ((PyFile)containingFile).getLanguageLevel();
}
return getDefault();
return PyPsiFacade.getInstance(element.getProject()).getLanguageLevel(element);
}
@NotNull
@@ -78,4 +78,7 @@ public abstract class PyPsiFacade {
@Nullable
public abstract String findShortestImportableName(@NotNull VirtualFile targetFile, @NotNull PsiElement anchor);
@NotNull
public abstract LanguageLevel getLanguageLevel(@NotNull PsiElement element);
}
@@ -19,11 +19,12 @@ import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtilCore;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiDirectory;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.util.QualifiedName;
import com.intellij.util.ObjectUtils;
import com.jetbrains.python.psi.PyClass;
import com.jetbrains.python.psi.PyPsiFacade;
import com.jetbrains.python.psi.*;
import com.jetbrains.python.psi.resolve.PyQualifiedNameResolveContext;
import com.jetbrains.python.psi.resolve.PyResolveImportUtil;
import com.jetbrains.python.psi.resolve.QualifiedNameFinder;
@@ -36,6 +37,8 @@ import org.jetbrains.annotations.Nullable;
import java.util.Collection;
import java.util.List;
import static com.jetbrains.python.psi.LanguageLevel.getDefault;
/**
* @author yole
*/
@@ -113,4 +116,20 @@ public class PyPsiFacadeImpl extends PyPsiFacade {
public String findShortestImportableName(@NotNull VirtualFile targetFile, @NotNull PsiElement anchor) {
return QualifiedNameFinder.findShortestImportableName(anchor, targetFile);
}
@NotNull
@Override
public LanguageLevel getLanguageLevel(@NotNull PsiElement element) {
if (element instanceof PsiDirectory) {
final PsiDirectory directory = (PsiDirectory)element;
return PyUtil.getLanguageLevelForVirtualFile(directory.getProject(), directory.getVirtualFile());
}
final PsiFile containingFile = element.getContainingFile();
if (containingFile instanceof PyFile) {
return ((PyFile)containingFile).getLanguageLevel();
}
return getDefault();
}
}
@@ -22,6 +22,8 @@ import com.intellij.testFramework.ParsingTestCase;
import com.intellij.testFramework.TestDataPath;
import com.jetbrains.python.psi.LanguageLevel;
import com.jetbrains.python.psi.PyFunction;
import com.jetbrains.python.psi.PyPsiFacade;
import com.jetbrains.python.psi.impl.PyPsiFacadeImpl;
import com.jetbrains.python.psi.impl.PythonASTFactory;
import org.jetbrains.annotations.NotNull;
@@ -50,6 +52,7 @@ public class PythonParsingTest extends ParsingTestCase {
registerExtension(PythonDialectsTokenSetContributor.EP_NAME, new PythonTokenSetContributor());
addExplicitExtension(LanguageASTFactory.INSTANCE, PythonLanguage.getInstance(), new PythonASTFactory());
PythonDialectsTokenSetProvider.reset();
getProject().registerService(PyPsiFacade.class, PyPsiFacadeImpl.class);
}
@Override
@@ -534,9 +534,14 @@ public class PyMultiFileResolveTest extends PyMultiFileResolveTestCase {
// PY-19989
public void testAmbiguousImplicitRelativeImport() {
prepareTestDirectory();
assertSameElements(doMultiResolveAndGetFileUrls("pkg2/__init__.py"), "pkg2/mod.py");
assertSameElements(doMultiResolveAndGetFileUrls("pkg/__init__.py"), "pkg/mod.py");
runWithLanguageLevel(
LanguageLevel.PYTHON27,
() -> {
prepareTestDirectory();
assertSameElements(doMultiResolveAndGetFileUrls("pkg2/__init__.py"), "pkg2/mod.py");
assertSameElements(doMultiResolveAndGetFileUrls("pkg/__init__.py"), "pkg/mod.py");
}
);
}
// PY-21088