second half of fix for PY-7887

This commit is contained in:
Dmitry Jemerov
2013-02-05 21:35:33 +01:00
parent baed9c4be6
commit 4c7a2fd177
8 changed files with 37 additions and 18 deletions
@@ -226,14 +226,17 @@ public class AddImportHelper {
if (target instanceof PsiFileSystemItem && qName.getComponentCount() == 1) {
addImportStatement(file, path, null, priority);
}
else if (useQualified) {
addImportStatement(file, path, null, priority);
final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(file.getProject());
element.replace(elementGenerator.createExpressionFromText(LanguageLevel.forElement(target), qName + "." + target.getName()));
}
else {
final PyQualifiedName toImportQName = QualifiedNameFinder.findCanonicalImportPath(toImport, element);
addImportFrom(file, null, toImportQName.toString(), target.getName(), null, priority);
if (useQualified) {
addImportStatement(file, path, null, priority);
final PyElementGenerator elementGenerator = PyElementGenerator.getInstance(file.getProject());
final String targetName = PyUtil.getElementNameWithoutExtension(target);
element.replace(elementGenerator.createExpressionFromText(LanguageLevel.forElement(target), toImportQName + "." + targetName));
}
else {
addImportFrom(file, null, toImportQName.toString(), target.getName(), null, priority);
}
}
}
@@ -609,6 +609,12 @@ public class PyUtil {
}
}
public static String getElementNameWithoutExtension(PsiNamedElement psiNamedElement) {
return psiNamedElement instanceof PyFile
? FileUtil.getNameWithoutExtension(((PyFile)psiNamedElement).getName())
: psiNamedElement.getName();
}
public static boolean hasUnresolvedAncestors(@NotNull PyClass cls) {
for (PyClassRef classRef : cls.iterateAncestors()) {
if (classRef.getPyClass() == null && classRef.getType() == null) {
@@ -50,9 +50,7 @@ public abstract class VariantsProcessor implements PsiScopeProcessor {
// TODO: refactor to look saner; much code duplication
if (element instanceof PsiNamedElement) {
final PsiNamedElement psiNamedElement = (PsiNamedElement)element;
final String name = psiNamedElement instanceof PyFile
? FileUtil.getNameWithoutExtension(((PyFile)psiNamedElement).getName())
: psiNamedElement.getName();
final String name = PyUtil.getElementNameWithoutExtension(psiNamedElement);
if (name != null && nameIsAcceptable(name)) {
addElement(name, psiNamedElement);
}
@@ -0,0 +1,3 @@
import pack.submod
pack.submod
@@ -18,15 +18,7 @@ public class PyClassNameCompletionTest extends PyTestCase {
}
public void testQualified() {
final PyCodeInsightSettings settings = PyCodeInsightSettings.getInstance();
boolean oldValue = settings.PREFER_FROM_IMPORT;
settings.PREFER_FROM_IMPORT = false;
try {
doTest();
}
finally {
settings.PREFER_FROM_IMPORT = oldValue;
}
doTestWithoutFromImport();
}
public void testFunction() {
@@ -45,6 +37,22 @@ public class PyClassNameCompletionTest extends PyTestCase {
doTest();
}
public void testSubmoduleRegularImport() { // PY-7887
doTestWithoutFromImport();
}
private void doTestWithoutFromImport() {
final PyCodeInsightSettings settings = PyCodeInsightSettings.getInstance();
boolean oldValue = settings.PREFER_FROM_IMPORT;
settings.PREFER_FROM_IMPORT = false;
try {
doTest();
}
finally {
settings.PREFER_FROM_IMPORT = oldValue;
}
}
private void doTest() {
final String path = "/completion/className/" + getTestName(true);
myFixture.copyDirectoryToProject(path, "");