Skip to content

Commit

Permalink
Refactor of visit(CompilationUnit node)
Browse files Browse the repository at this point in the history
  • Loading branch information
jakub-suliga committed Jan 29, 2025
1 parent 5b69fb7 commit 7f12c93
Show file tree
Hide file tree
Showing 7 changed files with 809 additions and 137 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,14 +24,19 @@

import org.eclipse.core.runtime.CoreException;

import org.eclipse.jface.preference.IPreferenceStore;

import org.eclipse.jface.text.IRegion;

import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;

import org.eclipse.jdt.ui.PreferenceConstants;
import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;

import org.eclipse.jdt.internal.ui.JavaPlugin;

public class FoldingTest {
@Rule
public ProjectTestSetup projectSetup= new ProjectTestSetup();
Expand All @@ -50,7 +55,9 @@ public void setUp() throws CoreException {
sourceFolder= JavaProjectHelper.addSourceContainer(jProject, "src");
}
packageFragment= sourceFolder.createPackageFragment("org.example.test", false, null);
}
IPreferenceStore store= JavaPlugin.getDefault().getPreferenceStore();
store.setValue(PreferenceConstants.EDITOR_NEW_FOLDING_ENABLED, true);
}

@After
public void tearDown() throws CoreException {
Expand Down Expand Up @@ -117,7 +124,7 @@ public void foo() { //here should be an annotation

List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 7); // foo Methode
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 6); // foo Methode
}

@Test
Expand All @@ -136,8 +143,8 @@ public void bar() { //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); // foo Methode
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 7); // bar Methode
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 3); // foo Methode
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 6); // bar Methode
}

@Test
Expand All @@ -155,8 +162,8 @@ void bar() { //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, 6); // InnerClass
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 5); // bar Methode
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 5); // InnerClass
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 3, 4); // bar Methode
}

@Test
Expand All @@ -181,9 +188,9 @@ void bar() { //here should be an annotation

List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 2, 4); // OuterWithDocs Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 12); // InnerWithDocs Klasse
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 5, 11); // InnerWithDocs Klasse
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 6, 8); // InnerWithDocs Javadoc
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 9, 11); // bar Methode
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 9, 10); // bar Methode
}

@Test
Expand Down Expand Up @@ -228,21 +235,22 @@ class h {
*
*/
void b() { //here should be an annotation
/* //here should NOT be an annotation
/* //here should be an annotation
*
*/
int a;
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 5);
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 6);

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, 20); // Methode b()
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 15, 19); // Methode b()
FoldingTestUtils.assertContainsRegionUsingStartAndEndLine(regions, str, 16, 18); // 5. Javadoc
}

@Test
Expand All @@ -257,4 +265,237 @@ class SomeClass {}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 1);
}

@Test
public void testMethodDeclarationFoldingWithSameLineStart() throws Exception {
String str= """
package org.example.test;
public class Q {
void a() {
int i = 0;
}void b() {
}
}
""";
FoldingTestUtils.assertCodeHasRegions(packageFragment, "TestFolding.java", str, 2);
List<IRegion> regions= FoldingTestUtils.getProjectionRangesOfFile(packageFragment, "TestFolding.java", str);
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
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -79,12 +79,14 @@ public static void assertContainsRegionUsingStartAndEndLine(List<IRegion> projec
", actual regions: " + projectionRanges
);
}

private static int getLengthIfNotFound(String input, int startLineEnd) {
if (startLineEnd == -1) {
startLineEnd= input.length();
}
return startLineEnd;
}

private static int findLineStartIndex(String input, int lineNumber) {
int currentInputIndex= 0;
for (int i= 0; i < lineNumber; i++) {
Expand All @@ -95,6 +97,7 @@ private static int findLineStartIndex(String input, int lineNumber) {
}
return currentInputIndex;
}

private static int findNextLineStart(String input, int currentInputIndex) {
return input.indexOf('\n', currentInputIndex + 1);
}
Expand Down
Loading

0 comments on commit 7f12c93

Please sign in to comment.