org.eclipse.datatools.sqltools.sqleditor.internal.indent
Class SQLHeuristicScanner

java.lang.Object
  extended by org.eclipse.datatools.sqltools.sqleditor.internal.indent.SQLHeuristicScanner
All Implemented Interfaces:
Symbols

public class SQLHeuristicScanner
extends java.lang.Object
implements Symbols

Utility methods for heuristic based SQL manipulations in an incomplete SQL source file.

An instance holds some internal position in the document and is therefore not threadsafe.

Author:
Li Huang

Field Summary
static int NOT_FOUND
          Returned by all methods when the requested position could not be found, or if a BadLocationExceptionwas thrown while scanning.
static int UNBOUND
          Special bound parameter that means either -1 (backward scanning) or fDocument.getLength() (forward scanning).
 
Fields inherited from interface org.eclipse.datatools.sqltools.sqleditor.internal.indent.Symbols
begin, BEGIN, beginTrail, BEGINTrail, Tokenbegin, TokenBEGIN, Tokenend, TokenEND, TokenEOF, TokenIDENT, TokenOTHER
 
Constructor Summary
SQLHeuristicScanner(org.eclipse.jface.text.IDocument document)
          Calls this(document, ISQLPartitions.SQL_PARTITIONING, IDocument.DEFAULT_CONTENT_TYPE).
SQLHeuristicScanner(org.eclipse.jface.text.IDocument document, java.lang.String partitioning, java.lang.String partition)
          Creates a new instance.
 
Method Summary
 int findClosingPeer(int start, int openingPeer, int closingPeer)
          Returns the position of the closing peer token (forward search).
 int findNonWhitespaceBackward(int position, int bound)
          Finds the highest position in fDocument such that the position is <= position and > bound and Character.isWhitespace(fDocument.getChar(pos)) evaluates to false and the position is in the default partition.
 int findNonWhitespaceForward(int position, int bound)
          Finds the smallest position in fDocument such that the position is >= position and < bound and Character.isWhitespace(fDocument.getChar(pos)) evaluates to false and the position is in the default partition.
 int findNonWhitespaceForwardInAnyPartition(int position, int bound)
          Finds the smallest position in fDocument such that the position is >= position and < bound and Character.isWhitespace(fDocument.getChar(pos)) evaluates to false.
 int findOpeningPeer(int start, int openingPeer, int closingPeer)
          Returns the position of the opening peer token (backward search).
 int getPosition()
          Returns the most recent internal scan position.
 boolean isDefaultPartition(int position)
          Checks whether position resides in a default (SQL) partition of _document.
 boolean isSameToken(int firstToken, int secondToken)
           
 int nextToken(int start, int bound)
          Returns the next token in forward direction, starting at start, and not extending further than bound.
 int previousToken(int start, int bound)
          Returns the next token in backward direction, starting at start, and not extending further than bound.
 int scanBackward(int position, int bound, char ch)
          Finds the highest position in fDocument such that the position is <= position and > bound and fDocument.getChar(position) == ch evaluates to true for at least one ch in chars and the position is in the default partition.
 int scanBackward(int position, int bound, char[] chars)
          Finds the highest position in _document such that the position is <= position and > bound and _document.getChar(position) == ch evaluates to true for at least one ch in chars and the position is in the default partition.
 int scanBackward(int start, int bound, StopCondition condition)
          Finds the highest position p in fDocument such that bound < p <= start and condition.stop(fDocument.getChar(p), p) evaluates to true.
 int scanForward(int position, int bound, char ch)
          Finds the lowest position in fDocument such that the position is >= position and < bound and fDocument.getChar(position) == ch evaluates to true and the position is in the default partition.
 int scanForward(int position, int bound, char[] chars)
          Finds the lowest position in fDocument such that the position is >= position and < bound and fDocument.getChar(position) == ch evaluates to true for at least one ch in chars and the position is in the default partition.
 int scanForward(int start, int bound, StopCondition condition)
          Finds the lowest position p in fDocument such that start <= p < bound and condition.stop(fDocument.getChar(p), p) evaluates to true.
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

NOT_FOUND

public static final int NOT_FOUND
Returned by all methods when the requested position could not be found, or if a BadLocationExceptionwas thrown while scanning.

See Also:
Constant Field Values

UNBOUND

public static final int UNBOUND
Special bound parameter that means either -1 (backward scanning) or fDocument.getLength() (forward scanning).

See Also:
Constant Field Values
Constructor Detail

SQLHeuristicScanner

public SQLHeuristicScanner(org.eclipse.jface.text.IDocument document,
                           java.lang.String partitioning,
                           java.lang.String partition)
Creates a new instance.

Parameters:
document - the document to scan
partitioning - the partitioning to use for scanning
partition - the partition to scan in

SQLHeuristicScanner

public SQLHeuristicScanner(org.eclipse.jface.text.IDocument document)
Calls this(document, ISQLPartitions.SQL_PARTITIONING, IDocument.DEFAULT_CONTENT_TYPE).

Parameters:
document - the document to scan.
Method Detail

getPosition

public int getPosition()
Returns the most recent internal scan position.

Returns:
the most recent internal scan position.

nextToken

public int nextToken(int start,
                     int bound)
Returns the next token in forward direction, starting at start, and not extending further than bound. The return value is one of the constants defined in Symbols. After a call, getPosition()will return the position just after the scanned token (i.e. the next position that will be scanned).

Parameters:
start - the first character position in the document to consider
bound - the first position not to consider any more
Returns:
a constant from Symbolsdescribing the next token

previousToken

public int previousToken(int start,
                         int bound)
Returns the next token in backward direction, starting at start, and not extending further than bound. The return value is one of the constants defined in Symbols. After a call, getPosition()will return the position just before the scanned token starts (i.e. the next position that will be scanned).

Parameters:
start - the first character position in the document to consider
bound - the first position not to consider any more
Returns:
a constant from Symbolsdescribing the previous token

findNonWhitespaceForward

public int findNonWhitespaceForward(int position,
                                    int bound)
Finds the smallest position in fDocument such that the position is >= position and < bound and Character.isWhitespace(fDocument.getChar(pos)) evaluates to false and the position is in the default partition.

Parameters:
position - the first character position in fDocument to be considered
bound - the first position in fDocument to not consider any more, with bound > position, or UNBOUND
Returns:
the smallest position of a non-whitespace character in [position,bound) that resides in a SQL partition, or NOT_FOUND if none can be found

findNonWhitespaceForwardInAnyPartition

public int findNonWhitespaceForwardInAnyPartition(int position,
                                                  int bound)
Finds the smallest position in fDocument such that the position is >= position and < bound and Character.isWhitespace(fDocument.getChar(pos)) evaluates to false.

Parameters:
position - the first character position in fDocument to be considered
bound - the first position in fDocument to not consider any more, with bound > position, or UNBOUND
Returns:
the smallest position of a non-whitespace character in [position,bound), or NOT_FOUND if none can be found

findNonWhitespaceBackward

public int findNonWhitespaceBackward(int position,
                                     int bound)
Finds the highest position in fDocument such that the position is <= position and > bound and Character.isWhitespace(fDocument.getChar(pos)) evaluates to false and the position is in the default partition.

Parameters:
position - the first character position in fDocument to be considered
bound - the first position in fDocument to not consider any more, with bound < position, or UNBOUND
Returns:
the highest position of a non-whitespace character in (bound,position] that resides in a SQL partition, or NOT_FOUND if none can be found

scanForward

public int scanForward(int start,
                       int bound,
                       StopCondition condition)
Finds the lowest position p in fDocument such that start <= p < bound and condition.stop(fDocument.getChar(p), p) evaluates to true.

Parameters:
start - the first character position in fDocument to be considered
bound - the first position in fDocument to not consider any more, with bound > start, or UNBOUND
condition - the StopCondition to check
Returns:
the lowest position in [start,bound) for which condition holds, or NOT_FOUND if none can be found

scanForward

public int scanForward(int position,
                       int bound,
                       char ch)
Finds the lowest position in fDocument such that the position is >= position and < bound and fDocument.getChar(position) == ch evaluates to true and the position is in the default partition.

Parameters:
position - the first character position in fDocument to be considered
bound - the first position in fDocument to not consider any more, with bound > position, or UNBOUND
ch - the char to search for
Returns:
the lowest position of ch in (bound,position] that resides in a SQL partition, or NOT_FOUND if none can be found

scanForward

public int scanForward(int position,
                       int bound,
                       char[] chars)
Finds the lowest position in fDocument such that the position is >= position and < bound and fDocument.getChar(position) == ch evaluates to true for at least one ch in chars and the position is in the default partition.

Parameters:
position - the first character position in fDocument to be considered
bound - the first position in fDocument to not consider any more, with bound > position, or UNBOUND
chars - an array of char to search for
Returns:
the lowest position of a non-whitespace character in [position,bound) that resides in a SQL partition, or NOT_FOUND if none can be found

scanBackward

public int scanBackward(int start,
                        int bound,
                        StopCondition condition)
Finds the highest position p in fDocument such that bound < p <= start and condition.stop(fDocument.getChar(p), p) evaluates to true.

Parameters:
start - the first character position in fDocument to be considered
bound - the first position in fDocument to not consider any more, with bound < start, or UNBOUND
condition - the StopCondition to check
Returns:
the highest position in (bound,start for which condition holds, or NOT_FOUND if none can be found

scanBackward

public int scanBackward(int position,
                        int bound,
                        char ch)
Finds the highest position in fDocument such that the position is <= position and > bound and fDocument.getChar(position) == ch evaluates to true for at least one ch in chars and the position is in the default partition.

Parameters:
position - the first character position in fDocument to be considered
bound - the first position in fDocument to not consider any more, with bound < position, or UNBOUND
ch - the char to search for
Returns:
the highest position of one element in chars in (bound, position] that resides in a SQL partition, or NOT_FOUND if none can be found

scanBackward

public int scanBackward(int position,
                        int bound,
                        char[] chars)
Finds the highest position in _document such that the position is <= position and > bound and _document.getChar(position) == ch evaluates to true for at least one ch in chars and the position is in the default partition.

Parameters:
position - the first character position in _document to be considered
bound - the first position in _document to not consider any more, with bound < position, or UNBOUND
chars - an array of char to search for
Returns:
the highest position of one element in chars in (bound, position] that resides in a SQL partition, or NOT_FOUND if none can be found

isDefaultPartition

public boolean isDefaultPartition(int position)
Checks whether position resides in a default (SQL) partition of _document.

Parameters:
position - the position to be checked
Returns:
true if position is in the default partition of _document, false otherwise

findOpeningPeer

public int findOpeningPeer(int start,
                           int openingPeer,
                           int closingPeer)
Returns the position of the opening peer token (backward search). Any scopes introduced by closing peers are skipped. All peers accounted for must reside in the default partition.

Note that start must not point to the closing peer, but to the first token being searched.

Parameters:
start - the start position
openingPeer - the opening peer token (e.g. 'begin')
closingPeer - the closing peer token (e.g. 'end')
Returns:
the matching peer character position, or NOT_FOUND

findClosingPeer

public int findClosingPeer(int start,
                           int openingPeer,
                           int closingPeer)
Returns the position of the closing peer token (forward search). Any scopes introduced by opening peers are skipped. All peers accounted for must reside in the default partition.

Note that start must not point to the opening peer, but to the first token being searched.

Parameters:
start - the start position
openingPeer - the opening peer character (e.g. 'begin')
closingPeer - the closing peer character (e.g. 'end')
Returns:
the matching peer character position, or NOT_FOUND

isSameToken

public boolean isSameToken(int firstToken,
                           int secondToken)