Added an export list to RainTypes, and removed some tests for old passes
This commit is contained in:
parent
f79cba0616
commit
4586cdd43a
|
@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License along
|
||||||
with this program. If not, see <http://www.gnu.org/licenses/>.
|
with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
-}
|
-}
|
||||||
|
|
||||||
module RainTypes where
|
module RainTypes (checkExpressionTypes,constantFoldPass,performTypeUnification,recordInfNameTypes) where
|
||||||
|
|
||||||
import Control.Monad.State
|
import Control.Monad.State
|
||||||
import Data.Generics
|
import Data.Generics
|
||||||
|
|
|
@ -74,78 +74,6 @@ constantFoldTest = TestList
|
||||||
lit :: Integer -> ExprHelper
|
lit :: Integer -> ExprHelper
|
||||||
lit n = Lit $ int64Literal n
|
lit n = Lit $ int64Literal n
|
||||||
|
|
||||||
-- | Tests that integer literals are correctly annotated with the smallest type that can hold them.
|
|
||||||
-- We only test the boundaries between each integer type, but that should suffice.
|
|
||||||
-- TODO was there a reason I didn't test unsigned numbers?
|
|
||||||
annotateIntTest :: Test
|
|
||||||
annotateIntTest = TestList
|
|
||||||
[
|
|
||||||
failSigned (-9223372036854775809)
|
|
||||||
,signed A.Int64 (-9223372036854775808)
|
|
||||||
,signed A.Int64 (-2147483649)
|
|
||||||
,signed A.Int32 (-2147483648)
|
|
||||||
,signed A.Int32 (-32769)
|
|
||||||
,signed A.Int16 (-32768)
|
|
||||||
,signed A.Int16 (-129)
|
|
||||||
,signed A.Int8 (-128)
|
|
||||||
,signed A.Int8 0
|
|
||||||
,signed A.Int8 127
|
|
||||||
,signed A.Int16 128
|
|
||||||
,signed A.Int16 32767
|
|
||||||
,signed A.Int32 32768
|
|
||||||
,signed A.Int32 2147483647
|
|
||||||
,signed A.Int64 2147483648
|
|
||||||
,signed A.Int64 9223372036854775807
|
|
||||||
,failSigned 9223372036854775808
|
|
||||||
]
|
|
||||||
where
|
|
||||||
signed :: A.Type -> Integer -> Test
|
|
||||||
signed t n = TestCase $ testPass ("annotateIntTest: " ++ show n) (tag3 A.Literal DontCare t $ tag2 A.IntLiteral DontCare (show n))
|
|
||||||
(annotateIntLiteralTypes $ int64Literal n) (return ())
|
|
||||||
failSigned :: Integer -> Test
|
|
||||||
failSigned n = TestCase $ testPassShouldFail ("annotateIntTest: " ++ show n) (annotateIntLiteralTypes $ int64Literal n) (return ())
|
|
||||||
|
|
||||||
|
|
||||||
annotateListLiteralTest :: Test
|
|
||||||
annotateListLiteralTest = TestList
|
|
||||||
[
|
|
||||||
testList 0 A.Int32 [int32Literal 0, int32Literal 1]
|
|
||||||
,testList 1 A.Any []
|
|
||||||
,testList 2 A.Int32 [charLiteral 'c', int32Literal 6]
|
|
||||||
,testList 3 A.Int64 [int32Literal 3, int32Literal 5, int64Literal 2,
|
|
||||||
int32Literal 2]
|
|
||||||
-- TODO test with variables (and implicit upcasting)
|
|
||||||
|
|
||||||
-- TODO test the type for lists of lists
|
|
||||||
-- TODO test ranges with variables too
|
|
||||||
,testRange 1000 A.Int32 (int32Literal 0) (int32Literal 1)
|
|
||||||
,testRange 1001 A.Int64 (int32Literal 0) (int64Literal 1)
|
|
||||||
,testRange 1002 A.Int64 (int64Literal 0) (int32Literal 1)
|
|
||||||
,testRange 1003 A.Int32 (charLiteral 'a') (int32Literal 1)
|
|
||||||
,testRange 1004 A.Int32 (int32Literal 0) (charLiteral 'b')
|
|
||||||
,testRange 1005 A.Int64 (charLiteral 'e') (int64Literal 1)
|
|
||||||
,testRange 1006 A.Int64 (int64Literal 0) (charLiteral 'f')
|
|
||||||
,testRange 1007 A.Byte (charLiteral 'd') (charLiteral 'f')
|
|
||||||
]
|
|
||||||
where
|
|
||||||
testList :: Int -> A.Type -> [A.Expression] -> Test
|
|
||||||
testList n t es = TestCase $ testPass ("annotateListLiteralTest: " ++
|
|
||||||
show n) (mLiteral (A.List t) $ mListLiteral $ map (maybeConvert t) es)
|
|
||||||
(annotateListLiteralTypes $ A.Literal emptyMeta A.Any $ A.ListLiteral emptyMeta es)
|
|
||||||
(return ())
|
|
||||||
|
|
||||||
maybeConvert :: A.Type -> A.Expression -> A.Expression
|
|
||||||
maybeConvert t lit@(A.Literal _ lt _)
|
|
||||||
| t == lt = lit
|
|
||||||
| otherwise = A.Conversion emptyMeta A.DefaultConversion t lit
|
|
||||||
|
|
||||||
testRange :: Int -> A.Type -> A.Expression -> A.Expression -> Test
|
|
||||||
testRange n t b e = TestCase $ testPass ("annotateListLiteralTest: "
|
|
||||||
++ show n) (mExprConstr $
|
|
||||||
mRangeConstr (A.List t) (maybeConvert t b) (maybeConvert t e))
|
|
||||||
(annotateListLiteralTypes $ A.ExprConstr emptyMeta $
|
|
||||||
A.RangeConstr emptyMeta A.Any b e)
|
|
||||||
(return ())
|
|
||||||
|
|
||||||
-- | An amazing amount of tests for testing the Rain type-checker for all the different forms of statement,
|
-- | An amazing amount of tests for testing the Rain type-checker for all the different forms of statement,
|
||||||
-- such as assignment, expressions, communications, etc etc.
|
-- such as assignment, expressions, communications, etc etc.
|
||||||
|
@ -520,8 +448,6 @@ ioTests :: IO Test
|
||||||
ioTests = liftM (TestLabel "RainTypesTest" . TestList) $ sequence
|
ioTests = liftM (TestLabel "RainTypesTest" . TestList) $ sequence
|
||||||
[
|
[
|
||||||
return constantFoldTest
|
return constantFoldTest
|
||||||
,return annotateIntTest
|
|
||||||
,return annotateListLiteralTest
|
|
||||||
,return checkExpressionTest
|
,return checkExpressionTest
|
||||||
,return testUnify
|
,return testUnify
|
||||||
,automaticTest FrontendRain "testcases/automatic/unify-types-1.rain.test"
|
,automaticTest FrontendRain "testcases/automatic/unify-types-1.rain.test"
|
||||||
|
|
Loading…
Reference in New Issue
Block a user