%
% (c) sof, 1999
%
Validating fragments of IDL.
\begin{code}
module Validate
(
validateParam
) where
import CoreIDL
import CoreUtils
import BasicTypes
import Opts
import TypeInfo
import Utils
\end{code}
Out parameters need to (expand to) a pointed type. In the
case of interface pointers, the type has got to be a pointer
to one.
Errors are treated as warnings (at least for now), so the
validator will simply notify you of the error of your ways and
correct the type.
\begin{code}
validateParam :: String -> Param -> Param
validateParam msg p =
case paramMode p of
Out ->
case paramType p of
Pointer pt isExp t | optCom && isIfaceTy t && not (isIfacePtr t) ->
warnWrongOutParam msg "out"
"pointer to an interface pointer (as it needs to be.)"
p{ paramType=(Pointer pt isExp (Pointer Ref True t))
, paramOrigType=(Pointer pt isExp (Pointer Ref True t))
}
| otherwise -> p
t@Iface{} | optCom ->
warnWrongOutParam msg "out"
"pointer to an interface pointer (as it needs to be.)"
p{ paramType=(Pointer Ref True (Pointer Ref True t))
, paramOrigType=(Pointer Ref True (Pointer Ref True t))
}
WString{} -> p
String{} -> p
Array{} -> p
Sequence{} -> p
Name _ _ _ _ _ (Just ti)
| is_pointed ti -> p
t ->
warnWrongOutParam msg "out"
"pointer to a type"
p{ paramType=Pointer Ref True t
, paramOrigType=Pointer Ref True (paramOrigType p)
}
In ->
case paramType p of
ty@Iface{} | optCom ->
warnWrongOutParam msg "in"
"*pointer* to an interface (as it needs to be.)"
p{ paramType=(Pointer Ref True ty)
, paramOrigType=(Pointer Ref True ty)
}
_ -> p
_ -> p
\end{code}
\begin{code}
warnWrongOutParam :: String -> String -> String -> a -> a
warnWrongOutParam prefix pkind kind cont =
trace ("Warning: [" ++ pkind ++ "] parameter " ++ show prefix ++
" is not a " ++ kind ++ "\n Correcting it for you.\n")
cont
\end{code}