-- Copyright (c) Jean-Philippe Bernardy 2008
module Yi.Mode.Compilation where

import Control.Monad
import Control.Lens
import Yi.Core
import Yi.File (editFile)
import Yi.Lexer.Alex (Tok(..), Posn(..))
import Yi.Style
import Yi.Modes (linearSyntaxMode)
import qualified Yi.Lexer.Compilation as Compilation
import qualified Yi.Syntax.OnlineTree as OnlineTree

mode :: Mode (OnlineTree.Tree (Tok Compilation.Token))
mode = (linearSyntaxMode Compilation.initState Compilation.alexScanToken tokenToStyle)
  {
   modeApplies = modeNeverApplies,
   modeName = "compilation",
   modeKeymap = topKeymapA %~ ((spec KEnter ?>>! withSyntax modeFollow) <||),
   modeFollow = YiA . follow
  }
    where tokenToStyle _ = commentStyle
          follow errs = do
              point <- withBuffer pointB
              case OnlineTree.tokAtOrBefore point errs of
                 Just (t@Tok {tokT = Compilation.Report filename line col _message}) -> do
                     withBuffer $ moveTo $ posnOfs $ tokPosn t
                     shiftOtherWindow
                     void $ editFile filename
                     withBuffer $ do
                         void $ gotoLn line
                         rightN col
                 _ -> return ()