packages feed

glean-0.2.0.0: glean/lang/flow/Glean/Indexer/Flow.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 ApplicativeDo #-}
module Glean.Indexer.Flow ( indexer ) where

import Options.Applicative

import Glean.Indexer
import Glean.Indexer.External

data Flow = Flow
  { flowBinary :: FilePath
  , flowWriteRoot :: String
  , flowIncludeDirectDeps :: Bool
  , flowIncludeTransitiveDeps :: Bool
  }

options :: Parser Flow
options = do
  flowBinary <- strOption $
    long "flow" <>
    value "flow" <>
    help "path to the flow binary"
  flowWriteRoot <- strOption $ long "write-root" <> value ""
  flowIncludeDirectDeps <- switch (long "include-direct-deps")
  flowIncludeTransitiveDeps <- switch (long "include-transitive-deps")
  return Flow{..}

indexer :: Indexer Flow
indexer = Indexer {
  indexerShortName = "flow",
  indexerDescription = "Index JS/Flow code",
  indexerOptParser = options,
  indexerRun = \Flow{..} -> do
    let ext = Ext {
          extRunScript = flowBinary,
          extFlavour = Json,
          extArgs =
            [ "glean"
            , "${TEST_ROOT}"
            , "--output-dir"
            , "${JSON_BATCH_DIR}"
            , "--write-root"
            , flowWriteRoot
            ] ++
            [ "--include-direct-deps" | flowIncludeDirectDeps] ++
            [ "--include-transitive-deps" | flowIncludeTransitiveDeps],
          extDerivePredicates =
            [ "flow.StringToFileModule"
            , "flow.FileXRef"
            , "flow.FileDeclaration"
            , "flow.FlowEntityImportUses"
            , "flow.FlowTypeEntityImportUses"
            , "flow.ModuleContains"
            , "flow.ModuleComments"

              -- possibly deprecated
            , "flow.ModuleNameLowerCase"

            -- new search predicates
            , "flow.SearchDeclarationByName"
            , "flow.SearchDeclarationByLowerCaseName"
            , "flow.SearchMemberDeclarationByName"
            , "flow.SearchMemberDeclarationByLowerCaseName"
            , "flow.SearchTypeDeclarationByName"
            , "flow.SearchTypeDeclarationByLowerCaseName"
            , "flow.SearchModuleByLowerCaseName"
            ],
            extAllowNonZeroExit = False
        }
    indexerRun externalIndexer ext
  }