/*
* DBeaver - Universal Database Manager
* Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.jkiss.dbeaver.ui.editors.sql.syntax.rules;
import org.eclipse.jface.text.rules.ICharacterScanner;
import org.eclipse.jface.text.rules.IRule;
import org.eclipse.jface.text.rules.IToken;
import org.eclipse.jface.text.rules.Token;
import org.jkiss.dbeaver.model.sql.SQLSyntaxManager;
import org.jkiss.dbeaver.ui.editors.sql.syntax.tokens.SQLParameterToken;
/**
* SQL parameter rule
*/
public class SQLParameterRule implements IRule {
private final SQLSyntaxManager syntaxManager;
private final SQLParameterToken parameterToken;
private final StringBuilder buffer;
private final char anonymousParameterMark;
private final char namedParameterPrefix;
public SQLParameterRule(SQLSyntaxManager syntaxManager, SQLParameterToken parameterToken) {
this.syntaxManager = syntaxManager;
this.parameterToken = parameterToken;
buffer = new StringBuilder();
anonymousParameterMark = syntaxManager.getAnonymousParameterMark();
namedParameterPrefix = syntaxManager.getNamedParameterPrefix();
}
@Override
public IToken evaluate(ICharacterScanner scanner)
{
scanner.unread();
int prevChar = scanner.read();
if (Character.isJavaIdentifierPart(prevChar) ||
prevChar == namedParameterPrefix || prevChar == anonymousParameterMark || prevChar == '\\' || prevChar == '/')
{
return Token.UNDEFINED;
}
int c = scanner.read();
if (c != ICharacterScanner.EOF && (c == anonymousParameterMark || c == namedParameterPrefix)) {
buffer.setLength(0);
do {
buffer.append((char) c);
c = scanner.read();
} while (c != ICharacterScanner.EOF && Character.isJavaIdentifierPart(c));
scanner.unread();
// Check for parameters
if (syntaxManager.isAnonymousParametersEnabled()) {
if (buffer.length() == 1 && buffer.charAt(0) == anonymousParameterMark) {
return parameterToken;
}
}
if (syntaxManager.isParametersEnabled()) {
if (buffer.charAt(0) == namedParameterPrefix && buffer.length() > 1) {
boolean validChars = true;
for (int i = 1; i < buffer.length(); i++) {
if (!Character.isJavaIdentifierPart(buffer.charAt(i))) {
validChars = false;
break;
}
}
if (validChars) {
return parameterToken;
}
}
}
for (int i = buffer.length() - 1; i >= 0; i--) {
scanner.unread();
}
} else {
scanner.unread();
}
return Token.UNDEFINED;
}
}