//ActiveXObject.on(obj: 'Word.Application', 'BeforeDocumentSave', ['Doc','SaveAsUI','Cancel'], function (params) {}); private TSMemberDescription ToActiveXEventMember(MemberInfo m, CoClassInfo c) { var @namespace = c.Parent.Name; var eventName = m.Name; var args = m.Parameters.Cast().Select(x => KVP(x.Name, (type: GetTypeName(x.VarTypeInfo, true), @readonly: !x.IsByRef()))).ToList(); ITSType argnamesType; ITSType parameterType; if (args.None()) { argnamesType = null; parameterType = TSObjectType.PlainObject; } else if (args.Count <= 5) { argnamesType = new TSTupleType(args.Keys().Select(x => $"'{x}'")); parameterType = new TSObjectType(args); } else { var alias = new TSAliasDescription() { TargetType = new TSTupleType(args.Keys().Select(x => $"'{x}'")) }; var param = new TSInterfaceDescription(); args.SelectKVP((key, value) => KVP(key, new TSMemberDescription() { ReturnType = value.type, ReadOnly = value.@readonly })).AddRangeTo(param.Members); var helperTypeKey = $"{@namespace}.EventHelperTypes.{c.Name}_{eventName}"; if (!eventHelperTypes.TryGetValue(helperTypeKey, out var helperTypes)) { helperTypes = (alias, param); eventHelperTypes.Add(helperTypeKey, helperTypes); } else if (!helperTypes.argNamesType.Equals(alias) || !helperTypes.parameterType.Equals(param)) { Debugger.Break(); } argnamesType = (TSSimpleType)$"{@namespace}.EventHelperTypes.{c.Name}_{eventName}_ArgNames"; parameterType = (TSSimpleType)$"{@namespace}.EventHelperTypes.{c.Name}_{eventName}_Parameter"; } var eventsourceType = $"{@namespace}.{c.Name}"; var ret = new TSMemberDescription(); ret.AddParameter("obj", $"{eventsourceType}"); ret.AddParameter("event", $"'{eventName}'"); if (argnamesType != null) { ret.AddParameter("argNames", argnamesType); } //build the handler parameter type var memberDescr = new TSMemberDescription(); var fnType = new TSFunctionType(memberDescr); memberDescr.AddParameter("this", eventsourceType); memberDescr.AddParameter("parameter", parameterType); memberDescr.ReturnType = TSSimpleType.Void; ret.AddParameter("handler", fnType); ret.ReturnType = TSSimpleType.Void; return(ret); }
private TSMemberDescription GetMemberDescriptionForName(IEnumerable <MemberInfo> members, string typename) { var ret = new TSMemberDescription(); var parameterList = GetSingleParameterList(members, ret.JsDoc); var paramType = Standard; parameterList.ForEachKVP((name, p) => { if (p.ParameterType == Standard && paramType == Optional) { p.ParameterType = Optional; } paramType = p.ParameterType; }); var memberCount = members.Count(); bool hasSetter = false; if (memberCount > 1) { if (!members.All(x => x.IsProperty())) { throw new InvalidOperationException("Unable to parse single name with property and non-property members"); } if (memberCount.In(2, 3)) { //readwrite properties will have multiple members - one getter and one setter; setters can also be either Set or Let (simple assignment) bool hasGetter = members.Any(m => m.InvokeKind == INVOKE_PROPERTYGET); hasSetter = members.Any(m => m.InvokeKind.In(INVOKE_PROPERTYPUT, INVOKE_PROPERTYPUTREF)); if (!hasGetter || !hasSetter) { throw new InvalidOperationException("Unable to parse multiple getters or multiple setter."); } } else { throw new InvalidOperationException("Unable to parse multiple getters or multiple setter."); } } var invokeable = members.First().IsInvokeable(); if (members.Any(x => x.IsInvokeable() != invokeable)) { throw new InvalidOperationException("Invokeable and non-invokeable members with the same name."); } invokeable = invokeable || (parameterList != null && parameterList.Any()); if (invokeable) { ret.Parameters = parameterList ?? new List <KeyValuePair <string, TSParameterDescription> >(); } if (!invokeable) { ret.ReadOnly = !hasSetter; } ret.ReturnType = GetTypeName(members.First().ReturnType, !invokeable); if (hasSetter && parameterList.Any()) { var parameterTypes = new TSTupleType(); parameterList.SelectKVP((name, parameterDescription) => parameterDescription.Type).AddRangeTo(parameterTypes.Members); parameterizedSetters.Add(new ParameterizedSetterInfo() { objectType = new TSSimpleType(typename), propertyName = members.First().Name, parameterTypes = parameterTypes, valueType = (TSSimpleType)ret.ReturnType }); } ret.JsDoc.Add("", members.Select(x => x.HelpString).Distinct().Joined(" / ")); return(ret); }