### Eclipse Workspace Patch 1.0 #P org.eclipse.cdt.ui Index: src/org/eclipse/cdt/ui/PreferenceConstants.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/ui/PreferenceConstants.java,v retrieving revision 1.42 diff -u -r1.42 PreferenceConstants.java --- src/org/eclipse/cdt/ui/PreferenceConstants.java 16 Jan 2008 09:50:35 -0000 1.42 +++ src/org/eclipse/cdt/ui/PreferenceConstants.java 20 Jan 2008 21:02:32 -0000 @@ -792,7 +792,7 @@ * */ public static final String EDITOR_FOLDING_ENABLED= "editor_folding_enabled"; //$NON-NLS-1$ - + /** * A named preference that stores the configured folding provider. *

@@ -813,6 +813,14 @@ public static final String EDITOR_FOLDING_STRUCTURES= "editor_folding_default_structures"; //$NON-NLS-1$ /** + * A named preference that stores the value for statements (if/else while/do, for, switch statements) + *

+ * Value is of type Boolean. + *

+ */ + 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. *

* Value is of type Boolean. Index: src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.properties =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.properties,v retrieving revision 1.7 diff -u -r1.7 FoldingMessages.properties --- src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.properties 28 May 2007 20:25:51 -0000 1.7 +++ src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.properties 20 Jan 2008 21:02:29 -0000 @@ -20,5 +20,6 @@ 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= Index: src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingPreferenceBlock.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingPreferenceBlock.java,v retrieving revision 1.7 diff -u -r1.7 DefaultCFoldingPreferenceBlock.java --- src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingPreferenceBlock.java 3 Dec 2007 14:04:09 -0000 1.7 +++ src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingPreferenceBlock.java 20 Jan 2008 21:02:26 -0000 @@ -74,6 +74,7 @@ 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 +93,7 @@ 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 +103,7 @@ 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; @@ -137,6 +139,9 @@ if (PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED.equals(key)) { fInactiveCodeFoldingCheckBox.setEnabled(fOverlayStore.getBoolean(key)); } + if (PreferenceConstants.EDITOR_FOLDING_STATEMENTS.equals(key)) { + fInactiveCodeFoldingCheckBox.setEnabled(fOverlayStore.getBoolean(key)); + } } /* Index: src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java,v retrieving revision 1.24 diff -u -r1.24 DefaultCFoldingStructureProvider.java --- src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java 18 Jan 2008 08:38:19 -0000 1.24 +++ src/org/eclipse/cdt/internal/ui/text/folding/DefaultCFoldingStructureProvider.java 20 Jan 2008 21:02:29 -0000 @@ -50,6 +50,21 @@ 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.IASTDoStatement; +import org.eclipse.cdt.core.dom.ast.IASTElaboratedTypeSpecifier; +import org.eclipse.cdt.core.dom.ast.IASTExpression; +import org.eclipse.cdt.core.dom.ast.IASTFileLocation; +import org.eclipse.cdt.core.dom.ast.IASTForStatement; +import org.eclipse.cdt.core.dom.ast.IASTWhileStatement; +import org.eclipse.cdt.core.dom.ast.IASTIfStatement; +import org.eclipse.cdt.core.dom.ast.IASTStatement; +import org.eclipse.cdt.core.dom.ast.IASTSwitchStatement; + import org.eclipse.cdt.core.dom.ast.IASTNodeLocation; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorElifStatement; import org.eclipse.cdt.core.dom.ast.IASTPreprocessorElseStatement; @@ -647,6 +662,7 @@ private int fMinCommentLines= 1; private boolean fPreprocessorBranchFoldingEnabled= true; + private boolean fStatementsFoldingEnabled = false; private boolean fCommentFoldingEnabled= true; private ICReconcilingListener fReconilingListener; @@ -810,6 +826,7 @@ fCollapseComments= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_COMMENTS); fCollapseInactiveCode= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_INACTIVE_CODE); fPreprocessorBranchFoldingEnabled= store.getBoolean(PreferenceConstants.EDITOR_FOLDING_PREPROCESSOR_BRANCHES_ENABLED); + fStatementsFoldingEnabled = store.getBoolean(PreferenceConstants.EDITOR_FOLDING_STATEMENTS); fCommentFoldingEnabled= true; } @@ -1041,7 +1058,7 @@ // ignore } } - if (fPreprocessorBranchFoldingEnabled) { + if (fPreprocessorBranchFoldingEnabled || fStatementsFoldingEnabled) { IASTTranslationUnit ast= ctx.getAST(); if (ast == null) { final ASTProvider astProvider= CUIPlugin.getDefault().getASTProvider(); @@ -1081,8 +1098,154 @@ return false; } + 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)) { + if (!pushedMR) return PROCESS_SKIP; + IASTFileLocation tmpfl = tmpstmt.getFileLocation(); + tmpmr = iral.peek(); + tmpmr.setLength(tmpfl.getNodeLength()+tmpfl.getNodeOffset()-tmpmr.getOffset()); + System.out.printf("%d is good\n", tmpmr.getLength()+tmpstmt.getFileLocation().getNodeLength()); //$NON-NLS-1$ + if (tmpstmt instanceof IASTBreakStatement) pushedMR = false; + continue; + } + IASTCaseStatement casestmt = (IASTCaseStatement) tmpstmt; + tmpmr = new ModifiableRegionExtra(); + tmpmr.inclusive = true; + IASTFileLocation tmpfl = casestmt.getExpression().getFileLocation(); + tmpmr.setOffset(tmpfl.getNodeOffset()); + tmpmr.setLength(tmpfl.getNodeLength()); + iral.push(tmpmr); + pushedMR = true; + } + } + /* The following code should visit any case statements within the + * switch statement, and add folding to each case statement. + * For some unknown reason, it fails to even visit a single child statement + * of the switch statement, the visit function in the anonymous class is never + * visited. + * I leave the code commented in case anyone wish to fix it. + statement.accept(new ASTVisitor() { + { + shouldVisitStatements = true; + } + boolean pushedMR = false; + //did we pushed a ModifiableRegion to iral stack? If we did we might need to update it + public int visit(IASTStatement stmt) { + ModifiableRegionExtra tmpmr; + if (!(stmt instanceof IASTCaseStatement)) { + if (!pushedMR) return PROCESS_SKIP; + tmpmr = iral.peek(); + tmpmr.setLength(tmpmr.getLength()+stmt.getFileLocation().getNodeLength()); + System.out.printf("%d is good\n", tmpmr.getLength()+stmt.getFileLocation().getNodeLength()); //$NON-NLS-1$ + if (stmt instanceof IASTBreakStatement) pushedMR = false; + return PROCESS_SKIP; + } + IASTCaseStatement casestmt = (IASTCaseStatement) stmt; + tmpmr = new ModifiableRegionExtra(); + IASTFileLocation tmpfl = casestmt.getExpression().getFileLocation(); + tmpmr.setOffset(tmpfl.getNodeOffset()); + tmpmr.setLength(tmpfl.getNodeLength()); + iral.push(tmpmr); + pushedMR = true; + + return PROCESS_SKIP; + } + });*/ + + } + 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 = 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,8 +1258,25 @@ if (fileName == null) { return; } + + 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(); + Stack branchStack = new Stack(); + + IASTPreprocessorStatement[] preprocStmts = ast.getAllPreprocessorStatements(); Index: src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.java =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.java,v retrieving revision 1.5 diff -u -r1.5 FoldingMessages.java --- src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.java 13 Nov 2006 09:44:13 -0000 1.5 +++ src/org/eclipse/cdt/internal/ui/text/folding/FoldingMessages.java 20 Jan 2008 21:02:29 -0000 @@ -30,6 +30,7 @@ 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); Index: .settings/org.eclipse.jdt.core.prefs =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/.settings/org.eclipse.jdt.core.prefs,v retrieving revision 1.8 diff -u -r1.8 org.eclipse.jdt.core.prefs --- .settings/org.eclipse.jdt.core.prefs 28 Nov 2007 10:23:51 -0000 1.8 +++ .settings/org.eclipse.jdt.core.prefs 20 Jan 2008 21:02:26 -0000 @@ -1,9 +1,9 @@ -#Wed Nov 28 11:20:40 CET 2007 +#Fri Jan 11 13:51:05 IST 2008 eclipse.preferences.version=1 -org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=disabled -org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.4 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve -org.eclipse.jdt.core.compiler.compliance=1.4 +org.eclipse.jdt.core.compiler.compliance=1.6 org.eclipse.jdt.core.compiler.debug.lineNumber=generate org.eclipse.jdt.core.compiler.debug.localVariable=generate org.eclipse.jdt.core.compiler.debug.sourceFile=generate @@ -16,7 +16,7 @@ org.eclipse.jdt.core.compiler.problem.deprecationWhenOverridingDeprecatedMethod=disabled org.eclipse.jdt.core.compiler.problem.discouragedReference=error org.eclipse.jdt.core.compiler.problem.emptyStatement=warning -org.eclipse.jdt.core.compiler.problem.enumIdentifier=warning +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error org.eclipse.jdt.core.compiler.problem.fallthroughCase=ignore org.eclipse.jdt.core.compiler.problem.fatalOptionalError=enabled org.eclipse.jdt.core.compiler.problem.fieldHiding=warning @@ -38,6 +38,7 @@ org.eclipse.jdt.core.compiler.problem.missingJavadocComments=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsOverriding=disabled org.eclipse.jdt.core.compiler.problem.missingJavadocCommentsVisibility=public +org.eclipse.jdt.core.compiler.problem.missingJavadocTagDescription=return_tag org.eclipse.jdt.core.compiler.problem.missingJavadocTags=ignore org.eclipse.jdt.core.compiler.problem.missingJavadocTagsOverriding=disabled org.eclipse.jdt.core.compiler.problem.missingJavadocTagsVisibility=protected @@ -77,7 +78,7 @@ org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning -org.eclipse.jdt.core.compiler.source=1.4 +org.eclipse.jdt.core.compiler.source=1.6 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 @@ -325,9 +326,12 @@ org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false org.eclipse.jdt.core.formatter.lineSplit=80 +org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false +org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0 org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1 org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true org.eclipse.jdt.core.formatter.tabulation.char=tab org.eclipse.jdt.core.formatter.tabulation.size=4 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true Index: .settings/org.eclipse.pde.prefs =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/.settings/org.eclipse.pde.prefs,v retrieving revision 1.1 diff -u -r1.1 org.eclipse.pde.prefs --- .settings/org.eclipse.pde.prefs 26 Sep 2006 10:01:26 -0000 1.1 +++ .settings/org.eclipse.pde.prefs 20 Jan 2008 21:02:26 -0000 @@ -1,7 +1,9 @@ -#Tue Sep 26 11:18:15 CEST 2006 +#Fri Jan 11 13:31:33 IST 2008 compilers.incompatible-environment=1 compilers.p.build=1 compilers.p.deprecated=1 +compilers.p.missing-bundle-classpath-entries=1 +compilers.p.missing-packages=2 compilers.p.no-required-att=0 compilers.p.not-externalized-att=1 compilers.p.unknown-attribute=1 Index: .settings/org.eclipse.jdt.ui.prefs =================================================================== RCS file: /cvsroot/tools/org.eclipse.cdt/all/org.eclipse.cdt.ui/.settings/org.eclipse.jdt.ui.prefs,v retrieving revision 1.4 diff -u -r1.4 org.eclipse.jdt.ui.prefs --- .settings/org.eclipse.jdt.ui.prefs 28 Nov 2007 10:23:51 -0000 1.4 +++ .settings/org.eclipse.jdt.ui.prefs 20 Jan 2008 21:02:26 -0000 @@ -1,4 +1,4 @@ -#Wed Nov 28 11:20:40 CET 2007 +#Fri Jan 11 13:51:05 IST 2008 eclipse.preferences.version=1 formatter_profile=_Eclipse [built-in] - cdt formatter_settings_version=11 @@ -6,3 +6,4 @@ org.eclipse.jdt.ui.importorder=java;javax;org;com;org.eclipse.cdt;org.eclipse.cdt.internal;org.eclipse.cdt.internal.ui; org.eclipse.jdt.ui.ondemandthreshold=99 org.eclipse.jdt.ui.staticondemandthreshold=99 +org.eclipse.jdt.ui.text.custom_code_templates=