private JsFunctionDefinitionExpression GenerateStructGetHashCodeMethod(ITypeDefinition type)
        {
            JsExpression h     = JsExpression.Identifier("h");
            var          stmts = new List <JsStatement>();

            foreach (var f in type.Fields.Where(f => !f.IsStatic))
            {
                var expr = GetFieldHashCode(f);
                if (expr != null)
                {
                    if (stmts.Count == 0)
                    {
                        stmts.Add(JsStatement.Var("h", expr));
                    }
                    else
                    {
                        stmts.Add(JsExpression.Assign(h, JsExpression.BitwiseXor(JsExpression.Multiply(h, JsExpression.Number(397)), expr)));
                    }
                }
            }
            switch (stmts.Count)
            {
            case 0:
                stmts.Add(JsStatement.Return(JsExpression.Number(0)));
                break;

            case 1:
                stmts[0] = JsStatement.Return(JsExpression.BitwiseOr(((JsVariableDeclarationStatement)stmts[0]).Declarations[0].Initializer, JsExpression.Number(0)));
                break;

            default:
                stmts.Add(JsStatement.Return(h));
                break;
            }

            return(JsExpression.FunctionDefinition(EmptyList <string> .Instance, JsStatement.Block(stmts)));
        }