protected virtual List <IProperty> GetPropertyOverloads(List <IProperty> list = null, ITypeDefinition typeDef = null) { typeDef = typeDef ?? this.TypeDefinition; bool isTop = list == null; list = list ?? new List <IProperty>(); if (this.Member != null && this.Member.IsOverride && !this.IsTemplateOverride(this.Member)) { if (this.OriginalMember == null) { this.OriginalMember = this.Member; } this.Member = InheritanceHelper.GetBaseMember(this.Member); typeDef = this.Member.DeclaringTypeDefinition; } if (typeDef != null) { bool isMember = this.Member is IMethod; var properties = typeDef.Properties.Where(p => { if (p.IsExplicitInterfaceImplementation) { return(false); } var canGet = p.CanGet && p.Getter != null; var canSet = p.CanSet && p.Setter != null; if (!this.IncludeInline) { var inline = canGet ? this.Emitter.GetInline(p.Getter) : null; if (!string.IsNullOrWhiteSpace(inline)) { return(false); } inline = canSet ? this.Emitter.GetInline(p.Setter) : null; if (!string.IsNullOrWhiteSpace(inline)) { return(false); } if (p.IsIndexer && canGet && p.Getter.Attributes.Any(a => a.AttributeType.FullName == "H5.ExternalAttribute")) { return(false); } } bool eq = false; bool?equalsByGetter = null; if (p.IsStatic == this.Static) { var fieldName = this.Emitter.GetEntityName(p); if (fieldName != null && (fieldName == this.JsName || fieldName == this.AltJsName || fieldName == this.FieldJsName)) { eq = true; } if (!eq && p.IsIndexer) { var getterIgnore = canGet && this.Emitter.Validator.IsExternalType(p.Getter); var setterIgnore = canSet && this.Emitter.Validator.IsExternalType(p.Setter); var getterName = canGet ? Helpers.GetPropertyRef(p, this.Emitter, false, true, true) : null; var setterName = canSet ? Helpers.GetPropertyRef(p, this.Emitter, true, true, true) : null; if (!getterIgnore && getterName != null && (getterName == this.JsName || getterName == this.AltJsName || getterName == this.FieldJsName)) { eq = true; equalsByGetter = true; } else if (!setterIgnore && setterName != null && (setterName == this.JsName || setterName == this.AltJsName || setterName == this.FieldJsName)) { eq = true; equalsByGetter = false; } } } if (eq) { if (p.IsOverride && !this.IsTemplateOverride(p)) { return(false); } if (equalsByGetter.HasValue && isMember && this.AltJsName == null) { this.AltJsName = Helpers.GetPropertyRef(p, this.Emitter, equalsByGetter.Value, true, true); } return(true); } return(false); }); list.AddRange(properties); if (this.Inherit) { var baseTypeDefinitions = typeDef.DirectBaseTypes.Where(t => t.Kind == typeDef.Kind || (typeDef.Kind == TypeKind.Struct && t.Kind == TypeKind.Class)); foreach (var baseTypeDef in baseTypeDefinitions) { list = this.GetPropertyOverloads(list, baseTypeDef.GetDefinition()); } } } var returnProperties = isTop ? list.Distinct().ToList() : list; return(returnProperties); }
public static void EmitComment(IAbstractEmitterBlock block, AstNode node, bool?getter = null, VariableInitializer varInitializer = null) { if (block.Emitter.AssemblyInfo.GenerateDocumentation == H5.Contract.DocumentationMode.None || node.Parent == null) { return; } var visitor = new DocumentationCommentVisitor(); node.AcceptChildren(visitor); if (block.Emitter.AssemblyInfo.GenerateDocumentation == H5.Contract.DocumentationMode.Basic && visitor.Comments.Count == 0) { return; } object value = null; var rr = block.Emitter.Resolver.ResolveNode(varInitializer ?? node); string source = BuildCommentString(visitor.Comments); if (node is FieldDeclaration) { if (varInitializer.Initializer is PrimitiveExpression initializer) { value = initializer.Value; } } else if (node is EventDeclaration eventDecl) { foreach (var evVar in eventDecl.Variables) { var ev_rr = block.Emitter.Resolver.ResolveNode(evVar); var memberResolveResult = ev_rr as MemberResolveResult; var ev = memberResolveResult.Member as IEvent; if (!getter.HasValue || getter.Value) { var comment = new JsDocComment(); InitMember(comment, ev.AddAccessor, block.Emitter, null); comment.Function = Helpers.GetEventRef(ev, block.Emitter, false); block.Write( block.WriteIndentToString(XmlToJsDoc.ReadComment(source, ev_rr, block.Emitter, comment))); block.WriteNewLine(); } if (!getter.HasValue || !getter.Value) { var comment = new JsDocComment(); InitMember(comment, ev.RemoveAccessor, block.Emitter, null); comment.Function = Helpers.GetEventRef(ev, block.Emitter, true); block.Write( block.WriteIndentToString(XmlToJsDoc.ReadComment(source, ev_rr, block.Emitter, comment))); block.WriteNewLine(); } } return; } if (node is PropertyDeclaration prop) { var memberResolveResult = rr as MemberResolveResult; var rProp = memberResolveResult.Member as IProperty; var comment = new JsDocComment(); InitMember(comment, rProp, block.Emitter, null); comment.Function = Helpers.GetPropertyRef(rProp, block.Emitter); block.Write(block.WriteIndentToString(XmlToJsDoc.ReadComment(source, rr, block.Emitter, comment))); block.WriteNewLine(); return; } if (node is IndexerDeclaration indexer) { var memberResolveResult = rr as MemberResolveResult; var rProp = memberResolveResult.Member as IProperty; var comment = new JsDocComment(); InitMember(comment, getter.HasValue && getter.Value ? rProp.Getter : rProp.Setter, block.Emitter, null); block.Write(block.WriteIndentToString(XmlToJsDoc.ReadComment(source, rr, block.Emitter, comment))); block.WriteNewLine(); return; } block.Write(block.WriteIndentToString(XmlToJsDoc.Convert(source, rr, block.Emitter, value))); block.WriteNewLine(); }