From 0dadd6b5d06d579a6231ebe425ff60336ed80c43 Mon Sep 17 00:00:00 2001 From: bananeweizen Date: Wed, 4 Jan 2006 22:49:13 +0000 Subject: [PATCH] avoid OutOfBoundsException and break of format action, when marker positions are around end of source and there are new marker offsets due to the formatting --- .../phpdt/internal/formatter/CodeFormatter.java | 60 +++++++++++--------- 1 files changed, 33 insertions(+), 27 deletions(-) diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/formatter/CodeFormatter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/formatter/CodeFormatter.java index 30e0110..434287e 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/formatter/CodeFormatter.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/formatter/CodeFormatter.java @@ -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() { @@ -951,7 +951,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Formats the char array sourceString, and returns a string containing the formatted version. - * + * * @return the formatted ouput. */ public String formatSourceString(String sourceString) { @@ -964,7 +964,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Formats the char array sourceString, and returns a string containing the formatted version. - * + * * @param string * the string to format * @param indentationLevel @@ -978,7 +978,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Formats the char array sourceString, 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 @@ -1011,7 +1011,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Formats the char array sourceString, and returns a string containing the formatted version. The initial * indentation level is 0. - * + * * @param string * the string to format * @return the formatted ouput. @@ -1022,7 +1022,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) { @@ -1074,7 +1074,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) { @@ -1103,7 +1103,7 @@ 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. */ @@ -1114,7 +1114,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Returns the priority of the token given as argument
* The most prioritary the token is, the smallest the return value is. - * + * * @return the priority of token * @param token * the token of which the priority is requested @@ -1297,7 +1297,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * If the length of oneLineBuffer exceeds maxLineLength, it is split and the result is dumped in * formattedSource - * + * * @param newLineCount * the number of new lines to append */ @@ -1368,7 +1368,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$ @@ -1597,7 +1597,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { *
  • If its length is < maxLineLength, output *
  • Otherwise it is split. * - * + * * @param currentString * string to output * @param preIndented @@ -1757,7 +1757,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 @@ -1829,7 +1829,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Pops elements until the stack is empty or the top element is token.
    * Does not remove token from the stack. - * + * * @param token * the token to be left as the top of the stack */ @@ -1877,7 +1877,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Pops elements until the stack is empty or the top element is token.
    * Removes token from the stack too. - * + * * @param token * the token to remove from the stack */ @@ -1956,11 +1956,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) { @@ -1981,7 +1981,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Splits stringToSplit on the top level token
    * 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) { @@ -1991,7 +1991,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Splits stringToSplit on the top level token
    * 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) { @@ -2479,7 +2479,7 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { if (posToMap < 0 || posToMap >= sourceLength) { // protection against out of bounds position if (posToMap == sourceLength) { - mappedPositions[indexToMap] = formattedSource.length(); + mappedPositions[indexToMap] = formattedSource.length()-1; } indexToMap = positionsToMap.length; // no more mapping return; @@ -2492,6 +2492,9 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { } else { mappedPositions[indexToMap] = posToMap + globalDelta + lineDelta; } + if (mappedPositions[indexToMap]>=formattedSource.length()) { + mappedPositions[indexToMap]=formattedSource.length()-1; + } } indexToMap++; } @@ -2503,6 +2506,9 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { while (indexInMap < mappedPositions.length && startPosition <= mappedPositions[indexInMap] && mappedPositions[indexInMap] < endPosition && indexInMap < indexToMap) { mappedPositions[indexInMap] += splitDelta; + if (mappedPositions[indexInMap]>=formattedSource.length()) { + mappedPositions[indexInMap]=formattedSource.length()-1; + } indexInMap++; } } @@ -2527,10 +2533,10 @@ public class CodeFormatter implements ITerminalSymbols, ICodeFormatter { /** * Sets the initial indentation level - * + * * @param indentationLevel * new indentation level - * + * * @deprecated */ public void setInitialIndentationLevel(int newIndentationLevel) { -- 1.7.1