blob: f9791a6c5925700c656fe269826ec4686c1b5b17 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2016 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
*******************************************************************************/
package org.eclipse.dltk.ruby.internal.ui.text.rules;
import org.eclipse.core.runtime.Assert;
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;
/**
* An implementation of <code>IRule</code> detecting a numerical value.
*/
public class RubyFloatNumberRule implements IRule {
protected static final int UNDEFINED = -1;
protected IToken fToken;
protected int fColumn = UNDEFINED;
public RubyFloatNumberRule(IToken token) {
Assert.isNotNull(token);
fToken = token;
}
public void setColumnConstraint(int column) {
if (column < 0)
column = UNDEFINED;
fColumn = column;
}
@Override
public IToken evaluate(ICharacterScanner scanner) {
int c = scanner.read();
int p = c;
if (Character.isDigit((char) c) || c == '.') {
if (fColumn == UNDEFINED || (fColumn == scanner.getColumn() - 1)) {
do {
p = c;
c = scanner.read();
} while (Character.isDigit((char) c));
if ((c != 'e' && c != 'E')) {
scanner.unread();
}
if (p == '.') {
scanner.unread();
return Token.UNDEFINED;
}
return fToken;
}
}
scanner.unread();
return Token.UNDEFINED;
}
}