From 0ce203caac13160ce21c4c8a5616c5a768818eb5 Mon Sep 17 00:00:00 2001 From: "Rustam.Vishnyakov" Date: Thu, 2 Feb 2012 16:43:41 +0400 Subject: [PATCH] Python custom folding enabled --- .../python/PythonFoldingBuilder.java | 33 ++++++++++++++----- python/testData/folding/CustomFolding.py | 25 ++++++++++++++ .../com/jetbrains/python/PyFoldingTest.java | 4 +++ 3 files changed, 54 insertions(+), 8 deletions(-) create mode 100644 python/testData/folding/CustomFolding.py diff --git a/python/src/com/jetbrains/python/PythonFoldingBuilder.java b/python/src/com/jetbrains/python/PythonFoldingBuilder.java index 9b041fbc9912..a2d6b77d0a2a 100644 --- a/python/src/com/jetbrains/python/PythonFoldingBuilder.java +++ b/python/src/com/jetbrains/python/PythonFoldingBuilder.java @@ -2,6 +2,7 @@ package com.jetbrains.python; import com.intellij.codeInsight.folding.CodeFoldingSettings; import com.intellij.lang.ASTNode; +import com.intellij.lang.folding.CustomFoldingBuilder; import com.intellij.lang.folding.FoldingBuilder; import com.intellij.lang.folding.FoldingDescriptor; import com.intellij.openapi.editor.Document; @@ -9,8 +10,10 @@ import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.LineTokenizer; import com.intellij.openapi.util.text.StringUtil; +import com.intellij.psi.PsiElement; import com.intellij.psi.TokenType; import com.intellij.psi.tree.IElementType; +import com.jetbrains.python.psi.PyFile; import com.jetbrains.python.psi.PyFileElementType; import com.jetbrains.python.psi.PyStringLiteralExpression; import org.jetbrains.annotations.NotNull; @@ -22,12 +25,14 @@ import java.util.List; /** * @author yole */ -public class PythonFoldingBuilder implements FoldingBuilder, DumbAware { - @NotNull - public FoldingDescriptor[] buildFoldRegions(@NotNull ASTNode node, @NotNull Document document) { - List descriptors = new ArrayList(); - appendDescriptors(node, descriptors); - return descriptors.toArray(new FoldingDescriptor[descriptors.size()]); +public class PythonFoldingBuilder extends CustomFoldingBuilder implements DumbAware { + + @Override + protected void buildLanguageFoldRegions(@NotNull List descriptors, + @NotNull PsiElement root, + @NotNull Document document, + boolean quick) { + appendDescriptors(root.getNode(), descriptors); } private static void appendDescriptors(ASTNode node, List descriptors) { @@ -122,7 +127,8 @@ public class PythonFoldingBuilder implements FoldingBuilder, DumbAware { return elementType == PyElementTypes.IMPORT_STATEMENT || elementType == PyElementTypes.FROM_IMPORT_STATEMENT; } - public String getPlaceholderText(@NotNull ASTNode node) { + @Override + protected String getLanguagePlaceholderText(@NotNull ASTNode node, @NotNull TextRange range) { if (isImport(node, false)) { return "import ..."; } @@ -137,7 +143,8 @@ public class PythonFoldingBuilder implements FoldingBuilder, DumbAware { return "..."; } - public boolean isCollapsedByDefault(@NotNull ASTNode node) { + @Override + protected boolean isRegionCollapsedByDefault(@NotNull ASTNode node) { if (isImport(node, false)) { return CodeFoldingSettings.getInstance().COLLAPSE_IMPORTS; } @@ -153,4 +160,14 @@ public class PythonFoldingBuilder implements FoldingBuilder, DumbAware { } return false; } + + @Override + protected boolean isCustomFoldingCandidate(ASTNode node) { + return node.getElementType() == PyTokenTypes.END_OF_LINE_COMMENT; + } + + @Override + protected boolean mayContainCustomFoldings(ASTNode node) { + return node.getPsi() instanceof PyFile || node.getElementType() == PyElementTypes.STATEMENT_LIST; + } } diff --git a/python/testData/folding/CustomFolding.py b/python/testData/folding/CustomFolding.py new file mode 100644 index 000000000000..1bf9db70a546 --- /dev/null +++ b/python/testData/folding/CustomFolding.py @@ -0,0 +1,25 @@ +#region SupportStuff +class SupportClass(object): + pass + + +def supportFunction(): + return +#endregion + +class ImportantClass(object): + #region Class body + def f(self): + return 'hello world' + #endregion + pass + +#region VeryImportant +def importantFunction(): + if (x > 0): + #region Body + print "abc" + #endregion + return +pass +#endregion \ No newline at end of file diff --git a/python/testSrc/com/jetbrains/python/PyFoldingTest.java b/python/testSrc/com/jetbrains/python/PyFoldingTest.java index 4dff78b698b5..ec9f09f9e737 100644 --- a/python/testSrc/com/jetbrains/python/PyFoldingTest.java +++ b/python/testSrc/com/jetbrains/python/PyFoldingTest.java @@ -17,4 +17,8 @@ public class PyFoldingTest extends PyTestCase { public void testDocString() { doTest(); } + + public void testCustomFolding() { + doTest(); + } }