diff --git a/python/src/com/jetbrains/python/PythonLanguage.java b/python/src/com/jetbrains/python/PythonLanguage.java index 2c51e77422a1..9b92b68307ef 100644 --- a/python/src/com/jetbrains/python/PythonLanguage.java +++ b/python/src/com/jetbrains/python/PythonLanguage.java @@ -4,9 +4,19 @@ import com.intellij.lang.Language; import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import com.intellij.psi.PsiFileFactory; +import com.intellij.psi.stubs.SerializationManager; import com.intellij.psi.tree.IFileElementType; -import com.jetbrains.python.psi.impl.PyElementGeneratorImpl; +import com.intellij.psi.tree.IStubFileElementType; import com.jetbrains.python.psi.PyElementGenerator; +import com.jetbrains.python.psi.impl.PyElementGeneratorImpl; +import com.jetbrains.python.psi.impl.stubs.PyClassSerializer; +import com.jetbrains.python.psi.impl.stubs.PyFunctionSerializer; +import com.jetbrains.python.psi.impl.stubs.PyParameterListSerializer; +import com.jetbrains.python.psi.impl.stubs.PyParameterSerializer; +import com.jetbrains.python.psi.stubs.PyClassStub; +import com.jetbrains.python.psi.stubs.PyFunctionStub; +import com.jetbrains.python.psi.stubs.PyParameterListStub; +import com.jetbrains.python.psi.stubs.PyParameterStub; import com.jetbrains.python.validation.*; import java.util.Set; @@ -17,8 +27,8 @@ import java.util.concurrent.CopyOnWriteArraySet; */ public class PythonLanguage extends Language { private final PyElementGenerator elementGenerator = new PyElementGeneratorImpl(this); - public final IFileElementType ELTYPE_FILE = new IFileElementType(this); - protected Set> _annotators = new CopyOnWriteArraySet>(); + private final IFileElementType ELTYPE_FILE = new IStubFileElementType(this); + private final Set> _annotators = new CopyOnWriteArraySet>(); public static PythonLanguage getInstance() { return (PythonLanguage) PythonFileType.INSTANCE.getLanguage(); @@ -37,6 +47,13 @@ public class PythonLanguage extends Language { _annotators.add(UnresolvedReferenceAnnotator.class); } + { + SerializationManager.getInstance().registerSerializer(PyClassStub.class, new PyClassSerializer()); + SerializationManager.getInstance().registerSerializer(PyFunctionStub.class, new PyFunctionSerializer()); + SerializationManager.getInstance().registerSerializer(PyParameterStub.class, new PyParameterSerializer()); + SerializationManager.getInstance().registerSerializer(PyParameterListStub.class, new PyParameterListSerializer()); + } + protected PythonLanguage() { super("Python"); } diff --git a/python/src/com/jetbrains/python/PythonParserDefinition.java b/python/src/com/jetbrains/python/PythonParserDefinition.java index dbd9f52dab9e..dc669835fc17 100644 --- a/python/src/com/jetbrains/python/PythonParserDefinition.java +++ b/python/src/com/jetbrains/python/PythonParserDefinition.java @@ -40,10 +40,10 @@ import org.jetbrains.annotations.NotNull; * @author Keith Lea */ public class PythonParserDefinition implements ParserDefinition { - private PythonLanguage language; + private final PythonLanguage language; - private TokenSet myWhitespaceTokens; - private TokenSet myCommentTokens; + private final TokenSet myWhitespaceTokens; + private final TokenSet myCommentTokens; public PythonParserDefinition() { language = (PythonLanguage)PythonFileType.INSTANCE.getLanguage(); diff --git a/python/src/com/jetbrains/python/psi/PyFile.java b/python/src/com/jetbrains/python/psi/PyFile.java index 356ff053c66f..23fffdbef0b6 100644 --- a/python/src/com/jetbrains/python/psi/PyFile.java +++ b/python/src/com/jetbrains/python/psi/PyFile.java @@ -20,4 +20,7 @@ public interface PyFile extends PyElement, PsiFile { List getStatements(); PythonLanguage getPyLanguage(); + + List getTopLevelClasses(); + List getTopLevelFunctions(); } diff --git a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java index 846536fc2379..8db9d8e33281 100644 --- a/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/PyFileImpl.java @@ -23,10 +23,13 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.ResolveState; import com.intellij.psi.scope.PsiScopeProcessor; +import com.intellij.psi.stubs.StubElement; import com.intellij.psi.tree.TokenSet; import com.jetbrains.python.PythonFileType; import com.jetbrains.python.PythonLanguage; import com.jetbrains.python.psi.*; +import com.jetbrains.python.psi.stubs.PyClassStub; +import com.jetbrains.python.psi.stubs.PyFunctionStub; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -108,4 +111,48 @@ public class PyFileImpl extends PsiFileBase implements PyFile { public PythonLanguage getPyLanguage() { return (PythonLanguage)getLanguage(); } + + public List getTopLevelClasses() { + List result = new ArrayList(); + final StubElement stub = getStub(); + if (stub != null) { + final List children = stub.getChildrenStubs(); + for (StubElement child : children) { + if (child instanceof PyClassStub) { + result.add(((PyClassStub)child).getPsi()); + } + } + } + else { + for (PsiElement child : getChildren()) { + if (child instanceof PyClass) { + result.add((PyClass)child); + } + } + } + + return result; + } + + public List getTopLevelFunctions() { + List result = new ArrayList(); + final StubElement stub = getStub(); + if (stub != null) { + final List children = stub.getChildrenStubs(); + for (StubElement child : children) { + if (child instanceof PyFunctionStub) { + result.add(((PyFunctionStub)child).getPsi()); + } + } + } + else { + for (PsiElement child : getChildren()) { + if (child instanceof PyFunction) { + result.add((PyFunction)child); + } + } + } + + return result; + } } diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyFileSerializer.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyFileSerializer.java new file mode 100644 index 000000000000..17d3d86837c0 --- /dev/null +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyFileSerializer.java @@ -0,0 +1,7 @@ +/* + * @author max + */ +package com.jetbrains.python.psi.impl.stubs; + +public class PyFileSerializer { +} \ No newline at end of file diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyFunctionStubImpl.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyFunctionStubImpl.java index 3a8f6116a920..b732bac2712e 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyFunctionStubImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyFunctionStubImpl.java @@ -30,7 +30,7 @@ public class PyFunctionStubImpl extends StubBase implements PyFuncti @NotNull public PyParameterListStub getParameterList() { - for (StubElement childStub : getChildStubs()) { + for (StubElement childStub : getChildrenStubs()) { if (childStub.getStubType() == PyElementTypes.PARAMETER_LIST) { return (PyParameterListStub)childStub; } diff --git a/python/src/com/jetbrains/python/psi/impl/stubs/PyParameterListStubImpl.java b/python/src/com/jetbrains/python/psi/impl/stubs/PyParameterListStubImpl.java index 90fbd797c90f..9231ddc8f09f 100644 --- a/python/src/com/jetbrains/python/psi/impl/stubs/PyParameterListStubImpl.java +++ b/python/src/com/jetbrains/python/psi/impl/stubs/PyParameterListStubImpl.java @@ -23,7 +23,7 @@ public class PyParameterListStubImpl extends StubBase implement } public PyParameterStub[] getParameters() { - final List stubs = getChildStubs(); + final List stubs = getChildrenStubs(); PyParameterStub[] result = new PyParameterStub[stubs.size()]; for (int i = 0; i < stubs.size(); i++) { diff --git a/python/src/com/jetbrains/python/psi/stubs/PyClassStub.java b/python/src/com/jetbrains/python/psi/stubs/PyClassStub.java index 5c103a4abe9a..27e318f23679 100644 --- a/python/src/com/jetbrains/python/psi/stubs/PyClassStub.java +++ b/python/src/com/jetbrains/python/psi/stubs/PyClassStub.java @@ -4,10 +4,7 @@ package com.jetbrains.python.psi.stubs; import com.intellij.psi.stubs.NamedStub; -import com.intellij.psi.stubs.SerializerClass; import com.jetbrains.python.psi.PyClass; -import com.jetbrains.python.psi.impl.stubs.PyClassSerializer; -@SerializerClass(PyClassSerializer.class) public interface PyClassStub extends NamedStub { } \ No newline at end of file