private static ApiPropertyConfiguration GetOrAddApiPropertyConfiguration(ApiMutableObjectType apiMutableObjectType, Type clrDeclaringType, string clrPropertyName, Type clrPropertyType, ApiPrecedenceLevel apiPrecedenceLevel, ApiPrecedenceStack apiPrecedenceStack) { Contract.Requires(apiMutableObjectType != null); Contract.Requires(clrDeclaringType != null); Contract.Requires(clrPropertyName.SafeHasContent()); Contract.Requires(clrPropertyType != null); Contract.Requires(apiPrecedenceStack != null); if (apiMutableObjectType.ApiPropertyConfigurationsIndex.TryGetValue(clrPropertyName, out var apiPropertyConfigurationIndex)) { var apiPropertyConfigurationExisting = apiMutableObjectType.ApiPropertyConfigurations[apiPropertyConfigurationIndex]; return(apiPropertyConfigurationExisting); } var apiPropertyConfigurationNew = new ApiPropertyConfiguration(clrDeclaringType, clrPropertyName, clrPropertyType, apiPrecedenceStack); var apiPropertyConfigurationIndexNew = apiMutableObjectType.ApiPropertyConfigurationsIndex.Count; apiMutableObjectType.ApiPropertyConfigurations.Add(apiPropertyConfigurationNew); apiMutableObjectType.ApiPropertyConfigurationsIndex.Add(clrPropertyName, apiPropertyConfigurationIndexNew); ApiFrameworkLog.Trace($"Added {nameof(ApiProperty)} [{nameof(ApiProperty.ClrName)}={clrPropertyName}] at {apiPrecedenceLevel} Level".Indent(IndentConstants.ApiMutableObjectTypeModifier)); return(apiPropertyConfigurationNew); }
public void AddOrUpdateApiScalarTypeConfiguration(ApiTypeConfiguration apiTypeConfiguration, ApiPrecedenceLevel apiPrecedenceLevel, ApiPrecedenceStack apiPrecedenceStack) { Contract.Requires(apiTypeConfiguration != null); Contract.Requires(apiPrecedenceStack != null); AddOrUpdateApiTypeConfiguration <ApiScalarTypeConfiguration, ApiMutableFactory <ApiMutableSchema, ApiMutableScalarType>, ApiMutableScalarType>(this.ApiScalarTypeConfigurationDictionary, apiTypeConfiguration, ApiScalarTypeConfigurationOpenGenericType, apiPrecedenceLevel, apiPrecedenceStack); }
public ApiScalarTypeConfiguration GetOrAddApiScalarTypeConfiguration(Type clrScalarType, ApiPrecedenceLevel apiPrecedenceLevel, ApiPrecedenceStack apiPrecedenceStack) { Contract.Requires(clrScalarType != null); Contract.Requires(apiPrecedenceStack != null); var apiScalarTypeConfiguration = GetOrAddApiConfiguration <ApiScalarTypeConfiguration>(this.ApiScalarTypeConfigurationDictionary, clrScalarType, ApiScalarTypeConfigurationOpenGenericType, apiPrecedenceLevel, apiPrecedenceStack); return(apiScalarTypeConfiguration); }
public ApiMutableObjectModifier(ApiPrecedenceLevel apiPrecedenceLevel, Action <TMutable> apiModifierFunction, string callerTypeName, string callerMemberName) { Contract.Requires(apiModifierFunction != null); Contract.Requires(callerTypeName.SafeHasContent()); Contract.Requires(callerMemberName.SafeHasContent()); this.ApiPrecedenceLevel = apiPrecedenceLevel; this.ApiModifierFunction = apiModifierFunction; this.CallerTypeName = callerTypeName; this.CallerMemberName = callerMemberName; }
public void Push(ApiPrecedenceLevel nextLevel) { this.Stack.Push(nextLevel); }
// PUBLIC CONSTRUCTORS ////////////////////////////////////////////// #region Constructors public ApiPrecedenceStack(ApiPrecedenceLevel initialLevel) { this.Stack = new Stack <ApiPrecedenceLevel>(); this.Stack.Push(initialLevel); }
private static TApiConfiguration GetOrAddApiConfiguration <T, TApiConfiguration>(IDictionary <Type, ApiTypeConfiguration> dictionary, Type apiConfigurationOpenGenericType, ApiPrecedenceLevel apiPrecedenceLevel, ApiPrecedenceStack apiPrecedenceStack) where TApiConfiguration : ApiTypeConfiguration { Contract.Requires(dictionary != null); Contract.Requires(apiConfigurationOpenGenericType != null); Contract.Requires(apiPrecedenceStack != null); var clrType = typeof(T); return(GetOrAddApiConfiguration <TApiConfiguration>(dictionary, clrType, apiConfigurationOpenGenericType, apiPrecedenceLevel, apiPrecedenceStack)); }
private static TApiConfiguration GetOrAddApiConfiguration <TApiConfiguration>(IDictionary <Type, ApiTypeConfiguration> dictionary, Type clrType, Type apiConfigurationOpenGenericType, ApiPrecedenceLevel apiPrecedenceLevel, ApiPrecedenceStack apiPrecedenceStack) where TApiConfiguration : ApiTypeConfiguration { Contract.Requires(dictionary != null); Contract.Requires(clrType != null); Contract.Requires(apiConfigurationOpenGenericType != null); Contract.Requires(apiPrecedenceStack != null); if (dictionary.TryGetValue(clrType, out var apiConfiguration)) { var apiConfigurationExisting = (TApiConfiguration)apiConfiguration; return(apiConfigurationExisting); } var apiConfigurationNew = ApiTypeConfigurationFactory.CreateApiTypeConfiguration <TApiConfiguration>(clrType, apiConfigurationOpenGenericType, apiPrecedenceStack); dictionary.Add(clrType, apiConfigurationNew); var apiTypeKind = apiConfigurationNew.ApiTypeKind; switch (apiTypeKind) { case ApiTypeKind.Enumeration: { ApiFrameworkLog.Trace($"Added {nameof(ApiEnumerationType)} [{nameof(ApiEnumerationType.ClrType)}={clrType.Name}] at {apiPrecedenceLevel} Level".Indent(IndentConstants.ApiMutableSchemaModifier)); break; } case ApiTypeKind.Object: { ApiFrameworkLog.Trace($"Added {nameof(ApiObjectType)} [{nameof(ApiObjectType.ClrType)}={clrType.Name}] at {apiPrecedenceLevel} Level".Indent(IndentConstants.ApiMutableSchemaModifier)); break; } case ApiTypeKind.Scalar: { ApiFrameworkLog.Trace($"Added {nameof(ApiScalarType)} [{nameof(ApiScalarType.ClrType)}={clrType.Name}] at {apiPrecedenceLevel} Level".Indent(IndentConstants.ApiMutableSchemaModifier)); break; } default: throw new ArgumentOutOfRangeException(); } return(apiConfigurationNew); }
// PRIVATE METHODS ////////////////////////////////////////////////// #region Methods private static void AddOrUpdateApiTypeConfiguration <TConfiguration, TMutableFactory, TMutable>(IDictionary <Type, ApiTypeConfiguration> dictionary, ApiTypeConfiguration apiTypeConfiguration, Type apiTypeConfigurationOpenGenericType, ApiPrecedenceLevel apiPrecedenceLevel, ApiPrecedenceStack apiPrecedenceStack) where TConfiguration : ApiTypeConfiguration where TMutableFactory : ApiMutableFactory <ApiMutableSchema, TMutable> { Contract.Requires(dictionary != null); Contract.Requires(apiTypeConfiguration != null); Contract.Requires(apiTypeConfigurationOpenGenericType != null); Contract.Requires(apiPrecedenceStack != null); var apiConfigurationIncoming = (TConfiguration)apiTypeConfiguration; var apiObjectFactoryIncoming = (TMutableFactory)apiConfigurationIncoming.ApiMutableFactory; var clrType = apiTypeConfiguration.ClrType; if (dictionary.TryGetValue(clrType, out var apiConfiguration)) { // Update the existing API configuration by merging the incoming derived API configuration. var apiConfigurationExisting = (TConfiguration)apiConfiguration; var apiObjectFactoryExisting = (TMutableFactory)apiConfigurationExisting.ApiMutableFactory; apiObjectFactoryExisting.Merge(apiObjectFactoryIncoming); return; } // Create a new API configuration from the incoming derived API configuration. var apiConfigurationNew = ApiTypeConfigurationFactory.CreateApiTypeConfiguration <TConfiguration, TMutableFactory, TMutable>(clrType, apiTypeConfigurationOpenGenericType, apiPrecedenceStack, apiObjectFactoryIncoming); dictionary.Add(clrType, apiConfigurationNew); ApiFrameworkLog.Trace($"Added {typeof(TConfiguration).Name} [ClrType={apiConfigurationNew.ClrType.Name}] at {apiPrecedenceLevel} Level".Indent(IndentConstants.ApiMutableSchemaModifier)); }
public ApiObjectTypeConfiguration <TObject> GetOrAddApiObjectTypeConfiguration <TObject>(ApiPrecedenceLevel apiPrecedenceLevel, ApiPrecedenceStack apiPrecedenceStack) { Contract.Requires(apiPrecedenceStack != null); var apiObjectTypeConfiguration = GetOrAddApiConfiguration <TObject, ApiObjectTypeConfiguration <TObject> >(this.ApiObjectTypeConfigurationDictionary, ApiObjectTypeConfigurationOpenGenericType, apiPrecedenceLevel, apiPrecedenceStack); return(apiObjectTypeConfiguration); }
public ApiEnumerationTypeConfiguration <TEnum> GetOrAddApiEnumerationTypeConfiguration <TEnum>(ApiPrecedenceLevel apiPrecedenceLevel, ApiPrecedenceStack apiPrecedenceStack) where TEnum : Enum { Contract.Requires(apiPrecedenceStack != null); var apiEnumTypeConfiguration = GetOrAddApiConfiguration <TEnum, ApiEnumerationTypeConfiguration <TEnum> >(this.ApiEnumerationTypeConfigurationDictionary, ApiEnumerationTypeConfigurationOpenGenericType, apiPrecedenceLevel, apiPrecedenceStack); return(apiEnumTypeConfiguration); }
private static ApiEnumerationValueConfiguration GetOrAddApiEnumerationValueConfiguration(ApiMutableEnumerationType apiMutableEnumerationType, string clrName, int clrOrdinal, ApiPrecedenceLevel apiPrecedenceLevel, ApiPrecedenceStack apiPrecedenceStack) { Contract.Requires(apiMutableEnumerationType != null); Contract.Requires(clrName.SafeHasContent()); Contract.Requires(apiPrecedenceStack != null); if (apiMutableEnumerationType.ApiEnumerationValueConfigurations.TryGetValue(clrOrdinal, out var apiEnumerationValueConfigurationExisting)) { return(apiEnumerationValueConfigurationExisting); } var apiEnumerationValueConfigurationNew = new ApiEnumerationValueConfiguration(clrName, clrOrdinal, apiPrecedenceStack); apiMutableEnumerationType.ApiEnumerationValueConfigurations.Add(clrOrdinal, apiEnumerationValueConfigurationNew); ApiFrameworkLog.Trace($"Added {nameof(ApiEnumerationValue)} [{nameof(ApiEnumerationValue.ClrName)}={clrName}] at {apiPrecedenceLevel} Level".Indent(IndentConstants.ApiMutableEnumerationTypeModifier)); return(apiEnumerationValueConfigurationNew); }