示例#1
0
        /// <summary>
        /// Adds the given constructors to the given type.
        /// </summary>
        /// <param name="type">The entity to add the fields to.</param>
        /// <param name="tp">.</param>
        private void AddConstructors(CompositeType type, TypeDeclaration tp)
        {
            foreach (ConstructorDeclaration cp in tp.Descendants.OfType <ConstructorDeclaration>())
            {
                // Skip subclass
                if (type.Name != cp.Name)
                {
                    continue;
                }

                Constructor cons = type.AddConstructor();

                cons.Name           = cp.Name;
                cons.AccessModifier = cp.Modifiers.ToEnClass();

                CSharpArgumentList Arg = new CSharpArgumentList();

                foreach (ParameterDeclaration ichParameter in cp.Parameters)
                {
                    Arg.Add(ichParameter.Name, ichParameter.Type.ToString(), ichParameter.ParameterModifier.ToEnClass(), ichParameter.DefaultExpression.ToString());
                }

                cons.ArgumentList = Arg;
            }
        }
示例#2
0
        private void toolNewConstructor_Click(object sender, EventArgs e)
        {
            if (parent.SupportsConstuctors)
            {
                Method       constructor = parent.AddConstructor();
                ListViewItem item        = AddOperationToList(constructor);

                item.Focused  = true;
                item.Selected = true;
                OnContentsChanged(EventArgs.Empty);
            }
        }
示例#3
0
 private void toolNewConstructor_Click(object sender, EventArgs e)
 {
     if (parent.SupportsConstuctors)
     {
         Method       constructor = parent.AddConstructor();
         ListViewItem item        = AddOperationToList(constructor);
         if (constructor.Parent is ClassType)
         {
             constructor.raptorTab =
                 NClass.Core.ProjectCore.raptorUpdater.createMethod(
                     (constructor.Parent as ClassType).raptorTab,
                     constructor.Name,
                     constructor);
         }
         OnContentsChanged(EventArgs.Empty);
         item.Focused  = true;
         item.Selected = true;
     }
 }
示例#4
0
        /// <summary>
        ///     Adds the given constructors to the given type.
        /// </summary>
        /// <param name="type">The entity to add the fields to.</param>
        /// <param name="tp">.</param>
        private void AddConstructors(CompositeType type, TypeDeclaration tp)
        {
            foreach (var cp in tp.Descendants.OfType <ConstructorDeclaration>())
            {
                var cons = type.AddConstructor();

                cons.Name           = cp.Name;
                cons.AccessModifier = cp.Modifiers.ToNClass();

                var Arg = new CSharpArgumentList();

                foreach (var ichParameter in cp.Parameters)
                {
                    Arg.Add(ichParameter.Name,
                            ichParameter.Type.ToString(),
                            ichParameter.ParameterModifier.ToNClass(),
                            ichParameter.DefaultExpression.ToString());
                }

                cons.ArgumentList = Arg;
            }
        }
示例#5
0
        /// <summary>
        /// Reflects all operations within the type <paramref name="xType"/>. Reflected
        /// operations are added to <paramref name="xOpContainer"/>.
        /// </summary>
        /// <param name="xType">The operations are taken from this type.</param>
        /// <param name="xOpContainer">Reflected operations are added to this OperationContainer.</param>
        private void ReflectOperations(Type xType, CompositeType xOpContainer)
        {
            #region --- Properties

            PropertyInfo[] axProperties     = xType.GetProperties(xStandardBindingFlags);
            List <string>  astPropertyNames = new List <string>();
            foreach (PropertyInfo xProperty in axProperties)
            {
                //Don't display derived Methods
                if (xProperty.DeclaringType != xType)
                {
                    continue;
                }

                astPropertyNames.Add(xProperty.Name);
                StringBuilder stDeclaration = new StringBuilder();
                //The access modifier for a property isn't stored at the property.
                //We have to use the access modifier from the corresponding get_XXX /
                //set_XXX Method.
                //Well - that's not the whole truth... It's possible to create a
                //public property with a private set method. But there could be also
                //a private property with a public get method. There's no way to get
                //this information back from the assembly.
                //Solution (for now): Take the first found access modifier as the
                // property access modifier.
                ParameterInfo[] axIndexParameter = xProperty.GetIndexParameters();
                //get_XXX and set_XXX might be overloaded, so we have to specify the
                //index parameters as well.
                Type[] axGetIndexParamTypes = new Type[axIndexParameter.Length];
                Type[] axSetIndexParamTypes = new Type[axIndexParameter.Length + 1];
                for (int i = 0; i < axIndexParameter.Length; i++)
                {
                    axGetIndexParamTypes[i] = axIndexParameter[i].ParameterType;
                    axSetIndexParamTypes[i] = axIndexParameter[i].ParameterType;
                }
                axSetIndexParamTypes[axSetIndexParamTypes.Length - 1] = xProperty.PropertyType;
                string     stGetMethodName = xProperty.Name.Insert(xProperty.Name.LastIndexOf('.') + 1, "get_");
                string     stSetMethodName = xProperty.Name.Insert(xProperty.Name.LastIndexOf('.') + 1, "set_");
                MethodInfo xGetMethod      = xType.GetMethod(stGetMethodName, xStandardBindingFlags, null, axGetIndexParamTypes, null); //, xStandardBindingFlags);
                MethodInfo xSetMethod      = xType.GetMethod(stSetMethodName, xStandardBindingFlags, null, axSetIndexParamTypes, null); //, xStandardBindingFlags);

                //If one of the access methods (get_XXX or set_XXX) should be importet
                //import the property.
                if (!((xProperty.CanRead && xImportSettings.CheckImportProperty(xGetMethod)) ||
                      (xProperty.CanWrite && xImportSettings.CheckImportProperty(xSetMethod))))
                {
                    continue;
                }
                if (!(xOpContainer is InterfaceType))
                {
                    if (xProperty.CanRead)
                    {
                        stDeclaration.Append(GetMethodAccessModifierString(xGetMethod));
                        stDeclaration.AppendFormat(" {0}", GetOperationModifierString(xGetMethod));
                        ChangeOperationModifierIfOverwritten(xType, xGetMethod, stDeclaration);
                    }
                    else
                    {
                        stDeclaration.Append(GetMethodAccessModifierString(xSetMethod));
                        stDeclaration.AppendFormat(" {0}", GetOperationModifierString(xSetMethod));
                        ChangeOperationModifierIfOverwritten(xType, xSetMethod, stDeclaration);
                    }
                }
                stDeclaration.AppendFormat(" {0}", GetTypeName(xProperty.PropertyType));
                //Is this an Item-property (public int this[int i])
                if (axIndexParameter.Length > 0)
                {
                    stDeclaration.Append(" this[");
                    foreach (ParameterInfo xParameter in axIndexParameter)
                    {
                        stDeclaration.AppendFormat("{0} ", GetTypeName(xParameter.ParameterType));
                        stDeclaration.AppendFormat("{0}, ", xParameter.Name);
                    }
                    //Get rid of the last ", "
                    stDeclaration.Length -= 2;
                    stDeclaration.Append("]");
                }
                else
                {
                    stDeclaration.AppendFormat(" {0}", xProperty.Name);
                }
                stDeclaration.AppendFormat(" {0}", "{");
                if (xProperty.CanRead)
                {
                    stDeclaration.AppendFormat(" {0}", "get;");
                    if (xProperty.CanWrite)
                    {
                        if (!stDeclaration.ToString().StartsWith(GetMethodAccessModifierString(xSetMethod)) && !(xOpContainer is InterfaceType))
                        {
                            //! set has a different access modifier
                            stDeclaration.AppendFormat(" {0}", GetMethodAccessModifierString(xSetMethod));
                        }
                        stDeclaration.AppendFormat(" {0}", "set;");
                    }
                }
                else
                {
                    //! Only set, so don't care about access modifier
                    stDeclaration.AppendFormat(" {0}", "set;");
                }
                stDeclaration.AppendFormat(" {0}", "}");

                Property xNewProperty = xOpContainer.AddProperty();
                xNewProperty.InitFromString(stDeclaration.ToString());
            }

            #endregion

            #region --- Methods

            MethodInfo[] axMethods = xType.GetMethods(xStandardBindingFlags);
            foreach (MethodInfo xMethod in axMethods)
            {
                //Don't display derived Methods
                if (xMethod.DeclaringType != xType)
                {
                    continue;
                }

                if (!xImportSettings.CheckImportMethod(xMethod))
                {
                    continue;
                }

                //There are sometimes some magic methods like '<.ctor>b__0'. Those
                //methods are generated by the compiler and shouldn't be importet.
                //Those methods have an attribute CompilerGeneratedAttribute.
                if (xMethod.GetCustomAttributes(typeof(CompilerGeneratedAttribute), true).Length > 0)
                {
                    continue;
                }

                //We store the method name here so it is much easier to take care about operators
                string stMethodName    = xMethod.Name;
                bool   boAddReturnType = true;
                if (xMethod.IsSpecialName)
                {
                    //SpecialName means that this method is an automaticaly generated
                    //method. This can be get_XXX and set_XXX for properties or
                    //add_XXX and remove_XXX for events. There are also special name
                    //methods starting with op_ for operators.
                    if (!xMethod.Name.StartsWith("op_"))
                    {
                        continue;
                    }
                    //!xMethod.Name starts witch 'op_' and so it is an operator. We
                    //have to get the 'real' method name here.
                    if (dstOperatorMethodsMap.ContainsKey(stMethodName))
                    {
                        stMethodName = dstOperatorMethodsMap[stMethodName];
                    }

                    if (stMethodName == "op_Implicit")
                    {
                        stMethodName    = "implicit operator " + GetTypeName(xMethod.ReturnType);
                        boAddReturnType = false;
                    }
                    else if (stMethodName == "op_Explicit")
                    {
                        stMethodName    = "explicit operator " + GetTypeName(xMethod.ReturnType);
                        boAddReturnType = false;
                    }
                }

                Method        xNewMethod    = (Method)xOpContainer.AddMethod();
                StringBuilder stDeclaration = new StringBuilder();

                if (!(xOpContainer is InterfaceType))
                {
                    stDeclaration.AppendFormat("{0} ", GetMethodAccessModifierString(xMethod));
                    stDeclaration.AppendFormat("{0} ", GetOperationModifierString(xMethod));
                }

                ChangeOperationModifierIfOverwritten(xType, xMethod, stDeclaration);

                if (boAddReturnType)
                {
                    stDeclaration.AppendFormat("{0} ", GetTypeName(xMethod.ReturnType));
                }
                stDeclaration.AppendFormat("{0}", stMethodName);

                stDeclaration.AppendFormat("{0}", GetParameterDeclarationString(xMethod));

                xNewMethod.InitFromString(stDeclaration.ToString());
            }

            #endregion

            #region --- Constructors

            if (xOpContainer.SupportsConstuctors)
            {
                ConstructorInfo[] axConstructors = xType.GetConstructors(xStandardBindingFlags);
                foreach (ConstructorInfo xConstructor in axConstructors)
                {
                    if (!xImportSettings.CheckImportConstructor(xConstructor))
                    {
                        continue;
                    }
                    Method        xNewConstructor = xOpContainer.AddConstructor();
                    StringBuilder stDeclaration   = new StringBuilder();
                    stDeclaration.AppendFormat("{0} ", GetMethodAccessModifierString(xConstructor));
                    stDeclaration.AppendFormat("{0}", xConstructor.IsStatic ? "static " : "");
                    stDeclaration.Append(xOpContainer.Name); //xOpContainer.Name since the name of the class/struct/... isn't set yet

                    stDeclaration.AppendFormat("{0}", GetParameterDeclarationString(xConstructor));
                    xNewConstructor.InitFromString(stDeclaration.ToString());
                }
            }

            #endregion

            ReflectTypeBase(xType, (TypeBase)xOpContainer);
        }