diff --git a/python/src/com/jetbrains/python/psi/PyFileElementType.java b/python/src/com/jetbrains/python/psi/PyFileElementType.java index 63b6428231eb..5f110d1d7672 100644 --- a/python/src/com/jetbrains/python/psi/PyFileElementType.java +++ b/python/src/com/jetbrains/python/psi/PyFileElementType.java @@ -24,7 +24,7 @@ public class PyFileElementType extends IStubFileElementType { @Override public int getStubVersion() { - return 15; + return 16; } @Override diff --git a/python/src/com/jetbrains/python/psi/PyImportElement.java b/python/src/com/jetbrains/python/psi/PyImportElement.java index 194c15c8a020..82175ceaa24c 100644 --- a/python/src/com/jetbrains/python/psi/PyImportElement.java +++ b/python/src/com/jetbrains/python/psi/PyImportElement.java @@ -4,14 +4,18 @@ import com.intellij.psi.StubBasedPsiElement; import com.jetbrains.python.psi.stubs.PyImportElementStub; import org.jetbrains.annotations.Nullable; +import java.util.List; + /** * @author yole */ public interface PyImportElement extends PyElement, NameDefiner, StubBasedPsiElement { - @Nullable PyReferenceExpression getImportReference(); + @Nullable + List getImportedQName(); + @Nullable PyTargetExpression getAsName(); diff --git a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java index 4077966e3cc8..faf161eb3a42 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFromImportStatementImpl.java @@ -114,7 +114,8 @@ public class PyFromImportStatementImpl extends PyBaseElementImpl return (PyReferenceExpression)importRefNode.getPsi(); } + public List getImportedQName() { + final PyImportElementStub stub = getStub(); + if (stub != null) { + return stub.getImportedQName(); + } + return ResolveImportUtil.getQualifiedName(getImportReference()); + } + public PyTargetExpression getAsName() { final ASTNode asNameNode = getNode().findChildByType(PyElementTypes.TARGET_EXPRESSION); if (asNameNode == null) return null; @@ -57,9 +65,9 @@ public class PyImportElementImpl extends PyBaseElementImpl if (!StringUtil.isEmpty(asName)) { return asName; } - final String importedName = stub.getImportedName(); - if (!StringUtil.isEmpty(importedName)) { - return importedName; + final List importedName = stub.getImportedQName(); + if (importedName.size() > 0) { + return importedName.get(importedName.size()-1); } return null; } diff --git a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java index dd70dbae5057..7525b40ee167 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyReferenceExpressionImpl.java @@ -184,9 +184,8 @@ public class PyReferenceExpressionImpl extends PyElementImpl implements PyRefere * @return resolution result. * @see #resolve() */ - private @NotNull - List resolveInner() { + private List resolveInner() { //List ret = new ArrayList(); ResultList ret = new ResultList(); diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyImportElementElementType.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyImportElementElementType.java index 96cc1a14bdc0..bfcbf6595d93 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyImportElementElementType.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyImportElementElementType.java @@ -7,13 +7,14 @@ import com.intellij.psi.stubs.StubInputStream; import com.intellij.psi.stubs.StubOutputStream; import com.intellij.util.io.StringRef; import com.jetbrains.python.psi.PyImportElement; -import com.jetbrains.python.psi.PyReferenceExpression; import com.jetbrains.python.psi.PyStubElementType; import com.jetbrains.python.psi.PyTargetExpression; import com.jetbrains.python.psi.impl.PyImportElementImpl; import com.jetbrains.python.psi.stubs.PyImportElementStub; import java.io.IOException; +import java.util.ArrayList; +import java.util.List; /** * @author yole @@ -35,21 +36,27 @@ public class PyImportElementElementType extends PyStubElementType qName = stub.getImportedQName(); + dataStream.writeVarInt(qName.size()); + for (String s : qName) { + dataStream.writeName(s); + } dataStream.writeName(stub.getAsName()); } public PyImportElementStub deserialize(StubInputStream dataStream, StubElement parentStub) throws IOException { - StringRef importedName = dataStream.readName(); + int size = dataStream.readVarInt(); + List qName = new ArrayList(size); + for (int i = 0; i < size; i++) { + qName.add(dataStream.readName().getString()); + } StringRef asName = dataStream.readName(); - return new PyImportElementStubImpl(importedName.getString(), asName.getString(), parentStub); - } + return new PyImportElementStubImpl(qName, asName.getString(), parentStub); } } diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyImportElementStubImpl.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyImportElementStubImpl.java index 02a3123f5399..14feecc5cc3e 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyImportElementStubImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyImportElementStubImpl.java @@ -1,33 +1,31 @@ package com.jetbrains.python.psi.impl.stubs; -import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.stubs.StubBase; import com.intellij.psi.stubs.StubElement; import com.jetbrains.python.PyElementTypes; import com.jetbrains.python.psi.PyImportElement; import com.jetbrains.python.psi.stubs.PyImportElementStub; +import java.util.List; + /** * @author yole */ public class PyImportElementStubImpl extends StubBase implements PyImportElementStub { - private final String myImportedName; + private final List myImportedQName; private final String myAsName; - public PyImportElementStubImpl(String importedName, String asName, final StubElement parent) { + public PyImportElementStubImpl(List importedQName, String asName, final StubElement parent) { super(parent, PyElementTypes.IMPORT_ELEMENT); - myImportedName = importedName; + myImportedQName = importedQName; myAsName = asName; } - public String getImportedName() { - return myImportedName; + public List getImportedQName() { + return myImportedQName; } public String getAsName() { - if (!StringUtil.isEmpty(myAsName)) { - return myAsName; - } - return myImportedName; + return myAsName; } } diff --git a/python/src/com/jetbrains/python/psi/stubs/PyImportElementStub.java b/python/src/com/jetbrains/python/psi/stubs/PyImportElementStub.java index cee67365698e..3488a62323b9 100644 --- a/python/src/com/jetbrains/python/psi/stubs/PyImportElementStub.java +++ b/python/src/com/jetbrains/python/psi/stubs/PyImportElementStub.java @@ -3,10 +3,12 @@ package com.jetbrains.python.psi.stubs; import com.intellij.psi.stubs.StubElement; import com.jetbrains.python.psi.PyImportElement; +import java.util.List; + /** * @author yole */ public interface PyImportElementStub extends StubElement { - String getImportedName(); + List getImportedQName(); String getAsName(); } diff --git a/python/testData/stubs/ImportStatement.py b/python/testData/stubs/ImportStatement.py index 5cfe821d7904..fc57d149fd43 100644 --- a/python/testData/stubs/ImportStatement.py +++ b/python/testData/stubs/ImportStatement.py @@ -1,2 +1,2 @@ from sys import argv -import os +import os.path diff --git a/python/testSrc/com/jetbrains/python/PyStubsTest.java b/python/testSrc/com/jetbrains/python/PyStubsTest.java index ebb1fd9eac51..4309f263a453 100644 --- a/python/testSrc/com/jetbrains/python/PyStubsTest.java +++ b/python/testSrc/com/jetbrains/python/PyStubsTest.java @@ -172,11 +172,13 @@ public class PyStubsTest extends PyLightFixtureTestCase { assertFalse(fromImport.isStarImport()); assertEquals(0, fromImport.getRelativeLevel()); final List qName = fromImport.getImportSourceQName(); - assertEquals(1, qName.size()); - assertEquals("sys", qName.get(0)); + assertSameElements(qName, "sys"); final List importTargets = file.getImportTargets(); assertEquals(1, importTargets.size()); + final PyImportElement importElement = importTargets.get(0); + final List importQName = importElement.getImportedQName(); + assertSameElements(importQName, "os", "path"); assertNotParsed(file); }