protected virtual IEnumerable <GeneratedWrapper> ExecuteImpl(GeneratorExecutionContext context) { var typeBuilder = new MultiTypeBuilder(context.Compilation.SyntaxTrees, context.Compilation, new TypeBuilder(), new PatchParametersWalker()); var types = typeBuilder.Generate(); foreach (var generatedType in types) { context.AddSource(generatedType.FileName, SourceText.From(generatedType.SourceCode, Encoding.UTF8)); } var tyeRepoGenerator = new TypeRepositoryGenerator(); var typeRepoClass = tyeRepoGenerator.CreateTypeRepository(types.Select(x => (x.SourceTypeFullName, x.TargetTypeFullName)), context.Compilation.Assembly.Name); context.AddSource("LaDeakJsonMergePatchTypeRepo", SourceText.From(typeRepoClass, Encoding.UTF8)); return(types); }
public void CustomNamespace_CreateRepository_AppendsSAvoidCollision() { var sut = new TypeRepositoryGenerator(); var result = sut.CreateTypeRepository(null, "CustomNamespace"); Assert.Equal(@" namespace LaDeak.JsonMergePatch.Generated.SafeCustomNamespace { public class TypeRepository : LaDeak.JsonMergePatch.Abstractions.ITypeRepository { private System.Collections.Generic.Dictionary<System.Type, System.Type> _repository = new System.Collections.Generic.Dictionary<System.Type, System.Type>(); private TypeRepository() { } public static LaDeak.JsonMergePatch.Abstractions.ITypeRepository Instance { get; } = new TypeRepository(); public void Add<TSource, TWrapper>() where TWrapper : LaDeak.JsonMergePatch.Abstractions.Patch<TSource> { _repository.Add(typeof(TSource), typeof(TWrapper)); } public void Add(System.Type source, System.Type wrapper) { if (wrapper.IsSubclassOf(typeof(LaDeak.JsonMergePatch.Abstractions.Patch<>).MakeGenericType(source))) _repository.Add(source, wrapper); } public bool TryGet(System.Type source, [System.Diagnostics.CodeAnalysis.NotNullWhen(true)] out System.Type wrapper) { return _repository.TryGetValue(source, out wrapper); } public System.Collections.Generic.IEnumerable<System.Collections.Generic.KeyValuePair<System.Type, System.Type>> GetAll() => _repository; } }", result); }
public void WithTypes_CreateRepository_GeneratesEmptyConstructor() { var sut = new TypeRepositoryGenerator(); var result = sut.CreateTypeRepository(new[] { ("TestDto0", "TestDto0Wrapped"), ("TestDto1", "TestDto1Wrapped") }, string.Empty);