protected override Expression DoResolve(ResolveContext ec){
var e = base.DoResolve(ec);
if (e == null || e != this)
return e;
var fld = target as FieldExpr;
if (fld == null){
var access = target as MemberAccess;
if (access != null)
fld = access.LeftExpression as FieldExpr;
if (fld == null){
Expression simple = target as SimpleName;
simple = simple != null ? simple.Resolve(ec) : null;
fld = simple as FieldExpr;
}
if (fld == null)
return e;
}
if (!fld.IsRole)
return e;
//assigning to a role. Check that the contract is fullfilled
var contractName = CSharpParser.GetCurrentRoleContractName(fld.DeclaringType.Name, fld.Name);
if (CSharpParser.RoleContracts.ContainsKey(contractName)){
if (source.Type == null)
source = source.Resolve(ec);
var contract = CSharpParser.RoleContracts[contractName];
if (!source.Type.FullfillsContract(contract)){
var index = -1;
var current_class = contract.Parent;
if (current_class.IsGeneric)
{
var typeParameters = current_class.TypeParameters;
for (int i = 0; index < 0 && i < typeParameters.Length; i++)
{
var param = typeParameters[i];
if (target.Type.Name == param.Name)
{
index = i;
}
}
}
if (index < 0)
{
ec.Report.Error(10009, loc, "Assignment to role '{0}' does not full fill contract", fld.Name);
}
else
{
current_class.Spec.AddTypesAndContracts(index, contract);
}
}
}
return this;
}
}