mirror of
https://github.com/eclipse-cdt/cdt
synced 2025-04-29 19:45:01 +02:00
Fix preprocessor auto-indentation
This commit is contained in:
parent
39fd51b72a
commit
a696db918b
6 changed files with 195 additions and 138 deletions
|
@ -9,12 +9,19 @@ const SimpleStruct simpleStruct =
|
|||
|
||||
#define SIZEOF( A, B ) sizeof( A.B )
|
||||
|
||||
#define FOREVER \
|
||||
for(;;)\
|
||||
{\
|
||||
\
|
||||
}
|
||||
}
|
||||
|
||||
const OtherStruct array[] =
|
||||
{
|
||||
{
|
||||
#if FOO
|
||||
"foo"
|
||||
#else
|
||||
# else
|
||||
"bar"
|
||||
#endif
|
||||
, SIZEOF( simpleStruct, num )
|
||||
|
|
|
@ -9,12 +9,19 @@ const SimpleStruct simpleStruct =
|
|||
|
||||
#define SIZEOF( A, B ) sizeof( A.B )
|
||||
|
||||
#define FOREVER \
|
||||
for(;;)\
|
||||
{\
|
||||
\
|
||||
}
|
||||
}
|
||||
|
||||
const OtherStruct array[] =
|
||||
{
|
||||
{
|
||||
#if FOO
|
||||
"foo"
|
||||
#else
|
||||
"foo"
|
||||
# else
|
||||
"bar"
|
||||
#endif
|
||||
, SIZEOF( simpleStruct, num )
|
||||
|
|
|
@ -12,7 +12,6 @@
|
|||
|
||||
package org.eclipse.cdt.ui.tests.text;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
|
@ -20,7 +19,6 @@ import junit.framework.Test;
|
|||
import junit.framework.TestCase;
|
||||
import junit.framework.TestSuite;
|
||||
|
||||
import org.eclipse.core.runtime.CoreException;
|
||||
import org.eclipse.jface.text.BadLocationException;
|
||||
import org.eclipse.jface.text.Document;
|
||||
import org.eclipse.jface.text.DocumentCommand;
|
||||
|
@ -245,10 +243,12 @@ public class CAutoIndentTest extends TestCase {
|
|||
tester.setAutoEditStrategy(IDocument.DEFAULT_CONTENT_TYPE,
|
||||
new CAutoIndentStrategy(textTools.getDocumentPartitioning(), null));
|
||||
tester.setAutoEditStrategy(ICPartitions.C_MULTI_LINE_COMMENT, new CCommentAutoIndentStrategy());
|
||||
tester.setAutoEditStrategy(ICPartitions.C_PREPROCESSOR,
|
||||
new CAutoIndentStrategy(textTools.getDocumentPartitioning(), null));
|
||||
return tester;
|
||||
}
|
||||
|
||||
public void testCAutoIndent() throws IOException, CoreException, BadLocationException {
|
||||
public void testCAutoIndent() throws BadLocationException {
|
||||
AutoEditTester tester = createAutoEditTester(); //$NON-NLS-1$
|
||||
tester.type("void main() {\n"); //$NON-NLS-1$
|
||||
assertEquals(1, tester.getCaretLine());
|
||||
|
@ -286,7 +286,7 @@ public class CAutoIndentTest extends TestCase {
|
|||
assertEquals("\t\tint x = 5;", tester.getLine(1)); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
public void testPasteAutoIndent() throws IOException, CoreException, BadLocationException {
|
||||
public void testPasteAutoIndent() throws BadLocationException {
|
||||
AutoEditTester tester = createAutoEditTester(); //$NON-NLS-1$
|
||||
tester.type("class A {\n"); //$NON-NLS-1$
|
||||
tester.goTo(1, 0);
|
||||
|
@ -313,7 +313,7 @@ public class CAutoIndentTest extends TestCase {
|
|||
assertEquals("\t};", tester.getLine(9)); //$NON-NLS-1$
|
||||
}
|
||||
|
||||
public void testDefaultAutoIndent() throws IOException, CoreException, BadLocationException {
|
||||
public void testDefaultAutoIndent() throws BadLocationException {
|
||||
AutoEditTester tester = createAutoEditTester(); //$NON-NLS-1$
|
||||
tester.type(" initial indent=3\n"); //$NON-NLS-1$
|
||||
assertEquals(1, tester.getCaretLine());
|
||||
|
@ -335,7 +335,7 @@ public class CAutoIndentTest extends TestCase {
|
|||
assertEquals(0, tester.getCaretColumn());
|
||||
}
|
||||
|
||||
public void testCCommentAutoIndent() throws IOException, CoreException, BadLocationException {
|
||||
public void testCCommentAutoIndent() throws BadLocationException {
|
||||
AutoEditTester tester = createAutoEditTester(); //$NON-NLS-1$
|
||||
tester.type("/*\n"); //$NON-NLS-1$
|
||||
assertEquals(ICPartitions.C_MULTI_LINE_COMMENT, tester.getContentType(-1));
|
||||
|
@ -352,4 +352,26 @@ public class CAutoIndentTest extends TestCase {
|
|||
assertEquals(0, tester.getCaretColumn());
|
||||
}
|
||||
|
||||
public void testPreprocessorAutoIndent() throws BadLocationException {
|
||||
AutoEditTester tester = createAutoEditTester(); //$NON-NLS-1$
|
||||
tester.type("void main() {\n"); //$NON-NLS-1$
|
||||
assertEquals(1, tester.getCaretLine());
|
||||
// Nested statement is indented by one.
|
||||
assertEquals(1, tester.getCaretColumn());
|
||||
// The brace was closed automatically.
|
||||
assertEquals("}", tester.getLine(1)); //$NON-NLS-1$
|
||||
tester.type("#define"); //$NON-NLS-1$
|
||||
assertEquals("#define", tester.getLine()); //$NON-NLS-1$
|
||||
tester.type(" FOREVER \\\n");
|
||||
assertEquals(1, tester.getCaretColumn());
|
||||
tester.type("for(;;) \\\n");
|
||||
assertEquals(1, tester.getCaretColumn());
|
||||
tester.type("\t{");
|
||||
assertEquals(2, tester.getCaretColumn());
|
||||
assertEquals("\t{", tester.getLine());
|
||||
tester.type("\\\n");
|
||||
assertEquals(2, tester.getCaretColumn());
|
||||
assertEquals("\t}", tester.getLine(1));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -16,13 +16,6 @@ import java.util.ResourceBundle;
|
|||
|
||||
import org.eclipse.core.runtime.IStatus;
|
||||
import org.eclipse.core.runtime.Status;
|
||||
|
||||
import org.eclipse.swt.custom.BusyIndicator;
|
||||
import org.eclipse.swt.widgets.Display;
|
||||
|
||||
import org.eclipse.jface.viewers.ISelection;
|
||||
import org.eclipse.jface.viewers.ISelectionProvider;
|
||||
|
||||
import org.eclipse.jface.text.Assert;
|
||||
import org.eclipse.jface.text.BadLocationException;
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
|
@ -34,7 +27,10 @@ import org.eclipse.jface.text.Position;
|
|||
import org.eclipse.jface.text.TextSelection;
|
||||
import org.eclipse.jface.text.TextUtilities;
|
||||
import org.eclipse.jface.text.source.ISourceViewer;
|
||||
|
||||
import org.eclipse.jface.viewers.ISelection;
|
||||
import org.eclipse.jface.viewers.ISelectionProvider;
|
||||
import org.eclipse.swt.custom.BusyIndicator;
|
||||
import org.eclipse.swt.widgets.Display;
|
||||
import org.eclipse.ui.IEditorInput;
|
||||
import org.eclipse.ui.texteditor.IDocumentProvider;
|
||||
import org.eclipse.ui.texteditor.ITextEditor;
|
||||
|
@ -45,11 +41,11 @@ import org.eclipse.cdt.core.CCorePlugin;
|
|||
import org.eclipse.cdt.core.formatter.DefaultCodeFormatterConstants;
|
||||
import org.eclipse.cdt.core.model.ICProject;
|
||||
import org.eclipse.cdt.core.model.ITranslationUnit;
|
||||
|
||||
import org.eclipse.cdt.ui.CUIPlugin;
|
||||
import org.eclipse.cdt.ui.text.ICPartitions;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.editor.CEditor;
|
||||
import org.eclipse.cdt.internal.ui.editor.IndentUtil;
|
||||
import org.eclipse.cdt.internal.ui.text.CHeuristicScanner;
|
||||
import org.eclipse.cdt.internal.ui.text.CIndenter;
|
||||
|
||||
|
@ -189,8 +185,8 @@ public class IndentAction extends TextEditorAction {
|
|||
}
|
||||
|
||||
/**
|
||||
* Indents a single line using the heuristic scanner. Cdoc and multiline comments are
|
||||
* indented as specified by the <code>CDocAutoIndentStrategy</code>.
|
||||
* Indents a single line using the heuristic scanner. Multiline comments are
|
||||
* indented as specified by the <code>CCommentAutoIndentStrategy</code>.
|
||||
*
|
||||
* @param document the document
|
||||
* @param line the line to be indented
|
||||
|
@ -214,7 +210,7 @@ public class IndentAction extends TextEditorAction {
|
|||
if (type.equals(ICPartitions.C_MULTI_LINE_COMMENT)) {
|
||||
indent= computeCommentIndent(document, line, scanner, startingPartition);
|
||||
} else if (startingPartition.getType().equals(ICPartitions.C_PREPROCESSOR)) {
|
||||
indent= computePreprocessorIndent(document, line, scanner, startingPartition);
|
||||
indent= computePreprocessorIndent(document, line, startingPartition);
|
||||
} else if (!fIsTabAction && startingPartition.getOffset() == offset && startingPartition.getType().equals(ICPartitions.C_SINGLE_LINE_COMMENT)) {
|
||||
// line comment starting at position 0 -> indent inside
|
||||
int max= document.getLength() - offset;
|
||||
|
@ -248,7 +244,7 @@ public class IndentAction extends TextEditorAction {
|
|||
}
|
||||
}
|
||||
|
||||
// standard C indentation
|
||||
// standard C code indentation
|
||||
if (indent == null) {
|
||||
StringBuffer computed= indenter.computeIndentation(offset);
|
||||
if (computed != null)
|
||||
|
@ -305,48 +301,7 @@ public class IndentAction extends TextEditorAction {
|
|||
* @throws BadLocationException
|
||||
*/
|
||||
private String computeCommentIndent(IDocument document, int line, CHeuristicScanner scanner, ITypedRegion partition) throws BadLocationException {
|
||||
if (line == 0) // impossible - the first line is never inside a comment comment
|
||||
return null;
|
||||
|
||||
// don't make any assumptions if the line does not start with \s*\* - it might be
|
||||
// commented out code, for which we don't want to change the indent
|
||||
final IRegion lineInfo= document.getLineInformation(line);
|
||||
final int lineStart= lineInfo.getOffset();
|
||||
final int lineLength= lineInfo.getLength();
|
||||
final int lineEnd= lineStart + lineLength;
|
||||
int nonWS= scanner.findNonWhitespaceForwardInAnyPartition(lineStart, lineEnd);
|
||||
if (nonWS == CHeuristicScanner.NOT_FOUND || document.getChar(nonWS) != '*') {
|
||||
if (nonWS == CHeuristicScanner.NOT_FOUND)
|
||||
return document.get(lineStart, lineLength);
|
||||
return document.get(lineStart, nonWS - lineStart);
|
||||
}
|
||||
|
||||
// take the indent from the previous line and reuse
|
||||
IRegion previousLine= document.getLineInformation(line - 1);
|
||||
int previousLineStart= previousLine.getOffset();
|
||||
int previousLineLength= previousLine.getLength();
|
||||
int previousLineEnd= previousLineStart + previousLineLength;
|
||||
|
||||
StringBuffer buf= new StringBuffer();
|
||||
int previousLineNonWS= scanner.findNonWhitespaceForwardInAnyPartition(previousLineStart, previousLineEnd);
|
||||
if (previousLineNonWS == CHeuristicScanner.NOT_FOUND || document.getChar(previousLineNonWS) != '*') {
|
||||
// align with the comment start if the previous line is not an asterisked line
|
||||
previousLine= document.getLineInformationOfOffset(partition.getOffset());
|
||||
previousLineStart= previousLine.getOffset();
|
||||
previousLineLength= previousLine.getLength();
|
||||
previousLineEnd= previousLineStart + previousLineLength;
|
||||
previousLineNonWS= scanner.findNonWhitespaceForwardInAnyPartition(previousLineStart, previousLineEnd);
|
||||
if (previousLineNonWS == CHeuristicScanner.NOT_FOUND)
|
||||
previousLineNonWS= previousLineEnd;
|
||||
|
||||
// add the initial space
|
||||
// TODO this may be controlled by a formatter preference in the future
|
||||
buf.append(' ');
|
||||
}
|
||||
|
||||
String indentation= document.get(previousLineStart, previousLineNonWS - previousLineStart);
|
||||
buf.insert(0, indentation);
|
||||
return buf.toString();
|
||||
return IndentUtil.computeCommentIndent(document, line, scanner, partition);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -354,13 +309,12 @@ public class IndentAction extends TextEditorAction {
|
|||
*
|
||||
* @param document the document
|
||||
* @param line the line in document
|
||||
* @param scanner the scanner
|
||||
* @param partition the comment partition
|
||||
* @return the indent, or <code>null</code> if not computable
|
||||
* @throws BadLocationException
|
||||
*/
|
||||
private String computePreprocessorIndent(IDocument document, int line, CHeuristicScanner scanner, ITypedRegion partition) throws BadLocationException {
|
||||
return ""; //$NON-NLS-1$
|
||||
private String computePreprocessorIndent(IDocument document, int line, ITypedRegion partition) throws BadLocationException {
|
||||
return IndentUtil.computePreprocessorIndent(document, line, partition);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -134,7 +134,7 @@ public final class IndentUtil {
|
|||
CIndenter indenter= new CIndenter(document, scanner, project);
|
||||
|
||||
String current= getCurrentIndent(document, lines.getStartLine());
|
||||
StringBuffer correct= indenter.computeIndentation(document.getLineOffset(lines.getStartLine()));
|
||||
StringBuffer correct= new StringBuffer(computeIndent(document, lines.getStartLine(), indenter, scanner));
|
||||
if (correct == null)
|
||||
return result; // bail out
|
||||
|
||||
|
@ -289,7 +289,7 @@ public final class IndentUtil {
|
|||
/**
|
||||
* Returns the indentation of the line <code>line</code> in <code>document</code>.
|
||||
* The returned string may contain pairs of leading slashes that are considered
|
||||
* part of the indentation. The space before the asterix in a javadoc-like
|
||||
* part of the indentation. The space before the asterix in a block
|
||||
* comment is not considered part of the indentation.
|
||||
*
|
||||
* @param document the document
|
||||
|
@ -314,7 +314,7 @@ public final class IndentUtil {
|
|||
to++;
|
||||
}
|
||||
|
||||
// don't count the space before javadoc like, asterix-style comment lines
|
||||
// don't count the space before javadoc like, asterisk-style comment lines
|
||||
if (to > from && to < endOffset - 1 && document.get(to - 1, 2).equals(" *")) { //$NON-NLS-1$
|
||||
String type= TextUtilities.getContentType(document, ICPartitions.C_PARTITIONING, to, true);
|
||||
if (type.equals(ICPartitions.C_MULTI_LINE_COMMENT))
|
||||
|
@ -353,12 +353,12 @@ public final class IndentUtil {
|
|||
}
|
||||
|
||||
/**
|
||||
* Indents a single line using the java heuristic scanner. Multi line comments
|
||||
* are indented as specified by the <code>CDocAutoIndentStrategy</code>.
|
||||
* Indents a single line using the heuristic scanner. Multiline comments are
|
||||
* indented as specified by the <code>CCommentAutoIndentStrategy</code>.
|
||||
*
|
||||
* @param document the document
|
||||
* @param line the line to be indented
|
||||
* @param indenter the java indenter
|
||||
* @param indenter the C indenter
|
||||
* @param scanner the heuristic scanner
|
||||
* @param commentLines the indent token comment booleans
|
||||
* @param lineIndex the zero-based line index
|
||||
|
@ -377,13 +377,15 @@ public final class IndentUtil {
|
|||
ITypedRegion startingPartition= TextUtilities.getPartition(document, ICPartitions.C_PARTITIONING, offset, false);
|
||||
String type= partition.getType();
|
||||
if (type.equals(ICPartitions.C_MULTI_LINE_COMMENT)) {
|
||||
indent= computeCdocIndent(document, line, scanner, startingPartition);
|
||||
indent= computeCommentIndent(document, line, scanner, startingPartition);
|
||||
} else if (startingPartition.getType().equals(ICPartitions.C_PREPROCESSOR)) {
|
||||
indent= computePreprocessorIndent(document, line, startingPartition);
|
||||
} else if (!commentLines[lineIndex] && startingPartition.getOffset() == offset && startingPartition.getType().equals(ICPartitions.C_SINGLE_LINE_COMMENT)) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// standard java indentation
|
||||
// standard C code indentation
|
||||
if (indent == null) {
|
||||
StringBuffer computed= indenter.computeIndentation(offset);
|
||||
if (computed != null)
|
||||
|
@ -418,10 +420,48 @@ public final class IndentUtil {
|
|||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes and returns the indentation for a source line.
|
||||
*
|
||||
* @param document the document
|
||||
* @param line the line in document
|
||||
* @param indenter the C indenter
|
||||
* @param scanner the scanner
|
||||
* @return the indent, never <code>null</code>
|
||||
* @throws BadLocationException
|
||||
*/
|
||||
public static String computeIndent(IDocument document, int line, CIndenter indenter, CHeuristicScanner scanner) throws BadLocationException {
|
||||
IRegion currentLine= document.getLineInformation(line);
|
||||
final int offset= currentLine.getOffset();
|
||||
|
||||
String indent= null;
|
||||
if (offset < document.getLength()) {
|
||||
ITypedRegion partition= TextUtilities.getPartition(document, ICPartitions.C_PARTITIONING, offset, true);
|
||||
ITypedRegion startingPartition= TextUtilities.getPartition(document, ICPartitions.C_PARTITIONING, offset, false);
|
||||
String type= partition.getType();
|
||||
if (type.equals(ICPartitions.C_MULTI_LINE_COMMENT)) {
|
||||
indent= computeCommentIndent(document, line, scanner, startingPartition);
|
||||
} else if (startingPartition.getType().equals(ICPartitions.C_PREPROCESSOR)) {
|
||||
indent= computePreprocessorIndent(document, line, startingPartition);
|
||||
} else if (startingPartition.getOffset() == offset && startingPartition.getType().equals(ICPartitions.C_SINGLE_LINE_COMMENT)) {
|
||||
indent= new String();
|
||||
}
|
||||
}
|
||||
|
||||
// standard C code indentation
|
||||
if (indent == null) {
|
||||
StringBuffer computed= indenter.computeIndentation(offset);
|
||||
if (computed != null)
|
||||
indent= computed.toString();
|
||||
else
|
||||
indent= new String();
|
||||
}
|
||||
return indent;
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes and returns the indentation for a javadoc line. The line
|
||||
* must be inside a javadoc comment.
|
||||
* Computes and returns the indentation for a comment line.
|
||||
*
|
||||
* @param document the document
|
||||
* @param line the line in document
|
||||
|
@ -430,8 +470,8 @@ public final class IndentUtil {
|
|||
* @return the indent, or <code>null</code> if not computable
|
||||
* @throws BadLocationException
|
||||
*/
|
||||
private static String computeCdocIndent(IDocument document, int line, CHeuristicScanner scanner, ITypedRegion partition) throws BadLocationException {
|
||||
if (line == 0) // impossible - the first line is never inside a javadoc comment
|
||||
public static String computeCommentIndent(IDocument document, int line, CHeuristicScanner scanner, ITypedRegion partition) throws BadLocationException {
|
||||
if (line == 0) // impossible - the first line is never inside a comment
|
||||
return null;
|
||||
|
||||
// don't make any assumptions if the line does not start with \s*\* - it might be
|
||||
|
@ -474,4 +514,40 @@ public final class IndentUtil {
|
|||
buf.insert(0, indentation);
|
||||
return buf.toString();
|
||||
}
|
||||
|
||||
/**
|
||||
* Computes and returns the indentation for a preprocessor line.
|
||||
*
|
||||
* @param document the document
|
||||
* @param line the line in document
|
||||
* @param partition the comment partition
|
||||
* @return the indent, or <code>null</code> if not computable
|
||||
* @throws BadLocationException
|
||||
*/
|
||||
public static String computePreprocessorIndent(IDocument document, int line, ITypedRegion partition) throws BadLocationException {
|
||||
int ppFirstLine= document.getLineOfOffset(partition.getOffset());
|
||||
if (line == ppFirstLine) {
|
||||
return ""; //$NON-NLS-1$
|
||||
}
|
||||
CHeuristicScanner ppScanner= new CHeuristicScanner(document, ICPartitions.C_PARTITIONING, partition.getType());
|
||||
CIndenter ppIndenter= new CIndenter(document, ppScanner);
|
||||
if (line == ppFirstLine + 1) {
|
||||
return ppIndenter.createReusingIndent(new StringBuffer(), 1).toString();
|
||||
}
|
||||
StringBuffer computed= ppIndenter.computeIndentation(document.getLineOffset(line), false);
|
||||
if (computed != null) {
|
||||
return computed.toString();
|
||||
}
|
||||
// take the indent from the previous line and reuse
|
||||
IRegion previousLine= document.getLineInformation(line - 1);
|
||||
int previousLineStart= previousLine.getOffset();
|
||||
int previousLineLength= previousLine.getLength();
|
||||
int previousLineEnd= previousLineStart + previousLineLength;
|
||||
|
||||
int previousLineNonWS= ppScanner.findNonWhitespaceForwardInAnyPartition(previousLineStart, previousLineEnd);
|
||||
String previousIndent= document.get(previousLineStart, previousLineNonWS - previousLineStart);
|
||||
computed= new StringBuffer(previousIndent);
|
||||
return computed.toString();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
* Contributors:
|
||||
* IBM Corporation - initial API and implementation
|
||||
* QNX Software System
|
||||
* Anton Leherbauer (Wind River Systems) - Fixed bug 48339
|
||||
* Anton Leherbauer (Wind River Systems)
|
||||
* Sergey Prigogin, Google
|
||||
*******************************************************************************/
|
||||
package org.eclipse.cdt.internal.ui.text;
|
||||
|
@ -23,6 +23,7 @@ import org.eclipse.jface.text.DocumentRewriteSession;
|
|||
import org.eclipse.jface.text.DocumentRewriteSessionType;
|
||||
import org.eclipse.jface.text.IDocument;
|
||||
import org.eclipse.jface.text.IRegion;
|
||||
import org.eclipse.jface.text.ITypedRegion;
|
||||
import org.eclipse.jface.text.TextUtilities;
|
||||
import org.eclipse.jface.text.rules.FastPartitioner;
|
||||
import org.eclipse.ui.IEditorPart;
|
||||
|
@ -36,6 +37,8 @@ import org.eclipse.cdt.ui.text.ICPartitions;
|
|||
|
||||
import org.eclipse.cdt.internal.corext.util.CodeFormatterUtil;
|
||||
|
||||
import org.eclipse.cdt.internal.ui.editor.IndentUtil;
|
||||
|
||||
/**
|
||||
* Auto indent strategy sensitive to brackets.
|
||||
*/
|
||||
|
@ -72,25 +75,6 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
fProject = project;
|
||||
}
|
||||
|
||||
// evaluate the line with the opening bracket that matches the closing bracket on the given line
|
||||
protected int findMatchingOpenBracket(IDocument d, int line, int end, int closingBracketIncrease) throws BadLocationException {
|
||||
int start = d.getLineOffset(line);
|
||||
int brackcount = getBracketCount(d, start, end, false) - closingBracketIncrease;
|
||||
|
||||
// sum up the brackets counts of each line (closing brackets count negative,
|
||||
// opening positive) until we find a line the brings the count to zero
|
||||
while (brackcount < 0) {
|
||||
line--;
|
||||
if (line < 0) {
|
||||
return -1;
|
||||
}
|
||||
start = d.getLineOffset(line);
|
||||
end = start + d.getLineLength(line) - 1;
|
||||
brackcount += getBracketCount(d, start, end, false);
|
||||
}
|
||||
return line;
|
||||
}
|
||||
|
||||
private int getBracketCount(IDocument d, int start, int end, boolean ignoreCloseBrackets) throws BadLocationException {
|
||||
int bracketcount = 0;
|
||||
while (start < end) {
|
||||
|
@ -153,7 +137,7 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
return end;
|
||||
}
|
||||
|
||||
protected String getIndentOfLine(IDocument d, int line) throws BadLocationException {
|
||||
private String getIndentOfLine(IDocument d, int line) throws BadLocationException {
|
||||
if (line > -1) {
|
||||
int start = d.getLineOffset(line);
|
||||
int end = start + d.getLineLength(line) - 1;
|
||||
|
@ -177,37 +161,6 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
return end;
|
||||
}
|
||||
|
||||
protected void smartInsertAfterBracket(IDocument d, DocumentCommand c) {
|
||||
if (c.offset == -1 || d.getLength() == 0)
|
||||
return;
|
||||
|
||||
try {
|
||||
int p = (c.offset == d.getLength() ? c.offset - 1 : c.offset);
|
||||
int line = d.getLineOfOffset(p);
|
||||
int start = d.getLineOffset(line);
|
||||
int whiteend = findEndOfWhiteSpace(d, start, c.offset);
|
||||
|
||||
// shift only when line does not contain any text up to the closing bracket
|
||||
if (whiteend == c.offset) {
|
||||
// evaluate the line with the opening bracket that matches out closing bracket
|
||||
int indLine = findMatchingOpenBracket(d, line, c.offset, 1);
|
||||
if (indLine != -1 && indLine != line) {
|
||||
// take the indent of the found line
|
||||
StringBuffer replaceText = new StringBuffer(getIndentOfLine(d, indLine));
|
||||
// add the rest of the current line including the just added close bracket
|
||||
replaceText.append(d.get(whiteend, c.offset - whiteend));
|
||||
replaceText.append(c.text);
|
||||
// modify document command
|
||||
c.length = c.offset - start;
|
||||
c.offset = start;
|
||||
c.text = replaceText.toString();
|
||||
}
|
||||
}
|
||||
} catch (BadLocationException excp) {
|
||||
CUIPlugin.getDefault().log(excp);
|
||||
}
|
||||
}
|
||||
|
||||
private void smartIndentAfterClosingBracket(IDocument d, DocumentCommand c) {
|
||||
if (c.offset == -1 || d.getLength() == 0)
|
||||
return;
|
||||
|
@ -218,7 +171,11 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
int start = d.getLineOffset(line);
|
||||
int whiteend = findEndOfWhiteSpace(d, start, c.offset);
|
||||
|
||||
CHeuristicScanner scanner = new CHeuristicScanner(d);
|
||||
CHeuristicScanner scanner= new CHeuristicScanner(d);
|
||||
ITypedRegion partition= TextUtilities.getPartition(d, fPartitioning, p, false);
|
||||
if (ICPartitions.C_PREPROCESSOR.equals(partition.getType())) {
|
||||
scanner = new CHeuristicScanner(d, fPartitioning, ICPartitions.C_PREPROCESSOR);
|
||||
}
|
||||
CIndenter indenter = new CIndenter(d, scanner, fProject);
|
||||
|
||||
// shift only when line does not contain any text up to the closing bracket
|
||||
|
@ -247,11 +204,14 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
if (c.offset < 1 || d.getLength() == 0)
|
||||
return;
|
||||
|
||||
CHeuristicScanner scanner = new CHeuristicScanner(d);
|
||||
|
||||
int p = (c.offset == d.getLength() ? c.offset - 1 : c.offset);
|
||||
|
||||
try {
|
||||
CHeuristicScanner scanner= new CHeuristicScanner(d);
|
||||
ITypedRegion partition= TextUtilities.getPartition(d, fPartitioning, p, false);
|
||||
if (ICPartitions.C_PREPROCESSOR.equals(partition.getType())) {
|
||||
scanner = new CHeuristicScanner(d, fPartitioning, ICPartitions.C_PREPROCESSOR);
|
||||
}
|
||||
// current line
|
||||
int line = d.getLineOfOffset(p);
|
||||
int lineOffset = d.getLineOffset(line);
|
||||
|
@ -284,12 +244,23 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
}
|
||||
|
||||
private void smartIndentAfterNewLine(IDocument d, DocumentCommand c) {
|
||||
CHeuristicScanner scanner = new CHeuristicScanner(d);
|
||||
int addIndent= 0;
|
||||
CHeuristicScanner scanner= new CHeuristicScanner(d);
|
||||
try {
|
||||
ITypedRegion partition= TextUtilities.getPartition(d, fPartitioning, c.offset, false);
|
||||
if (ICPartitions.C_PREPROCESSOR.equals(partition.getType()) && d.get(c.offset-1, 1).charAt(0) == '\\') {
|
||||
scanner = new CHeuristicScanner(d, fPartitioning, ICPartitions.C_PREPROCESSOR);
|
||||
addIndent= 1;
|
||||
}
|
||||
} catch (BadLocationException exc) {
|
||||
}
|
||||
CIndenter indenter = new CIndenter(d, scanner, fProject);
|
||||
StringBuffer indent = indenter.computeIndentation(c.offset);
|
||||
if (indent == null)
|
||||
indent = new StringBuffer();
|
||||
|
||||
if (addIndent > 0 && indent.length() == 0) {
|
||||
indent= indenter.createReusingIndent(indent, addIndent);
|
||||
}
|
||||
int docLength = d.getLength();
|
||||
if (c.offset == -1 || docLength == 0)
|
||||
return;
|
||||
|
@ -533,6 +504,7 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
ICPartitions.C_SINGLE_LINE_COMMENT,
|
||||
ICPartitions.C_STRING,
|
||||
ICPartitions.C_CHARACTER,
|
||||
ICPartitions.C_PREPROCESSOR,
|
||||
IDocument.DEFAULT_CONTENT_TYPE
|
||||
};
|
||||
FastPartitioner partitioner= new FastPartitioner(new FastCPartitionScanner(), types);
|
||||
|
@ -610,7 +582,7 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
if (!isIndentDetected) {
|
||||
// indent the first pasted line
|
||||
String current= getCurrentIndent(temp, l);
|
||||
StringBuffer correct= indenter.computeIndentation(lineOffset);
|
||||
StringBuffer correct= new StringBuffer(IndentUtil.computeIndent(temp, l, indenter, scanner));
|
||||
if (correct == null)
|
||||
return; // bail out
|
||||
|
||||
|
@ -978,6 +950,9 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
case ':':
|
||||
smartIndentAfterColumn(document, command);
|
||||
break;
|
||||
case '#':
|
||||
smartIndentAfterHash(document, command);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1136,6 +1111,22 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
}
|
||||
}
|
||||
|
||||
private void smartIndentAfterHash(IDocument doc, DocumentCommand c) {
|
||||
try {
|
||||
ITypedRegion partition= TextUtilities.getPartition(doc, fPartitioning, c.offset, false);
|
||||
if (IDocument.DEFAULT_CONTENT_TYPE.equals(partition.getType())) {
|
||||
IRegion startLine= doc.getLineInformationOfOffset(c.offset);
|
||||
String indent= (doc.get(startLine.getOffset(), c.offset - startLine.getOffset()));
|
||||
if (indent.trim().length() == 0) {
|
||||
c.offset -= indent.length();
|
||||
c.length += indent.length();
|
||||
}
|
||||
}
|
||||
} catch (BadLocationException e) {
|
||||
CUIPlugin.getDefault().log(e);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* @see org.eclipse.jface.text.IAutoEditStrategy#customizeDocumentCommand(IDocument, DocumentCommand)
|
||||
*/
|
||||
|
@ -1175,7 +1166,7 @@ public class CAutoIndentStrategy extends DefaultIndentLineAutoEditStrategy {
|
|||
private boolean isAppendToOpenMultilineComment(IDocument d, DocumentCommand c) {
|
||||
if (d.getLength() >= 2 && c.offset == d.getLength()) {
|
||||
try {
|
||||
String contentType = org.eclipse.jface.text.TextUtilities.getContentType(d, fPartitioning, c.offset - 1, false);
|
||||
String contentType = TextUtilities.getContentType(d, fPartitioning, c.offset - 1, false);
|
||||
if (ICPartitions.C_MULTI_LINE_COMMENT.equals(contentType)) {
|
||||
return !d.get(c.offset - 2, 2).equals(MULTILINE_COMMENT_CLOSE);
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue