Skip to content

Commit

Permalink
Fix folding of 2 consecutive methods
Browse files Browse the repository at this point in the history
If the second method starts in the same line the first one ends then
there will still be 2 foldings.

Fixes eclipse-jdt#1992
  • Loading branch information
jakub-suliga committed Jan 31, 2025
1 parent fbdc89d commit f07f68b
Show file tree
Hide file tree
Showing 4 changed files with 505 additions and 221 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
import org.eclipse.jdt.text.tests.codemining.CodeMiningTriggerTest;
import org.eclipse.jdt.text.tests.codemining.ParameterNamesCodeMiningTest;
import org.eclipse.jdt.text.tests.contentassist.ContentAssistTestSuite;
import org.eclipse.jdt.text.tests.folding.FoldingTest;
import org.eclipse.jdt.text.tests.folding.FoldingTestNew;
import org.eclipse.jdt.text.tests.semantictokens.SemanticTokensProviderTest;
import org.eclipse.jdt.text.tests.spelling.SpellCheckEngineTestCase;
import org.eclipse.jdt.text.tests.templates.TemplatesTestSuite;
Expand Down Expand Up @@ -71,7 +71,7 @@
JavaElementPrefixPatternMatcherTest.class,
CodeMiningTriggerTest.class,
ParameterNamesCodeMiningTest.class,
FoldingTest.class,
FoldingTestNew.class,
})
public class JdtTextTestSuite {
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ public void setUp() throws CoreException {
}
packageFragment= sourceFolder.createPackageFragment("org.example.test", false, null);
IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
store.setValue(PreferenceConstants.EDITOR_NEW_FOLDING_ENABLED, true);
store.setValue(PreferenceConstants.EDITOR_NEW_FOLDING_ENABLED, false);
}

@After
Expand Down Expand Up @@ -242,15 +242,14 @@ void b() { //here should be an annotation
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 6);
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 5);

List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 1, 3); // 1. Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 4, 6); // 2. Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 7, 9); // 3. Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 12, 14); // 4. Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 15, 19); // Methode b()
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 16, 18); // 5. Javadoc
}

@Test
Expand Down Expand Up @@ -283,219 +282,4 @@ void a() {
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 3); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 4, 5); // 2. Method
}

@Test
public void testIfStatementFolding() throws Exception {
String str= """
package org.example.test;
public class D {
void x() { //here should be an annotation
if (true) { //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // if
}

@Test
public void testTryStatementFolding() throws Exception {
String str= """
package org.example.test;
public class E {
void x() { //here should be an annotation
try { //here should be an annotation
} catch (Exception e) { //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 3);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 7); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 4); // try
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 6); // catch
}

@Test
public void testWhileStatementFolding() throws Exception {
String str= """
package org.example.test;
public class F {
void x() { //here should be an annotation
while (true) { //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // while
}

@Test
public void testForStatementFolding() throws Exception {
String str= """
package org.example.test;
public class G {
void x() { //here should be an annotation
for(int i=0;i<1;i++){ //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // for
}

@Test
public void testEnhancedForStatementFolding() throws Exception {
String str= """
package org.example.test;
public class H {
void x() { //here should be an annotation
for(String s: new String[0]){ //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // for
}

@Test
public void testDoStatementFolding() throws Exception {
String str= """
package org.example.test;
public class I {
void x() { //here should be an annotation
do { //here should be an annotation
} while(false);
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 5); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 4); // do
}

@Test
public void testSynchronizedStatementFolding() throws Exception {
String str= """
package org.example.test;
public class K {
void x() { //here should be an annotation
synchronized(this) { //here should be an annotation
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 3); // synchronized
}

@Test
public void testLambdaExpressionFolding() throws Exception {
String str= """
package org.example.test;
import java.util.function.Supplier;
public class L {
void x() { //here should be an annotation
Supplier<String> s = () -> { //here should be an annotation
return "";
};
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 6); // 1. Method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 4, 5); // Supplier
}

@Test
public void testAnonymousClassDeclarationFolding() throws Exception {
String str= """
package org.example.test;
public class M {
Object o = new Object(){ //here should be an annotation
void y() { //here should be an annotation
}
};
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 5); // Object
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 4); // Method
}

@Test
public void testEnumDeclarationFolding() throws Exception {
String str= """
package org.example.test;
public enum N { //here should be an annotation
A,
B
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 1);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 1, 3); // enum
}

@Test
public void testInitializerFolding() throws Exception {
String str= """
package org.example.test;
public class O {
static { //here should be an annotation
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 1);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 2); // static
}

@Test
public void testNestedFolding() throws Exception {
String str= """
package org.example.test;
public class P {
void x() { //here should be an annotation
if (true) { //here should be an annotation
for(int i=0;i<1;i++){ //here should be an annotation
while(true) { //here should be an annotation
do { //here should be an annotation
} while(false);
}
}
}
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 5);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 10); // method
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 9); // if
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 4, 8); // for
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 7); // while
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 6, 6); // do
}
}
Loading

0 comments on commit f07f68b

Please sign in to comment.