From d387df2ecd2d951e90968d6552b7c5c825f6cb06 Mon Sep 17 00:00:00 2001 From: Sergey Prigogin Date: Sun, 30 Jan 2011 21:29:56 +0000 Subject: [PATCH] Bug 280990 - Code formatter refuses to wrap member access expressions --- .../DefaultCodeFormatterConstants.java | 31 +++++++---- .../formatter/CodeFormatterVisitor.java | 48 +++++++++++------ .../DefaultCodeFormatterOptions.java | 53 ++++++++++++------- .../cdt/internal/formatter/Scribe.java | 5 ++ .../cdt/ui/tests/text/CodeFormatterTest.java | 32 +++++++++++ .../formatter/FormatterMessages.java | 2 + .../formatter/FormatterMessages.properties | 3 +- .../formatter/LineWrappingTabPage.java | 24 +++++++-- 8 files changed, 147 insertions(+), 51 deletions(-) diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/formatter/DefaultCodeFormatterConstants.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/formatter/DefaultCodeFormatterConstants.java index 029c96b504e..c80436559cf 100644 --- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/formatter/DefaultCodeFormatterConstants.java +++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/core/formatter/DefaultCodeFormatterConstants.java @@ -151,16 +151,6 @@ public class DefaultCodeFormatterConstants { * @see #createAlignmentValue(boolean, int, int) */ public static final String FORMATTER_ALIGNMENT_FOR_CONDITIONAL_EXPRESSION = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_conditional_expression"; //$NON-NLS-1$ - /** - *
-	 * FORMATTER / Option for alignment of expressions in initializer list
-	 *     - option id:         "org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer"
-	 *     - possible values:   values returned by createAlignmentValue(boolean, int, int) call
-	 *     - default:           createAlignmentValue(false, WRAP_COMPACT, INDENT_DEFAULT)
-	 * 
- * @see #createAlignmentValue(boolean, int, int) - */ - public static final String FORMATTER_ALIGNMENT_FOR_EXPRESSIONS_IN_INITIALIZER_LIST = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_expressions_in_array_initializer"; //$NON-NLS-1$ /** *
 	 * FORMATTER / Option for alignment of a declarator list
@@ -191,6 +181,27 @@ public class DefaultCodeFormatterConstants {
 	 * @see #createAlignmentValue(boolean, int, int)
 	 */
 	public static final String FORMATTER_ALIGNMENT_FOR_EXPRESSION_LIST = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_expression_list"; //$NON-NLS-1$	
+	/**
+	 * 
+	 * FORMATTER / Option for alignment of expressions in initializer list
+	 *     - option id:         "org.eclipse.cdt.core.formatter.alignment_for_expressions_in_array_initializer"
+	 *     - possible values:   values returned by createAlignmentValue(boolean, int, int) call
+	 *     - default:           createAlignmentValue(false, WRAP_COMPACT, INDENT_DEFAULT)
+	 * 
+ * @see #createAlignmentValue(boolean, int, int) + */ + public static final String FORMATTER_ALIGNMENT_FOR_EXPRESSIONS_IN_INITIALIZER_LIST = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_expressions_in_array_initializer"; //$NON-NLS-1$ + /** + *
+	 * FORMATTER / Option for alignment of member access
+	 *     - option id:         "org.eclipse.cdt.core.formatter.alignment_for_member_access"
+	 *     - possible values:   values returned by createAlignmentValue(boolean, int, int) call
+	 *     - default:           createAlignmentValue(false, M_NO_ALIGNMENT, INDENT_DEFAULT)
+	 * 
+ * @see #createAlignmentValue(boolean, int, int) + * @since 5.3 + */ + public static final String FORMATTER_ALIGNMENT_FOR_MEMBER_ACCESS = CCorePlugin.PLUGIN_ID + ".formatter.alignment_for_member_access"; //$NON-NLS-1$ /** *
 	 * FORMATTER / Option for alignment of parameters in method declaration
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java
index ae5733c56d4..e2391874d5b 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/CodeFormatterVisitor.java
@@ -1984,6 +1984,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
 	    	Alignment expressionAlignment= scribe.createAlignment(
 	    			"declarationInitializer", //$NON-NLS-1$
 	    			preferences.alignment_for_assignment,
+	    			Alignment.R_OUTERMOST,
 	    			1,
 	    			scribe.scanner.getCurrentPosition());
 	
@@ -2234,6 +2235,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
     	Alignment expressionAlignment= scribe.createAlignment(
     			"assignmentExpression", //$NON-NLS-1$
     			preferences.alignment_for_assignment,
+    			Alignment.R_OUTERMOST,
     			1,
     			scribe.scanner.getCurrentPosition());
 
@@ -2314,18 +2316,36 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
 		}
 		final IASTName fieldName= node.getFieldName();
 		if (fieldName != null) {
-			final int operatorToken= node.isPointerDereference() ? Token.tARROW : Token.tDOT;
-			scribe.printNextToken(operatorToken, scribe.printComment());
-			if (scribe.printComment()) {
-				scribe.space();
-			}
-			if (node instanceof ICPPASTFieldReference) {
-				if (((ICPPASTFieldReference) node).isTemplate()) {
-					scribe.printNextToken(Token.t_template);
-					scribe.space();
-				}
-			}
-			fieldName.accept(this);
+	    	Alignment alignment= scribe.createAlignment(
+	    			"fieldReference", //$NON-NLS-1$
+	    			preferences.alignment_for_member_access,
+	    			Alignment.R_OUTERMOST,
+	    			1,
+	    			scribe.scanner.getCurrentPosition());
+
+	    	scribe.enterAlignment(alignment);
+	    	boolean ok = false;
+	    	do {
+	    		try {
+	    			scribe.alignFragment(alignment, 0);
+
+					final int operatorToken= node.isPointerDereference() ? Token.tARROW : Token.tDOT;
+					scribe.printComment();
+					scribe.printNextToken(operatorToken, false);
+					scribe.printComment();
+					if (node instanceof ICPPASTFieldReference) {
+						if (((ICPPASTFieldReference) node).isTemplate()) {
+							scribe.printNextToken(Token.t_template);
+							scribe.space();
+						}
+					}
+					fieldName.accept(this);
+					ok = true;
+	    		} catch (AlignmentException e) {
+	    			scribe.redoAlignment(e);
+	    		}
+	    	} while (!ok);
+	    	scribe.exitAlignment(alignment, true);
 		}
     	return PROCESS_SKIP;
 	}
@@ -2524,9 +2544,7 @@ public class CodeFormatterVisitor extends ASTVisitor implements ICPPASTVisitor,
 				Alignment.M_COMPACT_SPLIT,
 				Alignment.R_OUTERMOST,
 				2,
-				scribe.scanner.getCurrentPosition(),
-				preferences.continuation_indentation,
-				false);
+				scribe.scanner.getCurrentPosition());
 		scribe.enterAlignment(alignment);
 		
     	boolean ok = false;
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/DefaultCodeFormatterOptions.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/DefaultCodeFormatterOptions.java
index 6aab8b5bd22..cfac91aefe7 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/DefaultCodeFormatterOptions.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/DefaultCodeFormatterOptions.java
@@ -24,7 +24,7 @@ public class DefaultCodeFormatterOptions {
 	public static final int TAB = 1;
 	public static final int SPACE = 2;
 	public static final int MIXED = 4;
-	
+
 	public static DefaultCodeFormatterOptions getDefaultSettings() {
 		DefaultCodeFormatterOptions options = new DefaultCodeFormatterOptions();
 		options.setDefaultSettings();
@@ -57,27 +57,28 @@ public class DefaultCodeFormatterOptions {
 
 	public int alignment_for_arguments_in_method_invocation;
 	public int alignment_for_assignment;
+	public int alignment_for_base_clause_in_type_declaration;
 	public int alignment_for_binary_expression;
 	public int alignment_for_compact_if;
 	public int alignment_for_conditional_expression;
-	public int alignment_for_expressions_in_initializer_list;
 	public int alignment_for_declarator_list;
 	public int alignment_for_enumerator_list;
 	public int alignment_for_expression_list;
+	public int alignment_for_expressions_in_initializer_list;
+	public int alignment_for_member_access;
 	public int alignment_for_parameters_in_method_declaration;
-	public int alignment_for_base_clause_in_type_declaration;
 	public int alignment_for_throws_clause_in_method_declaration;
 	
 //	public boolean align_type_members_on_columns;
 	
-	public String brace_position_for_initializer_list;
 	public String brace_position_for_block;
 	public String brace_position_for_block_in_case;
 //	public String brace_position_for_enum_declaration;
+	public String brace_position_for_initializer_list;
 	public String brace_position_for_method_declaration;
-	public String brace_position_for_type_declaration;
 	public String brace_position_for_namespace_declaration;
 	public String brace_position_for_switch;
+	public String brace_position_for_type_declaration;
 	
 	public int continuation_indentation;
 	public int continuation_indentation_for_initializer_list;
@@ -269,10 +270,11 @@ public class DefaultCodeFormatterOptions {
 		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_BINARY_EXPRESSION, getAlignment(this.alignment_for_binary_expression));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_COMPACT_IF, getAlignment(this.alignment_for_compact_if));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_CONDITIONAL_EXPRESSION, getAlignment(this.alignment_for_conditional_expression));
-		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_EXPRESSIONS_IN_INITIALIZER_LIST, getAlignment(this.alignment_for_expressions_in_initializer_list));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_DECLARATOR_LIST, getAlignment(this.alignment_for_declarator_list));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ENUMERATOR_LIST, getAlignment(this.alignment_for_enumerator_list));
+		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_EXPRESSIONS_IN_INITIALIZER_LIST, getAlignment(this.alignment_for_expressions_in_initializer_list));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_EXPRESSION_LIST, getAlignment(this.alignment_for_expression_list));
+		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_MEMBER_ACCESS, getAlignment(this.alignment_for_member_access));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_PARAMETERS_IN_METHOD_DECLARATION, getAlignment(this.alignment_for_parameters_in_method_declaration));
 //		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_SELECTOR_IN_METHOD_INVOCATION, getAlignment(this.alignment_for_selector_in_method_invocation));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_BASE_CLAUSE_IN_TYPE_DECLARATION, getAlignment(this.alignment_for_base_clause_in_type_declaration));
@@ -521,16 +523,6 @@ public class DefaultCodeFormatterOptions {
 				this.alignment_for_conditional_expression = Alignment.M_ONE_PER_LINE_SPLIT;
 			}
 		}
-		final Object alignmentForExpressionsInInitializerListOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_EXPRESSIONS_IN_INITIALIZER_LIST);
-		if (alignmentForExpressionsInInitializerListOption != null) {
-			try {
-				this.alignment_for_expressions_in_initializer_list = Integer.parseInt((String) alignmentForExpressionsInInitializerListOption);
-			} catch (NumberFormatException e) {
-				this.alignment_for_expressions_in_initializer_list = Alignment.M_COMPACT_SPLIT;
-			} catch (ClassCastException e) {
-				this.alignment_for_expressions_in_initializer_list = Alignment.M_COMPACT_SPLIT;
-			}
-		}
 		final Object alignmentForDeclaratorListOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_DECLARATOR_LIST);
 		if (alignmentForDeclaratorListOption != null) {
 			try {
@@ -551,6 +543,16 @@ public class DefaultCodeFormatterOptions {
 				this.alignment_for_enumerator_list = Alignment.M_ONE_PER_LINE_SPLIT;
 			}
 		}
+		final Object alignmentForExpressionsInInitializerListOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_EXPRESSIONS_IN_INITIALIZER_LIST);
+		if (alignmentForExpressionsInInitializerListOption != null) {
+			try {
+				this.alignment_for_expressions_in_initializer_list = Integer.parseInt((String) alignmentForExpressionsInInitializerListOption);
+			} catch (NumberFormatException e) {
+				this.alignment_for_expressions_in_initializer_list = Alignment.M_COMPACT_SPLIT;
+			} catch (ClassCastException e) {
+				this.alignment_for_expressions_in_initializer_list = Alignment.M_COMPACT_SPLIT;
+			}
+		}
 		final Object alignmentForExpressionListOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_EXPRESSION_LIST);
 		if (alignmentForExpressionListOption != null) {
 			try {
@@ -561,6 +563,16 @@ public class DefaultCodeFormatterOptions {
 				this.alignment_for_expression_list = Alignment.M_COMPACT_SPLIT;
 			}
 		}
+		final Object alignmentForMemberAccessOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_MEMBER_ACCESS);
+		if (alignmentForMemberAccessOption != null) {
+			try {
+				this.alignment_for_member_access = Integer.parseInt((String) alignmentForMemberAccessOption);
+			} catch (NumberFormatException e) {
+				this.alignment_for_member_access =  Alignment.M_ONE_PER_LINE_SPLIT;
+			} catch (ClassCastException e) {
+				this.alignment_for_member_access =  Alignment.M_ONE_PER_LINE_SPLIT;
+			}
+		}
 		final Object alignmentForParametersInMethodDeclarationOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_PARAMETERS_IN_METHOD_DECLARATION);
 		if (alignmentForParametersInMethodDeclarationOption != null) {
 			try {
@@ -1421,25 +1433,26 @@ public class DefaultCodeFormatterOptions {
 //		this.alignment_for_arguments_in_allocation_expression = Alignment.M_COMPACT_SPLIT;
 		this.alignment_for_arguments_in_method_invocation = Alignment.M_COMPACT_SPLIT;
 		this.alignment_for_assignment = Alignment.M_NO_ALIGNMENT;
+		this.alignment_for_base_clause_in_type_declaration = Alignment.M_NEXT_PER_LINE_SPLIT;
 		this.alignment_for_binary_expression = Alignment.M_COMPACT_SPLIT;
 		this.alignment_for_compact_if = Alignment.M_COMPACT_SPLIT;
 		this.alignment_for_conditional_expression = Alignment.M_NEXT_PER_LINE_SPLIT;
-		this.alignment_for_expressions_in_initializer_list = Alignment.M_COMPACT_SPLIT;
 		this.alignment_for_declarator_list = Alignment.M_COMPACT_SPLIT;
 		this.alignment_for_enumerator_list = Alignment.M_ONE_PER_LINE_SPLIT;
+		this.alignment_for_expressions_in_initializer_list = Alignment.M_COMPACT_SPLIT;
+		this.alignment_for_member_access = Alignment.M_NO_ALIGNMENT;
 		this.alignment_for_parameters_in_method_declaration = Alignment.M_COMPACT_SPLIT;
 //		this.alignment_for_selector_in_method_invocation = Alignment.M_COMPACT_SPLIT;
-		this.alignment_for_base_clause_in_type_declaration = Alignment.M_NEXT_PER_LINE_SPLIT;
 		this.alignment_for_throws_clause_in_method_declaration = Alignment.M_COMPACT_SPLIT;
 //		this.align_type_members_on_columns = false;
-		this.brace_position_for_initializer_list = DefaultCodeFormatterConstants.END_OF_LINE;
 		this.brace_position_for_block = DefaultCodeFormatterConstants.END_OF_LINE;
 		this.brace_position_for_block_in_case = DefaultCodeFormatterConstants.END_OF_LINE;
 //		this.brace_position_for_enum_declaration = DefaultCodeFormatterConstants.END_OF_LINE;
+		this.brace_position_for_initializer_list = DefaultCodeFormatterConstants.END_OF_LINE;
 		this.brace_position_for_method_declaration = DefaultCodeFormatterConstants.END_OF_LINE;
-		this.brace_position_for_type_declaration = DefaultCodeFormatterConstants.END_OF_LINE;
 		this.brace_position_for_namespace_declaration = DefaultCodeFormatterConstants.END_OF_LINE;
 		this.brace_position_for_switch = DefaultCodeFormatterConstants.END_OF_LINE;
+		this.brace_position_for_type_declaration = DefaultCodeFormatterConstants.END_OF_LINE;
 //		this.comment_clear_blank_lines = false;
 //		this.comment_format = true;
 //		this.comment_format_header = false;
diff --git a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java
index f449bc201da..3cf8755f5a5 100644
--- a/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java
+++ b/core/org.eclipse.cdt.core/src/org/eclipse/cdt/internal/formatter/Scribe.java
@@ -917,6 +917,11 @@ public class Scribe {
 		}
 	}
 
+	/**
+	 * Prints comment at the current position.
+	 * 
+	 * @return {@code true} if a writespace character was encountered preceding the next token,
+	 */
 	public boolean printComment() {
 		// if we have a space between two tokens we ensure it will be dumped in
 		// the formatted string
diff --git a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java
index b53f0b33284..b2442b283cf 100644
--- a/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java
+++ b/core/org.eclipse.cdt.ui.tests/ui/org/eclipse/cdt/ui/tests/text/CodeFormatterTest.java
@@ -608,6 +608,38 @@ public class CodeFormatterTest extends BaseUITestCase {
 		assertFormatterResult();
 	}
 
+	//class ClassWithALongName {
+	//public:
+	//ClassWithALongName* methodWithALongName();
+	//ClassWithALongName* anotherMethodWithALongName();
+	//};
+	//
+	//void test() {
+	//ClassWithALongName* variable_with_a_long_name;
+	//ClassWithALongName* another_variable = variable_with_a_long_name->methodWithALongName()->anotherMethodWithALongName();
+	//}
+
+	//class ClassWithALongName {
+	//public:
+	//    ClassWithALongName* methodWithALongName();
+	//    ClassWithALongName* anotherMethodWithALongName();
+	//};
+	//
+	//void test() {
+	//    ClassWithALongName* variable_with_a_long_name;
+	//    ClassWithALongName* another_variable =
+	//            variable_with_a_long_name->methodWithALongName()
+	//                    ->anotherMethodWithALongName();
+	//}
+	public void testMemberAccess() throws Exception {
+		fOptions.put(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, CCorePlugin.SPACE);
+		fOptions.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ASSIGNMENT,
+				Integer.toString(Alignment.M_COMPACT_SPLIT));
+		fOptions.put(DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_MEMBER_ACCESS,
+				Integer.toString(Alignment.M_COMPACT_SPLIT));
+		assertFormatterResult();
+	}
+
 	//int foo(){try{}catch(...){}}
 	//float* bar();
 	//templateclass basic_ios : public ios_base{public:
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/FormatterMessages.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/FormatterMessages.java
index 3cc40af8330..cd1f2195531 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/FormatterMessages.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/FormatterMessages.java
@@ -206,6 +206,7 @@ final class FormatterMessages extends NLS {
 	public static String LineWrappingTabPage_initializer_list;
 	public static String LineWrappingTabPage_conditionals;
 	public static String LineWrappingTabPage_binary_exprs;
+	public static String LineWrappingTabPage_member_access;
 	public static String LineWrappingTabPage_indentation_default;
 	public static String LineWrappingTabPage_indentation_on_column;
 	public static String LineWrappingTabPage_indentation_by_one;
@@ -226,6 +227,7 @@ final class FormatterMessages extends NLS {
 	public static String LineWrappingTabPage_initializer_list_lowercase;
 	public static String LineWrappingTabPage_conditionals_lowercase;
 	public static String LineWrappingTabPage_binary_exprs_lowercase;
+	public static String LineWrappingTabPage_member_access_lowercase;
 	public static String LineWrappingTabPage_indentation_default_lowercase;
 	public static String LineWrappingTabPage_indentation_on_column_lowercase;
 	public static String LineWrappingTabPage_indentation_by_one_lowercase;
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/FormatterMessages.properties b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/FormatterMessages.properties
index 05e74776b09..bc6e983754d 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/FormatterMessages.properties
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/FormatterMessages.properties
@@ -221,7 +221,6 @@ WhiteSpaceOptions_after_question_mark=After question mark
 
 WhiteSpaceTabPage_insert_space=&Insert space:
 
-
 LineWrappingTabPage_base_clause=Base-clause
 #LineWrappingTabPage_compact_if_else=Compact 'if else'
 LineWrappingTabPage_parameters=Parameters
@@ -233,6 +232,7 @@ LineWrappingTabPage_enumerator_list=Enumerator list
 LineWrappingTabPage_initializer_list=Initializer list
 LineWrappingTabPage_conditionals=Conditionals
 LineWrappingTabPage_binary_exprs=Binary expressions
+LineWrappingTabPage_member_access=Member access
 LineWrappingTabPage_indentation_default=Default indentation
 LineWrappingTabPage_indentation_on_column=Indent on column
 LineWrappingTabPage_indentation_by_one=Indent by one
@@ -255,6 +255,7 @@ LineWrappingTabPage_enumerator_list_lowercase=enumerator list
 LineWrappingTabPage_initializer_list_lowercase=initializer list
 LineWrappingTabPage_conditionals_lowercase=conditionals
 LineWrappingTabPage_binary_exprs_lowercase=binary expressions
+LineWrappingTabPage_member_access_lowercase=member access
 LineWrappingTabPage_indentation_default_lowercase=default indentation
 LineWrappingTabPage_indentation_on_column_lowercase=indent on column
 LineWrappingTabPage_indentation_by_one_lowercase=indent by one
diff --git a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/LineWrappingTabPage.java b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/LineWrappingTabPage.java
index 08cef92399e..9bfb1b455ca 100644
--- a/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/LineWrappingTabPage.java
+++ b/core/org.eclipse.cdt.ui/src/org/eclipse/cdt/internal/ui/preferences/formatter/LineWrappingTabPage.java
@@ -49,7 +49,6 @@ import org.eclipse.cdt.ui.CUIPlugin;
 
 import org.eclipse.cdt.internal.corext.util.Messages;
 
-
 /**
  * The line wrapping tab page.
  */
@@ -64,7 +63,7 @@ public class LineWrappingTabPage extends FormatterTabPage {
 		public final String previewText;
 		public final String description; //bug 235453: for categories' labels
 		public final List children;
-		
+
 		public int index;
 
 		public Category(String _key, String _previewText, String _name, String _description) {
@@ -455,6 +454,20 @@ public class LineWrappingTabPage extends FormatterTabPage {
 	    	FormatterMessages.LineWrappingTabPage_binary_exprs_lowercase
 		);
 
+	private final Category fMemberAccessExpressionCategory= new Category(
+		    DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_MEMBER_ACCESS,
+		    "class TreeNode {" + //$NON-NLS-1$
+		    "public:" + //$NON-NLS-1$
+		    "TreeNode* getParent();" + //$NON-NLS-1$
+		    "TreeNode* getFirstChild();" + //$NON-NLS-1$
+		    "};\n\n" + //$NON-NLS-1$
+		    "TreeNode* firstUncle(TreeNode& node) {" + //$NON-NLS-1$
+		    "return node.getParent()->getParent()->getFirstChild();" + //$NON-NLS-1$
+		    "}", //$NON-NLS-1$
+		    FormatterMessages.LineWrappingTabPage_member_access,
+	    	FormatterMessages.LineWrappingTabPage_member_access_lowercase
+		);
+
 //	private final Category fEnumConstArgumentsCategory= new Category(
 //	    	DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ARGUMENTS_IN_ENUM_CONSTANT,
 //	    	"enum Example {" + //$NON-NLS-1$
@@ -481,12 +494,12 @@ public class LineWrappingTabPage extends FormatterTabPage {
 
 	private final Category fAssignmentCategory= new Category(
 		    DefaultCodeFormatterConstants.FORMATTER_ALIGNMENT_FOR_ASSIGNMENT,
-		    "static char* string = \"TextTextText\";" + //$NON-NLS-1$
+		    "static char* string = \"text text text text\";" + //$NON-NLS-1$
 		    "class Example {" + //$NON-NLS-1$
 		    "void foo() {" + //$NON-NLS-1$
 		    "for (int i = 0; i < 10; i++) {}" + //$NON-NLS-1$
-		    "char* s;" + //$NON-NLS-1$
-		    "s = \"TextTextText\";}}", //$NON-NLS-1$
+		    "const char* character_string;" + //$NON-NLS-1$
+		    "character_string = \"text text text text\";}}", //$NON-NLS-1$
 	        FormatterMessages.LineWrappingTabPage_assignment_alignment,
     		FormatterMessages.LineWrappingTabPage_assignment_alignment_lowercase
 		);
@@ -600,6 +613,7 @@ public class LineWrappingTabPage extends FormatterTabPage {
 		expressions.children.add(fConditionalExpressionCategory);
 		expressions.children.add(fInitializerListExpressionsCategory);
 		expressions.children.add(fAssignmentCategory);
+		expressions.children.add(fMemberAccessExpressionCategory);
 		
 //		final Category statements= new Category(FormatterMessages.LineWrappingTabPage_statements); 
 //		statements.children.add(fCompactIfCategory);