1
1
mirror of https://github.com/github/semantic.git synced 2024-12-26 16:33:03 +03:00

Streamline the declarations for toc summaries

This commit is contained in:
Timothy Clem 2018-11-08 08:33:26 -08:00
parent d722e04550
commit 57f284f847
6 changed files with 10 additions and 51 deletions

View File

@ -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

View File

@ -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 declarations identifier and type. -- | A declarations 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 youre seeing errors about missing a 'CustomHasDeclaration' instance for a given type, youve probably listed it in here but not defined a 'CustomHasDeclaration' instance for it, or else youve 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 youre seeing errors about missing a 'CustomHasDeclaration' instance for a given type, youve probably listed it in here but not defined a 'CustomHasDeclaration' instance for it, or else youve 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

View File

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

View File

@ -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

View File

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

View File

@ -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