From: <k_s...@us...> - 2007-05-10 14:51:04
|
Revision: 9524 http://svn.sourceforge.net/jedit/?rev=9524&view=rev Author: k_satoda Date: 2007-05-10 07:51:01 -0700 (Thu, 10 May 2007) Log Message: ----------- Ignored COMMENT(1-4) LITERAL(1-4) tokens in bracket scanning for indent. This fixes SF.net bugs #747769, #1229283, #1592989. Originally submitted as SF.net patch #1711827. The patch was inspired by the description of SF.net bug #1711680. Modified Paths: -------------- jEdit/trunk/doc/CHANGES.txt jEdit/trunk/org/gjt/sp/jedit/indent/BracketIndentRule.java jEdit/trunk/org/gjt/sp/jedit/indent/CloseBracketIndentRule.java jEdit/trunk/org/gjt/sp/jedit/indent/IndentAction.java jEdit/trunk/org/gjt/sp/jedit/indent/OpenBracketIndentRule.java Modified: jEdit/trunk/doc/CHANGES.txt =================================================================== --- jEdit/trunk/doc/CHANGES.txt 2007-05-10 14:38:59 UTC (rev 9523) +++ jEdit/trunk/doc/CHANGES.txt 2007-05-10 14:51:01 UTC (rev 9524) @@ -4,7 +4,6 @@ Thanks to Bj\xF6rn "Vampire" Kautler, Alan Ezust, Jakub Roztocil, Matthieu Casanova, Nicholas O'Leary, Marcelo Vanzin, Kazutoshi Satoda, - Joseph Erickson, David Moss, Horst Eff, Daniel Hahler, Stephen Co, and Mike Gorski for contributing to this release. @@ -109,6 +108,10 @@ property of the edit mode, and the matching end char is automatically set. (#1666815) (Matthieu Casanova) +- Brackets in comments or literals (in terms of token types in edit mode) + are now ignored for indent. (SF.net bugs #747769, #1229283, #1592989) + (Kazutoshi Satoda) + }}} {{{ Miscellaneous Modified: jEdit/trunk/org/gjt/sp/jedit/indent/BracketIndentRule.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/indent/BracketIndentRule.java 2007-05-10 14:38:59 UTC (rev 9523) +++ jEdit/trunk/org/gjt/sp/jedit/indent/BracketIndentRule.java 2007-05-10 14:51:01 UTC (rev 9524) @@ -22,6 +22,12 @@ package org.gjt.sp.jedit.indent; +import javax.swing.text.Segment; +import org.gjt.sp.jedit.buffer.JEditBuffer; +import org.gjt.sp.jedit.syntax.Token; +import org.gjt.sp.jedit.syntax.TokenHandler; +import org.gjt.sp.jedit.syntax.TokenMarker; + /** * @author Slava Pestov * @version $Id$ @@ -43,6 +49,13 @@ } //}}} //{{{ getBrackets() method + /** + * @deprecated + * Use {@link #getBrackets(JEditBuffer,int,int,int)} instead. + * Brackets in comments or literals should be ignored for indent. + * But it can't be done without syntax parsing of a buffer. + */ + @Deprecated public Brackets getBrackets(String line) { Brackets brackets = new Brackets(); @@ -76,6 +89,22 @@ return brackets; } //}}} + //{{{ getBrackets() method + public Brackets getBrackets(JEditBuffer buffer, int lineIndex) + { + return getBrackets(buffer, lineIndex, + 0, buffer.getLineLength(lineIndex)); + } //}}} + + //{{{ getBrackets() method + public Brackets getBrackets(JEditBuffer buffer, int lineIndex, + int begin, int end) + { + LineScanner scanner = new LineScanner(begin, end); + buffer.markTokens(lineIndex, scanner); + return scanner.result; + } //}}} + //{{{ toString() method public String toString() { @@ -84,4 +113,97 @@ } //}}} protected char openBracket, closeBracket; + + //{{{ class LineScanner + private class LineScanner implements TokenHandler + { + public final Brackets result; + + private int scannedIndex; + private final int beginIndex; + private final int endIndex; + + public LineScanner(int begin, int end) + { + this.result = new Brackets(); + this.scannedIndex = 0; + this.beginIndex = begin; + this.endIndex = end; + } + + boolean rejectsToken(byte id) + { + // Rejects comments and literals. + // Accepts all others. + switch (id) + { + case Token.COMMENT1: + case Token.COMMENT2: + case Token.COMMENT3: + case Token.COMMENT4: + case Token.LITERAL1: + case Token.LITERAL2: + case Token.LITERAL3: + case Token.LITERAL4: + return true; + default: + return false; + } + } + + private void scan(Segment seg, int offset, int length) + { + int index = scannedIndex; + if (index >= endIndex) + { + return; + } + if (index < beginIndex) + { + int numToSkip = beginIndex - index; + if (numToSkip >= length) + { + return; + } + offset += numToSkip; + length -= numToSkip; + index = beginIndex; + } + if (index + length > endIndex) + { + length = endIndex - index; + } + + for (int i = 0; i < length; ++i) + { + char c = seg.array[seg.offset + offset + i]; + if(c == openBracket) + { + result.openCount++; + } + else if(c == closeBracket) + { + if(result.openCount != 0) + result.openCount--; + else + result.closeCount++; + } + } + } + + public void handleToken(Segment seg + , byte id, int offset, int length + , TokenMarker.LineContext context) + { + if (!rejectsToken(id)) + { + scan(seg, offset, length); + } + scannedIndex += length; + } + + public void setLineContext(TokenMarker.LineContext lineContext) + { + } + } //}}} } Modified: jEdit/trunk/org/gjt/sp/jedit/indent/CloseBracketIndentRule.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/indent/CloseBracketIndentRule.java 2007-05-10 14:38:59 UTC (rev 9523) +++ jEdit/trunk/org/gjt/sp/jedit/indent/CloseBracketIndentRule.java 2007-05-10 14:51:01 UTC (rev 9524) @@ -25,6 +25,7 @@ import java.util.List; import org.gjt.sp.jedit.buffer.JEditBuffer; import org.gjt.sp.jedit.TextUtilities; +import org.gjt.sp.util.StandardUtilities; /** * @author Slava Pestov @@ -54,18 +55,15 @@ if(index == -1) return; - String line = buffer.getLineText(index); - - int offset = line.lastIndexOf(closeBracket); + int offset = buffer.getLineText(index).lastIndexOf(closeBracket); if(offset == -1) return; - int closeCount = getBrackets(line).closeCount; + int closeCount = getBrackets(buffer, index).closeCount; if(closeCount != 0) { - IndentAction.AlignBracket alignBracket - = new IndentAction.AlignBracket( - buffer,index,offset); + AlignBracket alignBracket + = new AlignBracket(buffer,index,offset); /* Consider the following Common Lisp code (with one more opening bracket than closing): @@ -80,13 +78,13 @@ the next line must be indented relative to the corresponding opening bracket from line 1. */ - String openLine = alignBracket.getOpenBracketLine(); - int column = alignBracket.getOpenBracketColumn(); - if(openLine != null) + int openLine = alignBracket.getOpenBracketLine(); + if(openLine != -1) { - String leadingBrackets = openLine.substring(0,column); - alignBracket.setExtraIndent(getBrackets(leadingBrackets) - .openCount); + int column = alignBracket.getOpenBracketColumn(); + alignBracket.setExtraIndent( + getBrackets(buffer, openLine, + 0, column).openCount); } indentActions.add(alignBracket); @@ -94,10 +92,82 @@ } //}}} //{{{ isMatch() method + /** + * @deprecated + * This method calls BracketIndentRule#getBrackets(String) + * which has been deprecated. + */ + @Deprecated public boolean isMatch(String line) { return getBrackets(line).closeCount != 0; } //}}} private boolean aligned; + + //{{{ AlignBracket class + private static class AlignBracket implements IndentAction + { + private int line, offset; + private int openBracketLine; + private int openBracketColumn; + private String openBracketLineText; + private int extraIndent; + + public AlignBracket(JEditBuffer buffer, int line, int offset) + { + this.line = line; + this.offset = offset; + + int openBracketIndex = TextUtilities.findMatchingBracket( + buffer,this.line,this.offset); + if(openBracketIndex == -1) + openBracketLine = -1; + else + { + openBracketLine = buffer.getLineOfOffset(openBracketIndex); + openBracketColumn = openBracketIndex - + buffer.getLineStartOffset(openBracketLine); + openBracketLineText = buffer.getLineText(openBracketLine); + } + } + + public int getExtraIndent() + { + return extraIndent; + } + + public void setExtraIndent(int extraIndent) + { + this.extraIndent = extraIndent; + } + + public int getOpenBracketColumn() + { + return openBracketColumn; + } + + public int getOpenBracketLine() + { + return openBracketLine; + } + + public int calculateIndent(JEditBuffer buffer, int line, int oldIndent, + int newIndent) + { + if(openBracketLineText == null) + return newIndent; + else + { + return StandardUtilities.getLeadingWhiteSpaceWidth( + openBracketLineText,buffer.getTabSize()) + + (extraIndent * buffer.getIndentSize()); + } + } + + public boolean keepChecking() + { + return false; + } + } //}}} } Modified: jEdit/trunk/org/gjt/sp/jedit/indent/IndentAction.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/indent/IndentAction.java 2007-05-10 14:38:59 UTC (rev 9523) +++ jEdit/trunk/org/gjt/sp/jedit/indent/IndentAction.java 2007-05-10 14:51:01 UTC (rev 9524) @@ -134,71 +134,6 @@ } } - class AlignBracket implements IndentAction - { - private int line, offset; - private int openBracketLine; - private int openBracketColumn; - private String openBracketLineText; - private int extraIndent; - - public AlignBracket(JEditBuffer buffer, int line, int offset) - { - this.line = line; - this.offset = offset; - - int openBracketIndex = TextUtilities.findMatchingBracket( - buffer,this.line,this.offset); - if(openBracketIndex == -1) - openBracketLine = -1; - else - { - openBracketLine = buffer.getLineOfOffset(openBracketIndex); - openBracketColumn = openBracketIndex - - buffer.getLineStartOffset(openBracketLine); - openBracketLineText = buffer.getLineText(openBracketLine); - } - } - - public int getExtraIndent() - { - return extraIndent; - } - - public void setExtraIndent(int extraIndent) - { - this.extraIndent = extraIndent; - } - - public int getOpenBracketColumn() - { - return openBracketColumn; - } - - public String getOpenBracketLine() - { - return openBracketLineText; - } - - public int calculateIndent(JEditBuffer buffer, int line, int oldIndent, - int newIndent) - { - if(openBracketLineText == null) - return newIndent; - else - { - return StandardUtilities.getLeadingWhiteSpaceWidth( - openBracketLineText,buffer.getTabSize()) - + (extraIndent * buffer.getIndentSize()); - } - } - - public boolean keepChecking() - { - return false; - } - } - /** * @author Matthieu Casanova */ Modified: jEdit/trunk/org/gjt/sp/jedit/indent/OpenBracketIndentRule.java =================================================================== --- jEdit/trunk/org/gjt/sp/jedit/indent/OpenBracketIndentRule.java 2007-05-10 14:38:59 UTC (rev 9523) +++ jEdit/trunk/org/gjt/sp/jedit/indent/OpenBracketIndentRule.java 2007-05-10 14:51:01 UTC (rev 9524) @@ -67,7 +67,7 @@ if(line == -1) return 0; else - return getBrackets(buffer.getLineText(line)).openCount; + return getBrackets(buffer, line).openCount; } //}}} //{{{ handleCollapse() method This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |