Fixed arrays of user data types that are arrays to be flattened into a multidimensional array, rather than an array of arrays

This commit is contained in:
Neil Brown 2009-03-27 16:24:15 +00:00
parent 63cb30802e
commit 74e3f61614

View File

@ -32,6 +32,7 @@ import Pass
import qualified Properties as Prop
import Traversal
import Types
import Utils
simplifyTypes :: [Pass]
simplifyTypes
@ -45,13 +46,13 @@ resolveNamedTypes
(Prop.agg_namesDone
++ [Prop.expressionTypesChecked, Prop.processTypesChecked])
[Prop.typesResolvedInAST, Prop.typesResolvedInState]
(\t -> do get >>= resolve >>= resolve_csNames >>= put
resolve t)
(\t -> do get >>= resolve >>= flatten >>= onCsNames (flatten <.< resolve) >>= put
resolve t >>= flatten)
where
-- Work-around for data types not being resolved:
resolve_csNames :: Transform CompState
resolve_csNames cs = do csNames' <- T.mapM resolve $ csNames cs
return $ cs { csNames = csNames' }
onCsNames :: Transform A.NameDef -> Transform CompState
onCsNames f cs = do csNames' <- T.mapM f $ csNames cs
return $ cs { csNames = csNames' }
resolve :: PassType
resolve = applyDepthM doType
@ -59,3 +60,10 @@ resolveNamedTypes
doType :: A.Type -> PassM A.Type
doType t@(A.UserDataType _) = underlyingType emptyMeta t
doType t = return t
flatten :: PassType
flatten = applyDepthM doType
where
doType :: Transform A.Type
doType (A.Array dsA (A.Array dsB t)) = return $ A.Array (dsA++dsB) t
doType t = return t