コード例 #1
0
		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.
		}
コード例 #2
0
            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);
            }
コード例 #3
0
		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();
		}
コード例 #4
0
		/// <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;
		}
コード例 #5
0
		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);
				}
		}
コード例 #6
0
ファイル: DType.cs プロジェクト: DinrusGroup/DRC
        public ClassType(DClassLike dc, ISyntaxRegion td, 
			TemplateIntermediateType baseType, InterfaceType[] baseInterfaces = null,
			IEnumerable<TemplateParameterSymbol> deducedTypes = null)
            : base(dc, td, baseType, baseInterfaces, deducedTypes)
        {
        }
コード例 #7
0
ファイル: DType.cs プロジェクト: DinrusGroup/DRC
        public ClassType(DClassLike dc, ISyntaxRegion td, 
			TemplateIntermediateType baseType, InterfaceType[] baseInterfaces,
			ReadOnlyCollection<TemplateParameterSymbol> deducedTypes)
            : base(dc, td, baseType, baseInterfaces, deducedTypes)
        {
        }
コード例 #8
0
ファイル: DType.cs プロジェクト: Orvid/D_Parser
 public ClassType(DClassLike dc, ISyntaxRegion td,
                  TemplateIntermediateType baseType, InterfaceType[] baseInterfaces = null,
                  IEnumerable <TemplateParameterSymbol> deducedTypes = null)
     : base(dc, td, baseType, baseInterfaces, deducedTypes)
 {
 }
コード例 #9
0
ファイル: DType.cs プロジェクト: Orvid/D_Parser
 public ClassType(DClassLike dc, ISyntaxRegion td,
                  TemplateIntermediateType baseType, InterfaceType[] baseInterfaces,
                  ReadOnlyCollection <TemplateParameterSymbol> deducedTypes)
     : base(dc, td, baseType, baseInterfaces, deducedTypes)
 {
 }
コード例 #10
0
        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;
        }
コード例 #11
0
        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);
        }
コード例 #12
0
		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;
		}
コード例 #13
0
		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);
		}