{-# 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
import           Yi.File (openingNewFile)
import           Yi.Lexer.Alex (Tok(..), Posn(..))
import qualified Yi.Lexer.Compilation as Compilation
import           Yi.Keymap
import           Yi.Keymap.Keys
import           Yi.Modes (styleMode, TokenBasedMode)
import qualified Yi.Syntax.OnlineTree as OnlineTree

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 ()