/* * 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.*; /** * The same as end-of-line rule but matches word in case-insensitive fashion + * needs whitespace after last letter or digit */ public class LineCommentRule extends EndOfLineRule { public LineCommentRule(String startSequence, IToken token) { super(startSequence, token, (char) 0); } public LineCommentRule(String startSequence, IToken token, char escapeCharacter) { super(startSequence, token, escapeCharacter); } public LineCommentRule(String startSequence, IToken token, char escapeCharacter, boolean escapeContinuesLine) { super(startSequence, token, escapeCharacter, escapeContinuesLine); } protected IToken doEvaluate(ICharacterScanner scanner, boolean resume) { if (resume) { if (endSequenceDetected(scanner)) return fToken; } else { /* // Check we are at the line beginning for (;;) { scanner.unread(); int c = scanner.read(); } */ int c= scanner.read(); if (Character.toUpperCase(c) == Character.toUpperCase(fStartSequence[0])) { if (sequenceDetected(scanner, fStartSequence, false)) { if (endSequenceDetected(scanner)) return fToken; } } } scanner.unread(); return Token.UNDEFINED; } @Override public IToken evaluate(ICharacterScanner scanner, boolean resume) { if (fColumn == UNDEFINED) return doEvaluate(scanner, resume); int c= scanner.read(); scanner.unread(); if (Character.toUpperCase(c) == Character.toUpperCase(fStartSequence[0])) return (fColumn == scanner.getColumn() ? doEvaluate(scanner, resume) : Token.UNDEFINED); return Token.UNDEFINED; } @Override protected boolean sequenceDetected(ICharacterScanner scanner, char[] sequence, boolean eofAllowed) { for (int i= 1; i < sequence.length; i++) { int c= scanner.read(); if (c == ICharacterScanner.EOF && eofAllowed) { return true; } else if (Character.toUpperCase(c) != Character.toUpperCase(sequence[i])) { // Non-matching character detected, rewind the scanner back to the start. // Do not unread the first character. scanner.unread(); for (int j= i-1; j > 0; j--) scanner.unread(); return false; } } if (Character.isLetterOrDigit(sequence[sequence.length - 1])) { // Check for trailing whitespace int lastChar = scanner.read(); scanner.unread(); if (lastChar != ICharacterScanner.EOF) { if (!Character.isWhitespace((char) lastChar)) { return false; } } } return true; } }