PY-18688 Use host file when adding imports on smart completion in type comments

This commit is contained in:
Mikhail Golubev
2016-11-23 17:51:43 +03:00
parent c673f4f851
commit b01adf74ab
5 changed files with 27 additions and 7 deletions

View File

@@ -34,6 +34,7 @@ import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ContainerUtil;
import com.jetbrains.python.codeInsight.PyCodeInsightSettings;
import com.jetbrains.python.documentation.docstrings.DocStringUtil;
import com.jetbrains.python.documentation.doctest.PyDocstringFile;
import com.jetbrains.python.formatter.PyBlock;
import com.jetbrains.python.formatter.PyCodeStyleSettings;
import com.jetbrains.python.psi.*;
@@ -398,14 +399,24 @@ public class AddImportHelper {
@Nullable PsiElement anchor) {
try {
final PyImportStatementBase parentImport = PsiTreeUtil.getParentOfType(anchor, PyImportStatementBase.class, false);
final InjectedLanguageManager manager = InjectedLanguageManager.getInstance(file.getProject());
final PsiLanguageInjectionHost injectionHost = manager.getInjectionHost(file);
final boolean insideDoctest = file instanceof PyDocstringFile &&
injectionHost != null &&
DocStringUtil.getParentDefinitionDocString(injectionHost) == injectionHost;
final PsiElement insertParent;
if (parentImport != null && parentImport.getContainingFile() == file) {
insertParent = parentImport.getParent();
}
else if (injectionHost != null && !insideDoctest) {
insertParent = manager.getTopLevelFile(file);
}
else {
insertParent = file;
}
if (InjectedLanguageManager.getInstance(file.getProject()).isInjectedFragment(file)) {
if (insideDoctest) {
final PsiElement element = insertParent.addBefore(newImport, getInsertPosition(insertParent, newImport, priority));
PsiElement whitespace = element.getNextSibling();
if (!(whitespace instanceof PsiWhiteSpace)) {
@@ -413,13 +424,11 @@ public class AddImportHelper {
}
insertParent.addBefore(whitespace, element);
}
else if (anchor instanceof PyImportStatementBase) {
insertParent.addAfter(newImport, anchor);
}
else {
if (anchor instanceof PyImportStatementBase) {
insertParent.addAfter(newImport, anchor);
}
else {
insertParent.addBefore(newImport, getInsertPosition(insertParent, newImport, priority));
}
insertParent.addBefore(newImport, getInsertPosition(insertParent, newImport, priority));
}
}
catch (IncorrectOperationException e) {

View File

@@ -0,0 +1,3 @@
from typing import List
xs = [] # type: List

View File

@@ -0,0 +1 @@
xs = [] # type: Li<caret>

View File

@@ -0,0 +1,2 @@
class List:
pass

View File

@@ -72,6 +72,11 @@ public class PyClassNameCompletionTest extends PyTestCase {
}
}
// PY-18688
public void testTypeComment() {
doTest();
}
private void doTest() {
final String path = "/completion/className/" + getTestName(true);
myFixture.copyDirectoryToProject(path, "");