private TypeParameterType AddTypeParameterToSymbolTable(
AggregateSymbol agg,
MethodSymbol meth,
Type t,
bool bIsAggregate)
{
Debug.Assert((agg != null && bIsAggregate) || (meth != null && !bIsAggregate));
TypeParameterSymbol typeParam;
if (bIsAggregate)
{
typeParam = _symFactory.CreateClassTypeParameter(
GetName(t),
agg,
t.GenericParameterPosition,
t.GenericParameterPosition);
}
else
{
typeParam = _symFactory.CreateMethodTypeParameter(
GetName(t),
meth,
t.GenericParameterPosition,
t.GenericParameterPosition);
}
if ((t.GetTypeInfo().GenericParameterAttributes & GenericParameterAttributes.Covariant) != 0)
{
typeParam.Covariant = true;
}
if ((t.GetTypeInfo().GenericParameterAttributes & GenericParameterAttributes.Contravariant) != 0)
{
typeParam.Contravariant = true;
}
SpecCons cons = SpecCons.None;
if ((t.GetTypeInfo().GenericParameterAttributes & GenericParameterAttributes.DefaultConstructorConstraint) != 0)
{
cons |= SpecCons.New;
}
if ((t.GetTypeInfo().GenericParameterAttributes & GenericParameterAttributes.ReferenceTypeConstraint) != 0)
{
cons |= SpecCons.Ref;
}
if ((t.GetTypeInfo().GenericParameterAttributes & GenericParameterAttributes.NotNullableValueTypeConstraint) != 0)
{
cons |= SpecCons.Val;
}
typeParam.SetConstraints(cons);
typeParam.SetAccess(ACCESS.ACC_PUBLIC);
TypeParameterType typeParamType = _typeManager.GetTypeParameter(typeParam);
return typeParamType;
}