// Copyright (c) 2003-2008 by Leif Frenzel - see http://leiffrenzel.de // This code is made available under the terms of the Eclipse Public License, // version 1.0 (EPL). See http://www.eclipse.org/legal/epl-v10.html package net.sf.eclipsefp.haskell.ui.internal.editors.haskell.text; import java.util.ArrayList; import java.util.List; import net.sf.eclipsefp.haskell.core.codeassist.HaskellSyntax; import net.sf.eclipsefp.haskell.ui.internal.editors.haskell.syntax.ArrowRule; import net.sf.eclipsefp.haskell.ui.internal.editors.haskell.syntax.WhitespaceDetector; import net.sf.eclipsefp.haskell.ui.internal.preferences.editor.IEditorPreferenceNames; import net.sf.eclipsefp.haskell.ui.util.text.WordDetector; import org.eclipse.jface.text.rules.EndOfLineRule; import org.eclipse.jface.text.rules.ICharacterScanner; import org.eclipse.jface.text.rules.IPredicateRule; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.IToken; import org.eclipse.jface.text.rules.IWordDetector; import org.eclipse.jface.text.rules.MultiLineRule; import org.eclipse.jface.text.rules.RuleBasedScanner; import org.eclipse.jface.text.rules.SingleLineRule; import org.eclipse.jface.text.rules.WhitespaceRule; import org.eclipse.jface.text.rules.WordRule; /** <p>Tokenizes Haskell code into keywords, whitespaces, string and number * literals etc.</p> * * @author Leif Frenzel * @deprecated */ @Deprecated public class HaskellCodeScanner extends RuleBasedScanner implements IEditorPreferenceNames { private final ScannerManager man; /** <p>constructs a new HaskellCodeScanner and specifies the scanning * rules.</p> */ public HaskellCodeScanner( final ScannerManager man, final boolean latexLiterate ) { this.man=man; IToken keywordToken = man.createToken( EDITOR_KEYWORD_COLOR, EDITOR_KEYWORD_BOLD ); IToken stringToken = man.createToken( EDITOR_STRING_COLOR, EDITOR_STRING_BOLD ); IToken commentToken = man.createToken( EDITOR_COMMENT_COLOR, EDITOR_COMMENT_BOLD ); IToken defaultToken = man.createToken( EDITOR_DEFAULT_COLOR, EDITOR_DEFAULT_BOLD ); List<IRule> list = new ArrayList<>(); if( latexLiterate ) { list.add( new LiterateRule() ); } // strings and characters, comments list.add( new SingleLineRule( "\"", "\"", stringToken, '\\' ) ); //$NON-NLS-1$//$NON-NLS-2$ list.add( new EndOfLineRule( "--", commentToken ) ); //$NON-NLS-1$ list.add( new MultiLineRule( "{-", "-}", commentToken ) ); //$NON-NLS-1$//$NON-NLS-2$ // generic whitespace rule list.add( new WhitespaceRule( new WhitespaceDetector() ) ); // word rule for functions list.add( createFunctionRule( defaultToken, keywordToken ) ); // add rule for the special case of the -> keyword list.add( new ArrowRule( keywordToken ) ); applyRulesList( list ); setDefaultReturnToken( defaultToken ); } private WordRule createFunctionRule( final IToken defaultToken, final IToken keywordToken ) { WordRule result = new WordRule( new WordDetector(), defaultToken ); IToken functionToken = man.createToken( EDITOR_FUNCTION_COLOR, EDITOR_FUNCTION_BOLD ); String[] functions = HaskellSyntax.getFunctions(); for( int i = 0; i < functions.length; i++ ) { result.addWord( functions[ i ], functionToken ); } String[] keywords = HaskellSyntax.getKeywords(); for( int i = 0; i < keywords.length; i++ ) { result.addWord( keywords[ i ], keywordToken ); } return result; } private void applyRulesList( final List<IRule> list ) { IRule[] rules = new IRule[ list.size() ]; list.toArray( rules ); setRules( rules ); } // inner classes //////////////// public class LiterateRule extends WordRule implements IPredicateRule { private final IToken successToken; public LiterateRule() { super( new IWordDetector() { @Override public boolean isWordStart( final char c ) { return( c == '\\' ); } @Override public boolean isWordPart( final char c ) { return "\\begin{code}".indexOf( c ) != -1 //$NON-NLS-1$ || "\\end{code}".indexOf( c ) != -1; //$NON-NLS-1$ } } ); this.successToken = man.createToken( EDITOR_COMMENT_COLOR, EDITOR_COMMENT_BOLD ); addWord( "\\begin{code}", successToken ); //$NON-NLS-1$ addWord( "\\end{code}", successToken ); //$NON-NLS-1$ } @Override public IToken evaluate( final ICharacterScanner scanner, final boolean resume ) { return super.evaluate( scanner ); } @Override public IToken getSuccessToken() { return successToken; } } }