Removed some unused functions from RainTypes
This commit is contained in:
parent
4586cdd43a
commit
46aa0383be
|
@ -136,74 +136,6 @@ constantFoldPass = applyDepthM doExpression
|
||||||
doExpression :: A.Expression -> PassM A.Expression
|
doExpression :: A.Expression -> PassM A.Expression
|
||||||
doExpression = (liftM (\(x,_,_) -> x)) . constantFold
|
doExpression = (liftM (\(x,_,_) -> x)) . constantFold
|
||||||
|
|
||||||
-- | Annotates all integer literal types
|
|
||||||
annotateIntLiteralTypes :: Data t => t -> PassM t
|
|
||||||
annotateIntLiteralTypes = applyDepthM doExpression
|
|
||||||
where
|
|
||||||
--Function is separated out to easily provide the type description of Integer
|
|
||||||
powOf2 :: Integer -> Integer
|
|
||||||
powOf2 x = 2 ^ x
|
|
||||||
|
|
||||||
doExpression :: A.Expression -> PassM A.Expression
|
|
||||||
doExpression (A.Literal m t (A.IntLiteral m' s))
|
|
||||||
= do t' <-
|
|
||||||
if (t == A.Int64) then --it's a signed literal
|
|
||||||
(if (n >= powOf2 63 || n < (-(powOf2 63)))
|
|
||||||
then dieP m $ "Signed integer literal too large to fit into 64 bits: " ++ s
|
|
||||||
else
|
|
||||||
if (n < (-(powOf2 31)) || n >= powOf2 31)
|
|
||||||
then return A.Int64
|
|
||||||
else
|
|
||||||
if (n < (-(powOf2 15)) || n >= powOf2 15)
|
|
||||||
then return A.Int32
|
|
||||||
else
|
|
||||||
if (n < (-(powOf2 7)) || n >= powOf2 7)
|
|
||||||
then return A.Int16
|
|
||||||
else return A.Int8
|
|
||||||
)
|
|
||||||
else
|
|
||||||
dieP m $ "Unsigned literals currently unsupported"
|
|
||||||
return $ A.Literal m t' (A.IntLiteral m' s)
|
|
||||||
where
|
|
||||||
n :: Integer
|
|
||||||
n = read s
|
|
||||||
doExpression e = return e
|
|
||||||
|
|
||||||
-- | Annotates all list literals and list ranges with their type
|
|
||||||
annotateListLiteralTypes :: Data t => t -> PassM t
|
|
||||||
annotateListLiteralTypes = applyDepthM doExpression
|
|
||||||
where
|
|
||||||
doExpression :: A.Expression -> PassM A.Expression
|
|
||||||
doExpression (A.Literal m _ (A.ListLiteral m' es))
|
|
||||||
= do ts <- mapM astTypeOf es
|
|
||||||
sharedT <- case (ts, leastGeneralSharedTypeRain ts) of
|
|
||||||
(_, Just t) -> return t
|
|
||||||
([], Nothing) -> return A.Any
|
|
||||||
(_, Nothing) -> diePC m'
|
|
||||||
$ formatCode
|
|
||||||
"Can't determine a common type for the list literal from: %"
|
|
||||||
ts
|
|
||||||
es' <- mapM (coerceIfNecessary sharedT) (zip ts es)
|
|
||||||
return $ A.Literal m (A.List sharedT) $ A.ListLiteral m' es'
|
|
||||||
doExpression (A.ExprConstr m (A.RangeConstr m' t b e))
|
|
||||||
= do bt <- astTypeOf b
|
|
||||||
et <- astTypeOf e
|
|
||||||
sharedT <- case leastGeneralSharedTypeRain [bt, et] of
|
|
||||||
Just t -> return t
|
|
||||||
Nothing -> diePC m'
|
|
||||||
$ formatCode
|
|
||||||
"Can't determine a common type for the range from: % %"
|
|
||||||
bt et
|
|
||||||
b' <- coerceIfNecessary sharedT (bt, b)
|
|
||||||
e' <- coerceIfNecessary sharedT (et, e)
|
|
||||||
return $ A.ExprConstr m $ A.RangeConstr m' (A.List sharedT) b' e'
|
|
||||||
doExpression e = return e
|
|
||||||
|
|
||||||
coerceIfNecessary :: A.Type -> (A.Type, A.Expression) -> PassM A.Expression
|
|
||||||
coerceIfNecessary to (from, e)
|
|
||||||
| to == from = return e
|
|
||||||
| otherwise = coerceType " in list literal" to from e
|
|
||||||
|
|
||||||
-- | A pass that finds all the 'A.ProcCall' and 'A.FunctionCall' in the
|
-- | A pass that finds all the 'A.ProcCall' and 'A.FunctionCall' in the
|
||||||
-- AST, and checks that the actual parameters are valid inputs, given
|
-- AST, and checks that the actual parameters are valid inputs, given
|
||||||
-- the 'A.Formal' parameters in the process's type
|
-- the 'A.Formal' parameters in the process's type
|
||||||
|
@ -237,14 +169,6 @@ markParamPass = checkDepthM2 matchParamPassProc matchParamPassFunc
|
||||||
A.ndType def)
|
A.ndType def)
|
||||||
matchParamPassFunc _ = return ()
|
matchParamPassFunc _ = return ()
|
||||||
|
|
||||||
--Adds a cast between two types if it is safe to do so, otherwise gives an error
|
|
||||||
coerceType :: String -> A.Type -> A.Type -> A.Expression -> PassM A.Expression
|
|
||||||
coerceType customMsg to from item
|
|
||||||
= if isImplicitConversionRain from to
|
|
||||||
then return $ A.Conversion (findMeta item) A.DefaultConversion to item
|
|
||||||
else diePC (findMeta item) $ (liftM concat) $ sequence [formatCode "Could not perform implicit cast from supplied type: % to expected type: %" from to, return customMsg]
|
|
||||||
|
|
||||||
|
|
||||||
-- | Checks the types in expressions
|
-- | Checks the types in expressions
|
||||||
checkExpressionTypes :: Data t => t -> PassM t
|
checkExpressionTypes :: Data t => t -> PassM t
|
||||||
checkExpressionTypes = applyDepthM checkExpression
|
checkExpressionTypes = applyDepthM checkExpression
|
||||||
|
|
Loading…
Reference in New Issue
Block a user