packages feed

glean-0.1.0.0: glean/glass/Glean/Glass/Pretty/SCIP.hs

{-
  Copyright (c) Meta Platforms, Inc. and affiliates.
  All rights reserved.

  This source code is licensed under the BSD-style license found in the
  LICENSE file in the root directory of this source tree.
-}

{-# LANGUAGE TypeApplications #-}

module Glean.Glass.Pretty.SCIP ( prettyScipSignature ) where

import Data.Text ( Text )

import qualified Glean
import Glean.Angle as Angle
import Glean.Haxl.Repos as Glean ( RepoHaxl )
import Glean.Glass.Utils ( fetchData )
import Compat.Prettyprinter
  (pretty,
   layoutSmart,
   LayoutOptions,
   SimpleDocStream,
   reAnnotateS)

import qualified Glean.Schema.Scip.Types as Scip
import Glean.Glass.Types ( SymbolId(..) )

prettyScipSignature
  :: LayoutOptions
  -> Scip.SomeEntity
  -> Glean.RepoHaxl u w (Maybe (SimpleDocStream (Maybe SymbolId)))
prettyScipSignature opts (Scip.SomeEntity defn) = do
  text <- fetchData (definitionHover (Glean.getId defn)) -- just first result
  let docStream = layoutSmart opts . pretty <$> text
  return $ reAnnotateS (const Nothing) <$> docStream

definitionHover :: Glean.IdOf Scip.Definition -> Angle Text
definitionHover defnId = vars $ \text docText ->
  text `where_` [
    wild .= predicate @Scip.DefinitionDocumentation (
      rec $
        field @"defn" (asPredicate (factId defnId)) $
        field @"docs" (asPredicate docText)
      end),
    docText .= predicate @Scip.Documentation text

  ]