private JsExpression GetScriptType(IType type, TypeContext context, Func <ITypeParameter, JsExpression> resolveTypeParameter) { string contextName = GetTypeContextShortName(context); if (type is ParameterizedType) { var pt = (ParameterizedType)type; return(JsExpression.Invocation(JsExpression.Identifier(contextName + "_$InstantiateGenericType"), new[] { new JsTypeReferenceExpression(Common.CreateMockTypeDefinition(type.Name, Common.CreateMockAssembly())) }.Concat(pt.TypeArguments.Select(a => GetScriptType(a, TypeContext.GenericArgument, resolveTypeParameter))))); } else if (type.TypeParameterCount > 0) { // This handles open generic types ( typeof(C<,>) ) return(new JsTypeReferenceExpression(Common.CreateMockTypeDefinition(contextName + "_" + type.GetDefinition().Name, Common.CreateMockAssembly()))); } else if (type.Kind == TypeKind.Array) { return(JsExpression.Invocation(JsExpression.Identifier(contextName + "_$Array"), GetScriptType(((ArrayType)type).ElementType, TypeContext.GenericArgument, resolveTypeParameter))); } else if (type.Kind == TypeKind.Anonymous) { return(JsExpression.Identifier(contextName + "_$Anonymous")); } else if (type is ITypeDefinition) { return(new JsTypeReferenceExpression(Common.CreateMockTypeDefinition(contextName + "_" + type.Name, Common.CreateMockAssembly()))); } else if (type is ITypeParameter) { return(resolveTypeParameter((ITypeParameter)type)); } else { throw new ArgumentException("Unsupported type + " + type); } }