Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAnton Leherbauer2008-01-24 09:53:01 +0000
committerAnton Leherbauer2008-01-24 09:53:01 +0000
commit0a8351dce8254d9c03f9f497e84a979f7eab5571 (patch)
treee89c90b2e01634873d67c8df1f6efaa8a4f06793
parentb6c5c6fd9404bf5586d4d9e0735600a66a778948 (diff)
downloadorg.eclipse.cdt-0a8351dce8254d9c03f9f497e84a979f7eab5571.tar.gz
org.eclipse.cdt-0a8351dce8254d9c03f9f497e84a979f7eab5571.tar.xz
org.eclipse.cdt-0a8351dce8254d9c03f9f497e84a979f7eab5571.zip
174597: Code folding of compound statements (Patch by Elazar Leibovich)
-rw-r--r--core/org.eclipse.cdt.ui.tests/resources/folding/FoldingTest.cpp38
-rw-r--r--core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/FoldingTest.java62
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingPreferenceBlock.java7
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java171
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.java4
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.properties4
-rw-r--r--core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/PreferenceConstants.java9
7 files changed, 268 insertions, 27 deletions
diff --git a/core/org.eclipse.cdt.ui.tests/resources/folding/FoldingTest.cpp b/core/org.eclipse.cdt.ui.tests/resources/folding/FoldingTest.cpp
index 04961e7d64d..3be9bcbfb7d 100644
--- a/core/org.eclipse.cdt.ui.tests/resources/folding/FoldingTest.cpp
+++ b/core/org.eclipse.cdt.ui.tests/resources/folding/FoldingTest.cpp
@@ -1,7 +1,7 @@
/*
* header comment
*/
-
+#define ONE
#define MULTI_LINE_MACRO(x) \
if (DBG) { \
printf(x); \
@@ -14,7 +14,7 @@
#elif X
// X
#else
-# if 1
+# if ONE
# if 0
# if 1
//
@@ -72,5 +72,39 @@ int
main(int argc,
char *argv[])
{
+int MyI = 0,j = 0;
+ if (0==0) {
+ puts("Wow ");
+ } else {
+ j = j;
+ }
+ for (MyI = 0; MyI < 10; ++MyI) {
+ printf("%d\n",MyI);
+ }
+ while (0) {
+ puts("nothinghere");
+ }
+ switch (1) {
+ case 1:
+ puts("ab");
+ break;
+ case 2:
+ puts("cd");
+ default:
+ puts("xy");
+ }
+ do {
+ puts("tryagain");
+
+ } while (0);
+ if (MyI==0) {
+ return 1;
+ }
return 0;
}
+
+enum E {
+ e1,
+ e2,
+ e3
+};
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/FoldingTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/FoldingTest.java
index 436041af84a..54618607553 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/FoldingTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/FoldingTest.java
@@ -7,6 +7,7 @@
*
* Contributors:
* Anton Leherbauer (Wind River Systems) - initial API and implementation
+ * Elazar Leibovich (The Open University) - extra folding test
*******************************************************************************/
package org.eclipse.cdt.ui.tests.text;
@@ -80,6 +81,7 @@ public class FoldingTest extends TestCase {
IPreferenceStore store= CUIPlugin.getDefault().getPreferenceStore();
store.setValue(PreferenceConstants.EDITOR_FOLDING_ENABLED, true);
+ store.setValue(PreferenceConstants.EDITOR_FOLDING_STATEMENTS, true);
store.setValue(PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED, true);
store.setValue(PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE, false);
store.setValue(PreferenceConstants.EDITOR_FOLDING_HEADERS, false);
@@ -119,12 +121,13 @@ public class FoldingTest extends TestCase {
assertEquals(expectedEndLine, actualEndLine);
if (exp instanceof IProjectionPosition) {
int expectedCaptionOffset= ((IProjectionPosition)exp).computeCaptionOffset(document);
+ int expectedCaptionLine= document.getLineOfOffset(exp.getOffset() + expectedCaptionOffset);
+ int actualCaptionLine= actualStartLine;
if (act instanceof IProjectionPosition) {
int actualCaptionOffset= ((IProjectionPosition)act).computeCaptionOffset(document);
- assertEquals(expectedCaptionOffset, actualCaptionOffset);
- } else {
- assertEquals(expectedCaptionOffset, 0);
+ actualCaptionLine= document.getLineOfOffset(exp.getOffset() + actualCaptionOffset);
}
+ assertEquals(expectedCaptionLine, actualCaptionLine);
}
}
}
@@ -152,7 +155,20 @@ public class FoldingTest extends TestCase {
Position position= positions[i];
int startLine= document.getLineOfOffset(position.getOffset());
int endLine= document.getLineOfOffset(position.getOffset()+position.getLength()-1);
- buf.append("\tcreatePosition(" + startLine + ", " + endLine + "),\n");
+ int captionLine= startLine;
+ if (position instanceof IProjectionPosition) {
+ final int captionOffset = ((IProjectionPosition)position).computeCaptionOffset(document);
+ captionLine= document.getLineOfOffset(position.getOffset() + captionOffset);
+ }
+ buf.append("\tcreatePosition(");
+ buf.append(startLine);
+ buf.append(", ");
+ buf.append(endLine);
+ if (captionLine != startLine) {
+ buf.append(", ");
+ buf.append(captionLine);
+ }
+ buf.append("),\n");
}
buf.append("};\n");
return buf.toString();
@@ -179,7 +195,7 @@ public class FoldingTest extends TestCase {
public void testInitialFolding() throws BadLocationException {
Position[] actual= getFoldingPositions();
Position[] expected= new Position[] {
- createPosition(0, 2),
+ createPosition(0, 2, 1),
createPosition(4, 7),
createPosition(9, 12),
createPosition(10, 12),
@@ -190,7 +206,7 @@ public class FoldingTest extends TestCase {
createPosition(18, 20),
createPosition(21, 25),
createPosition(22, 24),
- createPosition(29, 31),
+ createPosition(29, 31, 30),
createPosition(34, 35),
createPosition(35, 40),
createPosition(36, 38),
@@ -200,9 +216,20 @@ public class FoldingTest extends TestCase {
createPosition(57, 59),
createPosition(61, 63),
createPosition(65, 67),
- createPosition(70, 75, 71),
+ createPosition(70, 103, 71),
+ createPosition(75, 76),
+ createPosition(77, 79),
+ createPosition(80, 82),
+ createPosition(83, 85),
+ createPosition(86, 94),
+ createPosition(87, 89),
+ createPosition(90, 91),
+ createPosition(92, 93),
+ createPosition(95, 97),
+ createPosition(99, 101),
+ createPosition(105, 109),
};
- if (false) System.out.println(toString(actual));
+// assertEquals(toString(expected), toString(actual));
assertEqualPositions(expected, actual);
}
@@ -214,9 +241,9 @@ public class FoldingTest extends TestCase {
Position[] actual= getFoldingPositions();
Position[] expected= new Position[] {
- createPosition(0, 2),
+ createPosition(0, 2, 1),
createPosition(4, 7),
- createPosition(29, 31),
+ createPosition(29, 31, 30),
createPosition(35, 40),
createPosition(42, 46),
createPosition(48, 55),
@@ -224,9 +251,20 @@ public class FoldingTest extends TestCase {
createPosition(57, 59),
createPosition(61, 63),
createPosition(65, 67),
- createPosition(70, 75, 71),
+ createPosition(70, 103, 71),
+ createPosition(75, 76),
+ createPosition(77, 79),
+ createPosition(80, 82),
+ createPosition(83, 85),
+ createPosition(86, 94),
+ createPosition(87, 89),
+ createPosition(90, 91),
+ createPosition(92, 93),
+ createPosition(95, 97),
+ createPosition(99, 101),
+ createPosition(105, 109),
};
- if (false) System.out.println(toString(actual));
+// assertEquals(toString(expected), toString(actual));
assertEqualPositions(expected, actual);
}
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingPreferenceBlock.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingPreferenceBlock.java
index 8708dfad2ae..4e16bd8f5d7 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingPreferenceBlock.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingPreferenceBlock.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2007 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
* Contributors:
* IBM Corporation - initial API and implementation
* Anton Leherbauer (Wind River Systems)
+ * Elazar Leibovich (IDF) - Code folding of compound statements (bug 174597)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.text.folding;
@@ -74,6 +75,7 @@ public class DefaultCFoldingPreferenceBlock implements ICFoldingPreferenceBlock
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_HEADERS));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE));
overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED));
+ overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_STATEMENTS));
return (OverlayKey[]) overlayKeys.toArray(new OverlayKey[overlayKeys.size()]);
}
@@ -92,6 +94,7 @@ public class DefaultCFoldingPreferenceBlock implements ICFoldingPreferenceBlock
inner.setLayout(layout);
addCheckBox(inner, FoldingMessages.DefaultCFoldingPreferenceBlock_preprocessor_enabled, PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED, 1);
+ addCheckBox(inner, FoldingMessages.DefaultCFoldingPreferenceBlock_statements_enabled, PreferenceConstants.EDITOR_FOLDING_STATEMENTS, 1);
ControlFactory.createEmptySpace(inner);
Composite group= ControlFactory.createGroup(inner, FoldingMessages.DefaultCFoldingPreferenceBlock_title, 1);
@@ -101,7 +104,7 @@ public class DefaultCFoldingPreferenceBlock implements ICFoldingPreferenceBlock
addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_methods, PreferenceConstants.EDITOR_FOLDING_METHODS, 0);
addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_structures, PreferenceConstants.EDITOR_FOLDING_STRUCTURES, 0);
addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_comments, PreferenceConstants.EDITOR_FOLDING_COMMENTS, 0);
- addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_headers, PreferenceConstants.EDITOR_FOLDING_HEADERS, 0);
+ addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_headers, PreferenceConstants.EDITOR_FOLDING_HEADERS, 0);
fInactiveCodeFoldingCheckBox= addCheckBox(group, FoldingMessages.DefaultCFoldingPreferenceBlock_inactive_code, PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE, 0);
return inner;
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java
index 815e775a1a4..54f5dffc776 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java
@@ -9,6 +9,7 @@
* IBM Corporation - initial API and implementation
* Anton Leherbauer (Wind River Systems)
* Markus Schorn (Wind River Systems)
+ * Elazar Leibovich (IDF) - Code folding of compound statements (bug 174597)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.text.folding;
@@ -50,6 +51,16 @@ import org.eclipse.jface.viewers.SelectionChangedEvent;
import org.eclipse.ui.texteditor.IDocumentProvider;
import org.eclipse.ui.texteditor.ITextEditor;
+import org.eclipse.cdt.core.CCorePlugin;
+import org.eclipse.cdt.core.dom.ast.ASTVisitor;
+import org.eclipse.cdt.core.dom.ast.IASTBreakStatement;
+import org.eclipse.cdt.core.dom.ast.IASTCaseStatement;
+import org.eclipse.cdt.core.dom.ast.IASTCompoundStatement;
+import org.eclipse.cdt.core.dom.ast.IASTDefaultStatement;
+import org.eclipse.cdt.core.dom.ast.IASTDoStatement;
+import org.eclipse.cdt.core.dom.ast.IASTFileLocation;
+import org.eclipse.cdt.core.dom.ast.IASTForStatement;
+import org.eclipse.cdt.core.dom.ast.IASTIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTNodeLocation;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorElifStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorElseStatement;
@@ -58,7 +69,10 @@ import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfdefStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorIfndefStatement;
import org.eclipse.cdt.core.dom.ast.IASTPreprocessorStatement;
+import org.eclipse.cdt.core.dom.ast.IASTStatement;
+import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement;
import org.eclipse.cdt.core.dom.ast.IASTTranslationUnit;
+import org.eclipse.cdt.core.dom.ast.IASTWhileStatement;
import org.eclipse.cdt.core.model.CModelException;
import org.eclipse.cdt.core.model.CoreModel;
import org.eclipse.cdt.core.model.ICElement;
@@ -647,6 +661,7 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
private int fMinCommentLines= 1;
private boolean fPreprocessorBranchFoldingEnabled= true;
+ private boolean fStatementsFoldingEnabled= false;
private boolean fCommentFoldingEnabled= true;
private ICReconcilingListener fReconilingListener;
@@ -810,7 +825,8 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
fCollapseComments= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_COMMENTS);
fCollapseInactiveCode= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE);
fPreprocessorBranchFoldingEnabled= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED);
- fCommentFoldingEnabled= true;
+ fStatementsFoldingEnabled= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_STATEMENTS);
+ fCommentFoldingEnabled = true;
}
private void update(FoldingStructureComputationContext ctx) {
@@ -1041,7 +1057,7 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
// ignore
}
}
- if (fPreprocessorBranchFoldingEnabled) {
+ if (fPreprocessorBranchFoldingEnabled || fStatementsFoldingEnabled) {
IASTTranslationUnit ast= ctx.getAST();
if (ast == null) {
final ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider();
@@ -1080,9 +1096,129 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
}
return false;
}
-
+
+ private static class ModifiableRegionExtra extends ModifiableRegion {
+ /*
+ * A modifiable region with extra information about the region it holds.
+ * It tells us whether or not to include the last line of the region
+ */
+ public boolean inclusive;
+ }
+
/**
- * Compute folding structure of the preprocessor branches for the given AST.
+ * Computes folding structure for preprocessor branches for the given AST.
+ *
+ * @param ast
+ * @param ctx
+ */
+ private void computeStatementFoldingStructure(IASTTranslationUnit ast, FoldingStructureComputationContext ctx) {
+ final Stack iral = new Stack();
+ ast.accept(new ASTVisitor() {
+ {
+ shouldVisitStatements = true;
+ }
+
+ public int visit(IASTStatement statement) {
+ // if it's not part of the displayed - file, we don't need it
+ if (!statement.isPartOfTranslationUnitFile())
+ return PROCESS_SKIP;// we neither need its descendants
+ try {
+ ModifiableRegionExtra mr;
+ IASTFileLocation fl;
+ if (statement instanceof IASTIfStatement) {
+ IASTIfStatement ifstmt = (IASTIfStatement) statement;
+ IASTStatement tmp;
+ mr = new ModifiableRegionExtra();
+ tmp = ifstmt.getThenClause();
+ if (tmp==null) return PROCESS_CONTINUE;
+ fl = tmp.getFileLocation();
+ mr.setLength(fl.getNodeLength());
+ mr.setOffset(fl.getNodeOffset());
+ mr.inclusive = false;
+ tmp = ifstmt.getElseClause();
+ if (tmp==null) {
+ mr.inclusive = true;
+ iral.push(mr);
+ return PROCESS_CONTINUE;
+ }
+ iral.push(mr);
+ mr = new ModifiableRegionExtra();
+ fl = tmp.getFileLocation();
+ mr.setLength(fl.getNodeLength());
+ mr.setOffset(fl.getNodeOffset());
+ mr.inclusive = true;
+ iral.push(mr);
+ }
+ mr = new ModifiableRegionExtra();
+ mr.inclusive = true;
+ if (statement instanceof IASTDoStatement)
+ mr.inclusive = false;
+ if (statement instanceof IASTSwitchStatement) {
+ IASTStatement switchstmt = ((IASTSwitchStatement)statement).getBody();
+ if (switchstmt instanceof IASTCompoundStatement) {
+ IASTStatement[] stmts = ((IASTCompoundStatement)switchstmt).getStatements();
+ boolean pushedMR = false;
+ for (int i = 0; i < stmts.length; i++) {
+ IASTStatement tmpstmt = stmts[i];
+ ModifiableRegionExtra tmpmr;
+ if (!(tmpstmt instanceof IASTCaseStatement || tmpstmt instanceof IASTDefaultStatement)) {
+ if (!pushedMR) return PROCESS_SKIP;
+ IASTFileLocation tmpfl = tmpstmt.getFileLocation();
+ tmpmr = (ModifiableRegionExtra) iral.peek();
+ tmpmr.setLength(tmpfl.getNodeLength()+tmpfl.getNodeOffset()-tmpmr.getOffset());
+ if (tmpstmt instanceof IASTBreakStatement) pushedMR = false;
+ continue;
+ }
+ IASTFileLocation tmpfl;
+ tmpmr = new ModifiableRegionExtra();
+ tmpmr.inclusive = true;
+ if (tmpstmt instanceof IASTCaseStatement) {
+ IASTCaseStatement casestmt = (IASTCaseStatement) tmpstmt;
+ tmpfl = casestmt.getExpression().getFileLocation();
+ tmpmr.setOffset(tmpfl.getNodeOffset());
+ tmpmr.setLength(tmpfl.getNodeLength());
+ } else if (tmpstmt instanceof IASTDefaultStatement) {
+ IASTDefaultStatement defstmt = (IASTDefaultStatement) tmpstmt;
+ tmpfl = defstmt.getFileLocation();
+ tmpmr.setOffset(tmpfl.getNodeOffset()+tmpfl.getNodeLength());
+ tmpmr.setLength(0);
+ }
+ iral.push(tmpmr);
+ pushedMR = true;
+ }
+ }
+ }
+ if (statement instanceof IASTForStatement ||
+ statement instanceof IASTWhileStatement ||
+ statement instanceof IASTDoStatement ||
+ statement instanceof IASTSwitchStatement) {
+ fl = statement.getFileLocation();
+ mr.setLength(fl.getNodeLength());
+ mr.setOffset(fl.getNodeOffset());
+ iral.push(mr);
+ }
+ return PROCESS_CONTINUE;
+ } catch (Throwable e) {
+ CCorePlugin.log(e);
+ return PROCESS_CONTINUE;
+ }
+ }
+ });
+ while (!iral.empty()) {
+ ModifiableRegionExtra mr = (ModifiableRegionExtra) iral.pop();
+ IRegion aligned = alignRegion(mr, ctx,mr.inclusive);
+ if (aligned != null) {
+ Position alignedPos= new Position(aligned.getOffset(), aligned.getLength());
+ ctx.addProjectionRange(new CProjectionAnnotation(false, computeKey(mr, ctx), false), alignedPos);
+ }
+ }
+ }
+
+ /**
+ * Compute folding structure of things related to the AST tree. Currently it
+ * computes the folding structure for: preprocessor branches for the given
+ * AST. Also, it computes statements folding (if/else do/while for and
+ * switch)
*
* @param ast
* @param ctx
@@ -1095,22 +1231,38 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
if (fileName == null) {
return;
}
- List branches= new ArrayList();
+
+ if (fStatementsFoldingEnabled)
+ computeStatementFoldingStructure(ast, ctx);
+
+ if (fPreprocessorBranchFoldingEnabled)
+ computePreprocessorFoldingStructure(ast, ctx, fileName);
+ }
+
+ /**
+ * Computes folding structure for preprocessor branches for the given AST.
+ *
+ * @param ast
+ * @param ctx
+ * @param fileName
+ */
+ private void computePreprocessorFoldingStructure(IASTTranslationUnit ast,
+ FoldingStructureComputationContext ctx, String fileName) {
+ List branches = new ArrayList();
Stack branchStack = new Stack();
IASTPreprocessorStatement[] preprocStmts = ast.getAllPreprocessorStatements();
for (int i = 0; i < preprocStmts.length; i++) {
IASTPreprocessorStatement statement = preprocStmts[i];
- if (!fileName.equals(statement.getContainingFilename())) {
+ if (!statement.isPartOfTranslationUnitFile()) {
// preprocessor directive is from a different file
continue;
}
- IASTNodeLocation[] nodeLocations = statement.getNodeLocations();
- if (nodeLocations.length != 1) {
+ IASTNodeLocation stmtLocation= statement.getFileLocation();
+ if (stmtLocation == null) {
continue;
}
- IASTNodeLocation stmtLocation= nodeLocations[0];
if (statement instanceof IASTPreprocessorIfStatement) {
IASTPreprocessorIfStatement ifStmt = (IASTPreprocessorIfStatement)statement;
branchStack.push(new Branch(stmtLocation.getNodeOffset(), ifStmt.taken()));
@@ -1311,6 +1463,7 @@ public class DefaultCFoldingStructureProvider implements ICFoldingStructureProvi
case ICElement.C_STRUCT:
case ICElement.C_CLASS:
case ICElement.C_UNION:
+ case ICElement.C_ENUMERATION:
case ICElement.C_TEMPLATE_STRUCT:
case ICElement.C_TEMPLATE_CLASS:
case ICElement.C_TEMPLATE_UNION:
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.java
index 10792344e96..103c5912446 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2000, 2006 QNX Software Systems and others.
+ * Copyright (c) 2000, 2008 QNX Software Systems and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
@@ -7,6 +7,7 @@
*
* Contributors:
* IBM Corporation - initial API and implementation
+ * Elazar Leibovich (IDF) - Code folding of compound statements (bug 174597)
*******************************************************************************/
package org.eclipse.cdt.internal.ui.text.folding;
@@ -30,6 +31,7 @@ public final class FoldingMessages extends NLS {
public static String DefaultCFoldingPreferenceBlock_inactive_code;
public static String DefaultCFoldingPreferenceBlock_preprocessor_enabled;
public static String EmptyCFoldingPreferenceBlock_emptyCaption;
+ public static String DefaultCFoldingPreferenceBlock_statements_enabled;
static {
NLS.initializeMessages(BUNDLE_NAME, FoldingMessages.class);
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.properties
index 34eca94cf01..3a6a8fd81ae 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.properties
@@ -1,5 +1,5 @@
###############################################################################
-# Copyright (c) 2000, 2007 IBM Corporation and others.
+# Copyright (c) 2000, 2008 IBM Corporation and others.
# All rights reserved. This program and the accompanying materials
# are made available under the terms of the Eclipse Public License v1.0
# which accompanies this distribution, and is available at
@@ -8,6 +8,7 @@
# Contributors:
# IBM Corporation - initial API and implementation
# Anton Leherbauer (Wind River Systems)
+# Elazar Leibovich (IDF) - Code folding of compound statements (bug 174597)
###############################################################################
@@ -20,5 +21,6 @@ DefaultCFoldingPreferenceBlock_comments= &Comments
DefaultCFoldingPreferenceBlock_headers= &Header Comments
DefaultCFoldingPreferenceBlock_inactive_code= &Inactive Preprocessor Branches
DefaultCFoldingPreferenceBlock_preprocessor_enabled= Enable folding of preprocessor branches (#if/#endif)
+DefaultCFoldingPreferenceBlock_statements_enabled= Enable folding of control flow statements (if/else, do/while, for, switch)
EmptyCFoldingPreferenceBlock_emptyCaption=
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/PreferenceConstants.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/PreferenceConstants.java
index 8b8e937e34f..65fd11d86c2 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/PreferenceConstants.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/PreferenceConstants.java
@@ -10,6 +10,7 @@
* QNX Software System
* Anton Leherbauer (Wind River Systems)
* Sergey Prigogin (Google)
+ * Elazar Leibovich (IDF) - Code folding of compound statements (bug 174597)
*******************************************************************************/
package org.eclipse.cdt.ui;
@@ -813,6 +814,14 @@ public class PreferenceConstants {
public static final String EDITOR_FOLDING_STRUCTURES= "editor_folding_default_structures"; //$NON-NLS-1$
/**
+ * A named preference that stores the value for statements folding (if/else, do/while, for, switch statements)
+ * <p>
+ * Value is of type <code>Boolean</code>.
+ * </p>
+ */
+ public static final String EDITOR_FOLDING_STATEMENTS = "editor_folding_statements"; //$NON-NLS-1$
+
+ /**
* A named preference that stores the value for functions folding for the default folding provider.
* <p>
* Value is of type <code>Boolean</code>.

Back to the top