Example #1
0
        private static void ProvideClearIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "ClearIndent", "Remove any indentation", (MemberAttributes)24578, indentLengths.Ref().CallS("Clear"), currentIndent.Ref().Assign(string.Empty.Prim()));

            codeMemberMethod.EndDirectives.Add(new CodeRegionDirective(CodeRegionMode.End, "Transform-time helpers"));
            members.Add(codeMemberMethod);
        }
Example #2
0
 private static IEnumerable <CodeTypeMember> SafeToEnumerable(CodeTypeMemberCollection collection)
 {
     foreach (CodeTypeMember codeTypeMember in collection)
     {
         yield return(codeTypeMember);
     }
 }
Example #3
0
        public static string GenerateCodeFromMembers(CodeTypeMemberCollection collection)
        {
            var type = new CodeTypeDeclaration("DUMMY");

            type.Members.AddRange(collection);
            var cp        = new CSharpCodeProvider();
            var sb        = new StringBuilder();
            var strWriter = new StringWriter(sb);


            var ccu = new CodeCompileUnit();
            var ns  = new CodeNamespace();

            ns.Types.Add(type);
            ccu.Namespaces.Add(ns);

            cp.GenerateCodeFromCompileUnit(ccu, strWriter, new CodeGeneratorOptions());
            var adjusted = new[] { "" }.Concat(
                sb.ToString()
                .Split(new string[] { Environment.NewLine }, StringSplitOptions.None)
                .Skip(14)
                .Reverse()
                .Skip(2)
                .Reverse()).ToArray();

            return(string.Join("\r\n", adjusted));
        }
        public override void apply(CodeTypeDeclaration mock, Type target)
        {
            CodeTypeMemberCollection mockMethods = mock.Members;

            foreach (CodeTypeMember member in mockMethods)
            {
                if (member is CodeMemberMethod)
                {
                    CodeMemberMethod        method     = (CodeMemberMethod)member;
                    CodeStatementCollection statements = method.Statements;
                    if (statements.Count > 0)
                    {
                        CodeStatement lastStatement = statements[statements.Count - 1];
                        if (lastStatement is CodeMethodReturnStatement)
                        {
                            statements.Remove(lastStatement);
                        }
                    }
                    CodeTypeReference           typeToThrow      = new CodeTypeReference(typeof(System.NotSupportedException));
                    CodeObjectCreateExpression  createExpression = new CodeObjectCreateExpression(typeToThrow, new CodeExpression[] {});
                    CodeThrowExceptionStatement throwStatement   = new CodeThrowExceptionStatement(createExpression);
                    statements.Add(throwStatement);
                }
            }
        }
        private static void ProvideClearIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeMemberMethod method = CodeDomHelpers.CreateMethod(null, "ClearIndent", "Remove any indentation", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { indentLengths.Ref().CallS("Clear", new CodeExpression[0]), currentIndent.Ref().Assign(string.Empty.Prim()) });

            method.EndDirectives.Add(new CodeRegionDirective(CodeRegionMode.End, "Transform-time helpers"));
            members.Add(method);
        }
Example #6
0
        private CodeTypeMemberCollection GeneratePrivateMemberVars(List <XmlNode> fieldList)
        {
            CodeTypeMemberCollection members = new CodeTypeMemberCollection();

            foreach (XmlNode fieldNode in fieldList)
            {
                try
                {
                    if (fieldNode.Attributes["type"].InnerText == "Custom")
                    {
                        continue;
                    }
                    if (fieldNode.Attributes["type"].InnerText == "ArrayStart")
                    {
                        continue;
                    }
                    members.Add(GeneratePrivateMember(fieldNode));
                }
                catch (Exception ex)
                {
                    throw new Exception(fieldNode.Attributes["type"].InnerText + " - GeneratePrivateMember on " + fieldNode.Attributes["name"].InnerText + " : " + ex.Message);
                }
            }
            return(members);
        }
        /// <summary>
        /// Adds [JsonIgnore] attribute if [XmlIgnore] found
        /// </summary>
        /// <param name="codedomElement">Class in which JsonIgnore to be added</param>
        private void AddJsonIgnore(CodeTypeDeclaration codedomElement)
        {
            bool xmlIgnoreFound = false;

            CodeTypeMemberCollection typeMembers = codedomElement.Members;

            // Loop thru each member/property of the class
            for (int memberCount = 0; memberCount < typeMembers.Count; memberCount++)
            {
                CodeMemberProperty typeProperty = typeMembers[memberCount] as CodeMemberProperty;
                if (typeProperty != null)
                {
                    foreach (CodeAttributeDeclaration xmlAttribute in typeProperty.CustomAttributes)
                    {
                        if (string.Equals(
                                xmlAttribute.AttributeType.BaseType.ToUpper(CultureInfo.InvariantCulture),
                                DataObjectConstants.XMLIGNORE.ToUpper(CultureInfo.InvariantCulture)))
                        {
                            xmlIgnoreFound = true;
                        }
                    } // Loop for each xml attribute

                    if (xmlIgnoreFound)
                    {
                        CodeAttributeDeclaration codeAttrDec = new CodeAttributeDeclaration(new CodeTypeReference("JsonIgnore"));
                        typeProperty.CustomAttributes.Add(codeAttrDec);
                        xmlIgnoreFound = false;
                    }
                }
            }
        }
        static CodeTypeMember[] _ToArray(CodeTypeMemberCollection refs)
        {
            var result = new CodeTypeMember[refs.Count];

            refs.CopyTo(result, 0);
            return(result);
        }
        public CodeTypeMemberCollection AddMethods(TableViewTableTypeBase baseobj)
        {
            CodeTypeMemberCollection ctmc = new CodeTypeMemberCollection();

            ctmc.Add(BuildIsDirtyMethod(baseobj));
            return(ctmc);
        }
Example #10
0
        private static void ProvideWarningMethod(CodeTypeMemberCollection members, CodeMemberProperty Errors, CodeVariableReferenceExpression error)
        {
            CodeMemberMethod method = CodeDomHelpers.CreateMethod(null, "Warning", "Raise a warning", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { new CodeVariableDeclarationStatement(typeof(CompilerError), "error", typeof(CompilerError).New()), error.Prop("ErrorText").Assign(new CodeVariableReferenceExpression("message")), error.Prop("IsWarning").Assign(true.Prim()), Errors.Ref().CallS("Add", new CodeExpression[] { error }) });

            method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "message"));
            members.Add(method);
        }
Example #11
0
        /// <summary>
        /// Generates source code from given attributes.
        /// </summary>
        public static string GenerateFromAttribute(CodeDomProvider codeProvider, params CodeAttributeDeclaration[] attributes)
        {
            CodeTypeMemberCollection collection = new CodeTypeMemberCollection();
            CodeMemberMethod         temp       = new CodeMemberMethod();
            int start = 0;

            if (attributes == null || attributes.Length == 0)
            {
                return(string.Empty);
            }

            temp.Name       = " ";
            temp.ReturnType = new CodeTypeReference(" ");
            collection.Add(temp);

            foreach (CodeAttributeDeclaration a in attributes)
            {
                temp.CustomAttributes.Add(a);
            }

            // get the code from function with attributes:
            string code = GenerateFromMember(codeProvider, collection, false);

            // and remove the last line with the function declaration:
            for (int i = 0; i < attributes.Length; i++)
            {
                start = code.IndexOfAny(NewLineChars, start);
            }
            if (start != -1)
            {
                code = code.Substring(0, start);
            }

            return(code);
        }
Example #12
0
        public void AddRange()
        {
            CodeTypeMember tm1 = new CodeTypeMember();
            CodeTypeMember tm2 = new CodeTypeMember();
            CodeTypeMember tm3 = new CodeTypeMember();

            CodeTypeMemberCollection coll1 = new CodeTypeMemberCollection();

            coll1.Add(tm1);
            coll1.Add(tm2);

            CodeTypeMemberCollection coll2 = new CodeTypeMemberCollection();

            coll2.Add(tm3);
            coll2.AddRange(coll1);
            Assert.AreEqual(3, coll2.Count, "#1");
            Assert.AreEqual(1, coll2.IndexOf(tm1), "#2");
            Assert.AreEqual(2, coll2.IndexOf(tm2), "#3");
            Assert.AreEqual(0, coll2.IndexOf(tm3), "#4");

            CodeTypeMemberCollection coll3 = new CodeTypeMemberCollection();

            coll3.Add(tm3);
            coll3.AddRange(new CodeTypeMember[] { tm1, tm2 });
            Assert.AreEqual(3, coll2.Count, "#5");
            Assert.AreEqual(1, coll2.IndexOf(tm1), "#6");
            Assert.AreEqual(2, coll2.IndexOf(tm2), "#7");
            Assert.AreEqual(0, coll2.IndexOf(tm3), "#8");
        }
        /// <summary>
        /// Replaces Item and Items property names to AnyIntuitObject and AnyIntuitObjects
        /// </summary>
        /// <param name="codedomElement">Class that has Item or Items property</param>
        private void ReplaceItem(CodeTypeDeclaration codedomElement)
        {
            CodeTypeMemberCollection typeMembers = codedomElement.Members;

            // Loop thru each member/property of the class
            for (int memberCount = 0; memberCount < typeMembers.Count; memberCount++)
            {
                CodeMemberProperty typeProperty = typeMembers[memberCount] as CodeMemberProperty;
                if (typeProperty != null)
                {
                    if (string.Equals(
                            typeProperty.Name.ToUpper(CultureInfo.InvariantCulture),
                            DataObjectConstants.ITEM.ToUpper(CultureInfo.InvariantCulture)))
                    {
                        typeProperty.Name = DataObjectConstants.ANYINTUITOBJECT;
                    }
                    else if (string.Equals(
                                 typeProperty.Name.ToUpper(CultureInfo.InvariantCulture),
                                 DataObjectConstants.ITEMS.ToUpper(CultureInfo.InvariantCulture)))
                    {
                        typeProperty.Name = DataObjectConstants.ANYINTUITOBJECTS;
                    }
                }
            }
        }
Example #14
0
        /// <summary>
        /// Run all of the marshaling hueristiscs on the type and it's members
        /// </summary>
        /// <param name="ctd"></param>
        /// <remarks></remarks>

        public void Process(CodeTypeDeclaration ctd)
        {
            // First check and see if it is a delegate type, if so run the delegate hueristics
            CodeTypeDelegate ctdDel = ctd as CodeTypeDelegate;

            if (ctdDel != null && ctdDel.UserData.Contains(TransformConstants.DefinedType))
            {
                ProcessDelegate(ctdDel);
                return;
            }

            // Now run the hueristics over the actual members of the type
            if (ctd.UserData.Contains(TransformConstants.DefinedType))
            {
                NativeDefinedType nt = ctd.UserData[TransformConstants.DefinedType] as NativeDefinedType;
                if (nt != null)
                {
                    switch (nt.Kind)
                    {
                    case NativeSymbolKind.StructType:
                        ProcessStruct(ctd);
                        break;

                    case NativeSymbolKind.UnionType:
                        RunPluginUnionMembers(ctd);
                        break;

                    case NativeSymbolKind.EnumType:
                        RunPluginEnumMembers(ctd);
                        break;
                    }
                }
            }

            // Now process the methods on the type.  First step is to convert all of them into
            // best PInvoke signature.  Then create wrapper methods for them
            CodeTypeMemberCollection col  = new CodeTypeMemberCollection(ctd.Members);
            List <CodeMemberMethod>  list = new List <CodeMemberMethod>();

            foreach (CodeTypeMember mem in col)
            {
                // Look at procedures
                CodeMemberMethod codeProc = mem as CodeMemberMethod;
                if (codeProc != null && codeProc.UserData.Contains(TransformConstants.Procedure))
                {
                    list.Add(codeProc);
                }
            }

            foreach (CodeMemberMethod codeProc in list)
            {
                ProcessParameters(codeProc);
                ProcessReturnType(codeProc);
            }

            foreach (CodeMemberMethod codeProc in list)
            {
                ProcessWrapperMethods(ctd, codeProc);
            }
        }
Example #15
0
        /// <summary>
        /// Iterates a CodeTypeMemberCollection and returns an array of indexes
        /// to members that are marked with the IsAttribute custom attribute.
        /// </summary>
        /// <param name="typeMembers">A CodeTypeMemberCollection containing contract members.</param>
        /// <returns>A integer array containing the indexes of attribute type members.</returns>
        /// <remarks>
        /// Special provisiong are made to handle AnyAttribute. If an AnyAttr data member is found,
        /// the index will be moved to the end of the attribute list. This way attribute processing
        /// can occur before an the next data member element is read.
        /// </remarks>
        internal static int[] GetListOfAttributes(CodeTypeMemberCollection typeMembers)
        {
            int[] tempList       = new int[typeMembers.Count];
            int   index          = 0;
            int   anyAttribIndex = -1;

            // Add attribute members
            for (int i = 0; i < typeMembers.Count; ++i)
            {
                if (GetCustomAttributeArgumentValue("IsAttribute", typeMembers[i].CustomAttributes) != null)
                {
                    tempList[index++] = i;
                }
                else if (typeMembers[i].Name == "AnyAttr")
                {
                    anyAttribIndex = i;
                }
            }

            int[] sortOrder;
            if (anyAttribIndex == -1)
            {
                sortOrder = new int[index];
                Array.Copy(tempList, sortOrder, index);
            }
            else
            {
                sortOrder = new int[index + 1];
                Array.Copy(tempList, sortOrder, index);
                sortOrder[index] = anyAttribIndex;
            }
            return(sortOrder);
        }
Example #16
0
        private static void ProvideWriteLineMethod1(CodeTypeMemberCollection members, CodeMemberField endsWithNewline, CodeMemberProperty GenerationEnvironment, CodeVariableReferenceExpression textToAppend)
        {
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "WriteLine", "Write text directly into the generated output", (MemberAttributes)24578, CodeDomHelpers.Call("Write", textToAppend), GenerationEnvironment.Ref().CallS("AppendLine"), endsWithNewline.Ref().Assign(true.Prim()));

            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), textToAppend.VariableName));
            members.Add(codeMemberMethod);
        }
Example #17
0
        private void BuildMethod(CodeTypeMemberCollection members, MethodInfo method, object[] parameters)
        {
            CodeMemberMethod method2 = new CodeMemberMethod();

            method2.Name = "Invoke" + method.Name;
            this.mainMethod.Statements.Add(new CodeMethodInvokeExpression(null, method2.Name, new CodeExpression[0]));
            method2.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            members.Add(method2);
            CodeMethodInvokeExpression expression = new CodeMethodInvokeExpression(this.BuildProxy(method2.Statements, method), method.Name, new CodeExpression[0]);

            this.BuildParameters(method2.Statements, method, parameters, expression.Parameters);
            if (method.ReturnType == typeof(void))
            {
                method2.Statements.Add(new CodeExpressionStatement(expression));
            }
            else
            {
                string uniqueVariableName = GetUniqueVariableName(method.Name + "Result", method2.Statements);
                method2.Statements.Add(new CodeVariableDeclarationStatement(method.ReturnType.FullName, uniqueVariableName, expression));
                this.BuildDumpInvoke(method2.Statements, "result", new CodeVariableReferenceExpression(uniqueVariableName));
            }
            ParameterInfo[] infoArray = method.GetParameters();
            for (int i = 0; i < infoArray.Length; i++)
            {
                ParameterInfo info = infoArray[i];
                if (info.IsOut || info.ParameterType.IsByRef)
                {
                    this.BuildDumpInvoke(method2.Statements, info.Name, ((CodeDirectionExpression)expression.Parameters[i]).Expression);
                }
            }
        }
Example #18
0
        private static void ProvideErrorMethod(CodeTypeMemberCollection members, CodeMemberProperty Errors, CodeVariableReferenceExpression error)
        {
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "Error", "Raise an error", (MemberAttributes)24578, new CodeVariableDeclarationStatement(typeof(CompilerError), "error", typeof(CompilerError).New()), error.Prop("ErrorText").Assign(new CodeVariableReferenceExpression("message")), Errors.Ref().CallS("Add", error));

            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "message"));
            members.Add(codeMemberMethod);
        }
Example #19
0
        public virtual CodeTypeDeclaration GenerateTypeDeclaration(string targetNamespace, string name, params string[] parents)
        {
            CodeTypeDeclaration type =
                CreateTypeDeclaration.Called(name)
                .AsPartial
                .WithAttributes(TypeAttributes.Public)
                .WithCustomAttributes(CodeGeneratorAttribute)
                .Type;

            CodeNamespace ns = LookupNamespace(targetNamespace);

            if (parents.Length == 0)
            {
                ns.Types.Add(type);
            }
            else
            {
                CodeTypeMemberCollection members = GetMemberCollectionForTypeDeclaration(ns.Types, parents[0]);

                for (int i = 1; i < parents.Length; i++)
                {
                    members = GetMemberCollectionForTypeMember(members, parents[i]);
                }

                members.Add(type);
            }

            return(type);
        }
        public void GenerateRequestClassesTest()
        {
            var decorator = new CountingRequestDecorator();
            var generator = new RequestClassGenerator(new IRequestDecorator[] { decorator });
            var decl      = new CodeTypeDeclaration();

            // Create a test resource.
            var resource = new MockResource();

            resource.Methods.Add("MethodA", new MockMethod()
            {
                Name = "MethodA"
            });
            resource.Methods.Add("MethodB", new MockMethod()
            {
                Name = "MethodB"
            });

            // Run the generator
            CodeTypeMemberCollection collection = generator.GenerateRequestClasses(decl, resource);

            Assert.AreEqual(2, decorator.TimesCalled);
            Assert.AreEqual(2, collection.Count);
            Assert.IsInstanceOf <CodeTypeDeclaration>(collection[0]);
            Assert.IsInstanceOf <CodeTypeDeclaration>(collection[1]);
            CollectionAssert.AreEqual(
                new[]
            {
                string.Format(RequestClassGenerator.RequestClassNamingScheme, "MethodA"),
                string.Format(RequestClassGenerator.RequestClassNamingScheme, "MethodB"),
            },
                from CodeTypeMember m in collection select m.Name);
        }
Example #21
0
        private void BuildMethod(CodeTypeMemberCollection members, MethodInfo method, object[] parameters)
        {
            CodeMemberMethod method1 = new CodeMemberMethod();

            method1.Name = "Invoke" + method.Name;
            mainMethod.Statements.Add(new CodeMethodInvokeExpression(null, method1.Name, new CodeExpression[0]));
            method1.Attributes = MemberAttributes.Public | MemberAttributes.Static;
            members.Add(method1);
            CodeExpression             expression1 = BuildProxy(method1.Statements, method);
            CodeMethodInvokeExpression expression2 =
                new CodeMethodInvokeExpression(expression1, method.Name, new CodeExpression[0]);

            BuildParameters(method1.Statements, method, parameters, expression2.Parameters);
            if (method.ReturnType == typeof(void))
            {
                method1.Statements.Add(new CodeExpressionStatement(expression2));
            }
            else
            {
                string text1 = GetUniqueVariableName(method.Name + "Result", method1.Statements);
                method1.Statements.Add(
                    new CodeVariableDeclarationStatement(method.ReturnType.FullName, text1, expression2));
                BuildDumpInvoke(method1.Statements, "result", new CodeVariableReferenceExpression(text1));
            }
            ParameterInfo[] infoArray1 = method.GetParameters();
            for (int num1 = 0; num1 < infoArray1.Length; num1++)
            {
                ParameterInfo info1 = infoArray1[num1];
                if (info1.IsOut || info1.ParameterType.IsByRef)
                {
                    BuildDumpInvoke(method1.Statements, info1.Name,
                                    ((CodeDirectionExpression)expression2.Parameters[num1]).Expression);
                }
            }
        }
    static CodeTypeMemberCollection GetWMIMembers(CodeTypeDeclaration type)
    {
        CodeTypeMemberCollection members = new CodeTypeMemberCollection();

        AppendWMIMembers(type, members);
        return(members);
    }
Example #23
0
        private static void ProvidePopIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeVariableReferenceExpression lhs         = new CodeVariableReferenceExpression("indentLength");
            CodeVariableReferenceExpression expression2 = new CodeVariableReferenceExpression("returnValue");
            CodeMemberMethod method = CodeDomHelpers.CreateMethod(typeof(string), "PopIndent", "Remove the last indent that was added with PushIndent", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { new CodeVariableDeclarationStatement(typeof(string), expression2.VariableName, string.Empty.Prim()), new CodeConditionStatement(indentLengths.Ref().Prop("Count").Gt(0.Prim()), new CodeStatement[] { new CodeVariableDeclarationStatement(typeof(int), lhs.VariableName, indentLengths.Ref().Index(new CodeExpression[] { indentLengths.Ref().Prop("Count").Subtract(1.Prim()) })), indentLengths.Ref().CallS("RemoveAt", new CodeExpression[] { indentLengths.Ref().Prop("Count").Subtract(1.Prim()) }), new CodeConditionStatement(lhs.Gt(0.Prim()), new CodeStatement[] { expression2.Assign(currentIndent.Ref().Call("Substring", new CodeExpression[] { currentIndent.Ref().Prop("Length").Subtract(lhs) })), currentIndent.Ref().Assign(currentIndent.Ref().Call("Remove", new CodeExpression[] { currentIndent.Ref().Prop("Length").Subtract(lhs) })) }) }), new CodeMethodReturnStatement(expression2) });

            members.Add(method);
        }
Example #24
0
        private static void ProvideWriteLineMethod2(CodeTypeMemberCollection members, CodeParameterDeclarationExpression argsParam)
        {
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "WriteLine", "Write formatted text directly into the generated output", (MemberAttributes)24578, CodeDomHelpers.Call("WriteLine", CodeDomHelpers.Call(typeof(string), "Format", typeof(CultureInfo).Expr().Prop("CurrentCulture"), new CodeVariableReferenceExpression("format"), new CodeVariableReferenceExpression("args"))));

            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "format"));
            codeMemberMethod.Parameters.Add(argsParam);
            members.Add(codeMemberMethod);
        }
Example #25
0
        private static void ProvidePushIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeVariableReferenceExpression codeVariableReferenceExpression = new CodeVariableReferenceExpression("indent");
            CodeMemberMethod codeMemberMethod = CodeDomHelpers.CreateMethod(null, "PushIndent", "Increase the indent", (MemberAttributes)24578, new CodeConditionStatement(codeVariableReferenceExpression.VEquals(CodeDomHelpers.nullEx), new CodeThrowExceptionStatement(typeof(ArgumentNullException).New("indent".Prim()))), currentIndent.Ref().Assign(currentIndent.Ref().Add(codeVariableReferenceExpression)), indentLengths.Ref().CallS("Add", codeVariableReferenceExpression.Prop("Length")));

            codeMemberMethod.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "indent"));
            members.Add(codeMemberMethod);
        }
Example #26
0
        private static void ProvidePushIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeVariableReferenceExpression lhs = new CodeVariableReferenceExpression("indent");
            CodeMemberMethod method             = CodeDomHelpers.CreateMethod(null, "PushIndent", "Increase the indent", MemberAttributes.Public | MemberAttributes.Final, new CodeObject[] { new CodeConditionStatement(lhs.VEquals(CodeDomHelpers.nullEx), new CodeStatement[] { new CodeThrowExceptionStatement(typeof(ArgumentNullException).New(new CodeExpression[] { "indent".Prim() })) }), currentIndent.Ref().Assign(currentIndent.Ref().Add(lhs)), indentLengths.Ref().CallS("Add", new CodeExpression[] { lhs.Prop("Length") }) });

            method.Parameters.Add(new CodeParameterDeclarationExpression(new CodeTypeReference(typeof(string)), "indent"));
            members.Add(method);
        }
Example #27
0
 private void AddRegionMarkers(CodeTypeMemberCollection members, string description)
 {
     if (members.Count > 0)
     {
         members[0].StartDirectives.Insert(0, new CodeRegionDirective(CodeRegionMode.Start, description));
         members[members.Count - 1].EndDirectives.Add(new CodeRegionDirective(CodeRegionMode.End, null));
     }
 }
Example #28
0
        private static string GenerateSourceCodeOutput(string codeClassName, IList <CodeNamedElement> codeElements, CodeModelLanguages language)
        {
            CodeTypeMemberCollection code            = new CodeTypeMemberCollection();
            CodeTypeMember           initConstructor = VariableHelper.GetInitConstructor(codeClassName, codeElements, language);

            code.Add(initConstructor);
            return(Environment.NewLine + CodeHelper.GenerateFromMember(language, code));
        }
        // private SendOrPostCallback xxxOperationCompleted;
        internal static void AddCallbackDeclaration(CodeTypeMemberCollection members, string callbackMember)
        {
            CodeMemberField callback = new CodeMemberField();

            callback.Type = new CodeTypeReference(typeof(SendOrPostCallback));
            callback.Name = callbackMember;
            members.Add(callback);
        }
Example #30
0
        private static void ProvidePopIndentMethod(CodeTypeMemberCollection members, CodeMemberField currentIndent, CodeMemberProperty indentLengths)
        {
            CodeVariableReferenceExpression codeVariableReferenceExpression  = new CodeVariableReferenceExpression("indentLength");
            CodeVariableReferenceExpression codeVariableReferenceExpression2 = new CodeVariableReferenceExpression("returnValue");
            CodeMemberMethod value = CodeDomHelpers.CreateMethod(typeof(string), "PopIndent", "Remove the last indent that was added with PushIndent", (MemberAttributes)24578, new CodeVariableDeclarationStatement(typeof(string), codeVariableReferenceExpression2.VariableName, string.Empty.Prim()), new CodeConditionStatement(indentLengths.Ref().Prop("Count").Gt(0.Prim()), new CodeVariableDeclarationStatement(typeof(int), codeVariableReferenceExpression.VariableName, indentLengths.Ref().Index(indentLengths.Ref().Prop("Count").Subtract(1.Prim()))), indentLengths.Ref().CallS("RemoveAt", indentLengths.Ref().Prop("Count").Subtract(1.Prim())), new CodeConditionStatement(codeVariableReferenceExpression.Gt(0.Prim()), codeVariableReferenceExpression2.Assign(currentIndent.Ref().Call("Substring", currentIndent.Ref().Prop("Length").Subtract(codeVariableReferenceExpression))), currentIndent.Ref().Assign(currentIndent.Ref().Call("Remove", currentIndent.Ref().Prop("Length").Subtract(codeVariableReferenceExpression))))), new CodeMethodReturnStatement(codeVariableReferenceExpression2));

            members.Add(value);
        }
	public void AddRange(CodeTypeMemberCollection value) {}
Example #32
0
    public void PostMembersHook(Smoke* smoke, Smoke.Class* klass, CodeTypeDeclaration type)
    {
        if (Util.IsQObject(klass))
        {
            CodeMemberProperty emit = new CodeMemberProperty();
            emit.Name = "Emit";
            emit.Attributes = MemberAttributes.Family | MemberAttributes.New | MemberAttributes.Final;
            emit.HasGet = true;
            emit.HasSet = false;

            string signalsIfaceName = "I" + type.Name + "Signals";
            CodeTypeReference returnType = new CodeTypeReference(signalsIfaceName);
            emit.Type = returnType;

            emit.GetStatements.Add(new CodeMethodReturnStatement(new CodeCastExpression(
                returnType,
                new CodeFieldReferenceExpression(new CodeThisReferenceExpression(), "Q_EMIT")
            )));

            type.Members.Add(emit);

            string className = ByteArrayManager.GetString(klass->className);
            int colon = className.LastIndexOf("::", StringComparison.Ordinal);
            string prefix = (colon != -1) ? className.Substring(0, colon) : string.Empty;

            IList typeCollection = this.Data.GetTypeCollection(prefix);
            CodeTypeDeclaration ifaceDecl = new CodeTypeDeclaration(signalsIfaceName);
            ifaceDecl.IsInterface = true;

            if (className != "QObject")
            {
                string parentClassName = ByteArrayManager.GetString(smoke->classes[smoke->inheritanceList[klass->parents]].className);
                colon = parentClassName.LastIndexOf("::", StringComparison.Ordinal);
                prefix = (colon != -1) ? parentClassName.Substring(0, colon) : string.Empty;
                if (colon != -1)
                {
                    parentClassName = parentClassName.Substring(colon + 2);
                }

                string parentInterface = (prefix != string.Empty) ? prefix.Replace("::", ".") + "." : string.Empty;
                parentInterface += "I" + parentClassName + "Signals";

                ifaceDecl.BaseTypes.Add(new CodeTypeReference(parentInterface));
            }
            Dictionary<CodeSnippetTypeMember, CodeMemberMethod> signalEvents = new Dictionary<CodeSnippetTypeMember, CodeMemberMethod>();
            IEnumerable<CodeMemberMethod> methods = type.Members.OfType<CodeMemberMethod>().ToList();
            GetSignals(smoke, klass, delegate(string signature, string name, string typeName, IntPtr metaMethod)
            {
                CodeMemberMethod signal = new CodeMemberMethod();
                signal.Attributes = MemberAttributes.Abstract;

                // capitalize the first letter
                StringBuilder builder = new StringBuilder(name);
                builder[0] = char.ToUpper(builder[0]);
                string signalName = builder.ToString();
                if (type.Members.OfType<CodeTypeDeclaration>().Any(t => t.Name == signalName))
                {
                    builder[0] = name[0];
                }
                signal.Name = builder.ToString();
                bool isRef;
                try
                {
                    if (typeName == string.Empty)
                        signal.ReturnType = new CodeTypeReference(typeof(void));
                    else
                        signal.ReturnType = this.Translator.CppToCSharp(typeName, type, out isRef);
                }
                catch (NotSupportedException)
                {
                    Debug.Print("  |--Won't wrap signal {0}::{1}", className, signature);
                    return;
                }

                CodeAttributeDeclaration attr = new CodeAttributeDeclaration("Q_SIGNAL",
                    new CodeAttributeArgument(new CodePrimitiveExpression(signature)));
                signal.CustomAttributes.Add(attr);

                int argNum = 1;
                StringBuilder fullNameBuilder = new StringBuilder("Slot");
                GetMetaMethodParameters(metaMethod, delegate(string paramType, string paramName)
                {
                    if (paramName == string.Empty)
                    {
                        paramName = "arg" + argNum.ToString();
                    }
                    argNum++;

                    CodeParameterDeclarationExpression param;
                    try
                    {
                        short id = smoke->IDType(paramType);
                        CodeTypeReference paramTypeRef;
                        if (id > 0)
                        {
                            paramTypeRef = this.Translator.CppToCSharp(smoke->types + id, type, out isRef);
                        }
                        else
                        {
                            if (!paramType.Contains("::"))
                            {
                                id = smoke->IDType(className + "::" + paramType);
                                if (id > 0)
                                {
                                    paramTypeRef = this.Translator.CppToCSharp(smoke->types + id, type, out isRef);
                                }
                                else
                                {
                                    paramTypeRef = this.Translator.CppToCSharp(paramType, type, out isRef);
                                }
                            }
                            else
                            {
                                paramTypeRef = this.Translator.CppToCSharp(paramType, type, out isRef);
                            }
                        }
                        param = new CodeParameterDeclarationExpression(paramTypeRef, paramName);
                    }
                    catch (NotSupportedException)
                    {
                        Debug.Print("  |--Won't wrap signal {0}::{1}", className, signature);
                        return;
                    }
                    if (isRef)
                    {
                        param.Direction = FieldDirection.Ref;
                    }
                    signal.Parameters.Add(param);
                    if (argNum == 2)
                    {
                        fullNameBuilder.Append('<');
                    }
                    fullNameBuilder.Append(param.Type.BaseType);
                    fullNameBuilder.Append(',');
                });
                if (fullNameBuilder[fullNameBuilder.Length - 1] == ',')
                {
                    fullNameBuilder[fullNameBuilder.Length - 1] = '>';
                }
                ifaceDecl.Members.Add(signal);
                CodeSnippetTypeMember signalEvent = new CodeSnippetTypeMember();
                signalEvent.Name = signal.Name;
                DocumentSignalEvent(type, signal, methods, signalEvent, signature);
                foreach (CodeMemberMethod method in from method in methods
                                                    where method.Name == signal.Name && method.ReturnType.BaseType == signal.ReturnType.BaseType
                                                    select method)
                {
                    method.Name = "On" + method.Name;
                }
                CodeSnippetTypeMember existing = signalEvents.Keys.FirstOrDefault(m => m.Name == signal.Name);
                if (existing != null)
                {
                    CodeSnippetTypeMember signalEventToUse;
                    CodeMemberMethod signalToUse;
                    if (signal.Parameters.Count == 0)
                    {
                        signalEventToUse = existing;
                        signalToUse = signalEvents[existing];
                    }
                    else
                    {
                        signalEventToUse = signalEvent;
                        signalToUse = signal;
                    }
                    string suffix = GetSignalEventSuffix(signalToUse);
                    signalEventToUse.Text = signalEventToUse.Text.Replace(signalEventToUse.Name, signalEventToUse.Name += suffix);
                }
                else
                {
                    if (signal.Parameters.Count > 0 && methods.Any(m => m.Name == signal.Name))
                    {
                        signalEvent.Name += GetSignalEventSuffix(signal);
                    }
                }
                signalEvent.Text += string.Format(@"
        public event {0} {1}
        {{
            add
            {{
                QObject.Connect(this, Qt.SIGNAL(""{2}""), (QObject) value.Target, Qt.SLOT(value.Method.Name + ""{3}""));
            }}
            remove
            {{
                QObject.Disconnect(this, Qt.SIGNAL(""{2}""), (QObject) value.Target, Qt.SLOT(value.Method.Name + ""{3}""));
            }}
        }}", fullNameBuilder, signalEvent.Name, signature, signature.Substring(signature.IndexOf('(')));
                signalEvents.Add(signalEvent, signal);
            });

            typeCollection.Add(ifaceDecl);
            CodeTypeMemberCollection members = new CodeTypeMemberCollection();
            foreach (KeyValuePair<CodeSnippetTypeMember, CodeMemberMethod> signalEvent in signalEvents)
            {
                members.Add(signalEvent.Key);
            }
            int index = 0;
            CodeSnippetTypeMember lastEvent = type.Members.OfType<CodeSnippetTypeMember>().LastOrDefault(s => s.Text.Contains("EventHandler<QEventArgs<"));
            if (lastEvent != null)
            {
                index = type.Members.IndexOf(lastEvent) + 1;
            }
            for (int i = members.Count - 1; i >= 0; i--)
            {
                type.Members.Insert(index, members[i]);
            }
        }
    }
	public CodeTypeMemberCollection(CodeTypeMemberCollection value) {}