private MethodBuilder CreateExecuteMethod( OperationDescriptor operationDescriptor, string runtimeTypeName) { MethodBuilder executeMethod = MethodBuilder .New() .SetOnlyDeclaration() .SetReturnType( TypeNames.Task.WithGeneric( TypeNames.IOperationResult.WithGeneric(runtimeTypeName))) .SetName(TypeNames.Execute); foreach (var arg in operationDescriptor.Arguments) { executeMethod .AddParameter() .SetName(NameUtils.GetParameterName(arg.Name)) .SetType(arg.Type.ToTypeReference()); } executeMethod .AddParameter(_cancellationToken) .SetType(TypeNames.CancellationToken) .SetDefault(); return(executeMethod); }
private MethodBuilder CreateWatchMethod( OperationDescriptor descriptor, string runtimeTypeName) { MethodBuilder watchMethod = MethodBuilder .New() .SetOnlyDeclaration() .SetReturnType( TypeNames.IOperationObservable .WithGeneric(TypeNames.IOperationResult.WithGeneric(runtimeTypeName))) .SetName(TypeNames.Watch); foreach (var arg in descriptor.Arguments) { watchMethod .AddParameter() .SetName(NameUtils.GetParameterName(arg.Name)) .SetType(arg.Type.ToTypeReference()); } watchMethod.AddParameter() .SetName(_strategy) .SetType(TypeNames.ExecutionStrategy.MakeNullable()) .SetDefault("null"); return(watchMethod); }
private void AddComplexDataHandler( CSharpSyntaxGeneratorSettings settings, ClassBuilder classBuilder, ConstructorBuilder constructorBuilder, MethodBuilder method, ComplexTypeDescriptor complexTypeDescriptor, HashSet <string> processed, bool isNonNullable) { if (complexTypeDescriptor.ParentRuntimeType is null) { throw new InvalidOperationException(); } method .AddParameter(_dataParameterName) .SetType(complexTypeDescriptor.ParentRuntimeType .ToString() .MakeNullable(!isNonNullable)) .SetName(_dataParameterName); if (settings.IsStoreEnabled()) { method .AddParameter(_snapshot) .SetType(TypeNames.IEntityStoreSnapshot); } if (!isNonNullable) { method.AddCode(EnsureProperNullability(_dataParameterName, isNonNullable)); } const string returnValue = nameof(returnValue); method.AddCode($"{complexTypeDescriptor.RuntimeType.Name}? {returnValue};"); method.AddEmptyLine(); GenerateIfForEachImplementedBy( method, complexTypeDescriptor, o => GenerateComplexDataInterfaceIfClause(settings, o, returnValue)); method.AddCode($"return {returnValue};"); AddRequiredMapMethods( settings, _dataParameterName, complexTypeDescriptor, classBuilder, constructorBuilder, processed); }
private void AddEntityHandler( ClassBuilder classBuilder, ConstructorBuilder constructorBuilder, MethodBuilder method, ComplexTypeDescriptor complexTypeDescriptor, HashSet <string> processed, bool isNonNullable) { method .AddParameter(_entityId) .SetType(TypeNames.EntityId.MakeNullable(!isNonNullable)); method .AddParameter(_snapshot) .SetType(TypeNames.IEntityStoreSnapshot); if (!isNonNullable) { method.AddCode(EnsureProperNullability(_entityId, isNonNullable)); } if (complexTypeDescriptor is InterfaceTypeDescriptor interfaceTypeDescriptor) { foreach (ObjectTypeDescriptor implementee in interfaceTypeDescriptor.ImplementedBy .Where(x => x.IsEntity())) { NameString dataMapperName = CreateEntityMapperName(implementee.RuntimeType.Name, implementee.Name); if (processed.Add(dataMapperName)) { var dataMapperType = TypeNames.IEntityMapper.WithGeneric( CreateEntityType( implementee.Name, implementee.RuntimeType.NamespaceWithoutGlobal) .ToString(), implementee.RuntimeType.Name); AddConstructorAssignedField( dataMapperType, GetFieldName(dataMapperName), GetParameterName(dataMapperName), classBuilder, constructorBuilder); } method.AddCode(GenerateEntityHandlerIfClause(implementee, isNonNullable)); } } method.AddCode(ExceptionBuilder.New(TypeNames.NotSupportedException)); }
private void AddDeserializeMethod( ITypeDescriptor typeReference, ClassBuilder classBuilder, HashSet <string> processed) { string methodName = DeserializerMethodNameFromTypeName(typeReference); if (processed.Add(methodName)) { MethodBuilder methodBuilder = classBuilder .AddMethod() .SetPrivate() .SetReturnType(typeReference.ToStateTypeReference()) .SetName(methodName); if (typeReference.IsOrContainsEntityType()) { methodBuilder .AddParameter(_session, x => x.SetType(TypeNames.IEntityStoreUpdateSession)) .AddParameter(_obj, x => x.SetType(TypeNames.JsonElement.MakeNullable())) .AddParameter( _entityIds, x => x.SetType(TypeNames.ISet.WithGeneric(TypeNames.EntityId))); } else { methodBuilder .AddParameter(_obj) .SetType(TypeNames.JsonElement.MakeNullable()); } IfBuilder jsonElementNullCheck = IfBuilder .New() .SetCondition($"!{_obj}.HasValue") .AddCode( typeReference.IsNonNullableType() ? ExceptionBuilder.New(TypeNames.ArgumentNullException) : CodeLineBuilder.From("return null;")); methodBuilder .AddCode(jsonElementNullCheck) .AddEmptyLine(); AddDeserializeMethodBody(classBuilder, methodBuilder, typeReference, processed); } }
private void AddDataHandler( ClassBuilder classBuilder, ConstructorBuilder constructorBuilder, MethodBuilder method, ComplexTypeDescriptor namedTypeDescriptor, HashSet <string> processed, bool isNonNullable) { method .AddParameter(_dataParameterName) .SetType(namedTypeDescriptor.ParentRuntimeType ! .ToString() .MakeNullable(!isNonNullable)); method .AddParameter(_snapshot) .SetType(TypeNames.IEntityStoreSnapshot); if (!isNonNullable) { method.AddCode(EnsureProperNullability(_dataParameterName, isNonNullable)); } const string returnValue = nameof(returnValue); method.AddCode($"{namedTypeDescriptor.RuntimeType.Name} {returnValue} = default!;"); method.AddEmptyLine(); GenerateIfForEachImplementedBy( method, namedTypeDescriptor, o => GenerateDataInterfaceIfClause(o, isNonNullable, returnValue)); method.AddCode($"return {returnValue};"); AddRequiredMapMethods( _dataParameterName, namedTypeDescriptor, classBuilder, constructorBuilder, processed); }
protected override void Generate( CodeWriter writer, DependencyInjectionDescriptor descriptor, out string fileName, out string?path) { fileName = CreateServiceCollectionExtensions(descriptor.Name); path = DependencyInjection; ClassBuilder factory = ClassBuilder .New(fileName) .SetStatic() .SetAccessModifier(AccessModifier.Public); MethodBuilder addClientMethod = factory .AddMethod($"Add{descriptor.Name}") .SetPublic() .SetStatic() .SetReturnType( TypeNames.IClientBuilder.WithGeneric(descriptor.StoreAccessor.RuntimeType)) .AddParameter( _services, x => x.SetThis().SetType(TypeNames.IServiceCollection)) .AddParameter( _strategy, x => x.SetType(TypeNames.ExecutionStrategy) .SetDefault(TypeNames.ExecutionStrategy + "." + "NetworkOnly")) .AddCode(GenerateMethodBody(descriptor)); if (descriptor.TransportProfiles.Count > 1) { addClientMethod .AddParameter(_profile) .SetType(CreateProfileEnumReference(descriptor)) .SetDefault(CreateProfileEnumReference(descriptor) + "." + descriptor.TransportProfiles[0].Name); } foreach (var profile in descriptor.TransportProfiles) { GenerateClientForProfile(factory, descriptor, profile); } factory.AddClass(_clientServiceProvider); CodeFileBuilder .New() .SetNamespace(TypeNames.DependencyInjectionNamespace) .AddType(factory) .Build(writer); }
private void AddArrayHandler( CSharpSyntaxGeneratorSettings settings, ClassBuilder classBuilder, ConstructorBuilder constructorBuilder, MethodBuilder methodBuilder, ListTypeDescriptor listTypeDescriptor, HashSet <string> processed, bool isNonNullable) { methodBuilder .AddParameter(_list) .SetType(listTypeDescriptor.ToStateTypeReference()); if (settings.IsStoreEnabled()) { methodBuilder .AddParameter(_snapshot) .SetType(TypeNames.IEntityStoreSnapshot); } var listVarName = GetParameterName(listTypeDescriptor.Name) + "s"; methodBuilder.AddCode(EnsureProperNullability(_list, isNonNullable)); methodBuilder.AddCode( AssignmentBuilder .New() .SetLefthandSide($"var {listVarName}") .SetRighthandSide( CodeBlockBuilder .New() .AddCode("new ") .AddCode(TypeNames.List) .AddCode("<") .AddCode( listTypeDescriptor.InnerType.ToTypeReference().SkipTrailingSpace()) .AddCode(">") .AddCode("()"))); methodBuilder.AddEmptyLine(); ForEachBuilder forEachBuilder = ForEachBuilder .New() .SetLoopHeader( CodeBlockBuilder .New() .AddCode(listTypeDescriptor.InnerType.ToStateTypeReference()) .AddCode($"{_child} in {_list}")) .AddCode( MethodCallBuilder .New() .SetMethodName(listVarName, nameof(List <object> .Add)) .AddArgument(MethodCallBuilder .Inline() .SetMethodName(MapMethodNameFromTypeName(listTypeDescriptor.InnerType)) .AddArgument(_child) .If(settings.IsStoreEnabled(), x => x.AddArgument(_snapshot)))); methodBuilder .AddCode(forEachBuilder) .AddEmptyLine() .AddCode($"return {listVarName};"); AddMapMethod( settings, listVarName, listTypeDescriptor.InnerType, classBuilder, constructorBuilder, processed); }
private void AddEntityOrUnionDataHandler( CSharpSyntaxGeneratorSettings settings, ClassBuilder classBuilder, ConstructorBuilder constructorBuilder, MethodBuilder method, ComplexTypeDescriptor complexTypeDescriptor, HashSet <string> processed, bool isNonNullable) { method .AddParameter(_dataParameterName) .SetType(TypeNames.EntityIdOrData.MakeNullable(!isNonNullable)) .SetName(_dataParameterName); method .AddParameter(_snapshot) .SetType(TypeNames.IEntityStoreSnapshot) .SetName(_snapshot); if (!isNonNullable) { method.AddCode(EnsureProperNullability(_dataParameterName, isNonNullable)); } var dataHandlerMethodName = MapMethodNameFromTypeName(complexTypeDescriptor) + "Entity"; MethodBuilder complexDataHandler = MethodBuilder .New() .SetReturnType( complexTypeDescriptor.RuntimeType.ToString().MakeNullable(!isNonNullable)) .SetName(dataHandlerMethodName); AddComplexDataHandler(settings, classBuilder, constructorBuilder, complexDataHandler, complexTypeDescriptor, processed, isNonNullable); classBuilder.AddMethod(complexDataHandler); var entityDataHandlerMethodName = MapMethodNameFromTypeName(complexTypeDescriptor) + "Data"; MethodBuilder entityDataHandler = MethodBuilder .New() .SetReturnType( complexTypeDescriptor.RuntimeType.ToString().MakeNullable(!isNonNullable)) .SetName(entityDataHandlerMethodName); AddEntityHandler( classBuilder, constructorBuilder, entityDataHandler, complexTypeDescriptor, processed, isNonNullable); classBuilder.AddMethod(entityDataHandler); method.AddEmptyLine(); var parameterName = isNonNullable ? _dataParameterName : $"{_dataParameterName}.Value"; IfBuilder ifBuilder = IfBuilder .New() .SetCondition($"{parameterName}.EntityId is {{ }} id") .AddCode(MethodCallBuilder .New() .SetReturn() .SetMethodName(entityDataHandlerMethodName) .AddArgument("id") .AddArgument(_snapshot)) .AddIfElse(IfBuilder .New() .SetCondition( $"{parameterName}.Data is {complexTypeDescriptor.ParentRuntimeType!} d") .AddCode(MethodCallBuilder .New() .SetReturn() .SetMethodName(dataHandlerMethodName) .AddArgument("d") .AddArgument(_snapshot))) .AddElse(ExceptionBuilder.New(TypeNames.ArgumentOutOfRangeException)); method.AddCode(ifBuilder); AddRequiredMapMethods( settings, _dataParameterName, complexTypeDescriptor, classBuilder, constructorBuilder, processed); }