mirror of
https://github.com/github/semantic.git
synced 2024-12-26 00:12:29 +03:00
Streamline the declarations for toc summaries
This commit is contained in:
parent
d722e04550
commit
57f284f847
@ -27,7 +27,7 @@ library
|
|||||||
, Analysis.Abstract.Tracing
|
, Analysis.Abstract.Tracing
|
||||||
, Analysis.ConstructorName
|
, Analysis.ConstructorName
|
||||||
, Analysis.CyclomaticComplexity
|
, Analysis.CyclomaticComplexity
|
||||||
, Analysis.Declaration
|
, Analysis.TOCSummary
|
||||||
, Analysis.Decorator
|
, Analysis.Decorator
|
||||||
, Analysis.HasTextElement
|
, Analysis.HasTextElement
|
||||||
, Analysis.PackageDef
|
, Analysis.PackageDef
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
{-# LANGUAGE RankNTypes, ScopedTypeVariables, TypeFamilies, TypeOperators, UndecidableInstances #-}
|
{-# LANGUAGE RankNTypes, ScopedTypeVariables, TypeFamilies, TypeOperators, UndecidableInstances #-}
|
||||||
module Analysis.Declaration
|
module Analysis.TOCSummary
|
||||||
( Declaration(..)
|
( Declaration(..)
|
||||||
, HasDeclaration
|
, HasDeclaration
|
||||||
, declarationAlgebra
|
, declarationAlgebra
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Prologue hiding (first, project)
|
import Prologue hiding (project)
|
||||||
|
|
||||||
import Control.Arrow hiding (first)
|
|
||||||
import qualified Data.Text as T
|
|
||||||
|
|
||||||
|
import Control.Arrow
|
||||||
import Control.Rewriting hiding (apply)
|
import Control.Rewriting hiding (apply)
|
||||||
import Data.Blob
|
import Data.Blob
|
||||||
import Data.Error (Error (..), showExpectation)
|
import Data.Error (Error (..), showExpectation)
|
||||||
@ -20,15 +18,12 @@ import Data.Source as Source
|
|||||||
import qualified Data.Syntax as Syntax
|
import qualified Data.Syntax as Syntax
|
||||||
import qualified Data.Syntax.Declaration as Declaration
|
import qualified Data.Syntax.Declaration as Declaration
|
||||||
import Data.Term
|
import Data.Term
|
||||||
|
import qualified Data.Text as T
|
||||||
import qualified Language.Markdown.Syntax as Markdown
|
import qualified Language.Markdown.Syntax as Markdown
|
||||||
import qualified Language.Ruby.Syntax as Ruby.Syntax
|
|
||||||
import qualified Language.TypeScript.Syntax as TypeScript.Syntax
|
|
||||||
|
|
||||||
-- | A declaration’s identifier and type.
|
-- | A declaration’s identifier and type.
|
||||||
data Declaration
|
data Declaration
|
||||||
= MethodDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language, declarationReceiver :: Maybe Text }
|
= MethodDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language, declarationReceiver :: Maybe Text }
|
||||||
| ClassDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language }
|
|
||||||
| ModuleDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language }
|
|
||||||
| FunctionDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language }
|
| FunctionDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language }
|
||||||
| HeadingDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language, declarationLevel :: Int }
|
| HeadingDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language, declarationLevel :: Int }
|
||||||
| ErrorDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language }
|
| ErrorDeclaration { declarationIdentifier :: Text, declarationText :: Text, declarationSpan :: Span, declarationLanguage :: Language }
|
||||||
@ -117,27 +112,6 @@ instance CustomHasDeclaration whole Declaration.Method where
|
|||||||
isEmpty = (== 0) . rangeLength . locationByteRange
|
isEmpty = (== 0) . rangeLength . locationByteRange
|
||||||
methodSource = getIdentifier (arr Declaration.methodBody) blob (In ann decl)
|
methodSource = getIdentifier (arr Declaration.methodBody) blob (In ann decl)
|
||||||
|
|
||||||
-- | Produce a 'ClassDeclaration' for 'Declaration.Class' nodes.
|
|
||||||
instance CustomHasDeclaration whole Declaration.Class where
|
|
||||||
customToDeclaration blob@Blob{..} ann decl@(Declaration.Class _ (Term (In identifierAnn _), _) _ _)
|
|
||||||
= Just $ ClassDeclaration (getSource blobSource identifierAnn) classSource (locationSpan ann) blobLanguage
|
|
||||||
where classSource = getIdentifier (arr Declaration.classBody) blob (In ann decl)
|
|
||||||
|
|
||||||
instance CustomHasDeclaration whole Ruby.Syntax.Class where
|
|
||||||
customToDeclaration blob@Blob{..} ann decl@(Ruby.Syntax.Class (Term (In identifierAnn _), _) _ _)
|
|
||||||
= Just $ ClassDeclaration (getSource blobSource identifierAnn) rubyClassSource (locationSpan ann) blobLanguage
|
|
||||||
where rubyClassSource = getIdentifier (arr Ruby.Syntax.classBody) blob (In ann decl)
|
|
||||||
|
|
||||||
instance CustomHasDeclaration whole Ruby.Syntax.Module where
|
|
||||||
customToDeclaration blob@Blob{..} ann decl@(Ruby.Syntax.Module (Term (In identifierAnn _), _) _)
|
|
||||||
= Just $ ModuleDeclaration (getSource blobSource identifierAnn) rubyModuleSource (locationSpan ann) blobLanguage
|
|
||||||
where rubyModuleSource = getIdentifier (arr Ruby.Syntax.moduleStatements >>> first) blob (In ann decl)
|
|
||||||
|
|
||||||
instance CustomHasDeclaration whole TypeScript.Syntax.Module where
|
|
||||||
customToDeclaration blob@Blob{..} ann decl@(TypeScript.Syntax.Module (Term (In identifierAnn _), _) _)
|
|
||||||
= Just $ ModuleDeclaration (getSource blobSource identifierAnn) tsModuleSource (locationSpan ann) blobLanguage
|
|
||||||
where tsModuleSource = getIdentifier (arr TypeScript.Syntax.moduleStatements >>> first) blob (In ann decl)
|
|
||||||
|
|
||||||
-- When encountering a Declaration-annotated term, we need to extract a Text
|
-- When encountering a Declaration-annotated term, we need to extract a Text
|
||||||
-- for the resulting Declaration's 'declarationIdentifier' field. This text
|
-- for the resulting Declaration's 'declarationIdentifier' field. This text
|
||||||
-- is constructed by slicing out text from the original blob corresponding
|
-- is constructed by slicing out text from the original blob corresponding
|
||||||
@ -154,9 +128,6 @@ getIdentifier finder Blob{..} (In a r)
|
|||||||
sliceFrom = T.stripEnd . toText . flip Source.slice blobSource . subtractRange declRange
|
sliceFrom = T.stripEnd . toText . flip Source.slice blobSource . subtractRange declRange
|
||||||
in either (const mempty) sliceFrom bodyRange
|
in either (const mempty) sliceFrom bodyRange
|
||||||
|
|
||||||
first :: Rule env [a] a
|
|
||||||
first = target >>= maybeM (Prologue.fail "empty list") . listToMaybe
|
|
||||||
|
|
||||||
getSource :: Source -> Location -> Text
|
getSource :: Source -> Location -> Text
|
||||||
getSource blobSource = toText . flip Source.slice blobSource . locationByteRange
|
getSource blobSource = toText . flip Source.slice blobSource . locationByteRange
|
||||||
|
|
||||||
@ -181,10 +152,6 @@ class HasDeclarationWithStrategy (strategy :: Strategy) whole syntax where
|
|||||||
--
|
--
|
||||||
-- If you’re seeing errors about missing a 'CustomHasDeclaration' instance for a given type, you’ve probably listed it in here but not defined a 'CustomHasDeclaration' instance for it, or else you’ve listed the wrong type in here. Conversely, if your 'customHasDeclaration' method is never being called, you may have forgotten to list the type in here.
|
-- If you’re seeing errors about missing a 'CustomHasDeclaration' instance for a given type, you’ve probably listed it in here but not defined a 'CustomHasDeclaration' instance for it, or else you’ve listed the wrong type in here. Conversely, if your 'customHasDeclaration' method is never being called, you may have forgotten to list the type in here.
|
||||||
type family DeclarationStrategy syntax where
|
type family DeclarationStrategy syntax where
|
||||||
DeclarationStrategy Declaration.Class = 'Custom
|
|
||||||
DeclarationStrategy Ruby.Syntax.Class = 'Custom
|
|
||||||
DeclarationStrategy Ruby.Syntax.Module = 'Custom
|
|
||||||
DeclarationStrategy TypeScript.Syntax.Module = 'Custom
|
|
||||||
DeclarationStrategy Declaration.Function = 'Custom
|
DeclarationStrategy Declaration.Function = 'Custom
|
||||||
DeclarationStrategy Declaration.Method = 'Custom
|
DeclarationStrategy Declaration.Method = 'Custom
|
||||||
DeclarationStrategy Markdown.Heading = 'Custom
|
DeclarationStrategy Markdown.Heading = 'Custom
|
@ -17,7 +17,7 @@ module Rendering.TOC
|
|||||||
) where
|
) where
|
||||||
|
|
||||||
import Prologue
|
import Prologue
|
||||||
import Analysis.Declaration
|
import Analysis.TOCSummary
|
||||||
import Data.Align (bicrosswalk)
|
import Data.Align (bicrosswalk)
|
||||||
import Data.Aeson
|
import Data.Aeson
|
||||||
import Data.Blob
|
import Data.Blob
|
||||||
@ -151,13 +151,7 @@ renderRPCToCDiff :: (Foldable f, Functor f) => BlobPair -> Diff f (Maybe Declara
|
|||||||
renderRPCToCDiff _ = List.partition isValidSummary . diffTOC
|
renderRPCToCDiff _ = List.partition isValidSummary . diffTOC
|
||||||
|
|
||||||
diffTOC :: (Foldable f, Functor f) => Diff f (Maybe Declaration) (Maybe Declaration) -> [TOCSummary]
|
diffTOC :: (Foldable f, Functor f) => Diff f (Maybe Declaration) (Maybe Declaration) -> [TOCSummary]
|
||||||
diffTOC = fmap entrySummary . dedupe . filter extraDeclarations . tableOfContentsBy declaration
|
diffTOC = fmap entrySummary . dedupe . tableOfContentsBy declaration
|
||||||
where
|
|
||||||
extraDeclarations :: Entry Declaration -> Bool
|
|
||||||
extraDeclarations entry = case entryPayload entry of
|
|
||||||
ClassDeclaration{..} -> False
|
|
||||||
ModuleDeclaration{..} -> False
|
|
||||||
_ -> True
|
|
||||||
|
|
||||||
renderToCTerm :: (Foldable f, Functor f) => Blob -> Term f (Maybe Declaration) -> Summaries
|
renderToCTerm :: (Foldable f, Functor f) => Blob -> Term f (Maybe Declaration) -> Summaries
|
||||||
renderToCTerm Blob{..} = uncurry Summaries . bimap toMap toMap . List.partition isValidSummary . termToC
|
renderToCTerm Blob{..} = uncurry Summaries . bimap toMap toMap . List.partition isValidSummary . termToC
|
||||||
@ -171,8 +165,6 @@ renderToCTerm Blob{..} = uncurry Summaries . bimap toMap toMap . List.partition
|
|||||||
-- The user-facing category name
|
-- The user-facing category name
|
||||||
toCategoryName :: Declaration -> T.Text
|
toCategoryName :: Declaration -> T.Text
|
||||||
toCategoryName declaration = case declaration of
|
toCategoryName declaration = case declaration of
|
||||||
ClassDeclaration{} -> "Class"
|
|
||||||
ModuleDeclaration{} -> "Module"
|
|
||||||
FunctionDeclaration{} -> "Function"
|
FunctionDeclaration{} -> "Function"
|
||||||
MethodDeclaration{} -> "Method"
|
MethodDeclaration{} -> "Method"
|
||||||
HeadingDeclaration _ _ _ _ l -> "Heading " <> T.pack (show l)
|
HeadingDeclaration _ _ _ _ l -> "Heading " <> T.pack (show l)
|
||||||
|
@ -5,7 +5,7 @@ module Semantic.Diff
|
|||||||
) where
|
) where
|
||||||
|
|
||||||
import Analysis.ConstructorName (ConstructorName)
|
import Analysis.ConstructorName (ConstructorName)
|
||||||
import Analysis.Declaration (HasDeclaration, declarationAlgebra)
|
import Analysis.TOCSummary (HasDeclaration, declarationAlgebra)
|
||||||
import Control.Effect
|
import Control.Effect
|
||||||
import Control.Monad.IO.Class
|
import Control.Monad.IO.Class
|
||||||
import Data.Blob
|
import Data.Blob
|
||||||
|
@ -18,7 +18,7 @@ module Data.Functor.Listable
|
|||||||
) where
|
) where
|
||||||
|
|
||||||
import Analysis.CyclomaticComplexity
|
import Analysis.CyclomaticComplexity
|
||||||
import Analysis.Declaration
|
import Analysis.TOCSummary
|
||||||
import Control.Monad.Free as Free
|
import Control.Monad.Free as Free
|
||||||
import Control.Monad.Trans.Free as FreeF
|
import Control.Monad.Trans.Free as FreeF
|
||||||
import Data.ByteString (ByteString)
|
import Data.ByteString (ByteString)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
{-# LANGUAGE DataKinds, MonoLocalBinds, TypeOperators #-}
|
{-# LANGUAGE DataKinds, MonoLocalBinds, TypeOperators #-}
|
||||||
module Rendering.TOC.Spec (spec) where
|
module Rendering.TOC.Spec (spec) where
|
||||||
|
|
||||||
import Analysis.Declaration
|
import Analysis.TOCSummary
|
||||||
import Control.Effect
|
import Control.Effect
|
||||||
import Data.Aeson hiding (defaultOptions)
|
import Data.Aeson hiding (defaultOptions)
|
||||||
import Data.Bifunctor
|
import Data.Bifunctor
|
||||||
|
Loading…
Reference in New Issue
Block a user