mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
IDEA-150943 Strange code folding in a method with lambda
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2015 JetBrains s.r.o.
|
* Copyright 2000-2016 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -24,6 +24,7 @@ import com.intellij.openapi.application.ex.PathManagerEx
|
|||||||
import com.intellij.openapi.command.WriteCommandAction
|
import com.intellij.openapi.command.WriteCommandAction
|
||||||
import com.intellij.openapi.editor.FoldRegion
|
import com.intellij.openapi.editor.FoldRegion
|
||||||
import com.intellij.openapi.editor.ex.DocumentEx
|
import com.intellij.openapi.editor.ex.DocumentEx
|
||||||
|
import com.intellij.openapi.editor.ex.EditorEx
|
||||||
import com.intellij.openapi.editor.ex.FoldingModelEx
|
import com.intellij.openapi.editor.ex.FoldingModelEx
|
||||||
import com.intellij.openapi.editor.impl.FoldingModelImpl
|
import com.intellij.openapi.editor.impl.FoldingModelImpl
|
||||||
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider
|
import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider
|
||||||
@@ -36,7 +37,6 @@ import com.intellij.psi.search.GlobalSearchScope
|
|||||||
import com.intellij.testFramework.EditorTestUtil
|
import com.intellij.testFramework.EditorTestUtil
|
||||||
import com.intellij.testFramework.LightProjectDescriptor
|
import com.intellij.testFramework.LightProjectDescriptor
|
||||||
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Denis Zhdanov
|
* @author Denis Zhdanov
|
||||||
* @since 1/17/11 1:00 PM
|
* @since 1/17/11 1:00 PM
|
||||||
@@ -1185,6 +1185,38 @@ class Foo {
|
|||||||
myFixture.doHighlighting()
|
myFixture.doHighlighting()
|
||||||
assertTopLevelFoldRegionsState "[FoldRegion +(57:144), placeholder='(Runnable) () → { ', FoldRegion +(165:189), placeholder=' }']"
|
assertTopLevelFoldRegionsState "[FoldRegion +(57:144), placeholder='(Runnable) () → { ', FoldRegion +(165:189), placeholder=' }']"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void "test folding update after external change"() {
|
||||||
|
configure """\
|
||||||
|
class Foo {
|
||||||
|
void m1() {
|
||||||
|
System.out.println(1);
|
||||||
|
System.out.println(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
void m2() {
|
||||||
|
System.out.println(3);
|
||||||
|
System.out.println(4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
myFixture.performEditorAction(IdeActions.ACTION_COLLAPSE_ALL_REGIONS)
|
||||||
|
assertTopLevelFoldRegionsState "[FoldRegion +(24:83), placeholder='{...}', FoldRegion +(99:158), placeholder='{...}']"
|
||||||
|
|
||||||
|
def virtualFile = ((EditorEx)myFixture.getEditor()).virtualFile
|
||||||
|
myFixture.saveText(virtualFile, """\
|
||||||
|
class Foo {
|
||||||
|
void m1() {
|
||||||
|
System.out.println(1);
|
||||||
|
System.out.println(4);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
""")
|
||||||
|
virtualFile.refresh(false, false)
|
||||||
|
|
||||||
|
myFixture.doHighlighting()
|
||||||
|
assertTopLevelFoldRegionsState "[FoldRegion +(24:83), placeholder='{...}']"
|
||||||
|
}
|
||||||
|
|
||||||
private void assertTopLevelFoldRegionsState(String expectedState) {
|
private void assertTopLevelFoldRegionsState(String expectedState) {
|
||||||
assertEquals(expectedState, myFixture.editor.foldingModel.toString())
|
assertEquals(expectedState, myFixture.editor.foldingModel.toString())
|
||||||
|
|||||||
+7
-2
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2015 JetBrains s.r.o.
|
* Copyright 2000-2016 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -93,6 +93,8 @@ class UpdateFoldRegionsOperation implements Runnable {
|
|||||||
List<FoldRegion> newRegions = addNewRegions(info, foldingModel, elementsToFold, rangeToExpandStatusMap, shouldExpand, groupExpand);
|
List<FoldRegion> newRegions = addNewRegions(info, foldingModel, elementsToFold, rangeToExpandStatusMap, shouldExpand, groupExpand);
|
||||||
|
|
||||||
applyExpandStatus(newRegions, shouldExpand, groupExpand);
|
applyExpandStatus(newRegions, shouldExpand, groupExpand);
|
||||||
|
|
||||||
|
foldingModel.clearExternalChangeFlag();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void applyExpandStatus(@NotNull List<FoldRegion> newRegions,
|
private static void applyExpandStatus(@NotNull List<FoldRegion> newRegions,
|
||||||
@@ -248,7 +250,10 @@ class UpdateFoldRegionsOperation implements Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private boolean regionCanBeRemovedWhenCollapsed(FoldRegion region) {
|
private boolean regionCanBeRemovedWhenCollapsed(FoldRegion region) {
|
||||||
return Boolean.TRUE.equals(region.getUserData(CAN_BE_REMOVED_WHEN_COLLAPSED)) || !region.isValid() || isRegionInCaretLine(region);
|
return Boolean.TRUE.equals(region.getUserData(CAN_BE_REMOVED_WHEN_COLLAPSED)) ||
|
||||||
|
((FoldingModelEx)myEditor.getFoldingModel()).documentHasBeenChangedExternally() ||
|
||||||
|
!region.isValid() ||
|
||||||
|
isRegionInCaretLine(region);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isRegionInCaretLine(FoldRegion region) {
|
private boolean isRegionInCaretLine(FoldRegion region) {
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2015 JetBrains s.r.o.
|
* Copyright 2000-2016 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -200,6 +200,15 @@ class FoldingModelWindow implements FoldingModelEx{
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean documentHasBeenChangedExternally() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearExternalChangeFlag() {
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clearFoldRegions() {
|
public void clearFoldRegions() {
|
||||||
myDelegate.clearFoldRegions();
|
myDelegate.clearFoldRegions();
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2015 JetBrains s.r.o.
|
* Copyright 2000-2016 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -64,4 +64,8 @@ public interface FoldingModelEx extends FoldingModel {
|
|||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
List<FoldRegion> getGroupedRegions(FoldingGroup group);
|
List<FoldRegion> getGroupedRegions(FoldingGroup group);
|
||||||
|
|
||||||
|
boolean documentHasBeenChangedExternally();
|
||||||
|
|
||||||
|
void clearExternalChangeFlag();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright 2000-2015 JetBrains s.r.o.
|
* Copyright 2000-2016 JetBrains s.r.o.
|
||||||
*
|
*
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
* you may not use this file except in compliance with the License.
|
* you may not use this file except in compliance with the License.
|
||||||
@@ -26,6 +26,7 @@ package com.intellij.openapi.editor.impl;
|
|||||||
|
|
||||||
import com.intellij.diagnostic.Dumpable;
|
import com.intellij.diagnostic.Dumpable;
|
||||||
import com.intellij.openapi.Disposable;
|
import com.intellij.openapi.Disposable;
|
||||||
|
import com.intellij.openapi.application.ApplicationManager;
|
||||||
import com.intellij.openapi.application.ex.ApplicationManagerEx;
|
import com.intellij.openapi.application.ex.ApplicationManagerEx;
|
||||||
import com.intellij.openapi.diagnostic.Logger;
|
import com.intellij.openapi.diagnostic.Logger;
|
||||||
import com.intellij.openapi.editor.*;
|
import com.intellij.openapi.editor.*;
|
||||||
@@ -36,6 +37,7 @@ import com.intellij.openapi.editor.markup.TextAttributes;
|
|||||||
import com.intellij.openapi.util.Disposer;
|
import com.intellij.openapi.util.Disposer;
|
||||||
import com.intellij.openapi.util.Key;
|
import com.intellij.openapi.util.Key;
|
||||||
import com.intellij.openapi.util.ModificationTracker;
|
import com.intellij.openapi.util.ModificationTracker;
|
||||||
|
import com.intellij.psi.ExternalChangeAction;
|
||||||
import com.intellij.util.containers.ContainerUtil;
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import com.intellij.util.containers.MultiMap;
|
import com.intellij.util.containers.MultiMap;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -65,6 +67,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
|
|||||||
private int mySavedCaretShift;
|
private int mySavedCaretShift;
|
||||||
private final MultiMap<FoldingGroup, FoldRegion> myGroups = new MultiMap<FoldingGroup, FoldRegion>();
|
private final MultiMap<FoldingGroup, FoldRegion> myGroups = new MultiMap<FoldingGroup, FoldRegion>();
|
||||||
private boolean myDocumentChangeProcessed = true;
|
private boolean myDocumentChangeProcessed = true;
|
||||||
|
private boolean myDocumentHasBeenChangedExternally;
|
||||||
private final AtomicLong myExpansionCounter = new AtomicLong();
|
private final AtomicLong myExpansionCounter = new AtomicLong();
|
||||||
|
|
||||||
public FoldingModelImpl(EditorImpl editor) {
|
public FoldingModelImpl(EditorImpl editor) {
|
||||||
@@ -532,6 +535,7 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
|
|||||||
if (!((DocumentEx)event.getDocument()).isInBulkUpdate()) {
|
if (!((DocumentEx)event.getDocument()).isInBulkUpdate()) {
|
||||||
updateCachedOffsets();
|
updateCachedOffsets();
|
||||||
}
|
}
|
||||||
|
if (ApplicationManager.getApplication().hasWriteAction(ExternalChangeAction.class)) myDocumentHasBeenChangedExternally = true;
|
||||||
}
|
}
|
||||||
finally {
|
finally {
|
||||||
myDocumentChangeProcessed = true;
|
myDocumentChangeProcessed = true;
|
||||||
@@ -593,4 +597,14 @@ public class FoldingModelImpl implements FoldingModelEx, PrioritizedInternalDocu
|
|||||||
public long getModificationCount() {
|
public long getModificationCount() {
|
||||||
return myExpansionCounter.get();
|
return myExpansionCounter.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean documentHasBeenChangedExternally() {
|
||||||
|
return myDocumentHasBeenChangedExternally;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearExternalChangeFlag() {
|
||||||
|
myDocumentHasBeenChangedExternally = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user