Example #1
0
		public static string get_type_name(ITypeNode t)
		{
			if (t is ICommonTypeNode)
			{
				return (t as ICommonTypeNode).comprehensive_namespace.namespace_name + "." + t.name;
			}
			else if (t is ICompiledTypeNode)
				return (t as ICompiledTypeNode).name;
			return t.name;
		}
Example #2
0
 public virtual void visit(ITypeNode value)
 {
 }
Example #3
0
 public TypeInfo AddEnum(ITypeNode type, EnumBuilder emb)
 {
     TypeInfo ti = new TypeInfo(emb);
     defs[type] = ti;
     return ti;
 }
Example #4
0
		void InvalidateBaseTypeFolderNode(ITypeNode typeNode) {
			var btNode = (IBaseTypeFolderNode)typeNode.TreeNode.DataChildren.FirstOrDefault(a => a is IBaseTypeFolderNode);
			Debug.Assert(btNode != null || typeNode.TreeNode.Children.Count == 0);
			if (btNode != null)
				btNode.InvalidateChildren();
		}
Example #5
0
		DeleteTypeDefCommand(ITypeNode[] asmNodes) {
			nodes = new DeletableNodes<ITypeNode>(asmNodes);
		}
Example #6
0
 private void ConvertConstantDefinitionNode(IConstantDefinitionNode cnst, string name, ITypeNode type, IConstantNode constant_value)
 {
     if (constant_value is IArrayConstantNode)
         ConvertArrayConstantDef(cnst, name, type, constant_value);
     else
         if (constant_value is IRecordConstantNode || constant_value is ICompiledStaticMethodCallNodeAsConstant)
             ConvertConstantDefWithInitCall(cnst, name, type, constant_value);
         else if (constant_value is ICommonNamespaceFunctionCallNodeAsConstant || constant_value is IBasicFunctionCallNodeAsConstant || constant_value is ICommonConstructorCallAsConstant || constant_value is ICompiledStaticFieldReferenceNodeAsConstant)
             ConvertSetConstantDef(cnst, name, type, constant_value);
         else ConvertSimpleConstant(cnst, name, type, constant_value);
 }
Example #7
0
        private void GenerateArrayInitCode(ILGenerator il, LocalBuilder lb, IArrayInitializer InitalValue, ITypeNode ArrayType)
        {
            IExpressionNode[] ElementValues = InitalValue.ElementValues;
            if (ElementValues[0] is IArrayInitializer)
            {
                bool is_unsized_array;
                Type FieldType, ArrType;
                int rank = get_rank(ElementValues[0].type);
                TypeInfo ti = helper.GetTypeReference(ElementValues[0].type);
                if (NETGeneratorTools.IsBoundedArray(ti))
                {
                    is_unsized_array = false;
                    ArrType = ti.tp;
                    FieldType = ti.arr_fld.FieldType;
                }
                else
                {
                    is_unsized_array = true;
                    ArrType = helper.GetTypeReference(ElementValues[0].type).tp;
                    FieldType = ArrType;
                }
                LocalBuilder llb = il.DeclareLocal(FieldType);
                for (int i = 0; i < ElementValues.Length; i++)
                {
                    il.Emit(OpCodes.Ldloc, lb);
                    PushIntConst(il, i);
                    if (!is_unsized_array)
                    {
                        il.Emit(OpCodes.Ldelem, ArrType);
                        il.Emit(OpCodes.Ldfld, ti.arr_fld);
                    }
                    else
                    {
                        //il.Emit(OpCodes.Ldelema, ArrType);
                        if (rank > 1)
                            CreateNDimUnsizedArray(il, (ElementValues[i] as IArrayInitializer).type, helper.GetTypeReference((ElementValues[i] as IArrayInitializer).type.element_type), rank, get_sizes(ElementValues[0] as IArrayInitializer, rank), lb.LocalType.GetElementType());
                        else
                            CreateUnsizedArray(il, helper.GetTypeReference((ElementValues[i] as IArrayInitializer).type.element_type), (ElementValues[0] as IArrayInitializer).ElementValues.Length, lb.LocalType.GetElementType());
                        il.Emit(OpCodes.Stelem, ArrType);
                        il.Emit(OpCodes.Ldloc, lb);
                        PushIntConst(il, i);
                        il.Emit(OpCodes.Ldelem, ArrType);
                        //il.Emit(OpCodes.Ldelem_Ref);
                    }
                    il.Emit(OpCodes.Stloc, llb);
                    if (rank > 1)
                        GenerateNDimArrayInitCode(il, llb, ElementValues[i] as IArrayInitializer, ElementValues[i].type, rank);
                    else
                        GenerateArrayInitCode(il, llb, ElementValues[i] as IArrayInitializer, ArrayType);
                }
            }
            else
                if (ElementValues[0] is IRecordConstantNode || ElementValues[0] is IRecordInitializer)
                {
                    TypeInfo ti = helper.GetTypeReference(ElementValues[0].type);
                    LocalBuilder llb = il.DeclareLocal(ti.tp.MakePointerType());
                    for (int i = 0; i < ElementValues.Length; i++)
                    {
                        il.Emit(OpCodes.Ldloc, lb);
                        PushIntConst(il, i);
                        il.Emit(OpCodes.Ldelema, ti.tp);
                        il.Emit(OpCodes.Stloc, llb);
                        if (ElementValues[0] is IRecordConstantNode)
                            GenerateRecordInitCode(il, llb, ElementValues[i] as IRecordConstantNode);
                        else GenerateRecordInitCode(il, llb, ElementValues[i] as IRecordInitializer, true);
                    }
                }
                else
                    for (int i = 0; i < ElementValues.Length; i++)
                    {
                        il.Emit(OpCodes.Ldloc, lb);
                        PushIntConst(il, i);
                        ILGenerator ilb = this.il;
                        TypeInfo ti = helper.GetTypeReference(ElementValues[i].type);

                        if (ti != null && ti.is_set)
                        {
                            this.il = il;
                            IConstantNode cn1 = null;
                            IConstantNode cn2 = null;
                            if (ArrayType != null && ArrayType.element_type.element_type is ICommonTypeNode)
                            {
                                cn1 = (ArrayType.element_type.element_type as ICommonTypeNode).lower_value;
                                cn2 = (ArrayType.element_type.element_type as ICommonTypeNode).upper_value;
                            }
                            if (cn1 != null && cn2 != null)
                            {
                                cn1.visit(this);
                                il.Emit(OpCodes.Box, helper.GetTypeReference(cn1.type).tp);
                                cn2.visit(this);
                                il.Emit(OpCodes.Box, helper.GetTypeReference(cn2.type).tp);
                            }
                            else
                            {
                                il.Emit(OpCodes.Ldnull);
                                il.Emit(OpCodes.Ldnull);
                            }
                            il.Emit(OpCodes.Newobj, ti.def_cnstr);
                            il.Emit(OpCodes.Stelem_Ref);
                            il.Emit(OpCodes.Ldloc, lb);
                            PushIntConst(il, i);
                            this.il = ilb;
                            //il.Emit(OpCodes.Ldelem_Ref);
                        }
                        if (ti != null && ti.tp.IsValueType && !TypeFactory.IsStandType(ti.tp) && !ti.tp.IsEnum)
                            il.Emit(OpCodes.Ldelema, ti.tp);
                        else
                            if (ti != null && ti.assign_meth != null)
                                il.Emit(OpCodes.Ldelem_Ref);
                        this.il = il;
                        ElementValues[i].visit(this);
                        if (ti != null && ti.assign_meth != null)
                        {
                            il.Emit(OpCodes.Call, ti.assign_meth);
                            this.il = ilb;
                            continue;
                        }
                        bool box = EmitBox(ElementValues[i], lb.LocalType.GetElementType());
                        this.il = ilb;
                        if (ti != null && !box)
                            NETGeneratorTools.PushStelem(il, ti.tp);
                        else
                            il.Emit(OpCodes.Stelem_Ref);
                    }
        }
Example #8
0
        private void CreateInitCodeForUnsizedArray(ILGenerator il, ITypeNode itn, IExpressionNode arr, LocalBuilder len)
        {
            ILGenerator tmp_il = this.il;
            TypeInfo ti = helper.GetTypeReference(itn);
            ICommonTypeNode ictn = itn as ICommonTypeNode;
            bool generic_param = (ictn != null && ictn.runtime_initialization_marker != null);
            FieldInfo finfo = null;
            MethodInfo rif = null;
            Label lab = default(Label);
            this.il = il;
            if (generic_param)
            {
                finfo = helper.GetField(ictn.runtime_initialization_marker).fi;
                lab = il.DefineLabel();
                il.Emit(OpCodes.Ldsfld, finfo);
                il.Emit(OpCodes.Brfalse, lab);
                if (SystemLibrary.SystemLibInitializer.RuntimeInitializeFunction.sym_info is ICompiledMethodNode)
                    rif = (SystemLibrary.SystemLibInitializer.RuntimeInitializeFunction.sym_info as ICompiledMethodNode).method_info;
                else
                    rif = helper.GetMethod(SystemLibrary.SystemLibInitializer.RuntimeInitializeFunction.sym_info as IFunctionNode).mi;
            }
            if (ti.tp.IsValueType && ti.init_meth != null || ti.is_arr || ti.is_set || ti.is_typed_file || ti.is_text_file || ti.tp == TypeFactory.StringType ||
                (generic_param))
            {
                LocalBuilder clb = il.DeclareLocal(TypeFactory.Int32Type);
                il.Emit(OpCodes.Ldc_I4_0);
                il.Emit(OpCodes.Stloc, clb);
                Label tlabel = il.DefineLabel();
                Label flabel = il.DefineLabel();
                il.MarkLabel(tlabel);
                il.Emit(OpCodes.Ldloc, clb);
                il.Emit(OpCodes.Ldloc, len);
                il.Emit(OpCodes.Bge, flabel);
                if (generic_param)
                {
                    arr.visit(this);
                    il.Emit(OpCodes.Ldloc, clb);
                    il.Emit(OpCodes.Ldsfld, finfo);
                }
                arr.visit(this);
                il.Emit(OpCodes.Ldloc, clb);
                if (!ti.is_arr && !ti.is_set && !ti.is_typed_file && !ti.is_text_file)
                {
                    if (generic_param)
                    {
                        il.Emit(OpCodes.Ldelem, ti.tp);
                        il.Emit(OpCodes.Box, ti.tp);
                        il.EmitCall(OpCodes.Call, rif, null);
                        il.Emit(OpCodes.Unbox_Any, ti.tp);
                        il.Emit(OpCodes.Stelem, ti.tp);
                    }
                    else if (ti.tp != TypeFactory.StringType)
                    {
                        il.Emit(OpCodes.Ldelema, ti.tp);
                        il.Emit(OpCodes.Call, ti.init_meth);
                    }
                    else
                    {
                        Label lb1 = il.DefineLabel();
                        Label lb2 = il.DefineLabel();
                        il.Emit(OpCodes.Ldelem_Ref);
                        il.Emit(OpCodes.Ldnull);
                        il.Emit(OpCodes.Beq, lb2);
                        arr.visit(this);
                        il.Emit(OpCodes.Ldloc, clb);
                        il.Emit(OpCodes.Ldelem_Ref);
                        il.Emit(OpCodes.Ldstr, "");
                        il.Emit(OpCodes.Ceq);
                        il.Emit(OpCodes.Brfalse, lb1);
                        il.MarkLabel(lb2);
                        arr.visit(this);
                        il.Emit(OpCodes.Ldloc, clb);
                        il.Emit(OpCodes.Ldstr, "");
                        il.Emit(OpCodes.Stelem_Ref);
                        il.MarkLabel(lb1);
                    }
                }
                else
                {
                    Label label1 = il.DefineLabel();
                    il.Emit(OpCodes.Ldelem_Ref);
                    il.Emit(OpCodes.Ldnull);
                    il.Emit(OpCodes.Ceq);
                    il.Emit(OpCodes.Brfalse, label1);
                    arr.visit(this);
                    il.Emit(OpCodes.Ldloc, clb);
                    if (ti.is_set)
                    {
                        IConstantNode cn1 = (arr.type.element_type as ICommonTypeNode).lower_value;
                        IConstantNode cn2 = (arr.type.element_type as ICommonTypeNode).upper_value;
                        if (cn1 != null && cn2 != null)
                        {
                            cn1.visit(this);
                            il.Emit(OpCodes.Box, helper.GetTypeReference(cn1.type).tp);
                            cn2.visit(this);
                            il.Emit(OpCodes.Box, helper.GetTypeReference(cn2.type).tp);
                        }
                        else
                        {
                            il.Emit(OpCodes.Ldnull);
                            il.Emit(OpCodes.Ldnull);
                        }
                    }
                    else if (ti.is_typed_file)
                    {
                        NETGeneratorTools.PushTypeOf(il, helper.GetTypeReference((arr.type.element_type as ICommonTypeNode).element_type).tp);
                    }

                    il.Emit(OpCodes.Newobj, ti.def_cnstr);

                    il.Emit(OpCodes.Stelem_Ref);
                    il.MarkLabel(label1);
                }
                il.Emit(OpCodes.Ldloc, clb);
                il.Emit(OpCodes.Ldc_I4_1);
                il.Emit(OpCodes.Add);
                il.Emit(OpCodes.Stloc, clb);
                il.Emit(OpCodes.Br, tlabel);
                il.MarkLabel(flabel);
            }
            if (generic_param)
            {
                il.MarkLabel(lab);
            }
            this.il = tmp_il;
        }
Example #9
0
 IObjectFieldDescriptor IObjectFieldDescriptor.Type(ITypeNode type)
 {
     Type(type);
     return(this);
 }
 IDirectiveArgumentDescriptor IDirectiveArgumentDescriptor.Type(
     ITypeNode type)
 {
     Type(type);
     return(this);
 }
Example #11
0
 /// <nodoc />
 public VariableDeclarationBuilder Type(ITypeNode type)
 {
     Contract.Requires(type != null);
     m_type = type;
     return(this);
 }
Example #12
0
 public LetTypeNode(VariableNode v, ITypeNode t)
 {
     Var  = v;
     Type = t;
 }
 public VariableDefinitionNode WithType(ITypeNode type)
 {
     return(new VariableDefinitionNode(
                Location, Variable, type,
                DefaultValue));
 }
Example #14
0
 IArgumentDescriptor IArgumentDescriptor.Type(ITypeNode type)
 {
     TypeReference = TypeReference.GetMoreSpecific(type);
     return(this);
 }
Example #15
0
        private void InitializeUnsizedArray(ILGenerator il, TypeInfo ti, ITypeNode _arr_type, IExpressionNode[] exprs, int rank)
        {
            Type arr_type = helper.GetTypeReference(_arr_type).tp.MakeArrayType();
            LocalBuilder tmp = il.DeclareLocal(arr_type);
            il.Emit(OpCodes.Stloc, tmp);
            for (int i = 2 + rank; i < exprs.Length; i++)
            {
                il.Emit(OpCodes.Ldloc, tmp);
                PushIntConst(il, i - 2 - rank);
                ILGenerator ilb = this.il;

                if (ti != null && ti.tp.IsValueType && !TypeFactory.IsStandType(ti.tp) && !ti.tp.IsEnum)
                    il.Emit(OpCodes.Ldelema, ti.tp);

                this.il = il;
                exprs[i].visit(this);
                bool box = EmitBox(exprs[i], arr_type.GetElementType());
                this.il = ilb;

                TypeInfo ti2 = helper.GetTypeReference(exprs[i].type);
                if (ti2 != null && !box)
                    NETGeneratorTools.PushStelem(il, ti2.tp);
                else
                    il.Emit(OpCodes.Stelem_Ref);

            }
            il.Emit(OpCodes.Ldloc, tmp);
        }
Example #16
0
 private ICommonFunctionNode GetGenericFunctionContainer(ITypeNode tn)
 {
     if (tn.common_generic_function_container != null)
     {
         return tn.common_generic_function_container;
     }
     if (tn.type_special_kind == type_special_kind.typed_file)
     {
         return GetGenericFunctionContainer(tn.element_type);
     }
     if (tn.type_special_kind == type_special_kind.set_type)
     {
         return GetGenericFunctionContainer(tn.element_type);
     }
     if (tn.type_special_kind == type_special_kind.array_kind)
     {
         return GetGenericFunctionContainer(tn.element_type);
     }
     IRefTypeNode ir = tn as IRefTypeNode;
     if (ir != null)
     {
         return GetGenericFunctionContainer(ir.pointed_type);
     }
     IGenericTypeInstance igti = tn as IGenericTypeInstance;
     if (igti != null)
     {
         foreach (ITypeNode par in igti.generic_parameters)
         {
             ICommonFunctionNode rez = GetGenericFunctionContainer(par);
             if (rez != null)
             {
                 return rez;
             }
         }
     }
     return null;
 }
Example #17
0
 public PropertyNodeCreator(IModuleDocumentNode modNode, ITypeNode ownerNode, PropertyDef property)
 {
     this.ownerNode = ownerNode;
     this.propNode  = modNode.Context.DocumentTreeView.Create(property);
 }
Example #18
0
 private void CreateNDimUnsizedArray(ILGenerator il, TypeInfo ti, ITypeNode tn, int rank, IExpressionNode[] sizes)
 {
     Type arr_type = ti.tp.MakeArrayType(rank);
     List<Type> types = new List<Type>();
     for (int i = 2; i < rank + 2; i++)
         types.Add(TypeFactory.Int32Type);
     ConstructorInfo ci = null;
     MethodInfo mi = null;
     if (tn is ICompiledTypeNode)
         ci = arr_type.GetConstructor(types.ToArray());
     else
         mi = mb.GetArrayMethod(arr_type, ".ctor", CallingConventions.HasThis, null, types.ToArray());
     ILGenerator tmp_il = this.il;
     this.il = il;
     for (int i = 2; i < rank + 2; i++)
         sizes[i].visit(this);
     this.il = tmp_il;
     if (ci != null)
         il.Emit(OpCodes.Newobj, ci);
     else
         il.Emit(OpCodes.Newobj, mi);
 }
Example #19
0
        private bool IsTypeAccessible(ITypeNode type)
        {
            // type not declared --> treat it as accessible
            if (type == null)
            {
                return(true);
            }

            // predefined types are always accessible
            if (type.IsPredefinedType())
            {
                return(true);
            }

            // descend into ParenthesizedType
            if (type.Kind == TypeScript.Net.Types.SyntaxKind.ParenthesizedType)
            {
                return(IsTypeAccessible(type.Cast <IParenthesizedTypeNode>().Type));
            }

            // an array type is accessible iff its element type is accessible
            if (type.Kind == TypeScript.Net.Types.SyntaxKind.ArrayType)
            {
                return(IsTypeAccessible(type.Cast <IArrayTypeNode>().ElementType));
            }

            // a union type is accessible iff all its types are accessible
            if (type.Kind == TypeScript.Net.Types.SyntaxKind.UnionType)
            {
                return(type.Cast <IUnionOrIntersectionTypeNode>().Types.All(t => IsTypeAccessible(t)));
            }

            // a function type is accessible iff its return type and its type parameters are accessible
            if (type.Kind == TypeScript.Net.Types.SyntaxKind.FunctionType)
            {
                var fnType       = type.Cast <IFunctionOrConstructorTypeNode>();
                var fnParameters = fnType.Parameters ?? NodeArray.Empty <IParameterDeclaration>();
                return
                    (IsTypeAccessible(fnType.Type) &&
                     fnParameters.All(tp => IsTypeAccessible(tp.Type)));
            }

            // a type literal is accessible iff all its members are accessible
            if (type.Kind == TypeScript.Net.Types.SyntaxKind.TypeLiteral)
            {
                return(type.Cast <ITypeLiteralNode>().Members.All(m => IsMemberAccessible(m)));

                bool IsMemberAccessible(ITypeElement e)
                {
                    var memberTypes = e.Kind == TypeScript.Net.Types.SyntaxKind.PropertySignature
                        ? new[] { e.Cast <IPropertySignature>().Type }
                        : null; // handle other kinds if needed

                    return(memberTypes != null && memberTypes.All(t => IsTypeAccessible(t)));
                }
            }

            // if any type argument is inaccessible, this type is not accessible either
            var typeArguments = type.GetTypeArguments();

            if (!typeArguments.All(t => IsTypeAccessible(t)))
            {
                return(false);
            }

            // if this type couldn't be resolved, treat it as inaccessible
            var resolvedSymbol = type.ResolvedSymbol;

            if (resolvedSymbol == null)
            {
                return(false);
            }

            // otherwise, a type is accessible if any of its declarations is either explicitly exported or defined in the prelude
            return(resolvedSymbol
                   .GetDeclarations()
                   .Any(d =>
                        d.IsExported() ||
                        m_semanticModel.TypeChecker.IsPreludeDeclaration(d)));
        }
Example #20
0
 private void add_possible_type_attribute(FieldBuilder fb, ITypeNode type)
 {
     if (comp_opt.target != TargetType.Dll)
         return;
     if (type.type_special_kind == type_special_kind.typed_file)
     {
         Type elem_type = helper.GetTypeReference(type.element_type).tp;
         CustomAttributeBuilder cust_bldr = null;
         if (type.element_type is ICompiledTypeNode || type.element_type is IRefTypeNode && (type.element_type as IRefTypeNode).pointed_type is ICompiledTypeNode)
             cust_bldr = new CustomAttributeBuilder(this.FileOfAttributeConstructor, new object[1] { elem_type });
         else
             cust_bldr = new CustomAttributeBuilder(this.FileOfAttributeConstructor, new object[1] { elem_type.FullName });
         fb.SetCustomAttribute(cust_bldr);
     }
     else if (type.type_special_kind == type_special_kind.set_type)
     {
         Type elem_type = helper.GetTypeReference(type.element_type).tp;
         CustomAttributeBuilder cust_bldr = null;
         if (type.element_type is ICompiledTypeNode || type.element_type is IRefTypeNode && (type.element_type as IRefTypeNode).pointed_type is ICompiledTypeNode)
             cust_bldr = new CustomAttributeBuilder(this.SetOfAttributeConstructor, new object[1] { elem_type });
         else
             cust_bldr = new CustomAttributeBuilder(this.SetOfAttributeConstructor, new object[1] { elem_type.FullName });
         fb.SetCustomAttribute(cust_bldr);
     }
     else if (type.type_special_kind == type_special_kind.short_string)
     {
         int len = (type as IShortStringTypeNode).Length;
         CustomAttributeBuilder cust_bldr = new CustomAttributeBuilder(this.ShortStringAttributeConstructor, new object[1] { len });
         fb.SetCustomAttribute(cust_bldr);
     }
 }
 public static ITypeRepresentation ToTypeRepresentation(this ITypeNode typeNode) =>
 typeNode switch
 {
Example #22
0
			public void Delete(ITypeNode[] nodes) {
				Debug.Assert(infos == null);
				if (infos != null)
					throw new InvalidOperationException();

				infos = new ModelInfo[nodes.Length];

				for (int i = 0; i < infos.Length; i++) {
					var node = nodes[i];

					var info = new ModelInfo(node.TypeDef);
					infos[i] = info;
					info.OwnerList.RemoveAt(info.Index);
				}
			}
Example #23
0
        private void AnalyzeTypeReference([CanBeNull] ITypeNode type)
        {
            if (type == null || type.IsPredefinedType())
            {
                return;
            }

            // Checking for named types like:
            // let n: CustomInterface = undefined;
            //        ~~~~~~~~~~~~~~~
            var typeReferenceNode = type.As <ITypeReferenceNode>();

            if (typeReferenceNode != null)
            {
                EntityName entityName = typeReferenceNode.TypeName;
                AnalyzeTypeReference(entityName);

                AnalyzeTypeArguments(typeReferenceNode.TypeArguments);
            }

            // Checking for typed literals like:
            // let n: {x: number, y: number} = {x: 1, y: 3};
            //        ~~~~~~~~~~~~~~~~~~~~~~
            var typeLiteralNode = type.As <ITypeLiteralNode>();

            if (typeLiteralNode != null)
            {
                // Don't need to register names, because it is not a real interface declaration.
                AnalyzeInterfaceMembers(typeLiteralNode.Members, registerPropertyNames: false);
            }

            // Check for array types like:
            // let n: number[] = [1,2];
            //        ~~~~~~~~
            var arrayTypeNode = type.As <IArrayTypeNode>();

            if (arrayTypeNode != null)
            {
                AnalyzeTypeReference(arrayTypeNode.ElementType);
            }

            // Check for function types like:
            // function foo(): () => number {}
            //                 ~~~~~~~~~~~~
            var functionType = type.As <IFunctionOrConstructorTypeNode>();

            if (functionType != null)
            {
                AnalyzeParameters(functionType.Parameters);
                AnalyzeTypeReference(functionType.Type);
                AnalyzeTypeParameters(functionType.TypeParameters);
            }

            // Check for parenthesized types like:
            // function foo(): (() => number)[] {return [];}
            //                 ~~~~~~~~~~~~~~~~
            var parenthesizedType = type.As <IParenthesizedTypeNode>();

            if (parenthesizedType != null)
            {
                AnalyzeTypeReference(parenthesizedType.Type);
            }

            // Checking for union types like:
            // type X = string | number;
            //          ~~~~~~~~~~~~~~~
            var unionType = type.As <IUnionTypeNode>();

            if (unionType != null)
            {
                foreach (var t in unionType.Types)
                {
                    AnalyzeTypeReference(t);
                }
            }

            // Checking for tuple types like:
            // type X = [1, 2];
            //          ~~~~~~~~~~~~~~~
            var tupleType = type.As <ITupleTypeNode>();

            if (tupleType != null)
            {
                foreach (var t in tupleType.ElementTypes)
                {
                    AnalyzeTypeReference(t);
                }
            }

            // Checking for type query like:
            // type X = typeof anIdentifier;
            //          ~~~~~~~~~~~~~~~
            var typeQueryType = type.As <ITypeQueryNode>();

            if (typeQueryType != null)
            {
                var entityName = typeQueryType.ExprName;
                AnalyzeTypeReference(entityName);
            }
        }
Example #24
0
		CreateNestedTypeDefCommand(ITypeNode ownerType, TypeDefOptions options) {
			this.ownerType = ownerType;

			var modNode = ownerType.GetModuleNode();
			Debug.Assert(modNode != null);
			if (modNode == null)
				throw new InvalidOperationException();
			this.nestedType = ownerType.Create(options.CreateTypeDef(modNode.DnSpyFile.ModuleDef));
		}
Example #25
0
 public ListTypeNode(ITypeNode type)
     : this(null, type)
 {
 }
Example #26
0
		public Type GetPascalTypeReference(ITypeNode tn)
		{
			return pas_defs[tn] as Type;
		}
Example #27
0
 public ListTypeNode WithType(ITypeNode type)
 {
     return(new ListTypeNode(Location, type));
 }
Example #28
0
        //получение типа
		public TypeInfo GetTypeReference(ITypeNode type)
		{
			TypeInfo ti = defs[type] as TypeInfo;
			if (ti != null) 
			{
				if (type.type_special_kind == type_special_kind.text_file) 
					ti.is_text_file = true;
				if (!ti.is_set && !ti.is_typed_file && !ti.is_text_file) return ti;
				if (ti.clone_meth == null && !ti.is_typed_file && !ti.is_text_file)
                {
                    if (type is ICommonTypeNode)
                        ti.clone_meth = this.GetMethodBuilder(find_method(type as ICommonTypeNode, "CloneSet"));//ti.tp.GetMethod("Clone");
                    else
                        ti.clone_meth = ti.tp.GetMethod("CloneSet");
                }
                if (ti.def_cnstr == null)
                {
                	//if (type.type_special_kind == type_special_kind.text_file) ti.is_text_file = true;
                    if (ti.is_set)
                    {
                        if (type is ICommonTypeNode)
                            ti.def_cnstr = this.GetConstructorBuilder(find_constructor_with_params(type as ICommonTypeNode));
                        else
                            ti.def_cnstr = find_constructor_with_params(ti.tp);
                    }
                    else if (ti.is_typed_file)
                    {
                        if (type is ICommonTypeNode)
                            ti.def_cnstr = this.GetConstructorBuilder(find_constructor_with_one_param(type as ICommonTypeNode));
                        else
                            ti.def_cnstr = find_constructor_with_one_param(ti.tp);
                    }
                    else
                    {
                        if (type is ICommonTypeNode)
                            ti.def_cnstr = this.GetConstructorBuilder(find_constructor(type as ICommonTypeNode));
                        else
                            ti.def_cnstr = find_constructor(ti.tp);
                    }
                }
                if (ti.assign_meth == null && !ti.is_typed_file && !ti.is_text_file)
                {
                    if (type is ICommonTypeNode)
                        ti.assign_meth = this.GetMethodBuilder(find_method(type as ICommonTypeNode, "AssignSetFrom"));
                    else
                        ti.assign_meth = ti.tp.GetMethod("AssignSetFrom");
                }
				return ti;
			}
			if (type is ICompiledTypeNode) {
				ti = new TypeInfo(((ICompiledTypeNode)type).compiled_type);
				defs[type] = ti;
				return ti;
			}
            //(ssyy) Ускорил, вставив switch
            switch (type.type_special_kind)
            {
                case type_special_kind.typed_file:
                    ti = GetTypeReference(type.base_type);
                    if (ti == null) return null;
                    ti.is_typed_file = true;
                    if (ti.def_cnstr == null)
                    {
                        if (type.base_type is ICommonTypeNode)
                            ti.def_cnstr = this.GetConstructorBuilder(find_constructor_with_one_param(type.base_type as ICommonTypeNode));
                        else
                            ti.def_cnstr = find_constructor_with_one_param(ti.tp);
                    }
                    return ti;
                case type_special_kind.set_type:
                    ti = GetTypeReference(type.base_type);
                    if (ti == null) return null;
                    ti.is_set = true;
                    if (ti.clone_meth == null)
                    {
                        if (type.base_type is ICommonTypeNode)
                            ti.clone_meth = this.GetMethodBuilder(find_method(type.base_type as ICommonTypeNode, "CloneSet"));//ti.tp.GetMethod("Clone");
                        else
                            ti.clone_meth = ti.tp.GetMethod("CloneSet");
                    }
                    if (ti.assign_meth == null)
                    {
                        if (type.base_type is ICommonTypeNode)
                            ti.assign_meth = this.GetMethodBuilder(find_method(type.base_type as ICommonTypeNode, "AssignSetFrom"));
                        else
                            ti.assign_meth = ti.tp.GetMethod("AssignSetFrom");    
                    }
                    if (ti.def_cnstr == null)
                    {
                        if (type.base_type is ICommonTypeNode)
                            ti.def_cnstr = this.GetConstructorBuilder(find_constructor_with_params(type.base_type as ICommonTypeNode));
                        else
                            ti.def_cnstr = find_constructor_with_params(ti.tp);
                    }
                    return ti;
                case type_special_kind.diap_type:
                    return GetTypeReference(type.base_type);
                case type_special_kind.short_string:
                    return TypeFactory.string_type;
                case type_special_kind.array_kind:
                    TypeInfo tmp = GetTypeReference(type.element_type);
                    if (tmp == null) return null;
                    int rank = (type as ICommonTypeNode).rank;
                    if (rank == 1)
                    	ti = new TypeInfo(tmp.tp.MakeArrayType());
                    else
                    	ti = new TypeInfo(tmp.tp.MakeArrayType(rank));
                    //ti.is_arr = true;
                    defs[type] = ti;
                    return ti;
            }
			if (type is IRefTypeNode) {
				TypeInfo ref_ti = GetTypeReference(((IRefTypeNode)type).pointed_type);
                if (ref_ti == null) return null;
                //(ssyy) Лучше использовать MakePointerType
                ti = new TypeInfo(ref_ti.tp.MakePointerType());
                defs[type] = ti;
                return ti;
			}
			
			return null;
		}
Example #29
0
 protected void Type(ITypeNode type)
 {
     FieldDescription.TypeReference = FieldDescription
                                      .TypeReference.GetMoreSpecific(type);
 }
Example #30
0
 private void InitializeNDimUnsizedArray(ILGenerator il, TypeInfo ti, ITypeNode _arr_type, IExpressionNode[] exprs, int rank)
 {
     Type arr_type = helper.GetTypeReference(_arr_type).tp.MakeArrayType(rank);
     LocalBuilder tmp = il.DeclareLocal(arr_type);
     CreateArrayLocalVariable(il, tmp, helper.GetTypeReference((exprs[2 + rank] as IArrayInitializer).type), exprs[2 + rank] as IArrayInitializer, (exprs[2 + rank] as IArrayInitializer).type);
     il.Emit(OpCodes.Ldloc, tmp);
 }
Example #31
0
 CreateFieldDefCommand(ITypeNode ownerNode, FieldDefOptions options)
 {
     this.ownerNode = ownerNode;
     this.fieldNode = ownerNode.Create(options.CreateFieldDef(ownerNode.TypeDef.Module));
 }
Example #32
0
 private void CreateInitCodeForUnsizedArray(ILGenerator il, TypeInfo ti, ITypeNode _arr_type, LocalBuilder size)
 {
     Type arr_type = helper.GetTypeReference(_arr_type).tp.MakeArrayType();
     ILGenerator tmp_il = this.il;
     this.il = il;
     if (ti.tp.IsValueType && ti.init_meth != null || ti.is_arr || ti.is_set || ti.is_typed_file || ti.is_text_file || ti.tp == TypeFactory.StringType)
     {
         LocalBuilder tmp = il.DeclareLocal(arr_type);
         il.Emit(OpCodes.Stloc, tmp);
         LocalBuilder clb = il.DeclareLocal(TypeFactory.Int32Type);
         il.Emit(OpCodes.Ldc_I4_0);
         il.Emit(OpCodes.Stloc, clb);
         Label tlabel = il.DefineLabel();
         Label flabel = il.DefineLabel();
         il.MarkLabel(tlabel);
         il.Emit(OpCodes.Ldloc, clb);
         il.Emit(OpCodes.Ldloc, size);
         il.Emit(OpCodes.Bge, flabel);
         il.Emit(OpCodes.Ldloc, tmp);
         il.Emit(OpCodes.Ldloc, clb);
         if (!ti.is_arr && !ti.is_set && !ti.is_typed_file && !ti.is_text_file)
         {
             if (ti.tp != TypeFactory.StringType)
             {
                 il.Emit(OpCodes.Ldelema, ti.tp);
                 il.Emit(OpCodes.Call, ti.init_meth);
             }
             else
             {
                 il.Emit(OpCodes.Ldstr, "");
                 il.Emit(OpCodes.Stelem_Ref);
             }
         }
         else
         {
             Label label1 = il.DefineLabel();
             il.Emit(OpCodes.Ldelem_Ref);
             il.Emit(OpCodes.Ldnull);
             il.Emit(OpCodes.Ceq);
             il.Emit(OpCodes.Brfalse, label1);
             il.Emit(OpCodes.Ldloc, tmp);
             il.Emit(OpCodes.Ldloc, clb);
             if (ti.is_set)
             {
                 IConstantNode cn1 = (_arr_type as ICommonTypeNode).lower_value;
                 IConstantNode cn2 = (_arr_type as ICommonTypeNode).upper_value;
                 if (cn1 != null && cn2 != null)
                 {
                     cn1.visit(this);
                     il.Emit(OpCodes.Box, helper.GetTypeReference(cn1.type).tp);
                     cn2.visit(this);
                     il.Emit(OpCodes.Box, helper.GetTypeReference(cn2.type).tp);
                 }
                 else
                 {
                     il.Emit(OpCodes.Ldnull);
                     il.Emit(OpCodes.Ldnull);
                 }
             }
             else if (ti.is_typed_file)
             {
                 NETGeneratorTools.PushTypeOf(il, helper.GetTypeReference((_arr_type as ICommonTypeNode).element_type).tp);
             }
             il.Emit(OpCodes.Newobj, ti.def_cnstr);
             il.Emit(OpCodes.Stelem_Ref);
             il.MarkLabel(label1);
         }
         il.Emit(OpCodes.Ldloc, clb);
         il.Emit(OpCodes.Ldc_I4_1);
         il.Emit(OpCodes.Add);
         il.Emit(OpCodes.Stloc, clb);
         il.Emit(OpCodes.Br, tlabel);
         il.MarkLabel(flabel);
         il.Emit(OpCodes.Ldloc, tmp);
     }
     this.il = tmp_il;
 }
Example #33
0
 CreatePropertyDefCommand(ITypeNode ownerNode, PropertyDefOptions options)
 {
     this.ownerNode = ownerNode;
     this.propNode  = ownerNode.Create(options.CreatePropertyDef(ownerNode.TypeDef.Module));
 }
Example #34
0
 private void CreateInitCodeForNDimUnsizedArray(ILGenerator il, TypeInfo ti, ITypeNode _arr_type, int rank, IExpressionNode[] exprs)
 {
     Type arr_type = helper.GetTypeReference(_arr_type).tp.MakeArrayType(rank);
     ILGenerator tmp_il = this.il;
     this.il = il;
     MethodInfo set_meth = null;
     MethodInfo addr_meth = null;
     MethodInfo get_meth = null;
     List<Type> lst2 = new List<Type>();
     for (int i = 0; i < exprs.Length; i++)
         lst2.Add(TypeFactory.Int32Type);
     get_meth = mb.GetArrayMethod(arr_type, "Get", CallingConventions.HasThis, ti.tp, lst2.ToArray());
     addr_meth = mb.GetArrayMethod(arr_type, "Address", CallingConventions.HasThis, ti.tp.MakeByRefType(), lst2.ToArray());
     lst2.Add(ti.tp);
     set_meth = mb.GetArrayMethod(arr_type, "Set", CallingConventions.HasThis, TypeFactory.VoidType, lst2.ToArray());
     if (ti.tp.IsValueType && ti.init_meth != null || ti.is_arr || ti.is_set || ti.is_typed_file || ti.is_text_file || ti.tp == TypeFactory.StringType)
     {
         LocalBuilder tmp = il.DeclareLocal(arr_type);
         il.Emit(OpCodes.Stloc, tmp);
         List<TmpForNDimArr> lst = new List<TmpForNDimArr>();
         for (int i = 0; i < exprs.Length; i++)
         {
             LocalBuilder clb = il.DeclareLocal(TypeFactory.Int32Type);
             il.Emit(OpCodes.Ldc_I4_0);
             il.Emit(OpCodes.Stloc, clb);
             Label tlabel = il.DefineLabel();
             Label flabel = il.DefineLabel();
             il.MarkLabel(tlabel);
             il.Emit(OpCodes.Ldloc, clb);
             TmpForNDimArr tmp_arr_str = new TmpForNDimArr(clb, tlabel, flabel);
             lst.Add(tmp_arr_str);
             exprs[i].visit(this);
             il.Emit(OpCodes.Bge, flabel);
         }
         il.Emit(OpCodes.Ldloc, tmp);
         for (int i = 0; i < exprs.Length; i++)
         {
             il.Emit(OpCodes.Ldloc, lst[i].clb);
         }
         if (!ti.is_arr && !ti.is_set && !ti.is_typed_file && !ti.is_text_file)
         {
             if (ti.tp != TypeFactory.StringType)
             {
                 il.Emit(OpCodes.Call, addr_meth);
                 il.Emit(OpCodes.Call, ti.init_meth);
             }
             else
             {
                 il.Emit(OpCodes.Ldstr, "");
                 il.Emit(OpCodes.Call, set_meth);
             }
         }
         else
         {
             Label label1 = il.DefineLabel();
             il.Emit(OpCodes.Call, get_meth);
             il.Emit(OpCodes.Ldnull);
             il.Emit(OpCodes.Ceq);
             il.Emit(OpCodes.Brfalse, label1);
             il.Emit(OpCodes.Ldloc, tmp);
             for (int i = 0; i < exprs.Length; i++)
             {
                 il.Emit(OpCodes.Ldloc, lst[i].clb);
             }
             if (ti.is_set)
             {
                 IConstantNode cn1 = (_arr_type as ICommonTypeNode).lower_value;
                 IConstantNode cn2 = (_arr_type as ICommonTypeNode).upper_value;
                 if (cn1 != null && cn2 != null)
                 {
                     cn1.visit(this);
                     il.Emit(OpCodes.Box, helper.GetTypeReference(cn1.type).tp);
                     cn2.visit(this);
                     il.Emit(OpCodes.Box, helper.GetTypeReference(cn2.type).tp);
                 }
                 else
                 {
                     il.Emit(OpCodes.Ldnull);
                     il.Emit(OpCodes.Ldnull);
                 }
             }
             else if (ti.is_typed_file)
             {
                 NETGeneratorTools.PushTypeOf(il, helper.GetTypeReference((_arr_type as ICommonTypeNode).element_type).tp);
             }
             il.Emit(OpCodes.Newobj, ti.def_cnstr);
             il.Emit(OpCodes.Call, set_meth);
             il.MarkLabel(label1);
         }
         for (int i = exprs.Length - 1; i >= 0; i--)
         {
             il.Emit(OpCodes.Ldloc, lst[i].clb);
             il.Emit(OpCodes.Ldc_I4_1);
             il.Emit(OpCodes.Add);
             il.Emit(OpCodes.Stloc, lst[i].clb);
             il.Emit(OpCodes.Br, lst[i].tlabel);
             il.MarkLabel(lst[i].flabel);
         }
         il.Emit(OpCodes.Ldloc, tmp);
     }
     this.il = tmp_il;
 }
Example #35
0
 public MethodNodeCreator(IModuleFileNode modNode, ITypeNode ownerNode, MethodDef method)
 {
     this.ownerNode  = ownerNode;
     this.methodNode = modNode.Context.FileTreeView.Create(method);
 }
Example #36
0
 private void CreateNDimUnsizedArray(ILGenerator il, ITypeNode ArrType, TypeInfo ti, int rank, int[] sizes, Type elem_type)
 {
     Type arr_type = helper.GetTypeReference(ArrType).tp;
     List<Type> types = new List<Type>();
     for (int i = 2; i < rank + 2; i++)
         types.Add(TypeFactory.Int32Type);
     ConstructorInfo ci = null;
     MethodInfo mi = null;
     if (ArrType is ICompiledTypeNode)
         ci = arr_type.GetConstructor(types.ToArray());
     else
         mi = mb.GetArrayMethod(arr_type, ".ctor", CallingConventions.HasThis, null, types.ToArray());
     for (int i = 0; i < sizes.Length; i++)
         il.Emit(OpCodes.Ldc_I4, sizes[i]);
     if (ci != null)
         il.Emit(OpCodes.Newobj, ci);
     else
         il.Emit(OpCodes.Newobj, mi);
 }
Example #37
0
 public new IInterfaceFieldDescriptor Type(ITypeNode type)
 {
     base.Type(type);
     return(this);
 }
Example #38
0
 private void GenerateNDimArrayInitCode(ILGenerator il, LocalBuilder lb, IArrayInitializer InitalValue, ITypeNode ArrayType, int rank)
 {
     IExpressionNode[] ElementValues = InitalValue.ElementValues;
     Type elem_type = helper.GetTypeReference(ArrayType.element_type).tp;
     MethodInfo set_meth = null;
     if (ArrayType is ICompiledTypeNode)
         set_meth = lb.LocalType.GetMethod("Set");
     else
     {
         List<Type> lst = new List<Type>();
         for (int i = 0; i < rank; i++)
             lst.Add(TypeFactory.Int32Type);
         lst.Add(elem_type);
         set_meth = mb.GetArrayMethod(lb.LocalType, "Set", CallingConventions.HasThis, TypeFactory.VoidType, lst.ToArray());
     }
     List<int> indices = new List<int>();
     for (int i = 0; i < ElementValues.Length; i++)
     {
         if (i == 0)
             indices.Add(i);
         else
             indices[indices.Count - rank] = i;
         EmitArrayIndex(il, set_meth, lb, ElementValues[i] as IArrayInitializer, rank - 1, rank, indices);
     }
 }
Example #39
0
        /// <summary>
        /// Exposes a declaration of the form '@@public export identifier : type = undefined' at the specified (pos, end) location
        /// </summary>
        /// <remarks>
        /// Line map of the source file is not set
        /// </remarks>
        public static void AddExportToSourceFile(TypeScript.Net.Types.SourceFile sourceFile, string identifier, ITypeNode type, int pos, int end)
        {
            // A value representing all output directories of the project
            var outputDeclaration = new VariableDeclaration(identifier, Identifier.CreateUndefined(), type);

            outputDeclaration.Flags |= NodeFlags.Export | NodeFlags.Public | NodeFlags.ScriptPublic;
            outputDeclaration.Pos    = pos;
            outputDeclaration.End    = end;

            // Final source file looks like
            //   @@public export outputs: type[] = undefined;
            // The 'undefined' part is not really important here. The value at runtime has its own special handling in the resolver.
            sourceFile.Statements.Add(new VariableStatement()
            {
                DeclarationList = new VariableDeclarationList(
                    NodeFlags.Const,
                    outputDeclaration)
            });
        }
Example #40
0
 private Type get_type_reference_for_pascal_attributes(ITypeNode tn)
 {
     if (tn.type_special_kind == type_special_kind.short_string)
     {
         return CreateShortStringType(tn);
     }
     else if (tn.type_special_kind == type_special_kind.typed_file)
     {
         return CreateTypedFileType(tn as ICommonTypeNode);
     }
     else if (tn.type_special_kind == type_special_kind.set_type)
     {
         return CreateTypedSetType(tn as ICommonTypeNode);
     }
     else
         return helper.GetTypeReference(tn).tp;
 }
Example #41
0
 IInterfaceFieldDescriptor IInterfaceFieldDescriptor.Type(ITypeNode type)
 {
     Type(type);
     return(this);
 }
Example #42
0
 private bool TypeNeedToFix(ITypeNode type)
 {
     switch (type.type_special_kind)
     {
         case type_special_kind.array_wrapper:
         case type_special_kind.array_kind:
         case type_special_kind.set_type:
         case type_special_kind.short_string:
         case type_special_kind.typed_file:
             return true;
     }
     return false;
 }
Example #43
0
 CreateEventDefCommand(ITypeNode ownerNode, EventDefOptions options)
 {
     this.ownerNode = ownerNode;
     this.eventNode = ownerNode.Create(options.CreateEventDef(ownerNode.TypeDef.Module));
 }
Example #44
0
        private void ConvertSetConstantDef(IConstantDefinitionNode cnst, string name, ITypeNode type, IConstantNode constant_value)
        {
            TypeInfo ti = helper.GetTypeReference(type);
            FieldAttributes attrs = FieldAttributes.Public | FieldAttributes.Static;
            if (comp_opt.target == TargetType.Dll)
                attrs |= FieldAttributes.InitOnly;
            FieldBuilder fb = cur_type.DefineField(name, ti.tp, attrs);
            //il.Emit(OpCodes.Newobj, ti.tp.GetConstructor(Type.EmptyTypes));
            //il.Emit(OpCodes.Stsfld, fb);
            if (cnst != null)
                helper.AddConstant(cnst, fb);
            bool tmp = save_debug_info;
            save_debug_info = false;
            constant_value.visit(this);
            save_debug_info = tmp;
            il.Emit(OpCodes.Stsfld, fb);

            if (!ConvertedConstants.ContainsKey(constant_value))
                ConvertedConstants.Add(constant_value, fb);
        }
Example #45
0
 public Array(ITypeNode of, int rank)
 {
     Of   = of;
     Rank = rank;
 }
Example #46
0
			public void Restore(ITypeNode[] nodes) {
				Debug.Assert(infos != null);
				if (infos == null)
					throw new InvalidOperationException();
				Debug.Assert(infos.Length == nodes.Length);
				if (infos.Length != nodes.Length)
					throw new InvalidOperationException();

				for (int i = infos.Length - 1; i >= 0; i--) {
					var node = nodes[i];
					var info = infos[i];
					info.OwnerList.Insert(info.Index, node.TypeDef);
				}

				infos = null;
			}
Example #47
0
 public new IObjectFieldDescriptor Type(ITypeNode typeNode)
 {
     base.Type(typeNode);
     return(this);
 }
Example #48
0
		CreateTypeDefCommand(IList<TypeDef> ownerList, IFileTreeNodeData ownerNode, TypeDefOptions options) {
			this.ownerList = ownerList;
			var modNode = ownerNode.GetModuleNode();
			Debug.Assert(modNode != null);
			if (modNode == null)
				throw new InvalidOperationException();
			this.nsNodeCreator = new NamespaceNodeCreator(options.Namespace, modNode);
			this.typeNode = modNode.Context.FileTreeView.Create(options.CreateTypeDef(modNode.DnSpyFile.ModuleDef));
		}
Example #49
0
 CreateMethodDefCommand(ITypeNode ownerNode, MethodDefOptions options)
 {
     this.ownerNode  = ownerNode;
     this.methodNode = ownerNode.Create(options.CreateMethodDef(ownerNode.TypeDef.Module));
 }
Example #50
0
		TypeDefSettingsCommand(ModuleDef module, ITypeNode typeNode, TypeDefOptions options) {
			this.module = module;
			this.typeNode = typeNode;
			this.newOptions = options;
			this.origOptions = new TypeDefOptions(typeNode.TypeDef);

			this.origParentNode = (IFileTreeNodeData)typeNode.TreeNode.Parent.Data;
			this.origParentChildIndex = this.origParentNode.TreeNode.Children.IndexOf(typeNode.TreeNode);
			Debug.Assert(this.origParentChildIndex >= 0);
			if (this.origParentChildIndex < 0)
				throw new InvalidOperationException();

			this.nameChanged = origOptions.Name != newOptions.Name;
			if (this.origParentNode is INamespaceNode) {
				var modNode = (IModuleFileNode)this.origParentNode.TreeNode.Parent.Data;
				if (newOptions.Namespace != origOptions.Namespace)
					this.nsNodeCreator = new NamespaceNodeCreator(newOptions.Namespace, modNode);
			}

			if (this.nameChanged || origOptions.Namespace != newOptions.Namespace)
				this.typeRefInfos = RefFinder.FindTypeRefsToThisModule(module).Where(a => RefFinder.TypeEqualityComparerInstance.Equals(a, typeNode.TypeDef)).Select(a => new TypeRefInfo(a)).ToArray();
		}
 public new IArgumentDescriptor Type(
     ITypeNode typeNode)
 {
     base.Type(typeNode);
     return(this);
 }
Example #52
0
		public void AddPascalTypeReference(ITypeNode tn, Type t)
		{
			pas_defs[tn] = t;
		}
Example #53
0
 public FieldDefinitionNode WithType(ITypeNode type)
 {
     return(new FieldDefinitionNode(
                Location, Name, Description,
                Arguments, type, Directives));
 }
Example #54
0
        //добавление типа
		public TypeInfo AddType(ITypeNode type, TypeBuilder tb)
		{
			TypeInfo ti = new TypeInfo(tb);
			defs[type] = ti;
			return ti;
		}
 public override void VisitTypeNode <T>(GraphContext context, ITypeNode <T> node)
 {
     base.VisitTypeNode(context, node);
 }
Example #56
0
 public TypeInfo AddExistingType(ITypeNode type, Type t)
 {
     TypeInfo ti = new TypeInfo(t);
     defs[type] = ti;
     return ti;
 }
Example #57
0
        private List <ICaseClause> CreateSwitchCasesForTargetFrameworks(NugetAnalyzedPackage analyzedPackage, ITypeNode pkgType)
        {
            var cases = new List <ICaseClause>();

            Contract.Assert(analyzedPackage.TargetFrameworks.Count != 0, "Managed package must have at least one target framework.");

            var valid = analyzedPackage.TargetFrameworks.Exists(moniker => m_nugetFrameworkMonikers.FullFrameworkVersionHistory.Contains(moniker) || m_nugetFrameworkMonikers.NetCoreVersionHistory.Contains(moniker));

            Contract.Assert(valid, "Target framework monikers must exsist and be registered with internal target framework version helpers.");

            var allFullFrameworkDeps = m_nugetFrameworkMonikers.FullFrameworkVersionHistory
                                       .SelectMany(m =>
                                                   analyzedPackage.DependenciesPerFramework.TryGetValue(m, out IReadOnlyList <INugetPackage> dependencySpecificFrameworks)
                        ? dependencySpecificFrameworks
                        : new List <INugetPackage>())
                                       .GroupBy(pkg => pkg.Id)
                                       .Select(grp => grp.OrderBy(pkg => pkg.Version).Last());

            foreach (var versionHistory in new List <PathAtom>[] { m_nugetFrameworkMonikers.FullFrameworkVersionHistory, m_nugetFrameworkMonikers.NetCoreVersionHistory })
            {
                FindAllCompatibleFrameworkMonikers(analyzedPackage, (List <PathAtom> monikers) =>
                {
                    if (monikers.Count == 0)
                    {
                        return;
                    }

                    if (analyzedPackage.IsNetStandardPackageOnly)
                    {
                        cases.AddRange(m_nugetFrameworkMonikers.NetStandardToFullFrameworkCompatibility.Select(m => new CaseClause(new LiteralExpression(m.ToString(m_pathTable.StringTable)))));
                    }

                    cases.AddRange(monikers.Take(monikers.Count - 1).Select(m => new CaseClause(new LiteralExpression(m.ToString(m_pathTable.StringTable)))));

                    var compile      = new List <IExpression>();
                    var runtime      = new List <IExpression>();
                    var dependencies = new List <IExpression>();

                    // Compile items
                    if (TryGetValueForFrameworkAndFallbacks(analyzedPackage.References, new NugetTargetFramework(monikers.First()), out IReadOnlyList <RelativePath> refAssemblies))
                    {
                        compile.AddRange(refAssemblies.Select(r => CreateSimpleBinary(r)));
                    }

                    // Runtime items
                    if (TryGetValueForFrameworkAndFallbacks(analyzedPackage.Libraries, new NugetTargetFramework(monikers.First()), out IReadOnlyList <RelativePath> libAssemblies))
                    {
                        runtime.AddRange(libAssemblies.Select(l => CreateSimpleBinary(l)));
                    }

                    // For full framework dependencies we unconditionally include all the distinct dependencies from the nuspec file,
                    // .NETStandard dependencies are only included if the moniker and the parsed target framework match!
                    if (m_nugetFrameworkMonikers.IsFullFrameworkMoniker(monikers.First()))
                    {
                        dependencies.AddRange(allFullFrameworkDeps.Select(dep => CreateImportFromForDependency(dep)));
                    }
                    else
                    {
                        if (analyzedPackage.DependenciesPerFramework.TryGetValue(monikers.First(), out IReadOnlyList <INugetPackage> dependencySpecificFrameworks))
                        {
                            dependencies.AddRange(dependencySpecificFrameworks.Select(dep => CreateImportFromForDependency(dep)));
                        }
                    }

                    cases.Add(
                        new CaseClause(
                            new LiteralExpression(monikers.Last().ToString(m_pathTable.StringTable)),
                            new ReturnStatement(
                                Call(
                                    PropertyAccess("Managed", "Factory", "createNugetPackage"),
                                    new LiteralExpression(analyzedPackage.Id),
                                    new LiteralExpression(analyzedPackage.Version),
                                    PropertyAccess("Contents", "all"),
                                    Array(compile),
                                    Array(runtime),
                                    m_nugetFrameworkMonikers.IsFullFrameworkMoniker(monikers.Last())
                                        ? Array(dependencies)
                                        : Array(new CallExpression(new Identifier("...addIfLazy"),
                                                                   new BinaryExpression(
                                                                       new PropertyAccessExpression("qualifier", "targetFramework"),
                                                                       SyntaxKind.EqualsEqualsEqualsToken,
                                                                       new LiteralExpression(monikers.First().ToString(m_pathTable.StringTable))
                                                                       ),
                                                                   new ArrowFunction(
                                                                       CollectionUtilities.EmptyArray <IParameterDeclaration>(),
                                                                       Array(dependencies)
                                                                       )
                                                                   ))
                                    )
                                )
                            )
                        );
                }, versionHistory);
            }

            return(cases);
        }
Example #58
0
		CreateFieldDefCommand(ITypeNode ownerNode, FieldDefOptions options) {
			this.ownerNode = ownerNode;
			this.fieldNode = ownerNode.Create(options.CreateFieldDef(ownerNode.TypeDef.Module));
		}
Example #59
0
        private List <ICaseClause> CreateSwitchCasesForTargetFrameworks(NugetAnalyzedPackage analyzedPackage, ITypeNode pkgType)
        {
            var cases = new List <ICaseClause>();

            Contract.Assert(analyzedPackage.TargetFrameworkWithFallbacks.Count != 0, "Managed package must have at least one target framework.");

            foreach (var framework in analyzedPackage.TargetFrameworkWithFallbacks)
            {
                // Emit the fallback cases first:
                foreach (var fallback in framework.Value)
                {
                    var fallbackString = fallback.ToString(m_pathTable.StringTable);
                    cases.Add(new CaseClause(new LiteralExpression(fallbackString)));
                }

                var compile      = new List <IExpression>();
                var runtime      = new List <IExpression>();
                var dependencies = new List <IExpression>();

                // Compile items
                if (TryGetValueForFrameworkAndFallbacks(analyzedPackage.References, new NugetTargetFramework(framework.Key), out IReadOnlyList <RelativePath> refAssemblies))
                {
                    foreach (var assembly in refAssemblies)
                    {
                        compile.Add(CreateSimpleBinary(assembly));
                    }
                }

                // Runtime items
                if (TryGetValueForFrameworkAndFallbacks(analyzedPackage.Libraries, new NugetTargetFramework(framework.Key), out IReadOnlyList <RelativePath> libAssemblies))
                {
                    foreach (var assembly in libAssemblies)
                    {
                        runtime.Add(CreateSimpleBinary(assembly));
                    }
                }

                // Dependency items
                if (analyzedPackage.DependenciesPerFramework.TryGetValue(
                        framework.Key,
                        out IReadOnlyList <INugetPackage> dependencySpecificFrameworks))
                {
                    foreach (var dependencySpecificFramework in dependencySpecificFrameworks)
                    {
                        dependencies.Add(CreateImportFromForDependency(dependencySpecificFramework));
                    }
                }

                dependencies.AddRange(analyzedPackage.Dependencies.Select(CreateImportFromForDependency));

                cases.Add(
                    new CaseClause(
                        new LiteralExpression(framework.Key.ToString(m_pathTable.StringTable)),
                        new ReturnStatement(
                            new CallExpression(
                                PropertyAccess("Managed", "Factory", "createNugetPackge"),
                                new LiteralExpression(analyzedPackage.Id),
                                new LiteralExpression(analyzedPackage.Version),
                                PropertyAccess("Contents", "all"),
                                Array(compile),
                                Array(runtime),
                                Array(dependencies)
                                )
                            )
                        )
                    );
            }

            return(cases);
        }