# HG changeset patch # User Matthias Bläsing # Date 1403904488 -7200 # Fri Jun 27 23:28:08 2014 +0200 # Node ID 3114b64c7aabfdae8e1acbee913d07f57814cc15 # Parent c51b32555f1a1fd25e4a25e5181b9c05d5497df3 Fix double-char operators (>=, <=, ...) diff --git a/db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLLexer.java b/db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLLexer.java --- a/db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLLexer.java +++ b/db.sql.editor/src/org/netbeans/modules/db/sql/lexer/SQLLexer.java @@ -94,8 +94,48 @@ case ';': case '*': case '!': + case '%': + case '&': + case '~': + case '^': + case '|': + case ':': state = State.INIT; - return factory.createToken(SQLTokenId.OPERATOR); + + int lookAhead = input.read(); + if(lookAhead == '=') { + switch (actChar) { + case '|': + case '^': + case '&': + case '%': + case '/': + case '*': + case '-': + case '+': + case ':': + case '!': + case '<': + case '>': + return factory.createToken(SQLTokenId.OPERATOR); + } + } + if(actChar == '|' && lookAhead == '|') { + return factory.createToken(SQLTokenId.OPERATOR); + } + if(actChar == '!' && (lookAhead == '=' || lookAhead == '>' || lookAhead == '<')) { + return factory.createToken(SQLTokenId.OPERATOR); + } + if(actChar == '<' && lookAhead == '>') { + return factory.createToken(SQLTokenId.OPERATOR); + } + input.backup(1); + if(actChar != ':') { + return factory.createToken(SQLTokenId.OPERATOR); + } else { + state = State.ISI_IDENTIFIER; + } + break; case '(': state = State.INIT; return factory.createToken(SQLTokenId.LPAREN); @@ -219,6 +259,9 @@ case '*': state = State.ISI_BLOCK_COMMENT; break; + case '=': + state = State.INIT; + return factory.createToken(SQLTokenId.OPERATOR); default: state = State.INIT; input.backup(1); @@ -232,6 +275,9 @@ case '-': state = State.ISI_LINE_COMMENT; break; + case '=': + state = State.INIT; + return factory.createToken(SQLTokenId.OPERATOR); default: state = State.INIT; input.backup(1); diff --git a/db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/lexer/SQLLexerTest.java b/db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/lexer/SQLLexerTest.java --- a/db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/lexer/SQLLexerTest.java +++ b/db.sql.editor/test/unit/src/org/netbeans/modules/db/sql/lexer/SQLLexerTest.java @@ -42,7 +42,6 @@ package org.netbeans.modules.db.sql.lexer; import javax.swing.text.BadLocationException; -import javax.swing.text.Document; import org.netbeans.api.lexer.Language; import org.netbeans.api.lexer.PartType; import org.netbeans.api.lexer.Token; @@ -155,6 +154,69 @@ assertTokens(seq, SQLTokenId.STRING, SQLTokenId.WHITESPACE); } + public void testPlaceHolder() throws Exception { + assertTokens(getTokenSequence("SELECT a FROM b WHERE c = :var"), + SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, + SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, + SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, + SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, + SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, + SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, + SQLTokenId.OPERATOR, SQLTokenId.WHITESPACE, + SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("SELECT a FROM b WHERE c = :var"), + SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, + SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, + SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, + SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, + SQLTokenId.KEYWORD, SQLTokenId.WHITESPACE, + SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, + SQLTokenId.OPERATOR, SQLTokenId.WHITESPACE, + SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + } + + public void testVariableDeclaration() throws Exception { + assertTokens(getTokenSequence("@a:='test'"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.STRING, SQLTokenId.WHITESPACE); + } + + public void testOperators() throws Exception { + // Basic Arithmetic + assertTokens(getTokenSequence("a+b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a-b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a* b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a /b"), SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a % b"), SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, SQLTokenId.OPERATOR, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + // Bitwise operators (MSSQL) + assertTokens(getTokenSequence("a&b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a|b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a^b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + // Unäres bitwise not (ones complement) + assertTokens(getTokenSequence("~b"), SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + // Comparison operators + assertTokens(getTokenSequence("a=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a>b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("ab"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a>=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a<=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a !=b"), SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a!< b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a !> b"), SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE, SQLTokenId.OPERATOR, SQLTokenId.WHITESPACE, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + // Concatenation (Informix) + assertTokens(getTokenSequence("a||b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + // Assignement Operator (SPL) + assertTokens(getTokenSequence("a:=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + // Compound Operators (Transact-SQL) + assertTokens(getTokenSequence("a+=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a-=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a*=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a/=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a%=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a&=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a^=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + assertTokens(getTokenSequence("a|=b"), SQLTokenId.IDENTIFIER, SQLTokenId.OPERATOR, SQLTokenId.IDENTIFIER, SQLTokenId.WHITESPACE); + } + /** * Check correct handling of multiline comments (bug #) *