/******************************************************************************* * Copyright (c) 2005, 2017 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.tcl.internal.ui.rules; import org.eclipse.dltk.tcl.internal.parser.raw.CodeScanner; import org.eclipse.dltk.tcl.internal.parser.raw.SimpleTclParser; import org.eclipse.dltk.tcl.internal.parser.raw.TclParseException; import org.eclipse.dltk.tcl.internal.parser.raw.VariableSubstitution; 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; public class TclVariableRule implements IRule { private IToken token; public TclVariableRule(IToken token) { super(); this.token = token; } private class SkipCodeScanner extends CodeScanner { ICharacterScanner scanner; public SkipCodeScanner(ICharacterScanner scanner) { super(null); this.scanner = scanner; } @Override public int read() { return scanner.read(); } @Override public boolean isEOF() { int res = scanner.read(); if (res == -1) return true; scanner.unread(); return false; } @Override public void unread() { scanner.unread(); } @Override public int getPosition() { return scanner.getColumn(); } } @Override public IToken evaluate(ICharacterScanner scanner) { SkipCodeScanner scs = new SkipCodeScanner(scanner); if (!VariableSubstitution.iAm(scs)) { return Token.UNDEFINED; } VariableSubstitution vs = new VariableSubstitution(); try { vs.readMe(scs, new SimpleTclParser()); } catch (TclParseException e) { // e.printStackTrace(); return Token.UNDEFINED; } return token; } }