1
1
mirror of https://github.com/github/semantic.git synced 2024-12-21 05:41:54 +03:00

Split up Comparison

This commit is contained in:
joshvera 2018-06-21 15:59:09 -04:00
parent 493399c74e
commit 9b49cef5b4
5 changed files with 102 additions and 17 deletions

View File

@ -22,14 +22,83 @@ instance Evaluatable Call where
op <- subtermValue callFunction op <- subtermValue callFunction
Rval <$> call op (map subtermAddress callParams) Rval <$> call op (map subtermAddress callParams)
data Comparison a data LessThan a = LessThan { lhs :: a, rhs :: a }
= LessThan !a !a deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Mergeable, Ord, Show, ToJSONFields1, Traversable, Named1, Message1)
| LessThanEqual !a !a
| GreaterThan !a !a instance Eq1 LessThan where liftEq = genericLiftEq
| GreaterThanEqual !a !a instance Ord1 LessThan where liftCompare = genericLiftCompare
| Equal !a !a instance Show1 LessThan where liftShowsPrec = genericLiftShowsPrec
| StrictEqual !a !a
| Comparison !a !a instance Evaluatable LessThan where
eval t = rvalBox =<< (traverse subtermValue t >>= go) where
go x = case x of
(LessThan a b) -> liftComparison (Concrete (<)) a b
data LessThanEqual a = LessThanEqual { lhs :: a, rhs :: a }
deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Mergeable, Ord, Show, ToJSONFields1, Traversable, Named1, Message1)
instance Eq1 LessThanEqual where liftEq = genericLiftEq
instance Ord1 LessThanEqual where liftCompare = genericLiftCompare
instance Show1 LessThanEqual where liftShowsPrec = genericLiftShowsPrec
instance Evaluatable LessThanEqual where
eval t = rvalBox =<< (traverse subtermValue t >>= go) where
go x = case x of
(LessThanEqual a b) -> liftComparison (Concrete (<=)) a b
data GreaterThan a = GreaterThan { lhs :: a, rhs :: a }
deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Mergeable, Ord, Show, ToJSONFields1, Traversable, Named1, Message1)
instance Eq1 GreaterThan where liftEq = genericLiftEq
instance Ord1 GreaterThan where liftCompare = genericLiftCompare
instance Show1 GreaterThan where liftShowsPrec = genericLiftShowsPrec
instance Evaluatable GreaterThan where
eval t = rvalBox =<< (traverse subtermValue t >>= go) where
go x = case x of
(GreaterThan a b) -> liftComparison (Concrete (>)) a b
data GreaterThanEqual a = GreaterThanEqual { lhs :: a, rhs :: a }
deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Mergeable, Ord, Show, ToJSONFields1, Traversable, Named1, Message1)
instance Eq1 GreaterThanEqual where liftEq = genericLiftEq
instance Ord1 GreaterThanEqual where liftCompare = genericLiftCompare
instance Show1 GreaterThanEqual where liftShowsPrec = genericLiftShowsPrec
instance Evaluatable GreaterThanEqual where
eval t = rvalBox =<< (traverse subtermValue t >>= go) where
go x = case x of
(GreaterThanEqual a b) -> liftComparison (Concrete (>=)) a b
data Equal a = Equal { lhs :: a, rhs :: a }
deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Mergeable, Ord, Show, ToJSONFields1, Traversable, Named1, Message1)
instance Eq1 Equal where liftEq = genericLiftEq
instance Ord1 Equal where liftCompare = genericLiftCompare
instance Show1 Equal where liftShowsPrec = genericLiftShowsPrec
instance Evaluatable Equal where
eval t = rvalBox =<< (traverse subtermValue t >>= go) where
go x = case x of
-- TODO: in PHP and JavaScript, the equals operator performs type coercion.
-- We need some mechanism to customize this behavior per-language.
(Equal a b) -> liftComparison (Concrete (==)) a b
data StrictEqual a = StrictEqual { lhs :: a, rhs :: a }
deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Mergeable, Ord, Show, ToJSONFields1, Traversable, Named1, Message1)
instance Eq1 StrictEqual where liftEq = genericLiftEq
instance Ord1 StrictEqual where liftCompare = genericLiftCompare
instance Show1 StrictEqual where liftShowsPrec = genericLiftShowsPrec
instance Evaluatable StrictEqual where
eval t = rvalBox =<< (traverse subtermValue t >>= go) where
go x = case x of
-- TODO: in PHP and JavaScript, the equals operator performs type coercion.
-- We need some mechanism to customize this behavior per-language.
(StrictEqual a b) -> liftComparison (Concrete (==)) a b
data Comparison a = Comparison { lhs :: a, rhs :: a }
deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Mergeable, Ord, Show, ToJSONFields1, Traversable, Named1, Message1) deriving (Declarations1, Diffable, Eq, Foldable, FreeVariables1, Functor, Generic1, Hashable1, Mergeable, Ord, Show, ToJSONFields1, Traversable, Named1, Message1)
instance Eq1 Comparison where liftEq = genericLiftEq instance Eq1 Comparison where liftEq = genericLiftEq
@ -39,15 +108,7 @@ instance Show1 Comparison where liftShowsPrec = genericLiftShowsPrec
instance Evaluatable Comparison where instance Evaluatable Comparison where
eval t = rvalBox =<< (traverse subtermValue t >>= go) where eval t = rvalBox =<< (traverse subtermValue t >>= go) where
go x = case x of go x = case x of
(LessThan a b) -> liftComparison (Concrete (<)) a b (Comparison a b) -> liftComparison (Concrete (==)) a b
(LessThanEqual a b) -> liftComparison (Concrete (<=)) a b
(GreaterThan a b) -> liftComparison (Concrete (>)) a b
(GreaterThanEqual a b) -> liftComparison (Concrete (>=)) a b
-- TODO: in PHP and JavaScript, the equals operator performs type coercion.
-- We need some mechanism to customize this behavior per-language.
(Equal a b) -> liftComparison (Concrete (==)) a b
(StrictEqual a b) -> liftComparison (Concrete (==)) a b
(Comparison a b) -> liftComparison Generalized a b
-- | Binary arithmetic operators. -- | Binary arithmetic operators.
data Arithmetic a data Arithmetic a

View File

@ -36,6 +36,12 @@ type Syntax =
, Declaration.VariableDeclaration , Declaration.VariableDeclaration
, Expression.Arithmetic , Expression.Arithmetic
, Expression.Call , Expression.Call
, Expression.LessThan
, Expression.LessThanEqual
, Expression.GreaterThan
, Expression.GreaterThanEqual
, Expression.Equal
, Expression.StrictEqual
, Expression.Comparison , Expression.Comparison
, Expression.BOr , Expression.BOr
, Expression.BXOr , Expression.BXOr

View File

@ -53,6 +53,12 @@ type Syntax = '[
, Expression.XOr , Expression.XOr
, Expression.Call , Expression.Call
, Expression.Cast , Expression.Cast
, Expression.LessThan
, Expression.LessThanEqual
, Expression.GreaterThan
, Expression.GreaterThanEqual
, Expression.Equal
, Expression.StrictEqual
, Expression.Comparison , Expression.Comparison
, Expression.InstanceOf , Expression.InstanceOf
, Expression.MemberAccess , Expression.MemberAccess

View File

@ -60,6 +60,12 @@ type Syntax =
, Expression.RShift , Expression.RShift
, Expression.Complement , Expression.Complement
, Expression.Call , Expression.Call
, Expression.LessThan
, Expression.LessThanEqual
, Expression.GreaterThan
, Expression.GreaterThanEqual
, Expression.Equal
, Expression.StrictEqual
, Expression.Comparison , Expression.Comparison
, Expression.Enumeration , Expression.Enumeration
, Expression.ScopeResolution , Expression.ScopeResolution

View File

@ -61,6 +61,12 @@ type Syntax = '[
, Expression.XOr , Expression.XOr
, Expression.Call , Expression.Call
, Expression.Cast , Expression.Cast
, Expression.LessThan
, Expression.LessThanEqual
, Expression.GreaterThan
, Expression.GreaterThanEqual
, Expression.Equal
, Expression.StrictEqual
, Expression.Comparison , Expression.Comparison
, Expression.Enumeration , Expression.Enumeration
, Expression.MemberAccess , Expression.MemberAccess