OpDecl.hs revision eee1316a9384b10682c998bd4b62b4a5ca2ce820
a530dde7009b0a808300c420def741354a4d13d2Martin Kühl Authors: Christian Maeder
18328fcbfe4296582227d42fdcf363f5a0fb8921Martin Kühl analyse op decls
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühlimport qualified Common.Lib.Map as Map
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin KühlposOfOpId :: OpId -> Pos
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin KühlposOfOpId (OpId i _ _) = posOfId i
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin KühlanaOpItem :: OpItem -> State Env ()
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin KühlanaOpItem (OpDecl is sc attr _) =
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl mapM_ (anaOpId sc attr) is
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin KühlanaOpItem (OpDefn o pats sc partial trm ps) =
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin Kühl do let newTrm = if null pats then trm else
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl LambdaTerm pats partial trm ps
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl (i, newSc) <- getUninstOpId sc o
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin Kühl Result ds mt <- resolveTerm newTrm
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl appendDiags ds
0e9a56585859610db38a1f900d87ee8680ced4d0Martin Kühl Just t -> addOpId i newSc [] $ Definition t
0e9a56585859610db38a1f900d87ee8680ced4d0Martin Kühl _ -> return ()
6f6549c13f912de12345850e4eb248ec358c1b43Adrián RiescogetUninstOpId :: TypeScheme -> OpId -> State Env (UninstOpId, TypeScheme)
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin KühlgetUninstOpId (TypeScheme tvs q ps) (OpId i args _) =
18328fcbfe4296582227d42fdcf363f5a0fb8921Martin Kühl do let newArgs = args ++ tvs
3f9cd04710597ee787032a371f33861640ab2abeAdrián Riesco sc = TypeScheme newArgs q ps
521e1648b2c66064c41e9ac47bcd510356ed2355Adrián Riesco appendDiags $ checkDifferentTypeArgs newArgs
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl (k, newSc) <- anaTypeScheme sc
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl checkKindsS (posOfId i) k star
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl return (i, newSc)
521e1648b2c66064c41e9ac47bcd510356ed2355Adrián RiescoanaOpId :: TypeScheme -> [OpAttr] -> OpId -> State Env ()
1a38107941725211e7c3f051f7a8f5e12199f03acmaederanaOpId sc attrs o =
3f9cd04710597ee787032a371f33861640ab2abeAdrián Riesco do (i, newSc) <- getUninstOpId sc o
c71a28752b8269572ba1de2e2230bb97a4dde6eaMartin Kühl addOpId i newSc attrs NoOpDefn
6858f9c9c8b077b2b574a9f30753cf5fec8124d6Martin KühlanaTypeScheme :: TypeScheme -> State Env (Kind, TypeScheme)
c71a28752b8269572ba1de2e2230bb97a4dde6eaMartin KühlanaTypeScheme (TypeScheme tArgs (q :=> ty) p) =
18328fcbfe4296582227d42fdcf363f5a0fb8921Martin Kühl do tm <- gets typeMap -- save global variables
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco mapM_ anaTypeVarDecl tArgs
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl (ik, newTy) <- anaTypeS (star, ty)
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl let newPty = TypeScheme tArgs (q :=> newTy) p
e368ae35ce99348be3de4181acd7a6f4ce03fe0cChristian Maeder putTypeMap tm -- forget local variables
d021fa76efedeeb63529a82dd1cfd81911f4d03eChristian Maeder return (ik, newPty)
b92e4eba198fcbffab302375b6c3527a8492bc66Adrián RiescocheckDifferentTypeArgs :: [TypeArg] -> [Diagnosis]
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin KühlcheckDifferentTypeArgs l =
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin Kühl let v = map (\ (TypeArg i _ _ _) -> i) l
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin Kühl vd = filter ( not . null . tail) $ group $ sort v
6858f9c9c8b077b2b574a9f30753cf5fec8124d6Martin Kühl in map ( \ vs -> mkDiag Error ("duplicate ids at '" ++
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl showSepList (showString " ") shortPosShow
6f6549c13f912de12345850e4eb248ec358c1b43Adrián Riesco (map posOfId (tail vs)) "'"
8d9ff304e4ec23e883f4ed22b95e054d80c7fd70Martin Kühl ++ " for") (head vs)) vd
973f776b7e2729a4d87a4f2a657d037129b6d700Martin KühlshortPosShow :: Pos -> ShowS
b22baa863f0a8bd4ac32a3e5fa7b476fc5aa78fdMartin KühlshortPosShow p = showParen True (shows (sourceLine p) . showString "," .
93da827a79b9d7122ed9bb5636a62bae43565b21Adrián Riesco shows (sourceColumn p))
18328fcbfe4296582227d42fdcf363f5a0fb8921Martin KühladdOpId :: UninstOpId -> TypeScheme -> [OpAttr] -> OpDefn -> State Env ()
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin KühladdOpId i sc attrs defn =
d021fa76efedeeb63529a82dd1cfd81911f4d03eChristian Maeder do as <- gets assumps
18328fcbfe4296582227d42fdcf363f5a0fb8921Martin Kühl if sc `elem` map opType l then
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin Kühl addDiag $ mkDiag Warning
6f6549c13f912de12345850e4eb248ec358c1b43Adrián Riesco "repeated value" i
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin Kühl else do bs <- mapM (unifiable sc) $ map opType l
3c8734f5b76d06ed1eae114c67e77066acb6a40bMartin Kühl if or bs then addDiag $ mkDiag Error
6d498b6f56ed9f71cced898b6c42fb48f6e60583Adrián Riesco "illegal overloading of" i
d021fa76efedeeb63529a82dd1cfd81911f4d03eChristian Maeder else putAssumps $ Map.insert i
d021fa76efedeeb63529a82dd1cfd81911f4d03eChristian Maeder (OpInfo sc attrs defn : l ) as