For anyone else who is concerned. I found a small bug in the Proxy Generator code that was causing any return types that are generic to create invalid markup which will cause a compiler issue.

Lets say for example you wanted to use the the ComponentInterface systems with a method that return
Deferred<IEnumerable<object>> GetSomeObjects();
In the generator code we do a regex test to get the return type and if it is a Deferred<T> we pull out the generic type of the return type. In the example above "IEnumerable<object>". The problem is that we key on a closing ">" for the regex test and that means that we would pull out "IEnumerable<object" which would break the compilation. All we have to do is add a single character to our regex to fix this. Adding a "$" after the ">" will take care of this. ("(.*?)Deferred(<(.+?)>$)?"). This will ensure that we are at the end of the string at that point so the ">" before must be the closing ">". I commented in the code below where the issue lies.

using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using MMO.Base;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

namespace MMO.Tools.ProxyGenerator
    public class ProxySyntaxAnalyzer : CSharpSyntaxWalker
        //private static readonly Regex ReturnTypeRegex = new Regex("(.*?)Deferred(<(.+?)>)?", RegexOptions.Compiled);
        private static readonly Regex ReturnTypeRegex = new Regex("(.*?)Deferred(<(.+?)>$)?", RegexOptions.Compiled);


        private Tuple<MappedMethodReturnType, string> GetMethodReturnType(MethodDeclarationSyntax method)
            var returnType = method.ReturnType.ToString();

            if (returnType == "void")
                return Tuple.Create(MappedMethodReturnType.Void, (string)null);

            var match = ReturnTypeRegex.Match(returnType);
            if (!match.Success)
                throw new InvalidOperationException($"Method {method.Identifier} does not have a valid return type (found {returnType})");

            var resultType = match.Result("$3"); // This is where it causes issues. We match on group 3 which originally doesn't have the closing '>'
            if (string.IsNullOrWhiteSpace(resultType))
                return Tuple.Create(MappedMethodReturnType.Response, (string)null);

            return Tuple.Create(MappedMethodReturnType.ResponseWithResult, resultType);