private void WriteClassDtoInterfaceTransfomMethods(SourceWriter writer, DtoInterfaceTransformLookup interfaceTransformLookup) { foreach (var(dtoInterfaceSymbol, dtoInterfaceMetadata) in interfaceTransformLookup) { writer.WriteLine(); writer.Write($"private static {dtoInterfaceMetadata.TransformMethodName}(dto: {dtoInterfaceSymbol.Name}): {dtoInterfaceMetadata.ClassSymbol.Name} "); using (writer.Block()) { var interfaceParameters = GetConstructorParameters(GetAllDistinctProperties(dtoInterfaceMetadata.ClassSymbol)) .Select(x => new { x.property, requiresDtoTransform = x.property.Type.RequiresDtoTransform(), x.parameterName }) .Apply(); if (interfaceParameters.Any(p => p.requiresDtoTransform)) { foreach (var parameter in interfaceParameters.Where(p => p.requiresDtoTransform)) { TsDtoTypeSymbolHelper.WriteSymbolDtoTransformation( propertySymbol: parameter.property, valueAccessor: $"dto.{parameter.property.Name}", variableName: parameter.parameterName, interfaceTransformLookup: interfaceTransformLookup, writer); } writer.WriteLine(); } IReadOnlyList <string> interfaceInitialization = interfaceParameters .Select(p => $"{p.property.Name}: {(p.requiresDtoTransform ? p.parameterName : $"dto.{p.property.Name}")}")
private void WriteClassDtoTransformMethod(SourceWriter writer, TsTypeSymbol symbol) { //InterfaceTransformLookup interfaceTransformLookup = this.BuildInterfaceTransformLookup(symbol); DtoInterfaceTransformLookup interfaceTransformLookup = DtoInterfaceTransformLookup.BuildLookup(symbol); writer.WriteLine(); TsTypeSymbol dtoInterface = symbol.DtoInterface; writer.Write($"public static fromDto(dto: {dtoInterface.Name}): {symbol.Name} "); using (writer.Block()) { var rawClassParameters = GetConstructorParameters(GetAllDistinctProperties(symbol)) .Select(cp => new { cp.property, cp.parameterName, requiresTransform = cp.property.Type.RequiresDtoTransform() }) .Apply(); if (rawClassParameters.Any(x => x.requiresTransform)) { foreach (var parameter in rawClassParameters.Where(x => x.requiresTransform)) { TsDtoTypeSymbolHelper.WriteSymbolDtoTransformation( propertySymbol: parameter.property, valueAccessor: $"dto.{parameter.property.Name}", variableName: parameter.parameterName, interfaceTransformLookup: interfaceTransformLookup, writer); } writer.WriteLine(); } // Write out the class constructor. var classParameters = rawClassParameters.Select(p => p.requiresTransform ? p.parameterName : "dto." + p.parameterName) .Apply(); writer.Write($"return new {symbol.Name}("); this.WriteCommaSeparatedItems(writer, classParameters); writer.WriteLine(");"); } // Write interface transform methods, if any. if (interfaceTransformLookup.Count > 0) { this.WriteClassDtoInterfaceTransfomMethods(writer, interfaceTransformLookup); } }
/// <summary> /// Resolves the type symbols for the specified <see cref="Type"/> objects. /// </summary> /// <param name="types">The types.</param> /// <returns>An <see cref="IReadOnlyList{T}"/> of <see cref="TsTypeSymbol"/>.</returns> public IReadOnlyList <TsTypeSymbol> ResolveTypeSymbols(IEnumerable <Type> types) { List <TsTypeSymbol> results = new List <TsTypeSymbol>(); TsSymbolLookup symbolLookup = new TsSymbolLookup(); TsDtoTypeSymbolHelper dtoHelper = new TsDtoTypeSymbolHelper(symbolLookup, this.options); TsDependencySortVisitor sortVisitor = new TsDependencySortVisitor(); IReadOnlyList <Type> sortedTypes = sortVisitor.Sort(types); foreach (Type type in sortedTypes) { TsTypeSymbol symbol = TsTypeSymbol.LoadFrom(type, symbolLookup, this.options); symbolLookup.Add(type, symbol); results.Add(symbol); } results.AddRange(dtoHelper.CreateAndConfigureDtoSymbols(results)); return(results); }
/// <summary> /// Determines if this <see cref="TsTypeSymbol"/> requires a data transfer /// object transformation. /// </summary> /// <returns><c>true</c> if a DTO transorm is required, <c>false</c> otherwise.</returns> public bool RequiresDtoTransform() { return(TsDtoTypeSymbolHelper.RequiresDtoTransform(this)); }