Skip to content

Commit 8637e79

Browse files
Marcus Mewsintellij-monorepo-bot
authored andcommitted
PY-76572 Extract method with typehints
- refactor platform expand-all folding action - introduce platform folding attribute 'keepExpandedOnFirstCollapseAll' - use 'keepExpandedOnFirstCollapseAll' for Python type annotation regions - add tests for new PyCharm two-step collapse action - add tests for legacy PyCharm two-step expand action GitOrigin-RevId: ad0931b1b64d2ce6dfee52086193f17234fa537e
1 parent 0533618 commit 8637e79

23 files changed

Lines changed: 348 additions & 70 deletions

platform/core-api/api-dump.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,12 +281,16 @@ com.intellij.lang.WhitespacesAndCommentsBinder$RecursiveBinder
281281
- com.intellij.lang.WhitespacesAndCommentsBinder
282282
com.intellij.lang.WhitespacesAndCommentsBinder$TokenTextGetter
283283
- a:get(I):java.lang.CharSequence
284+
c:com.intellij.lang.folding.CompositeFoldingBuilder
285+
- keepExpandedOnFirstCollapseAll(com.intellij.lang.folding.FoldingDescriptor):Z
284286
com.intellij.lang.folding.FoldingBuilder
285287
- com.intellij.openapi.project.PossiblyDumbAware
286288
- a:buildFoldRegions(com.intellij.lang.ASTNode,com.intellij.openapi.editor.Document):com.intellij.lang.folding.FoldingDescriptor[]
287289
- a:getPlaceholderText(com.intellij.lang.ASTNode):java.lang.String
288290
- a:isCollapsedByDefault(com.intellij.lang.ASTNode):Z
289291
- isCollapsedByDefault(com.intellij.lang.folding.FoldingDescriptor):Z
292+
- keepExpandedOnFirstCollapseAll(com.intellij.lang.ASTNode):Z
293+
- keepExpandedOnFirstCollapseAll(com.intellij.lang.folding.FoldingDescriptor):Z
290294
com.intellij.lang.injection.MultiHostInjector
291295
- com.intellij.openapi.project.PossiblyDumbAware
292296
- sf:MULTIHOST_INJECTOR_EP_NAME:com.intellij.openapi.extensions.ProjectExtensionPointName

platform/core-api/src/com/intellij/lang/folding/CompositeFoldingBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,12 @@ public boolean isCollapsedByDefault(@NotNull FoldingDescriptor foldingDescriptor
9292
return mayUseBuilder(foldingDescriptor.getElement(), builder) && builder.isCollapsedByDefault(foldingDescriptor);
9393
}
9494

95+
@Override
96+
public boolean keepExpandedOnFirstCollapseAll(@NotNull FoldingDescriptor foldingDescriptor) {
97+
FoldingBuilder builder = ((FoldingDescriptorWrapper)foldingDescriptor).myBuilder;
98+
return mayUseBuilder(foldingDescriptor.getElement(), builder) && builder.keepExpandedOnFirstCollapseAll(foldingDescriptor);
99+
}
100+
95101
private static boolean mayUseBuilder(@NotNull ASTNode node, @Nullable FoldingBuilder builder) {
96102
if (builder == null) return false;
97103
Project project = getProjectByNode(node);

platform/core-api/src/com/intellij/lang/folding/FoldingBuilder.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ public interface FoldingBuilder extends PossiblyDumbAware {
4040

4141
/**
4242
* Returns the default collapsed state for the folding region related to the specified node.
43+
* <p/>
44+
* The expand-all action applies a two-step behavior that - in step one - expands all regions except those
45+
* that return {@code true} here. In step two, all regions are expanded.
4346
*
4447
* @param node the node for which the collapsed state is requested.
4548
* @return true if the region is collapsed by default, false otherwise.
@@ -49,4 +52,21 @@ public interface FoldingBuilder extends PossiblyDumbAware {
4952
default boolean isCollapsedByDefault(@NotNull FoldingDescriptor foldingDescriptor) {
5053
return isCollapsedByDefault(foldingDescriptor.getElement());
5154
}
55+
56+
/**
57+
* Returns the behavior of the folding region when performing the collapse-all action.
58+
* <p/>
59+
* The collapse-all action applies a two-step behavior that - in step one - collapses all regions except those
60+
* that return {@code true} here. In step two, all regions are collapsed.
61+
*
62+
* @param node the node for which the expanded state is requested.
63+
* @return true if the region is not collapsed when the collapse-all action is applied the first time.
64+
*/
65+
default boolean keepExpandedOnFirstCollapseAll(@NotNull ASTNode node) {
66+
return false;
67+
}
68+
69+
default boolean keepExpandedOnFirstCollapseAll(@NotNull FoldingDescriptor foldingDescriptor) {
70+
return keepExpandedOnFirstCollapseAll(foldingDescriptor.getElement());
71+
}
5272
}

platform/foldings/api-dump.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ Fa:com.intellij.codeInsight.folding.CodeFoldingManager
66
- a:getFoldRegionsAtOffset(com.intellij.openapi.editor.Editor,I):com.intellij.openapi.editor.FoldRegion[]
77
- s:getInstance(com.intellij.openapi.project.Project):com.intellij.codeInsight.folding.CodeFoldingManager
88
- a:isCollapsedByDefault(com.intellij.openapi.editor.FoldRegion):java.lang.Boolean
9+
- a:keepExpandedOnFirstCollapseAll(com.intellij.openapi.editor.FoldRegion):java.lang.Boolean
910
- a:readFoldingState(org.jdom.Element,com.intellij.openapi.editor.Document):com.intellij.openapi.fileEditor.impl.text.CodeFoldingState
1011
- a:releaseFoldings(com.intellij.openapi.editor.Editor):V
1112
- a:restoreFoldingState(com.intellij.openapi.editor.Editor,com.intellij.openapi.fileEditor.impl.text.CodeFoldingState):V

platform/foldings/src/com/intellij/codeInsight/folding/CodeFoldingManager.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ public static CodeFoldingManager getInstance(Project project) {
5353
*/
5454
public abstract @Nullable Boolean isCollapsedByDefault(@NotNull FoldRegion region);
5555

56+
public abstract @Nullable Boolean keepExpandedOnFirstCollapseAll(@NotNull FoldRegion region);
57+
5658
/**
5759
* Schedules recalculation of foldings in editor (see {@link com.intellij.codeInsight.folding.impl.CodeFoldingPass CodeFoldingPass}),
5860
* which will happen even if the document (or other dependencies declared by {@link com.intellij.lang.folding.FoldingBuilder FoldingBuilder})

platform/foldings/src/com/intellij/codeInsight/folding/impl/CodeFoldingManagerImpl.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,11 @@ private void updateAndInitFolding(Editor editor, FoldingModelEx foldingModel, Ps
173173
return region.getUserData(UpdateFoldRegionsOperation.COLLAPSED_BY_DEFAULT);
174174
}
175175

176+
@Override
177+
public @Nullable Boolean keepExpandedOnFirstCollapseAll(@NotNull FoldRegion region) {
178+
return region.getUserData(UpdateFoldRegionsOperation.KEEP_EXPANDED_ON_FIRST_COLLAPSE_ALL);
179+
}
180+
176181
public void setCollapsedByDefault(@NotNull FoldRegion region, boolean isCollapsed) {
177182
region.putUserData(UpdateFoldRegionsOperation.COLLAPSED_BY_DEFAULT, isCollapsed);
178183
}

platform/foldings/src/com/intellij/codeInsight/folding/impl/FoldingPolicy.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,15 @@ static boolean isCollapsedByDefault(@NotNull FoldingDescriptor foldingDescriptor
3232
}
3333
}
3434

35+
static boolean keepExpandedOnFirstCollapseAll(@NotNull FoldingDescriptor foldingDescriptor, @NotNull FoldingBuilder foldingBuilder) {
36+
try {
37+
return foldingBuilder.keepExpandedOnFirstCollapseAll(foldingDescriptor);
38+
}
39+
catch (IndexNotReadyException e) {
40+
return false;
41+
}
42+
}
43+
3544
public static @Nullable String getSignature(@NotNull PsiElement element) {
3645
for(ElementSignatureProvider provider: EP_NAME.getExtensionList()) {
3746
String signature = provider.getSignature(element);

platform/foldings/src/com/intellij/codeInsight/folding/impl/FoldingUpdate.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,7 @@ public static final class RegionInfo {
341341
public final PsiElement element;
342342
final String signature;
343343
final boolean collapsedByDefault;
344+
final boolean keepExpandedOnFirstCollapseAll;
344345

345346
private RegionInfo(@NotNull FoldingDescriptor descriptor,
346347
@NotNull PsiElement psiElement,
@@ -349,6 +350,7 @@ private RegionInfo(@NotNull FoldingDescriptor descriptor,
349350
element = psiElement;
350351
Boolean hardCoded = descriptor.isCollapsedByDefault();
351352
collapsedByDefault = hardCoded == null ? FoldingPolicy.isCollapsedByDefault(descriptor, foldingBuilder) : hardCoded;
353+
keepExpandedOnFirstCollapseAll = FoldingPolicy.keepExpandedOnFirstCollapseAll(descriptor, foldingBuilder);
352354
signature = createSignature(psiElement);
353355
}
354356

platform/foldings/src/com/intellij/codeInsight/folding/impl/UpdateFoldRegionsOperation.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ enum ApplyDefaultStateMode { YES, EXCEPT_CARET_REGION, NO }
3737
private static final Logger LOG = Logger.getInstance(UpdateFoldRegionsOperation.class);
3838
private static final Key<Boolean> CAN_BE_REMOVED_WHEN_COLLAPSED = Key.create("canBeRemovedWhenCollapsed");
3939
static final Key<Boolean> COLLAPSED_BY_DEFAULT = Key.create("collapsedByDefault");
40+
static final Key<Boolean> KEEP_EXPANDED_ON_FIRST_COLLAPSE_ALL = Key.create("keepExpandedOnFirstCollapseAll");
4041
static final Key<String> SIGNATURE = Key.create("signature");
4142
static final Key<Boolean> UPDATE_REGION = Key.create("update");
4243
static final String NO_SIGNATURE = "no signature";
@@ -157,6 +158,7 @@ private static void applyExpandStatus(@NotNull List<? extends FoldRegion> newReg
157158

158159
if (descriptor.canBeRemovedWhenCollapsed()) region.putUserData(CAN_BE_REMOVED_WHEN_COLLAPSED, Boolean.TRUE);
159160
region.putUserData(COLLAPSED_BY_DEFAULT, regionInfo.collapsedByDefault);
161+
region.putUserData(KEEP_EXPANDED_ON_FIRST_COLLAPSE_ALL, regionInfo.keepExpandedOnFirstCollapseAll);
160162
region.putUserData(SIGNATURE, ObjectUtils.chooseNotNull(regionInfo.signature, NO_SIGNATURE));
161163

162164
info.addRegion(region, smartPointerManager.createSmartPsiElementPointer(psi));

platform/foldings/src/com/intellij/codeInsight/folding/impl/actions/BaseFoldingHandler.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ protected boolean isEnabledForCaret(@NotNull Editor editor, @NotNull Caret caret
3737
/**
3838
* Returns fold regions inside selection, or all regions in editor, if selection doesn't exist or doesn't contain fold regions.
3939
*/
40-
protected List<FoldRegion> getFoldRegionsForSelection(@NotNull Editor editor, @Nullable Caret caret) {
40+
protected @NotNull List<FoldRegion> getFoldRegionsForSelection(@NotNull Editor editor, @Nullable Caret caret) {
4141
FoldRegion[] allRegions = editor.getFoldingModel().getAllFoldRegions();
4242
if (caret == null) {
4343
caret = editor.getCaretModel().getPrimaryCaret();

0 commit comments

Comments
 (0)