bug 1037094, to much indentation for first comment in a function parameters and defau...
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / formatter / CodeFormatter.java
index 6003bd0..f5d3ea3 100644 (file)
@@ -1,11 +1,11 @@
 /*******************************************************************************
  * Copyright (c) 2000, 2001, 2002 International Business Machines Corp. and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v0.5 
- * 
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Common Public License v0.5
+ *
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/cpl-v05.html
- * 
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  ******************************************************************************/
@@ -129,7 +129,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
 
   /**
    * Creates a new instance of Code Formatter using the given settings.
-   * 
+   *
    * @deprecated backport 1.0 internal functionality
    */
   public CodeFormatter(ConfigurableOption[] settings) {
@@ -138,7 +138,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
 
   /**
    * Creates a new instance of Code Formatter using the FormattingOptions object given as argument
-   * 
+   *
    * @deprecated Use CodeFormatter(ConfigurableOption[]) instead
    */
   public CodeFormatter() {
@@ -271,7 +271,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
       outputLine(currentString, false, currentLineIndentationLevel, 0, -1, null, 0);
     }
     int scannerSourceLength = scanner.source.length;
-    if (scannerSourceLength > 2) {
+    if ((scannerSourceLength > 2) && (scanner.startPosition < scannerSourceLength)) {
       if (scanner.source[scannerSourceLength - 1] == '\n' && scanner.source[scannerSourceLength - 2] == '\r') {
         formattedSource.append(options.lineSeparatorSequence);
         increaseGlobalDelta(options.lineSeparatorSequence.length - 2);
@@ -332,6 +332,8 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
     currentLineIndentationLevel += constructionsCount;
     // An InvalidInputException exception might cause the termination of this
     // loop.
+    int arrayDeclarationCount=0;
+       int[] arrayDeclarationParenthesis=new int[10];
     try {
       while (true) {
         // Get the next token. Catch invalid input and output it
@@ -509,14 +511,24 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
             pendingSpace = false;
           }
         }
+        // don't linebreak empty array declarations
+        if (token == TokenNameRPAREN && arrayDeclarationCount > 0) {
+               if (previousCompilableToken == TokenNameLPAREN) {
+                       pendingNewLines = 0;
+               }
+        }
         // Add pending new lines to the formatted source string.
         // Note: pending new lines are not added if the current token
         // is a single line comment or whitespace.
         // if the comment is between parenthesis, there is no blank line
         // preservation
         // (if it's a one-line comment, a blank line is added after it).
-        if (((pendingNewLines > 0 && (!isComment(token)))
-            || (newLinesInWhitespace > 0 && (openParenthesisCount <= 1 && isComment(token))) || (previousCompilableToken == TokenNameLBRACE && token == TokenNameRBRACE))
+        if ((
+               (pendingNewLines > 0 && (!isComment(token)))
+            || (newLinesInWhitespace > 0 && (openParenthesisCount <= 1 && isComment(token)))
+            || (previousCompilableToken == TokenNameLBRACE && token == TokenNameRBRACE)
+            || (newLinesInWhitespace > 0 && previousCompilableToken == TokenNameDOT)
+            )
             && token != Scanner.TokenNameWHITESPACE) {
           // Do not add newline & indent between an adjoining close brace and
           // close paren. Anonymous inner classes may use this form.
@@ -675,9 +687,28 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
           else
             openParenthesis[0]++;
           pendingSpace = false;
+          // recognize array declaration for nice output
+          if (previousCompilableToken == TokenNamearray) {
+                       arrayDeclarationCount++;
+                       arrayDeclarationParenthesis[arrayDeclarationCount]=openParenthesis[openParenthesisCount];
+                       indentationLevel++;
+                       pendingNewLines=1;
+          }
           //S }
           break;
         case TokenNameRPAREN:
+            // check for closing array declaration
+            if (arrayDeclarationCount>0) {
+               if (arrayDeclarationParenthesis[arrayDeclarationCount]==openParenthesis[openParenthesisCount]) {
+                       if (previousCompilableToken != TokenNameLPAREN) {
+                               newLine(1);
+                       }
+                       indentationLevel--;
+                       currentLineIndentationLevel = indentationLevel;
+                    pendingNewLines = 0;
+                       arrayDeclarationCount--;
+               }
+            }
           // Decrease the parenthesis count
           // if there is no more unclosed parenthesis,
           // a new line and indent may be append (depending on the next
@@ -709,6 +740,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
               // Add new line and increase indentation level after open brace.
               pendingNewLines = 1;
               indentationLevel += pushBlock();
+              inAssignment = false;
             }
           }
           break;
@@ -766,7 +798,13 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
           pendingSpace = false;
           break;
         case TokenNameCOMMA:
+          pendingSpace = false;
+          if (arrayDeclarationCount>0) {
+                 pendingNewLines=1;
+          }
+          break;
         case TokenNameDOT:
+               space();
           pendingSpace = false;
           break;
         case TokenNameSEMICOLON:
@@ -927,7 +965,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
 
   /**
    * Formats the char array <code>sourceString</code>, and returns a string containing the formatted version.
-   * 
+   *
    * @return the formatted ouput.
    */
   public String formatSourceString(String sourceString) {
@@ -940,7 +978,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
 
   /**
    * Formats the char array <code>sourceString</code>, and returns a string containing the formatted version.
-   * 
+   *
    * @param string
    *          the string to format
    * @param indentationLevel
@@ -954,7 +992,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
   /**
    * Formats the char array <code>sourceString</code>, and returns a string containing the formatted version. The positions array
    * is modified to contain the mapped positions.
-   * 
+   *
    * @param string
    *          the string to format
    * @param indentationLevel
@@ -987,7 +1025,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
   /**
    * Formats the char array <code>sourceString</code>, and returns a string containing the formatted version. The initial
    * indentation level is 0.
-   * 
+   *
    * @param string
    *          the string to format
    * @return the formatted ouput.
@@ -998,7 +1036,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
 
   /**
    * Formats a given source string, starting indenting it at a particular depth and using the given options
-   * 
+   *
    * @deprecated backport 1.0 internal functionality
    */
   public static String format(String sourceString, int initialIndentationLevel, ConfigurableOption[] options) {
@@ -1050,7 +1088,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
   /**
    * Returns an array of descriptions for the configurable options. The descriptions may be changed and passed back to a different
    * compiler.
-   * 
+   *
    * @deprecated backport 1.0 internal functionality
    */
   public static ConfigurableOption[] getDefaultOptions(Locale locale) {
@@ -1079,18 +1117,25 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
 
   /**
    * Returns the array of mapped positions. Returns null is no positions have been set.
-   * 
+   *
    * @return int[]
    * @deprecated There is no need to retrieve the mapped positions anymore.
    */
   public int[] getMappedPositions() {
+       if (null!=mappedPositions) {
+               for (int i=0;i<mappedPositions.length;i++) {
+                       if (mappedPositions[i]>=formattedSource.length()) {
+                               mappedPositions[i]=formattedSource.length()-1;
+                       }
+               }
+       }
     return mappedPositions;
   }
 
   /**
    * Returns the priority of the token given as argument <br>
    * The most prioritary the token is, the smallest the return value is.
-   * 
+   *
    * @return the priority of <code>token</code>
    * @param token
    *          the token of which the priority is requested
@@ -1228,7 +1273,6 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
     case TokenNameLPAREN:
     case TokenNameNOT:
     case TokenNameTWIDDLE:
-    case TokenNameDOT:
     case 0:
     // no token
     case TokenNameWHITESPACE:
@@ -1273,7 +1317,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
   /**
    * If the length of <code>oneLineBuffer</code> exceeds <code>maxLineLength</code>, it is split and the result is dumped in
    * <code>formattedSource</code>
-   * 
+   *
    * @param newLineCount
    *          the number of new lines to append
    */
@@ -1344,7 +1388,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
       return "==="; //$NON-NLS-1$
     case TokenNameEQUAL_GREATER:
       // -= (15.25.2)
-      return "=>"; //$NON-NLS-1$                               
+      return "=>"; //$NON-NLS-1$
     case TokenNameNOT_EQUAL:
       // != (15.20, 15.20.1, 15.20.2, 15.20.3)
       return "!="; //$NON-NLS-1$
@@ -1573,7 +1617,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
    * <li>If its length is < maxLineLength, output
    * <li>Otherwise it is split.
    * </ul>
-   * 
+   *
    * @param currentString
    *          string to output
    * @param preIndented
@@ -1733,7 +1777,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
       String currentResult = result[i];
       if (currentResult.length() != 0 || splitOperators[i] != 0) {
         int newDepth = (currentResult.startsWith("/*") //$NON-NLS-1$
-        || currentResult.startsWith("//")) //$NON-NLS-1$ 
+        || currentResult.startsWith("//")) //$NON-NLS-1$
             ? indentationLevel - 1 : depth;
         outputLine(currentResult, i == 0 || (i == 1 && emptyFirstSubString) ? preIndented : false,
             i == 0 ? newDepth : newDepth + 1, splitOperators[i], i, splitLine.startSubstringsIndexes, currentString
@@ -1805,7 +1849,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
   /**
    * Pops elements until the stack is empty or the top element is <code>token</code>.<br>
    * Does not remove <code>token</code> from the stack.
-   * 
+   *
    * @param token
    *          the token to be left as the top of the stack
    */
@@ -1853,7 +1897,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
   /**
    * Pops elements until the stack is empty or the top element is <code>token</code>.<br>
    * Removes <code>token</code> from the stack too.
-   * 
+   *
    * @param token
    *          the token to remove from the stack
    */
@@ -1932,11 +1976,11 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
 
   /**
    * Set the positions to map. The mapped positions should be retrieved using the getMappedPositions() method.
-   * 
+   *
    * @param positions
    *          int[]
    * @deprecated Set the positions to map using the format(String, int, int[]) method.
-   * 
+   *
    * @see #getMappedPositions()
    */
   public void setPositionsToMap(int[] positions) {
@@ -1957,7 +2001,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
   /**
    * Splits <code>stringToSplit</code> on the top level token <br>
    * If there are several identical token at the same level, the string is cut into many pieces.
-   * 
+   *
    * @return an object containing the operator and all the substrings or null if the string cannot be split
    */
   public SplitLine split(String stringToSplit) {
@@ -1967,7 +2011,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
   /**
    * Splits <code>stringToSplit</code> on the top level token <br>
    * If there are several identical token at the same level, the string is cut into many pieces.
-   * 
+   *
    * @return an object containing the operator and all the substrings or null if the string cannot be split
    */
   public SplitLine split(String stringToSplit, int offsetInGlobalLine) {
@@ -2503,10 +2547,10 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter {
 
   /**
    * Sets the initial indentation level
-   * 
+   *
    * @param indentationLevel
    *          new indentation level
-   * 
+   *
    * @deprecated
    */
   public void setInitialIndentationLevel(int newIndentationLevel) {