dhscanner-kbgen 1.2.0 → 1.3.0
raw patch · 2 files changed
+55/−2 lines, 2 filesdep ~dhscanner-bitcodePVP ok
version bump matches the API change (PVP)
Dependency ranges changed: dhscanner-bitcode
API changes (from Hackage documentation)
+ Kbgen: Comparison :: Cond -> Lhs -> Rhs -> ComparisonOp -> Comparison
+ Kbgen: ComparisonCtor :: Comparison -> Fact
+ Kbgen: ComparisonOp :: String -> ComparisonOp
+ Kbgen: Lhs :: Location -> Lhs
+ Kbgen: Rhs :: Location -> Rhs
+ Kbgen: data Comparison
+ Kbgen: data ComparisonOp
+ Kbgen: data Lhs
+ Kbgen: data Rhs
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.Comparison
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.ComparisonOp
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.Lhs
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.Rhs
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.Comparison
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.ComparisonOp
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.Lhs
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.Rhs
+ Kbgen: instance GHC.Classes.Eq Kbgen.Comparison
+ Kbgen: instance GHC.Classes.Eq Kbgen.ComparisonOp
+ Kbgen: instance GHC.Classes.Eq Kbgen.Lhs
+ Kbgen: instance GHC.Classes.Eq Kbgen.Rhs
+ Kbgen: instance GHC.Classes.Ord Kbgen.Comparison
+ Kbgen: instance GHC.Classes.Ord Kbgen.ComparisonOp
+ Kbgen: instance GHC.Classes.Ord Kbgen.Lhs
+ Kbgen: instance GHC.Classes.Ord Kbgen.Rhs
+ Kbgen: instance GHC.Generics.Generic Kbgen.Comparison
+ Kbgen: instance GHC.Generics.Generic Kbgen.ComparisonOp
+ Kbgen: instance GHC.Generics.Generic Kbgen.Lhs
+ Kbgen: instance GHC.Generics.Generic Kbgen.Rhs
+ Kbgen: instance GHC.Show.Show Kbgen.Comparison
+ Kbgen: instance GHC.Show.Show Kbgen.ComparisonOp
+ Kbgen: instance GHC.Show.Show Kbgen.Lhs
+ Kbgen: instance GHC.Show.Show Kbgen.Rhs
Files
- dhscanner-kbgen.cabal +2/−2
- src/Kbgen.hs +53/−0
dhscanner-kbgen.cabal view
@@ -33,7 +33,7 @@ * explain in plain English your query's purpose * et voilà ! -version: 1.2.0 +version: 1.3.0 license: GPL-3.0-only license-file: LICENSE author: OrenGitHub @@ -63,7 +63,7 @@ containers < 0.7, text, dhscanner-ast >= 1.1.5, - dhscanner-bitcode >= 1.0.17 + dhscanner-bitcode >= 1.1.0 hs-source-dirs: src
src/Kbgen.hs view
@@ -72,9 +72,13 @@ ConstBoolTrue(..), ConstNull(..), GatedReturn(..), + Comparison(..), CallableReturnsValue(..), CallableReturnsWithoutValue(..), Cond(..), + Lhs(..), + Rhs(..), + ComparisonOp(..), ReturnedValue(..), ClassAnnotation, CallableAnnotation, @@ -996,6 +1000,44 @@ -- This is how the fact will look inside the Prolog file -- -- @ +-- kb_comparison( Cond, Lhs, Rhs, Op ). +-- @ +-- +-- __When should I use this fact__ +-- +-- Binary comparison instructions ( currently @==@ \/ @===@ mapped to +-- the Prolog atom @eq@, and @!=@ \/ @!==@ mapped to @neq@ ) fire this +-- fact. The @Cond@ slot is the location of the comparison\'s output +-- variable, which makes composing with 'GatedReturn' straightforward: +-- when the boolean condition of an @if@ that early-returns is itself a +-- comparison, both facts share the same location in the @Cond@ slot. +-- +-- __Writing a predicate with this fact and others__ +-- +-- @ +-- gated_return_on_comparison( Lhs, Rhs, Op, ReturnedValue ) :- +-- kb_gated_return( Cond, ReturnedValue ), +-- kb_comparison( Cond, Lhs, Rhs, Op ). +-- @ +-- +-- Other facts combined in this example predicate: +-- +-- * 'GatedReturn' +-- +data Comparison = Comparison + Cond -- ^ + Lhs -- ^ + Rhs -- ^ + ComparisonOp -- ^ + deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) + +-- | +-- +-- __Name__ +-- +-- This is how the fact will look inside the Prolog file +-- +-- @ -- kb_callable_returns_value( Callable, ReturnedValue ). -- @ -- @@ -1065,6 +1107,9 @@ data AssignedValue = AssignedValue Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) data ConstBoolTrue = ConstBoolTrue Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) data Cond = Cond Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) +data Lhs = Lhs Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) +data Rhs = Rhs Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) +data ComparisonOp = ComparisonOp String deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) data ReturnedValue = ReturnedValue Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) data Keyword = Keyword String deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) @@ -1106,6 +1151,7 @@ | ConstBoolTrueCtor ConstBoolTrue | ConstNullCtor ConstNull | GatedReturnCtor GatedReturn + | ComparisonCtor Comparison | CallableReturnsValueCtor CallableReturnsValue | CallableReturnsWithoutValueCtor CallableReturnsWithoutValue | MethodOfClassCtor MethodOfClass @@ -1145,6 +1191,7 @@ prologify (ConstBoolTrueCtor content) = prologify_ConstBoolTrue content prologify (ConstNullCtor content) = prologify_ConstNull content prologify (GatedReturnCtor content) = prologify_GatedReturn content +prologify (ComparisonCtor content) = prologify_Comparison content prologify (CallableReturnsValueCtor content) = prologify_CallableReturnsValue content prologify (CallableReturnsWithoutValueCtor content) = prologify_CallableReturnsWithoutValue content prologify (MethodOfClassCtor content) = prologify_MethodOfClass content @@ -1239,6 +1286,12 @@ prologify_GatedReturn :: GatedReturn -> String prologify_GatedReturn (GatedReturn (Cond c) (ReturnedValue v)) = prologify_GatedReturn' c v + +prologify_Comparison' :: Location -> Location -> Location -> String -> String +prologify_Comparison' c l r op = printf "kb_comparison( %s, %s, %s, %s )." (locationify c) (locationify l) (locationify r) op + +prologify_Comparison :: Comparison -> String +prologify_Comparison (Comparison (Cond c) (Lhs l) (Rhs r) (ComparisonOp op)) = prologify_Comparison' c l r op prologify_CallableReturnsValue' :: Location -> Location -> String prologify_CallableReturnsValue' c v = printf "kb_callable_returns_value( %s, %s )." (locationify c) (locationify v)