packages feed

dhscanner-kbgen 2.3.0 → 2.4.0

raw patch · 3 files changed

+70/−1 lines, 3 filesdep ~dhscanner-bitcodePVP ok

version bump matches the API change (PVP)

Dependency ranges changed: dhscanner-bitcode

API changes (from Hackage documentation)

+ Kbgen: FieldRead :: Location -> FieldRead
+ Kbgen: FieldReadResolved :: FieldRead -> Resolved -> FieldReadResolved
+ Kbgen: FieldReadResolvedCtor :: FieldReadResolved -> Fact
+ Kbgen: data FieldRead
+ Kbgen: data FieldReadResolved
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.FieldRead
+ Kbgen: instance Data.Aeson.Types.FromJSON.FromJSON Kbgen.FieldReadResolved
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.FieldRead
+ Kbgen: instance Data.Aeson.Types.ToJSON.ToJSON Kbgen.FieldReadResolved
+ Kbgen: instance GHC.Internal.Classes.Eq Kbgen.FieldRead
+ Kbgen: instance GHC.Internal.Classes.Eq Kbgen.FieldReadResolved
+ Kbgen: instance GHC.Internal.Classes.Ord Kbgen.FieldRead
+ Kbgen: instance GHC.Internal.Classes.Ord Kbgen.FieldReadResolved
+ Kbgen: instance GHC.Internal.Generics.Generic Kbgen.FieldRead
+ Kbgen: instance GHC.Internal.Generics.Generic Kbgen.FieldReadResolved
+ Kbgen: instance GHC.Internal.Show.Show Kbgen.FieldRead
+ Kbgen: instance GHC.Internal.Show.Show Kbgen.FieldReadResolved

Files

dhscanner-kbgen.cabal view
@@ -33,7 +33,7 @@         * explain in plain English your query's purpose         * et voilà ! -version:            2.3.0+version:            2.4.0 license:            GPL-3.0-only license-file:       LICENSE author:             OrenGitHub@@ -92,6 +92,7 @@         base,         dhscanner-kbgen,         dhscanner-ast,+        dhscanner-bitcode,         hspec,         QuickCheck 
src/Kbgen.hs view
@@ -110,6 +110,8 @@     MethodName(..),     ResolvedType(..),     CallResolved(..),+    FieldReadResolved(..),+    FieldRead(..),     CalledFrom(..),     AssignedValue(..),     ResolvedSuper(..),@@ -896,6 +898,49 @@ -- This is how the fact will look inside the Prolog file -- -- @+-- kb_field_read_resolved( FieldRead, Fqn ).+-- @+--+-- __When should I use this fact__+--+-- Reading a field of an imported name ( an enum constant, a static+-- field ) carries the resolved fqn of what was read :+--+-- @+-- import org.springframework.web.bind.annotation.RequestMethod;+--+-- \@RequestMapping( method = RequestMethod.GET )+-- public void oidc( ... ) { ... }+-- @+--+-- __Writing a predicate with this fact and others__+--+-- @+-- spring_request_mapping_get( Mapping ) :-+--     kb_keyword_arg_for_call( 'method', FieldRead, Mapping ),+--     kb_field_read_resolved( FieldRead, 'org.springframework.web.bind.annotation.RequestMethod.GET' ).+-- @+--+-- Other facts combined in this example predicate:+--+--     * 'KeywordArgForCall'+--+-- The @FieldRead@ slot is the location of the field read expression,+-- which is also where it shows up as an argument ( 'ArgiForCall',+-- 'KeywordArgForCall' ) or as a dataflow node ( 'DataflowEdge' ).+--+data FieldReadResolved = FieldReadResolved+    FieldRead -- ^+    Resolved -- ^+    deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON )++-- |+--+-- __Name__+--+-- This is how the fact will look inside the Prolog file+--+-- @ -- kb_called_from( Call, Callable ). -- @ --@@ -1290,6 +1335,7 @@  data Arg = Arg Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) data Call = Call Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON )+data FieldRead = FieldRead Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) data Param = Param Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) data Class = Class Location deriving ( Show, Eq, Ord, Generic, ToJSON, FromJSON ) @@ -1346,6 +1392,7 @@    | ConstIntegerCtor ConstInteger    | DataflowEdgeCtor DataflowEdge    | CallResolvedCtor CallResolved+   | FieldReadResolvedCtor FieldReadResolved    | CalledFromCtor CalledFrom    | ConstBoolTrueCtor ConstBoolTrue    | ConstNullCtor ConstNull@@ -1392,6 +1439,7 @@ prologify (ConstIntegerCtor content) = prologify_ConstInteger content prologify (DataflowEdgeCtor content) = prologify_DataflowEdge content prologify (CallResolvedCtor content) = prologify_CallResolved content+prologify (FieldReadResolvedCtor content) = prologify_FieldReadResolved content prologify (CalledFromCtor content) = prologify_CalledFrom content prologify (ConstBoolTrueCtor content) = prologify_ConstBoolTrue content prologify (ConstNullCtor content) = prologify_ConstNull content@@ -1486,6 +1534,12 @@  prologify_CallResolved :: CallResolved -> String prologify_CallResolved (CallResolved (Call call) (Resolved fqn)) = prologify_CallResolved' call fqn++prologify_FieldReadResolved' :: Location -> Fqn.Fqn -> String+prologify_FieldReadResolved' r fqn = printf "kb_field_read_resolved( %s, '%s' )." (locationify r) (quoted (prologifyFqn fqn))++prologify_FieldReadResolved :: FieldReadResolved -> String+prologify_FieldReadResolved (FieldReadResolved (FieldRead r) (Resolved fqn)) = prologify_FieldReadResolved' r fqn  prologify_ConstBoolTrue' :: Location -> String prologify_ConstBoolTrue' trueValue = printf "kb_class_name( %s, \'%s\' )." (locationify trueValue)
test/SmokeTests.hs view
@@ -9,9 +9,12 @@     , ConstNull (..)     , ElsePart (..)     , Fact (..)+    , FieldRead (..)+    , FieldReadResolved (..)     , GatedReturn (..)     , Method (..)     , MethodHasName (..)+    , Resolved (..)     , ReturnedValue (..)     , ThenPart (..)     , TopLevelIfThenElseGadget (..)@@ -19,6 +22,7 @@     , prologify     , restoreloc     )+import qualified Fqn import Location (Location (..)) import qualified Token import Test.Hspec (Spec, hspec, it, shouldBe)@@ -88,6 +92,15 @@         expected = "kb_method_has_name( " ++ locationify methodLoc ++ ", 'oidc' )."     in prologify (MethodHasNameCtor mn) `shouldBe` expected +testPrologifyFieldReadResolved :: IO ()+testPrologifyFieldReadResolved =+    let readLoc = sampleLoc 1+        requestMethod = Fqn.ThirdPartyImport (Fqn.ThirdPartyImportContent "org" ["springframework", "web", "bind", "annotation"] (Just "RequestMethod") Nothing)+        get = Token.FieldName (Token.Named "GET" (sampleLoc 2))+        r = FieldReadResolved (FieldRead readLoc) (Resolved (Fqn.FieldedAccess requestMethod get))+        expected = "kb_field_read_resolved( " ++ locationify readLoc ++ ", 'org.springframework.web.bind.annotation.RequestMethod.GET' )."+    in prologify (FieldReadResolvedCtor r) `shouldBe` expected+ testPrologifyTopLevelIfThenElseGadget :: IO () testPrologifyTopLevelIfThenElseGadget =     let callableLoc = sampleLoc 1@@ -122,6 +135,7 @@     it' testPrologifyConstNull "prologify_ConstNull should render kb_const_null( <loc> )."     it' testPrologifyGatedReturn "prologify_GatedReturn should render kb_gated_return( <cond>, <ret> )."     it' testPrologifyMethodHasName "prologify_MethodHasName should render kb_method_has_name( <method>, '<name>' )."+    it' testPrologifyFieldReadResolved "prologify_FieldReadResolved should render kb_field_read_resolved( <field read>, '<fqn>' )."     it' testPrologifyTopLevelIfThenElseGadget "prologify_TopLevelIfThenElseGadget should render kb_top_level_if_then_else_gadget( <callable>, <cond>, then_part_<cond>, else_part_<cond> )."     it' testPrologifyCallGuardedByCondInThenPart "prologify_CallGuardedByCondInThenPart should render kb_call_guarded_by_cond_in_then_part( <call>, <cond>, then_part_<cond> )."     it' testPrologifyCallGuardedByCondInElsePart "prologify_CallGuardedByCondInElsePart should render kb_call_guarded_by_cond_in_else_part( <call>, <cond>, else_part_<cond> )."