public static MethodAnalysis Analyze(this CimMethodDeclaration d, IDictionary <string, CimTypeDeclaration> typeRepo) { TypeSyntax returnType; var dotnetReturnType = CimConverter.GetDotNetType(d.ReturnType); if (d.ReturnType == CimType.DateTime) { dotnetReturnType = typeof(DateTime); } if (d.ReturnType == CimType.DateTimeArray) { dotnetReturnType = typeof(DateTime[]); } if (dotnetReturnType == null) { returnType = SyntaxFactory.ParseTypeName("void"); } else { returnType = SyntaxFactory.ParseTypeName(dotnetReturnType.FullName); } var inputParameters = new List <NameAndType>(); var outputParameters = new List <NameAndType>(); foreach (var p in d.Parameters) { var type = ResolveType(p.CimType, p.ReferenceClassName ?? p.Qualifiers["EmbeddedInstance"]?.Value as string, p.Qualifiers.IsNotNull(), typeRepo, out var isCimObject, out var isNullableValueType, out var isEnumerable, out var enumeratedType); var entry = new NameAndType { IsCimObject = isCimObject, Name = p.Name, Type = type, IsNullableValueType = isNullableValueType, IsEnumerable = isEnumerable, CimType = p.CimType, EnumeratedType = enumeratedType, }; if (IsIn(p)) { inputParameters.Add(entry); } if (IsOut(p)) { outputParameters.Add(entry); } } return(new MethodAnalysis { ReturnType = returnType, InputParameters = inputParameters.ToArray(), OutputParameters = outputParameters.ToArray() }); }
/// <summary> /// <para> /// Create <see cref="CimMethodParametersCollection"/> with given key properties. /// And/or <see cref="CimClass"/> object. /// </para> /// </summary> /// <param name="parameters"></param> /// <param name="cimClass"></param> /// <param name="cimInstance"></param> /// <param name="methodName"></param> /// <returns></returns> /// <exception cref="ArgumentNullException">See CimProperty.Create.</exception> /// <exception cref="ArgumentException">CimProperty.Create.</exception> private CimMethodParametersCollection CreateParametersCollection( IDictionary parameters, CimClass cimClass, CimInstance cimInstance, string methodName) { DebugHelper.WriteLogEx(); CimMethodParametersCollection collection = null; if (parameters == null) { return(collection); } else if (parameters.Count == 0) { return(collection); } collection = new CimMethodParametersCollection(); IDictionaryEnumerator enumerator = parameters.GetEnumerator(); while (enumerator.MoveNext()) { string parameterName = enumerator.Key.ToString(); const CimFlags parameterFlags = CimFlags.In; object parameterValue = GetBaseObject(enumerator.Value); DebugHelper.WriteLog(@"Create parameter name= {0}, value= {1}, flags= {2}.", 4, parameterName, parameterValue, parameterFlags); CimMethodParameter parameter = null; CimMethodDeclaration declaration = null; string className = null; if (cimClass != null) { className = cimClass.CimSystemProperties.ClassName; declaration = cimClass.CimClassMethods[methodName]; if (declaration == null) { throw new ArgumentException(string.Format( CultureInfo.CurrentUICulture, CimCmdletStrings.InvalidMethod, methodName, className)); } } else if (cimInstance != null) { className = cimInstance.CimClass.CimSystemProperties.ClassName; declaration = cimInstance.CimClass.CimClassMethods[methodName]; } if (declaration != null) { CimMethodParameterDeclaration paramDeclaration = declaration.Parameters[parameterName]; if (paramDeclaration == null) { throw new ArgumentException(string.Format( CultureInfo.CurrentUICulture, CimCmdletStrings.InvalidMethodParameter, parameterName, methodName, className)); } parameter = CimMethodParameter.Create( parameterName, parameterValue, paramDeclaration.CimType, parameterFlags); // FIXME: check in/out qualifier // parameterFlags = paramDeclaration.Qualifiers; } else { if (parameterValue == null) { // try the best to get the type while value is null parameter = CimMethodParameter.Create( parameterName, parameterValue, CimType.String, parameterFlags); } else { CimType referenceType = CimType.Unknown; object referenceObject = GetReferenceOrReferenceArrayObject(parameterValue, ref referenceType); if (referenceObject != null) { parameter = CimMethodParameter.Create( parameterName, referenceObject, referenceType, parameterFlags); } else { parameter = CimMethodParameter.Create( parameterName, parameterValue, parameterFlags); } } } if (parameter != null) { collection.Add(parameter); } } return(collection); }
private CimMethodParametersCollection CreateParametersCollection(IDictionary parameters, CimClass cimClass, CimInstance cimInstance, string methodName) { DebugHelper.WriteLogEx(); CimMethodParametersCollection cimMethodParametersCollection = null; if (parameters != null) { if (parameters.Count != 0) { cimMethodParametersCollection = new CimMethodParametersCollection(); IDictionaryEnumerator enumerator = parameters.GetEnumerator(); while (enumerator.MoveNext()) { string str = enumerator.Key.ToString(); CimFlags cimFlag = CimFlags.In; object baseObject = base.GetBaseObject(enumerator.Value); object[] objArray = new object[3]; objArray[0] = str; objArray[1] = baseObject; objArray[2] = cimFlag; DebugHelper.WriteLog("Create parameter name= {0}, value= {1}, flags= {2}.", 4, objArray); CimMethodParameter cimMethodParameter = null; CimMethodDeclaration item = null; string className = null; if (cimClass == null) { if (cimInstance != null) { className = cimInstance.CimClass.CimSystemProperties.ClassName; item = cimInstance.CimClass.CimClassMethods[methodName]; } } else { className = cimClass.CimSystemProperties.ClassName; item = cimClass.CimClassMethods[methodName]; if (item == null) { object[] objArray1 = new object[2]; objArray1[0] = methodName; objArray1[1] = className; throw new ArgumentException(string.Format(CultureInfo.CurrentUICulture, Strings.InvalidMethod, objArray1)); } } if (item == null) { if (baseObject != null) { CimType cimType = CimType.Unknown; object referenceOrReferenceArrayObject = base.GetReferenceOrReferenceArrayObject(baseObject, ref cimType); if (referenceOrReferenceArrayObject == null) { cimMethodParameter = CimMethodParameter.Create(str, baseObject, cimFlag); } else { cimMethodParameter = CimMethodParameter.Create(str, referenceOrReferenceArrayObject, cimType, cimFlag); } } else { cimMethodParameter = CimMethodParameter.Create(str, baseObject, CimType.String, cimFlag); } } else { CimMethodParameterDeclaration cimMethodParameterDeclaration = item.Parameters[str]; if (cimMethodParameterDeclaration != null) { cimMethodParameter = CimMethodParameter.Create(str, baseObject, cimMethodParameterDeclaration.CimType, cimFlag); } else { object[] objArray2 = new object[3]; objArray2[0] = str; objArray2[1] = methodName; objArray2[2] = className; throw new ArgumentException(string.Format(CultureInfo.CurrentUICulture, Strings.InvalidMethodParameter, objArray2)); } } if (cimMethodParameter == null) { continue; } cimMethodParametersCollection.Add(cimMethodParameter); } return(cimMethodParametersCollection); } else { return(cimMethodParametersCollection); } } else { return(cimMethodParametersCollection); } }