/** * (c) 2011, Alejandro Serrano * Released under the terms of the EPL. */ package net.sf.eclipsefp.haskell.ui.internal.editors.partitioned; import net.sf.eclipsefp.haskell.core.codeassist.ITokenTypes; import net.sf.eclipsefp.haskell.ui.internal.editors.haskell.text.ScionTokenScanner; import org.eclipse.core.resources.IFile; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.presentation.IPresentationReconciler; import org.eclipse.jface.text.presentation.PresentationReconciler; import org.eclipse.jface.text.rules.DefaultDamagerRepairer; import org.eclipse.jface.text.rules.EndOfLineRule; import org.eclipse.jface.text.rules.IRule; import org.eclipse.jface.text.rules.ITokenScanner; import org.eclipse.jface.text.rules.PatternRule; import org.eclipse.jface.text.rules.RuleBasedScanner; import org.eclipse.jface.text.rules.WordPatternRule; import org.eclipse.jface.text.rules.WordRule; import org.eclipse.jface.text.source.ISourceViewer; /** * Configures highlighting for Alex lexers. * @author Alejandro Serrano * */ public class AlexSourceViewerConfiguration extends PartitionSourceViewerConfiguration { /** * The constructor * * @param editor * The associated Haskell editor */ public AlexSourceViewerConfiguration( final PartitionEditor editor ) { super( editor ); } @Override public IPresentationReconciler getPresentationReconciler( final ISourceViewer viewer ) { PresentationReconciler reconciler = new PresentationReconciler(); reconciler.setDocumentPartitioning( PartitionDocumentSetup.PARTITIONING ); IFile file = ( editor != null ? editor.findFile() : null ); ScionTokenScanner codeScanner = new ScionTokenScanner( getScannerManager(), file); DefaultDamagerRepairer haskellDr = new DefaultDamagerRepairer( codeScanner ); reconciler.setDamager( haskellDr, PartitionDocumentSetup.HASKELL ); reconciler.setRepairer( haskellDr, PartitionDocumentSetup.HASKELL ); DefaultDamagerRepairer alexDr = new DefaultDamagerRepairer( createAlexScanner() ); reconciler.setDamager( alexDr, IDocument.DEFAULT_CONTENT_TYPE ); reconciler.setRepairer( alexDr, IDocument.DEFAULT_CONTENT_TYPE ); if (editor!=null){ editor.setTokenScanner( codeScanner ); } return reconciler; } private ITokenScanner createAlexScanner() { RuleBasedScanner scanner = new RuleBasedScanner(); // Patterns WordPatternRule dollarVars = new WordPatternRule( KeywordDetector.NO_DIGIT_AT_START_DETECTOR, "$", "", tokenByTypes.get( ITokenTypes.PREPROCESSOR_TEXT ) ); WordPatternRule atVars = new WordPatternRule( KeywordDetector.NO_DIGIT_AT_START_DETECTOR, "@", "", tokenByTypes.get( ITokenTypes.PREPROCESSOR_TEXT ) ); PatternRule startCodes = new PatternRule( "<", ">", tokenByTypes.get( ITokenTypes.IDENTIFIER_CONSTRUCTOR ), '\\', true ); PatternRule regexSet = new PatternRule( "[", "]", tokenByTypes.get( ITokenTypes.LITERAL_CHAR ), '\\', true ); PatternRule string = new PatternRule( "\"", "\"", tokenByTypes.get( ITokenTypes.LITERAL_STRING ), '\\', true ); EndOfLineRule comment = new EndOfLineRule( "-- ", tokenByTypes.get( ITokenTypes.LITERATE_COMMENT ) ); // Single words WordRule colon = createRuleForToken( ";", ITokenTypes.SYMBOL_RESERVED ); WordRule pre = createRuleForToken( "^", ITokenTypes.SYMBOL_RESERVED ); WordRule post = createRuleForToken( "/", ITokenTypes.SYMBOL_RESERVED ); WordRule empty = createRuleForToken( "$", ITokenTypes.SYMBOL_RESERVED ); WordRule startRules = createRuleForToken( ":-", ITokenTypes.SYMBOL_RESERVED ); WordRule equals = createRuleForToken( "=", ITokenTypes.SYMBOL_RESERVED ); WordRule pipe = createRuleForToken( "|", ITokenTypes.SYMBOL_RESERVED ); WordRule wrapper = createRuleForToken( "%wrapper", ITokenTypes.KEYWORD ); scanner.setRules( new IRule[] { dollarVars, atVars, startCodes, regexSet, string, comment, colon, pre, post, empty, startRules, equals, pipe, wrapper } ); return scanner; } }