mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
test and a bit of refactoring for py->java resolve
This commit is contained in:
@@ -2,10 +2,7 @@ package com.jetbrains.python.psi.impl;
|
||||
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleUtil;
|
||||
import com.intellij.psi.JavaPsiFacade;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiPackage;
|
||||
import com.intellij.psi.*;
|
||||
import com.jetbrains.python.psi.PyReferenceExpression;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -14,8 +11,14 @@ import org.jetbrains.annotations.Nullable;
|
||||
*/
|
||||
public class PyJavaImportResolver implements PyImportResolver {
|
||||
@Nullable
|
||||
public PsiElement resolveImportReference(final PyReferenceExpression importRef, final PsiElement importFrom) {
|
||||
public PsiElement resolveImportReference(final PyReferenceExpression importRef, PsiElement importFrom) {
|
||||
String fqn = importRef.getText();
|
||||
if (importFrom instanceof PsiDirectory) {
|
||||
PsiPackage fromPackage = JavaDirectoryService.getInstance().getPackage((PsiDirectory) importFrom);
|
||||
if (fromPackage != null) {
|
||||
importFrom = fromPackage;
|
||||
}
|
||||
}
|
||||
if (importFrom instanceof PsiPackage) {
|
||||
fqn = ((PsiPackage) importFrom).getQualifiedName() + "." + fqn;
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
package com.jetbrains.python.psi.impl;
|
||||
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.module.Module;
|
||||
import com.intellij.openapi.module.ModuleUtil;
|
||||
import com.intellij.openapi.roots.*;
|
||||
import com.intellij.openapi.vfs.VirtualFile;
|
||||
import com.intellij.openapi.extensions.Extensions;
|
||||
import com.intellij.psi.PsiDirectory;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.intellij.psi.PsiFile;
|
||||
import com.intellij.psi.PsiManager;
|
||||
import com.jetbrains.python.psi.*;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -36,13 +36,16 @@ public class ResolveImportUtil {
|
||||
}
|
||||
}
|
||||
|
||||
for(PyImportResolver resolver: Extensions.getExtensions(PyImportResolver.EP_NAME)) {
|
||||
PsiElement result = resolver.resolveImportReference(importRef, importFrom);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
PsiElement result = resolvePythonImport(importRef, importFrom, referencedName);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
return resolveForeignImport(importRef, importFrom);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiElement resolvePythonImport(final PyReferenceExpression importRef, final PsiElement importFrom,
|
||||
final String referencedName) {
|
||||
final PyExpression qualifier = importRef.getQualifier();
|
||||
if (qualifier instanceof PyReferenceExpression) {
|
||||
PsiElement qualifierElement = ((PyReferenceExpression) qualifier).resolve();
|
||||
@@ -71,6 +74,17 @@ public class ResolveImportUtil {
|
||||
return ModuleRootManager.getInstance(module).processOrder(resolvePolicy, null);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiElement resolveForeignImport(final PyReferenceExpression importRef, final PsiElement importFrom) {
|
||||
for(PyImportResolver resolver: Extensions.getExtensions(PyImportResolver.EP_NAME)) {
|
||||
PsiElement result = resolver.resolveImportReference(importRef, importFrom);
|
||||
if (result != null) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private static PsiElement resolveInRoots(final VirtualFile[] roots, final String referencedName, final PyReferenceExpression importRef) {
|
||||
for(VirtualFile contentRoot: roots) {
|
||||
|
||||
@@ -0,0 +1,2 @@
|
||||
from java.util import ArrayL<ref>ist
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.jetbrains.python;
|
||||
|
||||
import com.intellij.openapi.application.PathManager;
|
||||
import com.intellij.psi.PsiClass;
|
||||
import com.intellij.psi.PsiElement;
|
||||
import com.intellij.psi.PsiReference;
|
||||
import com.intellij.testFramework.ResolveTestCase;
|
||||
|
||||
/**
|
||||
* @author yole
|
||||
*/
|
||||
public class PyToJavaResolveTest extends ResolveTestCase {
|
||||
private PsiElement resolve() throws Exception {
|
||||
PsiReference ref = configureByFile(getTestName(false) + ".py");
|
||||
return ref.resolve();
|
||||
}
|
||||
|
||||
public void testSimple() throws Exception {
|
||||
PsiElement target = resolve();
|
||||
assertTrue(target instanceof PsiClass);
|
||||
assertEquals("java.util.ArrayList", ((PsiClass) target).getQualifiedName());
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTestDataPath() {
|
||||
return PathManager.getHomePath() + "/plugins/python/testData/resolve/pyToJava/";
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user