2016-01-05 19:27:37 +03:00
|
|
|
module Main where
|
|
|
|
|
2018-03-13 21:14:55 +03:00
|
|
|
import qualified Analysis.Go.Spec
|
2018-03-20 00:42:00 +03:00
|
|
|
import qualified Analysis.PHP.Spec
|
2018-03-10 02:16:07 +03:00
|
|
|
import qualified Analysis.Python.Spec
|
2018-03-14 02:19:26 +03:00
|
|
|
import qualified Analysis.Ruby.Spec
|
2018-03-10 03:24:32 +03:00
|
|
|
import qualified Analysis.TypeScript.Spec
|
2017-11-27 21:47:04 +03:00
|
|
|
import qualified Assigning.Assignment.Spec
|
2018-05-07 21:21:05 +03:00
|
|
|
import qualified Control.Abstract.Evaluator.Spec
|
2018-09-14 20:08:08 +03:00
|
|
|
import qualified Control.Rewriting.Spec
|
2017-11-27 21:59:44 +03:00
|
|
|
import qualified Data.Diff.Spec
|
2018-10-31 20:19:43 +03:00
|
|
|
import qualified Data.Abstract.Name.Spec
|
2018-04-18 00:13:01 +03:00
|
|
|
import qualified Data.Abstract.Path.Spec
|
2017-11-30 18:24:48 +03:00
|
|
|
import qualified Data.Functor.Classes.Generic.Spec
|
2018-10-31 19:20:38 +03:00
|
|
|
import qualified Data.Graph.Spec
|
2018-10-31 19:46:52 +03:00
|
|
|
import qualified Data.Range.Spec
|
2018-04-04 00:02:56 +03:00
|
|
|
import qualified Data.Scientific.Spec
|
2018-10-31 22:47:30 +03:00
|
|
|
import qualified Data.Semigroup.App.Spec
|
2017-11-27 21:49:52 +03:00
|
|
|
import qualified Data.Source.Spec
|
2017-11-27 22:02:03 +03:00
|
|
|
import qualified Data.Term.Spec
|
2017-11-27 21:48:43 +03:00
|
|
|
import qualified Diffing.Algorithm.RWS.Spec
|
2017-11-27 21:51:05 +03:00
|
|
|
import qualified Diffing.Algorithm.SES.Spec
|
2017-11-27 22:03:45 +03:00
|
|
|
import qualified Diffing.Interpreter.Spec
|
2018-07-16 18:07:40 +03:00
|
|
|
import qualified Graphing.Calls.Spec
|
2017-11-27 22:06:12 +03:00
|
|
|
import qualified Integration.Spec
|
2018-03-27 23:14:30 +03:00
|
|
|
import qualified Matching.Go.Spec
|
Give Control.Matching API better ergonomics.
Given that @tclem and I have found the matcher API frustrating, I've
taken a stab at improving its ergonomics, and I've found some success
in separating composition of matchers from predicate-based narrowing
thereof.
The biggest change here is the elimination of the old `match`
combinator, which proved to be clumsy in that it complected narrowing
and composition. Top-down matching combinators are now written with
the `need` combinator and the `>>>` combinator, which is more readable
and more versatile. Here's a matcher that accepts functions with
Python docstrings:
```haskell
docstringMatcher :: ( Decl.Function :< fs
, [] :< fs
, Lit.TextElement :< fs
, term ~ Term (Sum fs) ann
) => Matcher term term
docstringMatcher = target <*
(need Decl.functionBody
>>> narrow @[]
>>> mhead
>>> narrow @Lit.TextElement
>>> ensure Lit.isTripleQuoted))
```
Pretty readable, right? Each step of the tree regular expression -
choosing function bodies, ensuring said bodies are lists, examining
the first element, and choosing only TextElements containing
triple-quoted strings - is made implicit. The old way would have
looked something like this:
```haskell
docstringMatcher = target <* match Decl.functionBody
$ narrow
$ matchM listToMaybe
$ target <* ensure Lit.isTripleQuoted
```
which is a good deal more disorganized and less flexible
in the quite-common case of applying functions during a
matching pass. Separating the act of composition from
function application is a big win here.
Further comments are inline.
2018-11-03 02:25:29 +03:00
|
|
|
import qualified Matching.Python.Spec
|
2018-06-25 18:55:32 +03:00
|
|
|
import qualified Numeric.Spec
|
2017-11-27 22:04:58 +03:00
|
|
|
import qualified Rendering.TOC.Spec
|
2018-07-31 19:44:20 +03:00
|
|
|
import qualified Reprinting.Spec
|
2018-11-02 23:55:30 +03:00
|
|
|
import qualified Tags.Spec
|
2017-11-27 22:00:53 +03:00
|
|
|
import qualified Semantic.Spec
|
2017-11-27 21:57:25 +03:00
|
|
|
import qualified Semantic.CLI.Spec
|
2017-11-27 21:52:48 +03:00
|
|
|
import qualified Semantic.IO.Spec
|
2017-11-27 21:58:23 +03:00
|
|
|
import qualified Semantic.Stat.Spec
|
2018-07-10 21:17:56 +03:00
|
|
|
import Semantic.Config (defaultOptions)
|
|
|
|
import Semantic.Task (withOptions)
|
2018-07-10 21:09:02 +03:00
|
|
|
import Semantic.Util (TaskConfig(..))
|
2018-06-05 19:51:23 +03:00
|
|
|
import qualified Proto3.Roundtrip
|
2016-01-05 19:27:37 +03:00
|
|
|
import Test.Hspec
|
|
|
|
|
|
|
|
main :: IO ()
|
2018-07-09 21:26:15 +03:00
|
|
|
main = do
|
2018-07-10 21:16:51 +03:00
|
|
|
withOptions defaultOptions $ \ config logger statter -> hspec $ do
|
2018-07-10 20:49:34 +03:00
|
|
|
let args = TaskConfig config logger statter
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Semantic.Stat" Semantic.Stat.Spec.spec
|
|
|
|
parallel $ do
|
2018-07-10 21:09:22 +03:00
|
|
|
describe "Analysis.Go" (Analysis.Go.Spec.spec args)
|
|
|
|
describe "Analysis.PHP" (Analysis.PHP.Spec.spec args)
|
|
|
|
describe "Analysis.Python" (Analysis.Python.Spec.spec args)
|
|
|
|
describe "Analysis.Ruby" (Analysis.Ruby.Spec.spec args)
|
|
|
|
describe "Analysis.TypeScript" (Analysis.TypeScript.Spec.spec args)
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Assigning.Assignment" Assigning.Assignment.Spec.spec
|
|
|
|
describe "Control.Abstract.Evaluator" Control.Abstract.Evaluator.Spec.spec
|
2018-09-14 20:08:08 +03:00
|
|
|
describe "Control.Rewriting.Spec" Control.Rewriting.Spec.spec
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Data.Diff" Data.Diff.Spec.spec
|
2018-10-31 19:20:38 +03:00
|
|
|
describe "Data.Graph" Data.Graph.Spec.spec
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Data.Abstract.Path" Data.Abstract.Path.Spec.spec
|
2018-10-31 20:19:43 +03:00
|
|
|
describe "Data.Abstract.Name" Data.Abstract.Name.Spec.spec
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Data.Functor.Classes.Generic" Data.Functor.Classes.Generic.Spec.spec
|
2018-10-31 19:46:52 +03:00
|
|
|
describe "Data.Range" Data.Range.Spec.spec
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Data.Scientific" Data.Scientific.Spec.spec
|
2018-10-31 22:47:30 +03:00
|
|
|
describe "Data.Semigroup.App" Data.Semigroup.App.Spec.spec
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Data.Source" Data.Source.Spec.spec
|
|
|
|
describe "Data.Term" Data.Term.Spec.spec
|
|
|
|
describe "Diffing.Algorithm.RWS" Diffing.Algorithm.RWS.Spec.spec
|
|
|
|
describe "Diffing.Algorithm.SES" Diffing.Algorithm.SES.Spec.spec
|
|
|
|
describe "Diffing.Interpreter" Diffing.Interpreter.Spec.spec
|
2018-07-16 18:07:40 +03:00
|
|
|
describe "Graphing.Calls" Graphing.Calls.Spec.spec
|
Give Control.Matching API better ergonomics.
Given that @tclem and I have found the matcher API frustrating, I've
taken a stab at improving its ergonomics, and I've found some success
in separating composition of matchers from predicate-based narrowing
thereof.
The biggest change here is the elimination of the old `match`
combinator, which proved to be clumsy in that it complected narrowing
and composition. Top-down matching combinators are now written with
the `need` combinator and the `>>>` combinator, which is more readable
and more versatile. Here's a matcher that accepts functions with
Python docstrings:
```haskell
docstringMatcher :: ( Decl.Function :< fs
, [] :< fs
, Lit.TextElement :< fs
, term ~ Term (Sum fs) ann
) => Matcher term term
docstringMatcher = target <*
(need Decl.functionBody
>>> narrow @[]
>>> mhead
>>> narrow @Lit.TextElement
>>> ensure Lit.isTripleQuoted))
```
Pretty readable, right? Each step of the tree regular expression -
choosing function bodies, ensuring said bodies are lists, examining
the first element, and choosing only TextElements containing
triple-quoted strings - is made implicit. The old way would have
looked something like this:
```haskell
docstringMatcher = target <* match Decl.functionBody
$ narrow
$ matchM listToMaybe
$ target <* ensure Lit.isTripleQuoted
```
which is a good deal more disorganized and less flexible
in the quite-common case of applying functions during a
matching pass. Separating the act of composition from
function application is a big win here.
Further comments are inline.
2018-11-03 02:25:29 +03:00
|
|
|
describe "Matching.Go" Matching.Go.Spec.spec
|
|
|
|
describe "Matching.Python" Matching.Python.Spec.spec
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Numeric" Numeric.Spec.spec
|
|
|
|
describe "Rendering.TOC" Rendering.TOC.Spec.spec
|
2018-07-31 19:44:20 +03:00
|
|
|
describe "Reprinting.Spec" Reprinting.Spec.spec
|
2018-11-02 23:55:30 +03:00
|
|
|
describe "Tags.Spec" Tags.Spec.spec
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Semantic" Semantic.Spec.spec
|
|
|
|
describe "Semantic.CLI" Semantic.CLI.Spec.spec
|
|
|
|
describe "Semantic.IO" Semantic.IO.Spec.spec
|
2018-07-10 20:49:34 +03:00
|
|
|
describe "Integration" (Integration.Spec.spec args)
|
2018-07-09 21:26:15 +03:00
|
|
|
describe "Protobuf roundtripping" Proto3.Roundtrip.spec
|