private static CodeModel Merge(CodeModel compositeClient, CodeModel subClient) { if (compositeClient == null) { throw new ArgumentNullException("compositeClient"); } if (subClient == null) { throw new ArgumentNullException("subClient"); } // Merge if (compositeClient.BaseUrl == null) { compositeClient.BaseUrl = subClient.BaseUrl; } else { AssertEquals(compositeClient.BaseUrl, subClient.BaseUrl, "BaseUrl"); } // Copy client properties foreach (var subClientProperty in subClient.Properties) { if (subClientProperty.SerializedName == "api-version") { continue; } var compositeClientProperty = compositeClient.Properties.FirstOrDefault(p => p.Name == subClientProperty.Name); if (compositeClientProperty == null) { compositeClient.Add(subClientProperty); } else { AssertJsonEquals(compositeClientProperty, subClientProperty); } } // Copy models foreach (var subClientModel in subClient.ModelTypes) { var compositeClientModel = compositeClient.ModelTypes.FirstOrDefault(p => p.Name == subClientModel.Name); if (compositeClientModel == null) { compositeClient.Add(subClientModel); } else { AssertJsonEquals(compositeClientModel, subClientModel); } } // Copy enum types foreach (var subClientModel in subClient.EnumTypes) { var compositeClientModel = compositeClient.EnumTypes.FirstOrDefault(p => p.Name == subClientModel.Name); if (compositeClientModel == null) { compositeClient.Add(subClientModel); } else { AssertJsonEquals(compositeClientModel, subClientModel); } } // Copy error types foreach (var subClientModel in subClient.ErrorTypes) { var compositeClientModel = compositeClient.ErrorTypes.FirstOrDefault(p => p.Name == subClientModel.Name); if (compositeClientModel == null) { compositeClient.AddError(subClientModel); } else { AssertJsonEquals(compositeClientModel, subClientModel); } } // Copy header types foreach (var subClientModel in subClient.HeaderTypes) { var compositeClientModel = compositeClient.HeaderTypes.FirstOrDefault(p => p.Name == subClientModel.Name); if (compositeClientModel == null) { compositeClient.AddHeader(subClientModel); } else { AssertJsonEquals(compositeClientModel, subClientModel); } } // Copy methods foreach (var subClientMethod in subClient.Methods) { var apiVersionParameter = subClientMethod.Parameters.FirstOrDefault(p => p.SerializedName == "api-version"); if (apiVersionParameter != null) { apiVersionParameter.ClientProperty = null; apiVersionParameter.IsConstant = true; apiVersionParameter.DefaultValue = subClient.ApiVersion; apiVersionParameter.IsRequired = true; } var compositeClientMethod = compositeClient.Methods.FirstOrDefault(m => m.ToString() == subClientMethod.ToString() && m.Group == subClientMethod.Group); if (compositeClientMethod == null) { // Re-link client parameters foreach (var parameter in subClientMethod.Parameters.Where(p => p.IsClientProperty)) { var clientProperty = compositeClient.Properties .FirstOrDefault(p => p.SerializedName == parameter.ClientProperty.SerializedName); if (clientProperty != null) { parameter.ClientProperty = clientProperty; } } compositeClient.Add(subClientMethod); } } // make sure that properties and parameters are using the types from the new model // and not the types from the original. foreach (var property in compositeClient.Properties) { EnsureUsesTypeFromModel(property, compositeClient); } foreach (var method in compositeClient.Methods) { foreach (var parameter in method.Parameters) { EnsureUsesTypeFromModel(parameter, compositeClient); } method.ReturnType.Body = EnsureUsesTypeFromModel(method.ReturnType.Body, compositeClient); method.ReturnType.Headers = EnsureUsesTypeFromModel(method.ReturnType.Headers, compositeClient); } foreach (var modelType in compositeClient.ModelTypes) { foreach (var property in modelType.Properties) { EnsureUsesTypeFromModel(property, compositeClient); } } return(compositeClient); }