private void SetParameterAttributes(MethodOrPropertySymbol methProp, ParameterInfo[] parameters, int i)
{
if (((parameters[i].Attributes & ParameterAttributes.Optional) != 0) &&
!parameters[i].ParameterType.IsByRef)
{
methProp.SetOptionalParameter(i);
PopulateSymbolTableWithName("Value", new Type[] { typeof(Missing) }, typeof(Missing)); // We might need this later
}
object[] attrs;
// Get MarshalAsAttribute
if ((parameters[i].Attributes & ParameterAttributes.HasFieldMarshal) != 0)
{
if ((attrs = parameters[i].GetCustomAttributes(typeof(MarshalAsAttribute), false).ToArray()) != null
&& attrs.Length > 0)
{
MarshalAsAttribute attr = (MarshalAsAttribute)attrs[0];
methProp.SetMarshalAsParameter(i, attr.Value);
}
}
// Get the various kinds of default values
if ((attrs = parameters[i].GetCustomAttributes(typeof(DateTimeConstantAttribute), false).ToArray()) != null
&& attrs.Length > 0)
{
// Get DateTimeConstant
DateTimeConstantAttribute attr = (DateTimeConstantAttribute)attrs[0];
ConstValFactory factory = new ConstValFactory();
CONSTVAL cv = factory.Create(((DateTime)attr.Value).Ticks);
CType cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_DATETIME);
methProp.SetDefaultParameterValue(i, cvType, cv);
}
else if ((attrs = parameters[i].GetCustomAttributes(typeof(DecimalConstantAttribute), false).ToArray()) != null
&& attrs.Length > 0)
{
// Get DecimalConstant
DecimalConstantAttribute attr = (DecimalConstantAttribute)attrs[0];
ConstValFactory factory = new ConstValFactory();
CONSTVAL cv = factory.Create(attr.Value);
CType cvType = _semanticChecker.GetSymbolLoader().GetOptPredefType(PredefinedType.PT_DECIMAL);
methProp.SetDefaultParameterValue(i, cvType, cv);
}
else if (((parameters[i].Attributes & ParameterAttributes.HasDefault) != 0) &&
!parameters[i].ParameterType.IsByRef)
{
// Only set a default value if we have one, and the type that we're
// looking at isn't a by ref type or a type parameter.
ConstValFactory factory = new ConstValFactory();
CONSTVAL cv = cv = ConstValFactory.GetNullRef();
CType cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_OBJECT);
// We need to use RawDefaultValue, because DefaultValue is too clever.
#if UNSUPPORTEDAPI
if (parameters[i].RawDefaultValue != null)
{
object defValue = parameters[i].RawDefaultValue;
#else
if (parameters[i].DefaultValue != null)
{
object defValue = parameters[i].DefaultValue;
#endif
Type defType = defValue.GetType();
if (defType == typeof(Byte))
{
cv = factory.Create((Byte)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_BYTE);
}
else if (defType == typeof(Int16))
{
cv = factory.Create((Int16)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_SHORT);
}
else if (defType == typeof(Int32))
{
cv = factory.Create((Int32)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_INT);
}
else if (defType == typeof(Int64))
{
cv = factory.Create((Int64)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_LONG);
}
else if (defType == typeof(Single))
{
cv = factory.Create((Single)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_FLOAT);
}
else if (defType == typeof(Double))
{
cv = factory.Create((Double)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_DOUBLE);
}
else if (defType == typeof(Decimal))
{
cv = factory.Create((Decimal)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_DECIMAL);
}
else if (defType == typeof(Char))
{
cv = factory.Create((Char)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_CHAR);
}
else if (defType == typeof(Boolean))
{
cv = factory.Create((Boolean)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_BOOL);
}
else if (defType == typeof(SByte))
{
cv = factory.Create((SByte)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_SBYTE);
}
else if (defType == typeof(UInt16))
{
cv = factory.Create((UInt16)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_USHORT);
}
else if (defType == typeof(UInt32))
{
cv = factory.Create((UInt32)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_UINT);
}
else if (defType == typeof(UInt64))
{
cv = factory.Create((UInt64)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_ULONG);
}
else if (defType == typeof(String))
{
cv = factory.Create((String)defValue);
cvType = _semanticChecker.GetSymbolLoader().GetReqPredefType(PredefinedType.PT_STRING);
}
// if we fall off the end of this cascading if, we get Object/null
// because that's how we initialized the constval.
}
methProp.SetDefaultParameterValue(i, cvType, cv);
}
}
/////////////////////////////////////////////////////////////////////////////////
private MethodSymbol FindMatchingMethod(MemberInfo method, AggregateSymbol callingAggregate)
{
MethodSymbol meth = _bsymmgr.LookupAggMember(GetName(method.Name), callingAggregate, symbmask_t.MASK_MethodSymbol).AsMethodSymbol();
while (meth != null)
{
if (meth.AssociatedMemberInfo.IsEquivalentTo(method))
{
return meth;
}
meth = BSYMMGR.LookupNextSym(meth, callingAggregate, symbmask_t.MASK_MethodSymbol).AsMethodSymbol();
}
return null;
}