packages feed

ariadne-0.1.2.2: Ariadne.hs

{-# LANGUAGE ViewPatterns, OverloadedStrings #-}
module Main where

import Ariadne.GlobalNameIndex
import Ariadne.Index
import Ariadne.Types
import qualified Ariadne.SrcMap as SrcMap
import Ariadne.ModuleDB

import Language.Haskell.Names
import Language.Haskell.Names.Interfaces
import Language.Haskell.Names.SyntaxUtils
import Language.Haskell.Names.Imports
import qualified Language.Haskell.Names.GlobalSymbolTable as Global
import Language.Haskell.Exts.Annotated hiding (parse)
import Language.Haskell.Exts.Annotated.CPP
import Distribution.HaskellSuite.Packages
import Distribution.Simple.Compiler (PackageDB(..))

import Control.Applicative
import Control.Monad.Trans
import Control.Monad
import Control.Exception
import Control.Monad.State
import Text.Printf
import System.FilePath
import System.Directory
import System.Environment
import qualified Data.Map as Map
import qualified System.Log.Logger as L
import Data.Maybe
import qualified Data.Foldable as F
import Data.Proxy

import Data.BERT
import Network.BERT.Server
import Network.BERT.Transport
import qualified Data.ByteString.Lazy.UTF8 as UTF8

main = do
  lookupEnv "ARIADNE_DEBUG" >>= \v ->
    when (isJust v) $ do
      logger <- L.getRootLogger
      L.updateGlobalLogger L.rootLoggerName (L.setLevel L.DEBUG)

  L.debugM "ariadne" "Ariadne started"

  t <- tcpServer 39014

  withModuleDB $ \mdb -> serve t (dispatch mdb)

  where
    dispatch mdb mod fn args = do
      L.debugM "ariadne.server" $
        printf "request: %s %s %s" mod fn (show args)
      response <- handle mdb mod fn args
      L.debugM "ariadne.server" $
        printf "response: %s" (show response)
      return response
    handle mdb "ariadne" "find" [BinaryTerm file, IntTerm line, IntTerm col] = do
      let filestr = UTF8.toString file
      sendRequestSync mdb (Include filestr)
      answer mdb filestr line col >>= \result -> return . Success $
        case result of
          Nothing -> TupleTerm [AtomTerm "no_name"]
          Just (LocKnown (SrcLoc file' line' col')) ->
            TupleTerm
              [ AtomTerm "loc_known"
              , BinaryTerm (UTF8.fromString file')
              , IntTerm line'
              , IntTerm col'
              ]
          Just (LocUnknown modName) ->
            TupleTerm
              [ AtomTerm "loc_unknown"
              , BinaryTerm (UTF8.fromString modName)
              ]
          Just (ResolveError er) ->
            TupleTerm
              [ AtomTerm "error"
              , BinaryTerm (UTF8.fromString er)
              ]
    handle _ _ _ _ = return NoSuchFunction