public static IEnumerable<TemplateIntermediateType> SearchForClassDerivatives(TemplateIntermediateType t, ResolutionContext ctxt) { if (!(t is ClassType || t is InterfaceType)) throw new ArgumentException ("t is expected to be a class or an interface, not " + (t != null ? t.ToString () : "null")); var f = new ClassInterfaceDerivativeFinder (ctxt); f.typeNodeToFind = t.Definition; var bt = t; while (bt != null) { f.alreadyResolvedClasses.Add (bt.Definition); bt = DResolver.StripMemberSymbols (bt.Base) as TemplateIntermediateType; } var filter = MemberFilter.Classes; if (t is InterfaceType) // -> Only interfaces can inherit interfaces. Interfaces cannot be subclasses of classes. { filter |= MemberFilter.Interfaces; f.isInterface = true; } f.IterateThroughScopeLayers (t.Definition.Location, filter); return f.results; // return them. }
public StructVis(TemplateIntermediateType structType,List<int> tkn,ICompletionDataGenerator gen,ResolutionContext ctxt) : base(ctxt) { this.alreadyTakenNames = tkn; this.gen = gen; if (CompletionOptions.Instance.ShowStructMembersInStructInitOnly) this.DeepScanClass(structType, MemberFilter.Variables, false); else IterateThroughScopeLayers(CodeLocation.Empty, MemberFilter.All); }
protected static KeyValuePair<TemplateIntermediateType, MemberSymbol[]>[] GetMembers(TemplateIntermediateType ct, ResolutionContext ctxt) { var lk = new MemberLookup(ctxt); lk.DeepScanClass (ct, MemberFilter.Variables, false); var res = new List<KeyValuePair<TemplateIntermediateType, MemberSymbol[]>>(); var l = new List<MemberSymbol> (); var _ct = ct; while (_ct != null) { l.Clear (); foreach (var m in lk.tempMembers) if (m.Definition.Parent == _ct.Definition) l.Add (m); res.Insert (0,new KeyValuePair<TemplateIntermediateType, MemberSymbol[]> (_ct, l.ToArray ())); _ct = _ct.Base as TemplateIntermediateType; } return res.ToArray(); }
/// <summary> /// Lists the members. /// The List may contain MemberSymbols as well as InterfaceTypes /// </summary> public static List<DSymbol> ListMembers(TemplateIntermediateType tiType, ResolutionContext ctx) { var lMembers = MemberLookup.GetMembers(tiType, ctx); var members = new List<DSymbol>(); if (lMembers != null && lMembers.Length > 0) { foreach (var kvp in lMembers) { if (kvp.Value != null && kvp.Value.Length > 0) { foreach (var ms in kvp.Value) { members.Add(ms); } } if (kvp.Key.BaseInterfaces != null && kvp.Key.BaseInterfaces.Length > 0) foreach (var itf in kvp.Key.BaseInterfaces) members.Add(itf); } } return members; }
static void IterateThroughBaseClassesInterfaces(List<TemplateIntermediateType> l, TemplateIntermediateType tit) { if (tit == null) return; var @base = tit.Base as TemplateIntermediateType; if (@base != null) { if (!l.Contains(@base)) l.Add(@base); IterateThroughBaseClassesInterfaces(l, @base); } if (tit.BaseInterfaces != null) foreach (var I in tit.BaseInterfaces) { if (!l.Contains(I)) l.Add(I); IterateThroughBaseClassesInterfaces(l, I); } }
public ClassType(DClassLike dc, ISyntaxRegion td, TemplateIntermediateType baseType, InterfaceType[] baseInterfaces = null, IEnumerable<TemplateParameterSymbol> deducedTypes = null) : base(dc, td, baseType, baseInterfaces, deducedTypes) { }
public ClassType(DClassLike dc, ISyntaxRegion td, TemplateIntermediateType baseType, InterfaceType[] baseInterfaces, ReadOnlyCollection<TemplateParameterSymbol> deducedTypes) : base(dc, td, baseType, baseInterfaces, deducedTypes) { }
public ClassType(DClassLike dc, ISyntaxRegion td, TemplateIntermediateType baseType, InterfaceType[] baseInterfaces = null, IEnumerable <TemplateParameterSymbol> deducedTypes = null) : base(dc, td, baseType, baseInterfaces, deducedTypes) { }
public ClassType(DClassLike dc, ISyntaxRegion td, TemplateIntermediateType baseType, InterfaceType[] baseInterfaces, ReadOnlyCollection <TemplateParameterSymbol> deducedTypes) : base(dc, td, baseType, baseInterfaces, deducedTypes) { }
public static TooltipInformation Generate(TemplateIntermediateType tit, int currentParam = -1) { var sb = new StringBuilder("("); if (tit is ClassType) sb.Append("Class"); else if (tit is InterfaceType) sb.Append("Interface"); else if (tit is TemplateType) sb.Append("Template"); else if (tit is StructType) sb.Append("Struct"); else if (tit is UnionType) sb.Append("Union"); sb.Append(") ").Append(tit.Name); var dc =tit.Definition; if (dc.TemplateParameters != null && dc.TemplateParameters.Length != 0) { sb.Append('('); for (int i = 0; i < dc.TemplateParameters.Length; i++) { if (i == currentParam) sb.Append("<i>"); sb.Append(dc.TemplateParameters[i].ToString()); if (i == currentParam) sb.Append("</i>"); sb.Append(','); } sb.Remove(sb.Length -1, 1).Append(')'); } var tti = new TooltipInformation { SignatureMarkup = sb.ToString(), SummaryMarkup = dc.Description, FooterMarkup = dc.ToString(false) }; return tti; }
void VisitTemplateIntermediateType(TemplateIntermediateType tr) { if (tr.DeclarationOrExpressionBase is TokenExpression) { var token = ((TokenExpression)tr.DeclarationOrExpressionBase).Token; isVariableInstance = token == DTokens.This || token == DTokens.Super; } // Cases: // myVar. (located in basetype definition) <-- Show everything // this. <-- Show everything // myVar. (not located in basetype definition) <-- Show public and public static members // super. <-- Show all base type members // myClass. (not located in myClass) <-- Show all static members // myClass. (located in myClass) <-- Show all static members MemberCompletionEnumeration.EnumChildren(CompletionDataGenerator, ctxt, tr, isVariableInstance, MemberFilter); GenUfcsAndStaticProperties(tr); }
List<Tuple<MemberSymbol,int>> GetMembersWithOffsets(TemplateIntermediateType tit, out int size) { var members = new List<Tuple<MemberSymbol,int>> (); if (tit is ClassType) size = Memory.CalcOffset (2); else if (tit is StructType || tit is UnionType) size = 0; else throw new ArgumentException ("Can only estimate size of classes, structs and unions"); var sz = Backtrace.DSession.PointerSize; var memberLength = sz; foreach (var ds in MemberLookup.ListMembers(tit, resolutionCtx)) { // If there's a base interface, the interface's vtbl pointer is stored at this position -- and shall be skipped! if(ds is InterfaceType){ // See below if (memberLength < sz) size += size % sz; size += sz; continue; } var ms = ds as MemberSymbol; if (ms == null) throw new InvalidDataException ("ds must be a MemberSymbol, not "+ds.ToCode()); var newSize = SizeOf (ms.Base); /* * Very important on x64: if a long, array or pointer follows e.g. an int value, it'll be aligned to an 8 byte-base again. */ if (memberLength < sz && newSize % sz == 0) size += size % sz; memberLength = newSize; members.Add (new Tuple<MemberSymbol, int>(ms, size)); size += memberLength % 4 == 0 ? memberLength : ((memberLength / 4) + 1) * 4; } return members; }
void VisitTemplateIntermediateType(TemplateIntermediateType tr) { // Cases: // myVar. (located in basetype definition) <-- Show everything // this. <-- Show everything // myVar. (not located in basetype definition) <-- Show public and public static members // super. <-- Show all base type members // myClass. (not located in myClass) <-- Show all static members // myClass. (located in myClass) <-- Show all static members MemberCompletionEnumeration.EnumChildren(CompletionDataGenerator, ctxt, tr, MemberFilter); GenUfcsAndStaticProperties(tr); }