{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_HADDOCK show-extensions #-}

-- |
-- Module      :  Yi.Mode.Compilation
-- License     :  GPL-2
-- Maintainer  :  yi-devel@googlegroups.com
-- Stability   :  experimental
-- Portability :  portable
--
-- A 'Mode' for working with buffers showing the results of compilations.
module Yi.Mode.Compilation where

import           Control.Lens         ((%~), (&), (.~))
import           Data.Text            ()
import           Yi.Buffer
import           Yi.Core              (withSyntax)
import           Yi.Editor            (shiftOtherWindow, withCurrentBuffer)
import           Yi.File              (openingNewFile)
import           Yi.Keymap            (Action (YiA), topKeymapA)
import           Yi.Keymap.Keys       (Key (KEnter), spec, (<||), (?>>!))
import           Yi.Lexer.Alex        (Posn (..), Tok (..))
import qualified Yi.Lexer.Compilation as Compilation (Token (Report), lexer)
import           Yi.Modes             (TokenBasedMode, styleMode)
import qualified Yi.Syntax.OnlineTree as OnlineTree (tokAtOrBefore)

mode :: TokenBasedMode Compilation.Token
mode = styleMode Compilation.lexer
  & modeAppliesA .~ modeNeverApplies
  & modeNameA .~ "compilation"
  & modeKeymapA .~ topKeymapA %~ ((spec KEnter ?>>! withSyntax modeFollow) <||)
  & modeFollowA .~ YiA . follow
  where
    follow errs = withCurrentBuffer pointB >>= \point ->
      case OnlineTree.tokAtOrBefore point errs of
        Just t@Tok {tokT = Compilation.Report filename line col _} -> do
          withCurrentBuffer . moveTo . posnOfs $ tokPosn t
          shiftOtherWindow
          openingNewFile filename $ gotoLn line >> rightN col
        _ -> return ()