示例#1
0
文件: Cs.cs 项目: nofuture-git/31g
        public string ToStmt(CgMember cgMem, string cgNamespace, string cgInvokeOnName)
        {
            var paramNames = string.Format("({0});",
                                           string.Join(",",
                                                       cgMem.Args.Select(
                                                           x => x.ArgType.StartsWith("ref ") ? string.Format("ref {0}", x.ArgName) : x.ArgName)));

            if (cgMem.IsCtor)
            {
                return(string.Format("new {0}{1}", cgMem.TypeName, paramNames));
            }

            var stmtBldr = new StringBuilder();

            if (!string.IsNullOrWhiteSpace(cgNamespace))
            {
                stmtBldr.AppendFormat("{0}.", cgNamespace);
            }
            if (!string.IsNullOrWhiteSpace(cgInvokeOnName))
            {
                stmtBldr.AppendFormat("{0}.", cgInvokeOnName);
            }

            stmtBldr.Append(cgMem.Name);
            stmtBldr.Append(paramNames);

            return(cgMem.TypeName == "void" ? stmtBldr.ToString() : string.Format("return {0}", stmtBldr));
        }
示例#2
0
        public void TestGetMyEndEnclosure()
        {
            var testCgMem = new CgMember()
            {
                Name = "ddlScreeningLocation_SelectedIndexChanged",
                Args =
                    new List <CgArg>
                {
                    new CgArg {
                        ArgName = "sender", ArgType = "object"
                    },
                    new CgArg {
                        ArgName = "e", ArgType = "EventArgs"
                    }
                },
                IsMethod         = true,
                PdbModuleSymbols = new ModuleSymbols()
                {
                    firstLine = new PdbLineNumber()
                    {
                        lineNumber = 356
                    }, lastLine = new PdbLineNumber()
                    {
                        lineNumber = 359
                    }
                },
                AccessModifier = CgAccessModifier.Family
            };

            var testSrcFile = TestFileContent;

            var testResult = testCgMem.GetMyEndEnclosure(testSrcFile);

            Console.WriteLine(string.Format("{0},{1}", testResult.Item1, testResult.Item2));
        }
示例#3
0
        public void TestMyStartEnclosure()
        {
            var testCgMem = new CgMember()
            {
                Name             = "GetYoMommaTypes",
                IsMethod         = true,
                PdbModuleSymbols = new ModuleSymbols()
                {
                    lastLine = new PdbLineNumber()
                    {
                        lineNumber = 365
                    }, firstLine = new PdbLineNumber()
                    {
                        lineNumber = 445
                    }
                },
                AccessModifier = CgAccessModifier.Family
            };

            var testResult = testCgMem.GetMyStartEnclosure(TestFileContent);

            Assert.IsNotNull(testResult);
            Assert.AreEqual(362, testResult.Item1);
            Assert.AreEqual(1, testResult.Item2);
            Console.WriteLine(string.Format("{0},{1}", testResult.Item1, testResult.Item2));

            testCgMem = new CgMember()
            {
                Name = "ddlScreeningLocation_SelectedIndexChanged",
                Args =
                    new List <CgArg>
                {
                    new CgArg {
                        ArgName = "sender", ArgType = "object"
                    },
                    new CgArg {
                        ArgName = "e", ArgType = "EventArgs"
                    }
                },
                IsMethod         = true,
                PdbModuleSymbols = new ModuleSymbols()
                {
                    lastLine = new PdbLineNumber()
                    {
                        lineNumber = 453
                    }, firstLine = new PdbLineNumber()
                    {
                        lineNumber = 458
                    }
                },
                AccessModifier = CgAccessModifier.Family
            };
            testResult = testCgMem.GetMyStartEnclosure(TestFileContent);
            Assert.IsNotNull(testResult);
            Assert.AreEqual(453, testResult.Item1);
            Assert.AreEqual(1, testResult.Item2);
            Console.WriteLine(string.Format("{0},{1}", testResult.Item1, testResult.Item2));
        }
示例#4
0
        public void TestToCsDecl()
        {
            var testSubject = new CgMember()
            {
                Args =
                    new List <CgArg>
                {
                    new CgArg {
                        ArgName = "param1", ArgType = "int"
                    },
                    new CgArg {
                        ArgName = "param2", ArgType = "string"
                    },
                    new CgArg {
                        ArgName = "param3", ArgType = "bool"
                    }
                },
                Name           = "MyMethodName",
                TypeName       = "System.String",
                AccessModifier = CgAccessModifier.Public
            };

            var testResult = NoFuture.Gen.Settings.LangStyle.ToDecl(testSubject);

            Assert.IsNotNull(testResult);
            Assert.AreNotEqual(string.Empty, testResult);
            Assert.IsTrue(testResult.StartsWith(testSubject.TypeName));
            Console.WriteLine(testResult);

            testResult = NoFuture.Gen.Settings.LangStyle.ToDecl(testSubject, true);
            Assert.IsNotNull(testResult);
            Assert.AreNotEqual(string.Empty, testResult);
            Assert.IsTrue(testResult.StartsWith($"public {testSubject.TypeName}"));
            Console.WriteLine(testResult);

            testSubject.TypeName = "MyNamespace.Here.MyTypeName";
            testSubject.Name     = ".ctor";
            testSubject.IsCtor   = true;
            testResult           = NoFuture.Gen.Settings.LangStyle.ToDecl(testSubject);
            Assert.IsNotNull(testResult);
            Console.WriteLine(testResult);

            testSubject = new CgMember()
            {
                Name           = "SomeProperty",
                TypeName       = "System.String",
                AccessModifier = CgAccessModifier.Public,
                HasGetter      = true,
                HasSetter      = true,
            };

            testResult = NoFuture.Gen.Settings.LangStyle.ToDecl(testSubject, true);
            Assert.IsNotNull(testResult);
            Assert.AreNotEqual(string.Empty, testResult);
            Assert.IsTrue(testResult.Contains("get;"));
            Assert.IsTrue(testResult.Contains("set;"));
            Console.WriteLine(testResult);
        }
示例#5
0
文件: Cs.cs 项目: nofuture-git/31g
        public string ToInvokeRegex(CgMember cgMem, params string[] varNames)
        {
            if (string.IsNullOrWhiteSpace(cgMem.Name))
            {
                return(".");
            }

            var regexPattern = new StringBuilder();

            if (cgMem.MyCgType != null && (cgMem.IsEnum || cgMem.IsStatic || cgMem.MyCgType.IsEnum))
            {
                regexPattern.Append(cgMem.MyCgType.RegexPatternName);
            }
            else
            {
                if (varNames.Length > 0)
                {
                    regexPattern.Append("(");

                    regexPattern.Append(string.Join(@"\x2e|",
                                                    varNames.Select(x => x.EscapeString())));
                    regexPattern.Append(@"\x2e");
                    regexPattern.Append(")");
                }
                else
                {
                    regexPattern.Append(@"((this\x2e)|(?<!\.))");
                }
            }

            regexPattern.AppendFormat(@"\b{0}\b", cgMem.Name);

            if (cgMem.IsGeneric)
            {
                //needs to handle crazy shit like 'global::System.Tuple<int, Func<Mynamespace.MyType, global::System.Int64>>'
                regexPattern.Append(@"\x3c.*?\x3e");
            }

            if (cgMem.MyCgType != null && cgMem.MyCgType.IsEnum && cgMem.MyCgType.EnumValueDictionary.Values.Count > 0)
            {
                regexPattern.Append("(");
                regexPattern.Append(string.Join("|", cgMem.MyCgType.EnumValueDictionary.Values.SelectMany(x => x)));
                regexPattern.Append(")");
            }
            else if (cgMem.Args.Count > 0)
            {
                regexPattern.AppendFormat(@"\s*?\({0}\)", string.Join(@"\,", cgMem.Args.Select(x => x.AsInvokeRegexPattern)));
            }
            else if (cgMem.IsMethod)
            {
                regexPattern.Append(@"\(\s*?\)");
            }

            return(regexPattern.ToString());
        }
示例#6
0
文件: Cs.cs 项目: nofuture-git/31g
        public CgArg ToParam(CgMember cgMem, bool asFunctionPtr)
        {
            if (!asFunctionPtr)
            {
                var isReadOnlyProp = cgMem.HasGetter && !cgMem.HasSetter;

                var addByRef = (cgMem.TypeName == "string" || cgMem.TypeName == "System.String" ||
                                IsPrimitiveTypeName(cgMem.TypeName)) && !isReadOnlyProp;

                return(new CgArg
                {
                    ArgName = cgMem.Name,
                    ArgType = (addByRef ? string.Format("ref {0}", cgMem.TypeName) : cgMem.TypeName)
                });
            }

            if (string.IsNullOrWhiteSpace(cgMem.TypeName) || cgMem.TypeName == "void" || cgMem.TypeName == "System.Void")//as an Action
            {
                if (cgMem.Args.Count <= 0)
                {
                    return new CgArg {
                               ArgName = cgMem.Name, ArgType = "Action"
                    }
                }
                ;

                var actBldr = new StringBuilder();
                actBldr.Append("Action<");
                actBldr.Append(string.Join(", ", cgMem.Args.Select(x => x.ArgType)));
                actBldr.Append(">");
                return(new CgArg {
                    ArgName = cgMem.Name, ArgType = actBldr.ToString()
                });
            }

            var funcBldr = new StringBuilder();

            funcBldr.Append("Func<");
            if (cgMem.Args.Count > 0)
            {
                funcBldr.Append(string.Join(", ", cgMem.Args.Select(x => x.ArgType)));
                funcBldr.Append(", ");
            }
            funcBldr.AppendFormat("{0}>", cgMem.TypeName);
            return(new CgArg {
                ArgName = cgMem.Name, ArgType = funcBldr.ToString()
            });
        }
示例#7
0
        public void TestCgMemberEquals()
        {
            var args1 = new List <CgArg>
            {
                new CgArg {
                    ArgName = "NameOne", ArgType = "TypeOne"
                },
                new CgArg {
                    ArgName = "NameTwo", ArgType = "TypeTwo"
                },
                new CgArg {
                    ArgName = "NameThree", ArgType = "TypeThree"
                }
            };

            var args2 = new List <CgArg>
            {
                new CgArg {
                    ArgName = "NameThree", ArgType = "TypeThree"
                },
                new CgArg {
                    ArgName = "NameTwo", ArgType = "TypeTwo"
                },
                new CgArg {
                    ArgName = "NameOne", ArgType = "TypeOne"
                }
            };

            var cgOne = new CgMember()
            {
                Args      = args1,
                HasGetter = true,
                HasSetter = true,
                TypeName  = "MyCgMember",
                Name      = "MyCgType"
            };

            var cgTwo = new CgMember()
            {
                Args      = args2,
                HasGetter = true,
                HasSetter = true,
                TypeName  = "MyCgMember",
                Name      = "MyCgType"
            };

            Assert.IsTrue(cgOne.Equals(cgTwo));
        }
示例#8
0
文件: Etc.cs 项目: nofuture-git/31g
        /// <summary>
        /// Gets the <see cref="PropertyInfo"/> as a code gen member (<see cref="CgMember"/>)
        /// </summary>
        /// <param name="pi"></param>
        /// <param name="valueTypeOnly"></param>
        /// <param name="enumValueDictionary"></param>
        /// <returns></returns>
        public static CgMember GetAsCgMember(PropertyInfo pi, bool valueTypeOnly,
            Dictionary<string, string[]> enumValueDictionary)
        {
            if (pi == null)
                return null;

            var piType = pi.NfPropertyType();

            if (valueTypeOnly && piType.NfBaseType() != null &&
                piType.NfBaseType().Name != VALUE_TYPE)
                return null;

            var cgMem = new CgMember
            {
                TypeName = Settings.LangStyle.TransformClrTypeSyntax(piType),
                IsEnumerableType = NfTypeName.IsEnumerableReturnType(piType),
                Name = pi.Name,
                MetadataToken = pi.MetadataToken
            };
            if (pi.CanRead)
            {
                cgMem.HasGetter = true;
                if (pi.NfGetGetMethod() != null)
                    cgMem.IsStatic = pi.NfGetGetMethod().IsStatic;
            }

            if (pi.CanWrite)
            {
                cgMem.HasSetter = true;
                if (pi.NfGetSetMethod() != null)
                    cgMem.IsStatic = pi.NfGetSetMethod().IsStatic;
            }

            string[] enumVals;
            if (NfTypeName.IsEnumType(piType, out enumVals) && enumValueDictionary != null)
            {
                cgMem.IsEnum = true;
                var clearName = NfTypeName.GetLastTypeNameFromArrayAndGeneric(cgMem.TypeName, "<");
                if (!enumValueDictionary.ContainsKey(clearName))
                {
                    enumValueDictionary.Add(clearName, enumVals);
                }
            }

            return cgMem;
        }
示例#9
0
文件: Cs.cs 项目: nofuture-git/31g
        public string ToDecl(CgMember cgMem, bool includesAccessModifier = false)
        {
            if (cgMem == null)
            {
                return(string.Empty);
            }

            var cgArgs    = cgMem.Args.Select(cgArg => $"{cgArg.ArgType} {cgArg.ArgName}").ToList();
            var accessMod = includesAccessModifier ? TransposeCgAccessModToString(cgMem.AccessModifier) + " " : string.Empty;
            var args      = string.Join(", ", cgArgs);

            if (cgMem.IsCtor)
            {
                var ctorName = NfReflect.GetTypeNameWithoutNamespace(cgMem.TypeName);
                return($"{accessMod}{ctorName}({args})");
            }

            if (cgArgs.Any() || cgMem.IsMethod)
            {
                //TODO - this is only going to work for when there is only one generic arg
                return(cgMem.IsGeneric && !cgMem.IsCtor
                    ? $"{accessMod}{cgMem.TypeName} {cgMem.Name}<{cgMem.TypeName}>({args})"
                    : $"{accessMod}{cgMem.TypeName} {cgMem.Name}({args})");
            }
            var propSyntax = "";

            if (cgMem.HasSetter || cgMem.HasGetter)
            {
                propSyntax += " { ";
                if (cgMem.HasGetter)
                {
                    propSyntax += "get; ";
                }

                if (cgMem.HasSetter)
                {
                    propSyntax += "set; ";
                }

                propSyntax += "}";
            }

            return($"{accessMod}{cgMem.TypeName} {cgMem.Name}{propSyntax}");
        }
示例#10
0
文件: Cs.cs 项目: nofuture-git/31g
        public string ToSignatureRegex(CgMember cgMem)
        {
            var regexPattern = new StringBuilder();

            regexPattern.Append(@"(\b" + TransposeCgAccessModToString(cgMem.AccessModifier) + @"\b)");

            if (cgMem.AccessModifier == CgAccessModifier.Assembly)
            {
                regexPattern.Append("?");
            }

            regexPattern.Append(@"([^\x2c\x3b\x7d\x7b]+?)");

            regexPattern.AppendFormat(@"\b{0}\b", cgMem.Name);
            if (cgMem.IsGeneric)
            {
                //needs to handle crazy shit like 'global::System.Tuple<int, Func<Mynamespace.MyType, global::System.Int64>>'
                regexPattern.Append(@"\x3c.*?\x3e");
            }

            if (!cgMem.IsMethod)
            {
                return(regexPattern.ToString());
            }

            if (cgMem.Args.Count <= 0)
            {
                regexPattern.Append(@"\(\s*?\)");
                return(regexPattern.ToString());
            }

            var simpleArgTypes =
                cgMem.Args.Select(
                    x =>
                    @"\s*\b" +
                    NfReflect.GetTypeNameWithoutNamespace(x.ArgType).EscapeString() +
                    @"\b\s*([^\,]+?)").ToList();

            regexPattern.AppendFormat(@"\s*\({0}\)", string.Join(@"\,", simpleArgTypes));

            return(regexPattern.ToString());
        }
示例#11
0
        public void TestAsInvokeRegexPattern02()
        {
            var testSubject = new CgMember()
            {
                Name     = "ToString",
                TypeName = "System.String",
                IsMethod = true
            };

            var testResult = testSubject.AsInvokeRegexPattern();

            var testCompare =
                "command.Parameters.Add(new SqlParameter(\"@createUser\", Convert.ToString(Session[SessionContants.LoggedInEntityId])));";

            Assert.IsFalse(System.Text.RegularExpressions.Regex.IsMatch(testCompare, testResult));
            Console.WriteLine(testResult);

            testCompare = "somethingElse.InvokeMe(4,true,\"sd\");var mysomething=ToString()";
            Assert.IsTrue(System.Text.RegularExpressions.Regex.IsMatch(testCompare, testResult));
        }
示例#12
0
        public void TestToCsStmt()
        {
            var testSubject = new CgMember()
            {
                Args =
                    new List <CgArg>
                {
                    new CgArg {
                        ArgName = "param1", ArgType = "int"
                    },
                    new CgArg {
                        ArgName = "param2", ArgType = "string"
                    },
                    new CgArg {
                        ArgName = "param3", ArgType = "bool"
                    }
                },
                Name     = "MyMethodName",
                TypeName = "System.String"
            };
            var testResult = NoFuture.Gen.Settings.LangStyle.ToStmt(testSubject, "MyNamespace.Here", "MyTypeName");

            Console.WriteLine(testResult);
            Assert.IsNotNull(testResult);
            Assert.AreNotEqual(string.Empty, testResult);
            Assert.IsTrue(testResult.StartsWith("return"));

            testSubject.TypeName = "void";
            testResult           = NoFuture.Gen.Settings.LangStyle.ToStmt(testSubject, "MyNamespace.Here", "MyTypeName");
            Console.WriteLine(testResult);

            Assert.IsTrue(testResult.StartsWith("MyNamespace"));

            testSubject.TypeName = "MyNamespace.Here.MyTypeName";
            testSubject.Name     = ".ctor";
            testSubject.IsCtor   = true;
            testResult           = NoFuture.Gen.Settings.LangStyle.ToStmt(testSubject, null, null);
            Assert.IsNotNull(testResult);
            Assert.AreEqual("new MyNamespace.Here.MyTypeName(param1,param2,param3);", testResult);
            Console.WriteLine(testResult);
        }
示例#13
0
        public void TestContainsThisMember()
        {
            var args1 = new List<CgArg>
            {
                new CgArg {ArgName = "NameOne", ArgType = "TypeOne"},
                new CgArg {ArgName = "NameTwo", ArgType = "TypeTwo"},
                new CgArg {ArgName = "NameThree", ArgType = "TypeThree"}
            };

            var args2 = new List<CgArg>
            {
                new CgArg {ArgName = "NameThree", ArgType = "TypeThree"},
                new CgArg {ArgName = "NameTwo", ArgType = "TypeTwo"},
                new CgArg {ArgName = "NameOne", ArgType = "TypeOne"}
            };

            var cgOne = new CgMember()
            {
                Args = args1,
                HasGetter = true,
                HasSetter = true,
                TypeName = "MyCgMember",
                Name = "MyCgType"
            };

            var cgTwo = new CgMember()
            {
                Args = args2,
                HasGetter = true,
                HasSetter = true,
                TypeName = "MyCgMember",
                Name = "MyCgType"
            };

            var testSubject = new CgType();
            testSubject.Methods.Add(cgOne);
            Assert.IsTrue(testSubject.ContainsThisMember(cgTwo));

            testSubject = new CgType();
            testSubject.Fields.Add(cgOne);
            Assert.IsTrue(testSubject.ContainsThisMember(cgTwo));

            testSubject = new CgType();
            testSubject.Events.Add(cgOne);
            Assert.IsTrue(testSubject.ContainsThisMember(cgTwo));

            testSubject = new CgType();
            testSubject.Properties.Add(cgOne);
            Assert.IsTrue(testSubject.ContainsThisMember(cgTwo));
        }
示例#14
0
        public void TestCgMemberEquals()
        {
            var args1 = new List<CgArg>
            {
                new CgArg {ArgName = "NameOne", ArgType = "TypeOne"},
                new CgArg {ArgName = "NameTwo", ArgType = "TypeTwo"},
                new CgArg {ArgName = "NameThree", ArgType = "TypeThree"}
            };

            var args2 = new List<CgArg>
            {
                new CgArg {ArgName = "NameThree", ArgType = "TypeThree"},
                new CgArg {ArgName = "NameTwo", ArgType = "TypeTwo"},
                new CgArg {ArgName = "NameOne", ArgType = "TypeOne"}
            };

            var cgOne = new CgMember()
            {
                Args = args1,
                HasGetter = true,
                HasSetter = true,
                TypeName = "MyCgMember",
                Name = "MyCgType"
            };

            var cgTwo = new CgMember()
            {
                Args = args2,
                HasGetter = true,
                HasSetter = true,
                TypeName = "MyCgMember",
                Name = "MyCgType"
            };

            Assert.IsTrue(cgOne.Equals(cgTwo));
        }
示例#15
0
        public void TestCodeBlockUseMyLocals()
        {
            var inputString = new String[]
            {
                "            objZuluUIController = new ZuluUIController();",
                "            DataSet dsGetSecurityQuestions = objZuluUIController.GetZuluSecurityQuestions(DropdownConstants.ZuluSECURITYQUESTIONS);",
                "            ddlSecurityQuestion.DataSource = dsGetSecurityQuestions;",
                "            ddlSecurityQuestion.DataTextField = \"ItemName\";",
                "            ddlSecurityQuestion.DataValueField = \"ItemAbbreviation\";",
                "            ddlSecurityQuestion.DataBind();",
                "            ddlSecurityQuestion.Items.Insert(0, string.Format(\" '{0}'\",\"------------------- Select a question -------------------\");",
                "        }",
                "        catch (Exception ex)",
                "        {",
                "            MyNamespace.CRM.Common.Utitility.CommonMethods.LogException(\"\",ex);",
                "            throw ex;",
                "        }",
                "    }",
                ""
            };

            var args1 = new List<CgArg>
            {
                new CgArg {ArgName = "objZuluUIController", ArgType = "TypeOne"},
                new CgArg {ArgName = "ddlSecurityQuestion", ArgType = "TypeTwo"},
            };
            var args2 = new List<CgArg>
            {
                new CgArg {ArgName = "objZuluUIController", ArgType = "TypeOne"},
                new CgArg {ArgName = "ddlSecurityQuestion", ArgType = "TypeTwo"},
                new CgArg {ArgName = "NameOne", ArgType = "TypeOne"}
            };
            //however expect that if arg name furthest left has no match then the result as false
            var args3 = new List<CgArg>
            {
                new CgArg {ArgName = "NameOne", ArgType = "TypeOne"},
                new CgArg {ArgName = "objZuluUIController", ArgType = "TypeOne"},
                new CgArg {ArgName = "ddlSecurityQuestion", ArgType = "TypeTwo"}
            };
            var testSubject = new CgMember()
            {
                Args = args1,
                HasGetter = true,
                HasSetter = true,
                TypeName = "MyCgMember",
                Name = "MyCgType"
            };

            Assert.AreEqual(2, testSubject.CodeBlockUsesMyArgs(inputString));

            testSubject.Args = args2;

            //if it can't find all three , it check for first two, then just one
            Assert.AreEqual(2, testSubject.CodeBlockUsesMyArgs(inputString));

            testSubject.Args = args3;

            Assert.AreEqual(0, testSubject.CodeBlockUsesMyArgs(inputString));
        }
示例#16
0
        public void TestCgMemberCompare()
        {
            var testSubject = new CgMemberCompare();

            Assert.AreEqual(0, testSubject.Compare(null, null));

            var less = new CgMember
            {
                Args =
                    new List <CgArg>()
                {
                    new CgArg {
                        ArgName = "ddl", ArgType = "System.Web.UI.WebControls.DropDownList"
                    },
                    new CgArg {
                        ArgName = "lookupMstrDescription", ArgType = "string"
                    }
                },
                Name     = "less",
                TypeName = "void"
            };


            var middle = new CgMember
            {
                Args =
                    new List <CgArg>()
                {
                    new CgArg {
                        ArgName = "ddl", ArgType = "System.Web.UI.WebControls.DropDownList"
                    },
                    new CgArg {
                        ArgName = "lookupMstrDescription", ArgType = "string"
                    },
                    new CgArg {
                        ArgName = "Id", ArgType = "bool"
                    }
                },
                Name     = "middle",
                TypeName = "void"
            };

            var most = new CgMember
            {
                Args =
                    new List <CgArg>()
                {
                    new CgArg {
                        ArgName = "ddl", ArgType = "System.Web.UI.WebControls.DropDownList"
                    },
                    new CgArg {
                        ArgName = "lookupMstrDescription", ArgType = "string"
                    },
                    new CgArg {
                        ArgName = "defaultValue", ArgType = "string"
                    }
                },
                Name     = "most",
                TypeName = "void"
            };

            var deadLast = new CgMember
            {
                Name     = "deadLast",
                TypeName = "void"
            };

            var myCgType = new CgType();

            myCgType.Methods.AddRange(new List <CgMember>()
            {
                deadLast, middle, less, most
            });

            foreach (var obj in myCgType.SortedMethods)
            {
                var cg = obj as CgMember;
                Console.WriteLine(string.Format("----{0}", cg.Name));
                foreach (var arg in cg.Args)
                {
                    Console.WriteLine(arg.ToString());
                }
            }
        }
示例#17
0
        public void TestCgMemberCompare()
        {
            var testSubject = new CgMemberCompare();

            Assert.AreEqual(0, testSubject.Compare(null, null));

            var less = new CgMember
            {
                Args =
                    new List<CgArg>()
                    {
                        new CgArg {ArgName = "ddl", ArgType = "System.Web.UI.WebControls.DropDownList"},
                        new CgArg {ArgName = "lookupMstrDescription", ArgType = "string"}
                    },
                Name = "less",
                TypeName = "void"
            };

            var middle = new CgMember
            {
                Args =
                    new List<CgArg>()
                    {
                        new CgArg {ArgName = "ddl", ArgType = "System.Web.UI.WebControls.DropDownList"},
                        new CgArg {ArgName = "lookupMstrDescription", ArgType = "string"},
                        new CgArg {ArgName = "Id", ArgType = "bool"}
                    },
                Name = "middle",
                TypeName = "void"
            };

            var most = new CgMember
            {
                Args =
                    new List<CgArg>()
                    {
                        new CgArg {ArgName = "ddl", ArgType = "System.Web.UI.WebControls.DropDownList"},
                        new CgArg {ArgName = "lookupMstrDescription", ArgType = "string"},
                        new CgArg {ArgName = "defaultValue", ArgType = "string"}
                    },
                Name = "most",
                TypeName = "void"
            };

            var deadLast = new CgMember
            {
                Name = "deadLast",
                TypeName = "void"
            };

            var myCgType = new CgType() { Methods = new List<CgMember>() { deadLast, middle, less, most } };

            foreach (var obj in myCgType.SortedMethods)
            {
                var cg = obj as CgMember;
                System.Diagnostics.Debug.WriteLine(string.Format("----{0}", cg.Name));
                foreach (var arg in cg.Args)
                {
                    System.Diagnostics.Debug.WriteLine(arg.ToString());
                }
            }
        }
示例#18
0
文件: Etc.cs 项目: nofuture-git/31g
        /// <summary>
        /// Gets a method as a code gen member type
        /// </summary>
        /// <param name="mti"></param>
        /// <param name="getCallvirtMetadataTokens"></param>
        /// <returns></returns>
        public static CgMember GetAsCgMember(MethodInfo mti, bool getCallvirtMetadataTokens = false)
        {
            if (mti == null)
                return null;
            string propName;
            if (NfTypeName.IsClrMethodForProperty(mti.Name, out propName))
                return null;
            if (NfTypeName.IsClrGeneratedType(mti.Name))
                //these appear as '<SomeNameOfMethodAlreadyAdded>b__kifkj(...)'
                return null;

            var miReturnType = mti.NfReturnType();

            var cgMem = new CgMember
            {
                Name = mti.Name,
                TypeName = Settings.LangStyle.TransformClrTypeSyntax(miReturnType),
                IsStatic = mti.IsStatic,
                IsGeneric = mti.IsGenericMethod,
                IsEnumerableType = NfTypeName.IsEnumerableReturnType(miReturnType),
                IsMethod = true,
                MetadataToken = mti.MetadataToken
            };
            if(mti.IsAssembly)
                cgMem.AccessModifier = CgAccessModifier.Assembly;
            if(mti.IsFamily)
                cgMem.AccessModifier = CgAccessModifier.Family;
            if(mti.IsFamilyAndAssembly)
                cgMem.AccessModifier = CgAccessModifier.FamilyAssembly;
            if(mti.IsPrivate)
                cgMem.AccessModifier = CgAccessModifier.Private;
            if(mti.IsPublic)
                cgMem.AccessModifier = CgAccessModifier.Public;

            foreach (var parameterInfo in mti.GetParameters())
            {
                var paramType = parameterInfo.NfParameterType();
                var cgArg = new CgArg
                {
                    ArgName = parameterInfo.Name,
                    ArgType = Settings.LangStyle.TransformClrTypeSyntax(paramType)
                };

                cgMem.Args.Add(cgArg);
            }
            cgMem.MethodBodyIL = Convert.ToBase64String(Asm.GetMethodBody(mti));

            if (!getCallvirtMetadataTokens)
                return cgMem;

            cgMem.opCodeCallsAndCallvirtsMetadatTokens.AddRange(Asm.GetCallsMetadataTokens(mti));
            return cgMem;
        }
示例#19
0
        public void TestAsInvokeRegexPattern()
        {
            var testSubject = new CgMember()
            {
                Args =
                    new List<CgArg>
                    {
                        new CgArg {ArgName = "param1", ArgType = "int"},
                        new CgArg {ArgName = "param2", ArgType = "string"},
                        new CgArg {ArgName = "param3", ArgType = "bool"}
                    },
                Name = "MyMethodName",
                TypeName = "System.String"
            };
            var testResult = testSubject.AsInvokeRegexPattern();
            Assert.IsNotNull(testResult);
            Assert.AreNotEqual(string.Empty, testResult);
            Assert.AreNotEqual(".",testResult);
            System.Diagnostics.Debug.WriteLine(testResult);
            Assert.IsTrue(System.Text.RegularExpressions.Regex.IsMatch("MyMethodName(11,\"a string literal\",true)",testResult));

            testSubject.IsStatic = true;
            testSubject.MyCgType = new CgType {Namespace = "NoFuture.TestNs", Name = "Something"};
            testSubject.IsGeneric = true;
            testResult = testSubject.AsInvokeRegexPattern();
            System.Diagnostics.Debug.WriteLine(testResult);
            Assert.IsNotNull(testResult);

            testSubject.IsStatic = false;
            testResult = testSubject.AsInvokeRegexPattern("myVar", "myVar.ItsTypes.Types.Type");
            System.Diagnostics.Debug.WriteLine(testResult);
            Assert.IsNotNull(testResult);

            testSubject.MyCgType.IsEnum = true;
            testSubject.IsGeneric = false;
            testSubject.Name = "MyEnum";
            testSubject.MyCgType.EnumValueDictionary.Add("MyType", new[] { "Instance", "NonPublic", "Public", "DeclaredOnly" });
            testResult = testSubject.AsInvokeRegexPattern();
            System.Diagnostics.Debug.WriteLine(testResult);
            Assert.IsNotNull(testResult);

            testSubject = new CgMember()
            {
                Name = "MyPropertyName",
                TypeName = "System.String"
            };

            testResult = testSubject.AsInvokeRegexPattern();
            Assert.IsNotNull(testResult);
            Assert.AreNotEqual(string.Empty, testResult);
            Assert.AreNotEqual(".", testResult);
            System.Diagnostics.Debug.WriteLine(testResult);
        }
示例#20
0
文件: Cs.cs 项目: nofuture-git/31g
        public string ToDecl(CgMember cgMem, bool includesAccessModifier = false)
        {
            var cgArgs = cgMem.Args.Select(cgArg => String.Format("{0} {1}", cgArg.ArgType, cgArg.ArgName)).ToList();

            var cgSig = string.Join(",", cgArgs);
            var tn = cgMem.IsCtor ? string.Empty : cgMem.TypeName;
            var n = cgMem.IsCtor
                ? NfTypeName.GetTypeNameWithoutNamespace(cgMem.TypeName)
                : string.Format(" {0}", cgMem.Name);

            cgSig = cgSig.Length > 0 || cgMem.IsCtor || cgMem.IsMethod
                ? string.Format("{0}{1}({2})", tn, n, cgSig)
                : string.Format("{0}{1}", tn, n);

            return includesAccessModifier
                ? string.Format("{0} {1}", TransposeCgAccessModToString(cgMem.AccessModifier), cgSig)
                : cgSig;
        }
示例#21
0
        public void TestToCsParam()
        {
            var testSubject = new CgMember()
            {
                Args =
                    new List<CgArg>
                    {
                        new CgArg {ArgName = "param1", ArgType = "int"},
                        new CgArg {ArgName = "param2", ArgType = "string"},
                        new CgArg {ArgName = "param3", ArgType = "bool"}
                    },
                Name = "MyMethodName",
                TypeName = "System.String"
            };

            var testResult = NoFuture.Gen.Settings.LangStyle.ToParam(testSubject, true);
            Assert.IsNotNull(testResult);
            System.Diagnostics.Debug.WriteLine(testResult);
            Assert.IsTrue(testResult.ToString().StartsWith("Func<"));
        }
示例#22
0
文件: Cs.cs 项目: nofuture-git/31g
 public string GetEnclosureCloseToken(CgMember cgMem)
 {
     return C_CLOSE_CURLY.ToString();
 }
示例#23
0
文件: Cs.cs 项目: nofuture-git/31g
 public string GetEnclosureOpenToken(CgMember cgMem)
 {
     return C_OPEN_CURLY.ToString();
 }
示例#24
0
        public void TestContainsThisMember()
        {
            var args1 = new List <CgArg>
            {
                new CgArg {
                    ArgName = "NameOne", ArgType = "TypeOne"
                },
                new CgArg {
                    ArgName = "NameTwo", ArgType = "TypeTwo"
                },
                new CgArg {
                    ArgName = "NameThree", ArgType = "TypeThree"
                }
            };

            var args2 = new List <CgArg>
            {
                new CgArg {
                    ArgName = "NameThree", ArgType = "TypeThree"
                },
                new CgArg {
                    ArgName = "NameTwo", ArgType = "TypeTwo"
                },
                new CgArg {
                    ArgName = "NameOne", ArgType = "TypeOne"
                }
            };

            var cgOne = new CgMember()
            {
                Args      = args1,
                HasGetter = true,
                HasSetter = true,
                TypeName  = "MyCgMember",
                Name      = "MyCgType"
            };

            var cgTwo = new CgMember()
            {
                Args      = args2,
                HasGetter = true,
                HasSetter = true,
                TypeName  = "MyCgMember",
                Name      = "MyCgType"
            };

            var testSubject = new CgType();

            testSubject.Methods.Add(cgOne);
            Assert.IsTrue(testSubject.ContainsThisMember(cgTwo));

            testSubject = new CgType();
            testSubject.Fields.Add(cgOne);
            Assert.IsTrue(testSubject.ContainsThisMember(cgTwo));

            testSubject = new CgType();
            testSubject.Events.Add(cgOne);
            Assert.IsTrue(testSubject.ContainsThisMember(cgTwo));

            testSubject = new CgType();
            testSubject.Properties.Add(cgOne);
            Assert.IsTrue(testSubject.ContainsThisMember(cgTwo));
        }
示例#25
0
        public void TestCodeBlockUseMyLocals()
        {
            var inputString = new String[]
            {
                "            objZuluUIController = new ZuluUIController();",
                "            DataSet dsGetSecurityQuestions = objZuluUIController.GetZuluSecurityQuestions(DropdownConstants.ZuluSECURITYQUESTIONS);",
                "            ddlSecurityQuestion.DataSource = dsGetSecurityQuestions;",
                "            ddlSecurityQuestion.DataTextField = \"ItemName\";",
                "            ddlSecurityQuestion.DataValueField = \"ItemAbbreviation\";",
                "            ddlSecurityQuestion.DataBind();",
                "            ddlSecurityQuestion.Items.Insert(0, string.Format(\" '{0}'\",\"------------------- Select a question -------------------\");",
                "        }",
                "        catch (Exception ex)",
                "        {",
                "            MyNamespace.CRM.Common.Utitility.CommonMethods.LogException(\"\",ex);",
                "            throw ex;",
                "        }",
                "    }",
                ""
            };

            var args1 = new List <CgArg>
            {
                new CgArg {
                    ArgName = "objZuluUIController", ArgType = "TypeOne"
                },
                new CgArg {
                    ArgName = "ddlSecurityQuestion", ArgType = "TypeTwo"
                },
            };
            var args2 = new List <CgArg>
            {
                new CgArg {
                    ArgName = "objZuluUIController", ArgType = "TypeOne"
                },
                new CgArg {
                    ArgName = "ddlSecurityQuestion", ArgType = "TypeTwo"
                },
                new CgArg {
                    ArgName = "NameOne", ArgType = "TypeOne"
                }
            };
            //however expect that if arg name furthest left has no match then the result as false
            var args3 = new List <CgArg>
            {
                new CgArg {
                    ArgName = "NameOne", ArgType = "TypeOne"
                },
                new CgArg {
                    ArgName = "objZuluUIController", ArgType = "TypeOne"
                },
                new CgArg {
                    ArgName = "ddlSecurityQuestion", ArgType = "TypeTwo"
                }
            };
            var testSubject = new CgMember()
            {
                Args      = args1,
                HasGetter = true,
                HasSetter = true,
                TypeName  = "MyCgMember",
                Name      = "MyCgType"
            };

            Assert.AreEqual(2, testSubject.CodeBlockUsesMyArgs(inputString));

            testSubject.Args = args2;

            //if it can't find all three , it check for first two, then just one
            Assert.AreEqual(2, testSubject.CodeBlockUsesMyArgs(inputString));

            testSubject.Args = args3;

            Assert.AreEqual(0, testSubject.CodeBlockUsesMyArgs(inputString));
        }
示例#26
0
        public void TestMyStartEnclosure()
        {
            var testCgMem = new CgMember()
            {
                Name = "GetYoMommaTypes",
                IsMethod = true,
                PdbModuleSymbols = new ModuleSymbols(){lastLine = new PdbLineNumber(){lineNumber = 365}, firstLine = new PdbLineNumber(){lineNumber = 445}},
                AccessModifier = CgAccessModifier.Family
            };

            var testResult = testCgMem.GetMyStartEnclosure(TestFileContent);
            Assert.IsNotNull(testResult);
            Assert.AreEqual(362, testResult.Item1);
            Assert.AreEqual(1,testResult.Item2);
            System.Diagnostics.Debug.WriteLine(string.Format("{0},{1}", testResult.Item1, testResult.Item2));

            testCgMem = new CgMember()
            {
                Name = "ddlScreeningLocation_SelectedIndexChanged",
                Args =
                    new List<CgArg>
                    {
                        new CgArg {ArgName = "sender", ArgType = "object"},
                        new CgArg {ArgName = "e", ArgType = "EventArgs"}
                    },
                IsMethod = true,
                PdbModuleSymbols = new ModuleSymbols() { lastLine = new PdbLineNumber() { lineNumber = 453 }, firstLine = new PdbLineNumber() { lineNumber = 458 } },
                AccessModifier = CgAccessModifier.Family
            };
            testResult = testCgMem.GetMyStartEnclosure(TestFileContent);
            Assert.IsNotNull(testResult);
            Assert.AreEqual(354, testResult.Item1);
            Assert.AreEqual(1, testResult.Item2);
            System.Diagnostics.Debug.WriteLine(string.Format("{0},{1}", testResult.Item1, testResult.Item2));
        }
示例#27
0
文件: Etc.cs 项目: nofuture-git/31g
        /// <summary>
        /// Gets the <see cref="FieldInfo"/> as a code gen member (<see cref="CgMember"/>)
        /// </summary>
        /// <param name="fi"></param>
        /// <param name="valueTypeOnly"></param>
        /// <param name="enumValueDictionary"></param>
        /// <returns></returns>
        public static CgMember GetAsCgMember(FieldInfo fi, bool valueTypeOnly,
            Dictionary<string, string[]> enumValueDictionary)
        {
            if (fi == null)
                return null;

            if (NfTypeName.IsClrGeneratedType(fi.Name))
                return null;

            var fiType = fi.NfFieldType();

            if (valueTypeOnly && fiType.NfBaseType() != null && fiType.NfBaseType().Name != VALUE_TYPE)
                return null;

            var cgMem = new CgMember
            {
                TypeName = Settings.LangStyle.TransformClrTypeSyntax(fiType),
                IsEnumerableType = NfTypeName.IsEnumerableReturnType(fiType),
                Name = fi.Name,
                IsStatic = fi.IsStatic,
                MetadataToken = fi.MetadataToken
            };

            string[] enumVals;
            if (NfTypeName.IsEnumType(fiType, out enumVals) && enumValueDictionary != null)
            {
                cgMem.IsEnum = true;
                var clearName = NfTypeName.GetLastTypeNameFromArrayAndGeneric(cgMem.TypeName, "<");
                if (!enumValueDictionary.ContainsKey(clearName))
                {
                    enumValueDictionary.Add(clearName, enumVals);
                }
            }
            return cgMem;
        }
示例#28
0
        public void TestAsInvokeRegexPattern()
        {
            var testSubject = new CgMember()
            {
                Args =
                    new List <CgArg>
                {
                    new CgArg {
                        ArgName = "param1", ArgType = "int"
                    },
                    new CgArg {
                        ArgName = "param2", ArgType = "string"
                    },
                    new CgArg {
                        ArgName = "param3", ArgType = "bool"
                    }
                },
                Name     = "MyMethodName",
                TypeName = "System.String"
            };
            var testResult = testSubject.AsInvokeRegexPattern();

            Assert.IsNotNull(testResult);
            Assert.AreNotEqual(string.Empty, testResult);
            Assert.AreNotEqual(".", testResult);
            Console.WriteLine(testResult);
            Assert.IsTrue(System.Text.RegularExpressions.Regex.IsMatch("MyMethodName(11,\"a string literal\",true)", testResult));

            testSubject.IsStatic = true;
            testSubject.MyCgType = new CgType {
                Namespace = "NoFuture.TestNs", Name = "Something"
            };
            testSubject.IsGeneric = true;
            testResult            = testSubject.AsInvokeRegexPattern();
            Console.WriteLine(testResult);
            Assert.IsNotNull(testResult);

            testSubject.IsStatic = false;
            testResult           = testSubject.AsInvokeRegexPattern("myVar", "myVar.ItsTypes.Types.Type");
            Console.WriteLine(testResult);
            Assert.IsNotNull(testResult);

            testSubject.MyCgType.IsEnum = true;
            testSubject.IsGeneric       = false;
            testSubject.Name            = "MyEnum";
            testSubject.MyCgType.EnumValueDictionary.Add("MyType", new[] { "Instance", "NonPublic", "Public", "DeclaredOnly" });
            testResult = testSubject.AsInvokeRegexPattern();
            Console.WriteLine(testResult);
            Assert.IsNotNull(testResult);

            testSubject = new CgMember()
            {
                Name     = "MyPropertyName",
                TypeName = "System.String"
            };

            testResult = testSubject.AsInvokeRegexPattern();
            Assert.IsNotNull(testResult);
            Assert.AreNotEqual(string.Empty, testResult);
            Assert.AreNotEqual(".", testResult);
            Console.WriteLine(testResult);
        }
示例#29
0
文件: Etc.cs 项目: nofuture-git/31g
        /// <summary>
        /// Gets a constructor as a code gen member type
        /// </summary>
        /// <param name="ci"></param>
        /// <param name="typeName"></param>
        /// <param name="getCallvirtMetadataTokens"></param>
        /// <returns></returns>
        public static CgMember GetAsCgMember(ConstructorInfo ci, string typeName, bool getCallvirtMetadataTokens = false)
        {
            if (ci == null || string.IsNullOrWhiteSpace(typeName))
                return null;

            var cgMem = new CgMember
            {
                Name = Constants.CTOR_NAME,
                IsCtor = true,
                TypeName = typeName,
                MetadataToken = ci.MetadataToken
            };
            foreach (var parameterInfo in ci.GetParameters())
            {
                var paramType = parameterInfo.NfParameterType();
                var cgArg = new CgArg
                {
                    ArgName = parameterInfo.Name,
                    ArgType = Settings.LangStyle.TransformClrTypeSyntax(paramType)
                };

                cgMem.Args.Add(cgArg);
            }

            if (!getCallvirtMetadataTokens) return cgMem;

            cgMem.opCodeCallsAndCallvirtsMetadatTokens.AddRange(Asm.GetCallsMetadataTokens(ci));
            return cgMem;
        }
示例#30
0
        public void TestGetMyEndEnclosure()
        {
            var testCgMem = new CgMember()
            {
                Name = "ddlScreeningLocation_SelectedIndexChanged",
                Args =
                    new List<CgArg>
                    {
                        new CgArg {ArgName = "sender", ArgType = "object"},
                        new CgArg {ArgName = "e", ArgType = "EventArgs"}
                    },
                IsMethod = true,
                PdbModuleSymbols = new ModuleSymbols() { firstLine = new PdbLineNumber() { lineNumber = 356 }, lastLine = new PdbLineNumber() { lineNumber = 359 } },
                AccessModifier = CgAccessModifier.Family
            };

            var testSrcFile = TestFileContent;

            var testResult = testCgMem.GetMyEndEnclosure(testSrcFile);
            System.Diagnostics.Debug.WriteLine(string.Format("{0},{1}", testResult.Item1, testResult.Item2));
        }
示例#31
0
文件: Etc.cs 项目: nofuture-git/31g
        /// <summary>
        /// Converts the .NET type into the custom Code Gen type
        /// </summary>
        /// <param name="asmType"></param>
        /// <param name="valueTypeOnly">
        /// Will only export Fields and Properties whose base type extends System.ValueType
        /// </param>
        /// <param name="resolveDependencies">
        /// Switch to have the IL of the type parsed and all dependent calls Metadata tokens added.
        /// </param>
        /// <returns></returns>
        public static CgType GetCgOfType(this Type asmType, bool valueTypeOnly, bool resolveDependencies = false)
        {
            var cgType = new CgType();

            if (asmType == null || NfTypeName.IsIgnoreType(asmType) || NfTypeName.IsClrGeneratedType(asmType))
                return null;

            //use the logic in TypeName to get the namespace and class name so its not tied to having the assembly
            var cgTypeName = new NfTypeName(asmType.AssemblyQualifiedName);

            //make sure there is always some kind of namespace
            cgType.Namespace = string.IsNullOrWhiteSpace(cgTypeName.Namespace)
                ? asmType.Assembly.GetName().Name
                : cgTypeName.Namespace;
            cgType.IsContrivedNamespace = string.IsNullOrWhiteSpace(cgTypeName.Namespace);
            cgType.Name = cgTypeName.ClassName;
            cgType.AssemblyQualifiedName = asmType.AssemblyQualifiedName;
            cgType.IsEnum = NfTypeName.IsEnumType(asmType);

            var cgTypesInterfaces = asmType.GetInterfaces();
            cgType.MetadataToken = asmType.MetadataToken;

            Func<CgType, string, bool> alreadyPresentHerein =
                (cg, nextName) =>
                    (cg.Properties.FirstOrDefault(
                        cgP => string.Equals(cgP.Name, nextName, StringComparison.OrdinalIgnoreCase)) != null
                     ||
                     cg.Fields.FirstOrDefault(
                         cgF => string.Equals(cgF.Name, nextName, StringComparison.OrdinalIgnoreCase)) != null
                     ||
                     cg.Events.FirstOrDefault(
                         cgE => string.Equals(cgE.Name, nextName, StringComparison.OrdinalIgnoreCase)) != null)
                ;

            //have events go first since they tend to be speard across fields and properties
            foreach (
                var evtInfo in
                    asmType.GetEvents(NfConfig.DefaultFlags))
            {
                var evtHandlerType = evtInfo.NfEventHandlerType().ToString();

                var cgMem = new CgMember
                {
                    Name = evtInfo.Name,
                    TypeName = evtHandlerType,
                    MetadataToken = evtInfo.MetadataToken
                };
                cgType.Events.Add(cgMem);
            }

            var asmMembers =
                asmType.GetMembers(NfConfig.DefaultFlags);

            foreach (var mi in asmMembers)
            {
                if (alreadyPresentHerein(cgType, mi.Name))
                    continue;

                try
                {
                    if (mi.MemberType == MemberTypes.Property)
                    {
                        var pi = mi as PropertyInfo;

                        var cgm = GetAsCgMember(pi, valueTypeOnly, cgType.EnumValueDictionary);
                        if (cgm == null)
                            continue;
                        if (resolveDependencies)
                        {
                            var propMi = NfTypeName.GetMethodsForProperty(pi, asmType);
                            foreach (var pim in propMi)
                            {
                                cgm.opCodeCallsAndCallvirtsMetadatTokens.AddRange(Asm.GetCallsMetadataTokens(pim));
                            }
                        }
                        cgType.Properties.Add(cgm);
                    }
                }
                catch (Exception ex)
                {
                    Asm.AddLoaderExceptionToLog(null, ex);

                    if (!Settings.IgnoreReflectionMissingAsmError)
                        throw;

                    cgType.Properties.Add(new CgMember
                    {
                        Name = mi.Name,
                        TypeName = DF_TYPE_NAME,
                        HasGetter = true,
                        HasSetter = true,
                        SkipIt = true
                    });
                }

                try
                {
                    if (mi.MemberType == MemberTypes.Event)
                    {
                        continue;//these have already been handled
                    }
                }
                catch (Exception ex)
                {
                    Asm.AddLoaderExceptionToLog(null, ex);
                    continue;
                }

                try
                {
                    if (mi.MemberType == MemberTypes.Field)
                    {
                        var fi = mi as FieldInfo;
                        var cgm = GetAsCgMember(fi, valueTypeOnly, cgType.EnumValueDictionary);

                        if (cgm == null)
                            continue;
                        cgType.Fields.Add(cgm);
                    }
                }
                catch (Exception ex)
                {
                    Asm.AddLoaderExceptionToLog(null, ex);
                    if (!Settings.IgnoreReflectionMissingAsmError)
                        throw;

                    cgType.Fields.Add(new CgMember
                    {
                        Name = mi.Name,
                        TypeName = DF_TYPE_NAME,
                        SkipIt = true
                    });
                }
                try
                {
                    if (!valueTypeOnly && mi.MemberType == MemberTypes.Method)
                    {
                        var mti = mi as MethodInfo;
                        var cgm = GetAsCgMember(mti, resolveDependencies);

                        if (cgm == null)
                            continue;
                        cgm.IsInterfaceImpl = IsInterfaceImpl(mti, cgTypesInterfaces);
                        cgType.Methods.Add(cgm);
                    }

                    if (!valueTypeOnly && mi.MemberType == MemberTypes.Constructor)
                    {
                        var ci = mi as ConstructorInfo;
                        var tn = (string.IsNullOrWhiteSpace(cgTypeName.Namespace)
                            ? cgTypeName.ClassName
                            : $"{cgTypeName.Namespace}.{cgTypeName.ClassName}");

                        var cgm = GetAsCgMember(ci, tn, resolveDependencies);

                        if (cgm == null)
                            continue;
                        cgType.Methods.Add(cgm);
                    }

                }
                catch (Exception ex)
                {
                    Asm.AddLoaderExceptionToLog(null, ex);
                    if (!Settings.IgnoreReflectionMissingAsmError)
                        throw;

                    cgType.Methods.Add(new CgMember
                    {
                        Name = mi.Name,
                        TypeName = DF_TYPE_NAME,
                        SkipIt = true
                    });
                }
            }

            if (resolveDependencies)
            {
                ResolveAllMetadataTokens(cgType, asmType.Assembly.ManifestModule);
            }

            return cgType;
        }
示例#32
0
        public void TestAsInvokeRegexPattern02()
        {
            var testSubject = new CgMember()
            {
                Name = "ToString",
                TypeName = "System.String",
                IsMethod = true
            };

            var testResult = testSubject.AsInvokeRegexPattern();

            var testCompare =
                "command.Parameters.Add(new SqlParameter(\"@createUser\", Convert.ToString(Session[SessionContants.LoggedInEntityId])));";
            Assert.IsFalse(System.Text.RegularExpressions.Regex.IsMatch(testCompare, testResult));
            System.Diagnostics.Debug.WriteLine(testResult);

            testCompare = "somethingElse.InvokeMe(4,true,\"sd\");var mysomething=ToString()";
            Assert.IsTrue(System.Text.RegularExpressions.Regex.IsMatch(testCompare, testResult));
        }
示例#33
0
文件: Etc.cs 项目: nofuture-git/31g
        /// <summary>
        /// Resolves all MetadataTokens present in <see cref="cgm"/> using the <see cref="manifestModule"/>
        /// </summary>
        /// <param name="cgm"></param>
        /// <param name="manifestModule"></param>
        /// <param name="memberInfoCache">
        /// Optional cache dictionary for use when this is being called within a loop, helps performance.
        /// </param>
        /// <param name="ignoreAssemblyFullNames">
        /// Optional list of fully-qualified assembly names whose members should NOT be added (e.g. mscorlib).
        /// </param>
        /// <param name="maxErrors">The max number of exceptions to be incurred before abandoning.</param>
        /// <returns>Count of errors encountered, will range from 0 to <see cref="maxErrors"/></returns>
        public static int ResolveCgMemberMetadataTokens(CgMember cgm, Module manifestModule,
            Dictionary<int, MemberInfo> memberInfoCache, string[] ignoreAssemblyFullNames, int maxErrors = 5)
        {
            if (cgm == null)
                return maxErrors;
            if (manifestModule == null)
                return maxErrors;

            var errorCount = 0;
            //for each method, get all invoked metadata tokens
            foreach (var metadataToken in cgm.opCodeCallsAndCallvirtsMetadatTokens)
            {
                try
                {
                    MemberInfo runtimeMem = null;
                    //resolve invoked metadata token to a member type
                    if (memberInfoCache != null && memberInfoCache.ContainsKey(metadataToken))
                    {
                        runtimeMem = memberInfoCache[metadataToken];
                    }
                    else
                    {
                        runtimeMem = manifestModule.ResolveMember(metadataToken);
                    }
                    if (runtimeMem == null)
                        continue;
                    var declaringType = runtimeMem.DeclaringType;
                    var declaringTypeAsmName = declaringType?.AssemblyQualifiedName;

                    if (string.IsNullOrWhiteSpace(declaringTypeAsmName))
                        continue;

                    if (ignoreAssemblyFullNames != null && ignoreAssemblyFullNames.Any(declaringTypeAsmName.EndsWith))
                        continue;

                    //add to cache for performance
                    if (memberInfoCache != null && !memberInfoCache.ContainsKey(metadataToken))
                        memberInfoCache.Add(metadataToken, runtimeMem);

                    var runtimeMi = runtimeMem as MethodInfo;
                    if (runtimeMi != null)
                    {
                        var ncgm = GetAsCgMember(runtimeMi, false);
                        if (ncgm == null)
                            continue;
                        ncgm.MetadataToken = metadataToken;
                        ncgm.DeclaringTypeAsmName = declaringTypeAsmName;

                        cgm.OpCodeCallAndCallvirts.Add(ncgm);
                        continue;
                    }

                    var runtimePi = runtimeMem as PropertyInfo;
                    if (runtimePi != null)
                    {
                        var ncgm = GetAsCgMember(runtimePi, false, null);
                        if (ncgm == null)
                            continue;

                        ncgm.MetadataToken = metadataToken;
                        ncgm.DeclaringTypeAsmName = declaringTypeAsmName;
                        cgm.OpCodeCallAndCallvirts.Add(ncgm);
                        continue;
                    }

                    var runtimeFi = runtimeMem as FieldInfo;
                    if (runtimeFi == null)
                        continue;

                    var fiCgm = GetAsCgMember(runtimeFi, false, null);
                    if (fiCgm == null)
                        continue;
                    fiCgm.MetadataToken = metadataToken;
                    fiCgm.DeclaringTypeAsmName = declaringTypeAsmName;
                    cgm.OpCodeCallAndCallvirts.Add(fiCgm);
                }
                catch
                {
                    errorCount += 1;
                    if (errorCount > maxErrors)
                        break;
                }
            }
            return errorCount;
        }
示例#34
0
        public void TestToCsStmt()
        {
            var testSubject = new CgMember()
            {
                Args =
                    new List<CgArg>
                    {
                        new CgArg {ArgName = "param1", ArgType = "int"},
                        new CgArg {ArgName = "param2", ArgType = "string"},
                        new CgArg {ArgName = "param3", ArgType = "bool"}
                    },
                Name = "MyMethodName",
                TypeName = "System.String"
            };
            var testResult = NoFuture.Gen.Settings.LangStyle.ToStmt(testSubject, "MyNamespace.Here", "MyTypeName");
            System.Diagnostics.Debug.WriteLine(testResult);
            Assert.IsNotNull(testResult);
            Assert.AreNotEqual(string.Empty, testResult);
            Assert.IsTrue(testResult.StartsWith("return"));

            testSubject.TypeName = "void";
            testResult = NoFuture.Gen.Settings.LangStyle.ToStmt(testSubject, "MyNamespace.Here", "MyTypeName");
            System.Diagnostics.Debug.WriteLine(testResult);

            Assert.IsTrue(testResult.StartsWith("MyNamespace"));

            testSubject.TypeName = "MyNamespace.Here.MyTypeName";
            testSubject.Name = ".ctor";
            testSubject.IsCtor = true;
            testResult = NoFuture.Gen.Settings.LangStyle.ToStmt(testSubject, null, null);
            Assert.IsNotNull(testResult);
            Assert.AreEqual("new MyNamespace.Here.MyTypeName(param1,param2,param3);", testResult);
            System.Diagnostics.Debug.WriteLine(testResult);
        }
示例#35
0
        public void TestToSignatureRegex()
        {
            var testCgMember = new CgMember() {Name = "PopulateDdlForSomething"};
            testCgMember.Args.Add(new CgArg(){ArgName = "ddl", ArgType = "DropDownList"});
            testCgMember.Args.Add(new CgArg() { ArgName = "cname", ArgType = "string" });
            testCgMember.IsMethod = true;

            var testInput = Settings.LangStyle.ToSignatureRegex(testCgMember);
            Assert.IsNotNull(testInput);

            Assert.IsTrue(Regex.IsMatch("        public void PopulateDdlForSomething(DropDownList ddl, string strAccountId)", testInput, RegexOptions.IgnoreCase));

            testCgMember = new CgMember() { Name = "GetKeeperMasterDetailsForBizIDsForEmail" };
            testCgMember.Args.Add(new CgArg() { ArgName = "strClinicIDs", ArgType = "string" });
            testCgMember.IsMethod = true;

            testInput = Settings.LangStyle.ToSignatureRegex(testCgMember);
            Assert.IsNotNull(testInput);

            Assert.IsTrue(Regex.IsMatch("        public List<KeeperMaster> GetKeeperMasterDetailsForBizIDsForEmail(string strClinicIDs)", testInput, RegexOptions.IgnoreCase));

            testCgMember = new CgMember() { Name = "AProperty" };
            testCgMember.IsMethod = false;
            testCgMember.HasGetter = true;
            testCgMember.HasGetter = true;
            testCgMember.AccessModifier  = CgAccessModifier.Family;

            testInput = Settings.LangStyle.ToSignatureRegex(testCgMember);
            Assert.IsNotNull(testInput);
            System.Diagnostics.Debug.WriteLine(testInput);

            Assert.IsTrue(Regex.IsMatch("             protected string AProperty",testInput));
        }
示例#36
0
文件: Cs.cs 项目: nofuture-git/31g
        public string ToSignatureRegex(CgMember cgMem)
        {
            var regexPattern = new StringBuilder();

            regexPattern.Append(@"(\b" + TransposeCgAccessModToString(cgMem.AccessModifier) + @"\b)");

            if (cgMem.AccessModifier == CgAccessModifier.Assembly)
                regexPattern.Append("?");

            regexPattern.Append(@"([^\x2c\x3b\x7d\x7b]+?)");

            regexPattern.AppendFormat(@"\b{0}\b", cgMem.Name);
            if (cgMem.IsGeneric)
            {
                //needs to handle crazy shit like 'global::System.Tuple<int, Func<Mynamespace.MyType, global::System.Int64>>'
                regexPattern.Append(@"\x3c.*?\x3e");
            }

            if (!cgMem.IsMethod)
                return regexPattern.ToString();

            if (cgMem.Args.Count <= 0)
            {
                regexPattern.Append(@"\(\s*?\)");
                return regexPattern.ToString();
            }

            var simpleArgTypes =
                cgMem.Args.Select(
                    x =>
                        @"\s*\b" +
                        NfTypeName.GetTypeNameWithoutNamespace(x.ArgType).EscapeString() +
                        @"\b\s*([^\,]+?)").ToList();
            regexPattern.AppendFormat(@"\s*\({0}\)", string.Join(@"\,", simpleArgTypes));

            return regexPattern.ToString();
        }
示例#37
0
文件: Cs.cs 项目: nofuture-git/31g
 public string GetEnclosureOpenToken(CgMember cgMem)
 {
     return(C_OPEN_CURLY.ToString());
 }
示例#38
0
文件: Cs.cs 项目: nofuture-git/31g
        public string ToStmt(CgMember cgMem, string cgNamespace, string cgInvokeOnName)
        {
            var paramNames = string.Format("({0});",
                string.Join(",",
                    cgMem.Args.Select(
                        x => x.ArgType.StartsWith("ref ") ? string.Format("ref {0}", x.ArgName) : x.ArgName)));

            if (cgMem.IsCtor)
                return string.Format("new {0}{1}", cgMem.TypeName, paramNames);

            var stmtBldr = new StringBuilder();
            if (!string.IsNullOrWhiteSpace(cgNamespace))
                stmtBldr.AppendFormat("{0}.", cgNamespace);
            if (!string.IsNullOrWhiteSpace(cgInvokeOnName))
                stmtBldr.AppendFormat("{0}.", cgInvokeOnName);

            stmtBldr.Append(cgMem.Name);
            stmtBldr.Append(paramNames);

            return cgMem.TypeName == "void" ? stmtBldr.ToString() : string.Format("return {0}", stmtBldr);
        }
示例#39
0
文件: Cs.cs 项目: nofuture-git/31g
        public string ToInvokeRegex(CgMember cgMem, params string[] varNames)
        {
            if (string.IsNullOrWhiteSpace(cgMem.Name))
                return ".";

            var regexPattern = new StringBuilder();

            if (cgMem.MyCgType != null && (cgMem.IsEnum || cgMem.IsStatic || cgMem.MyCgType.IsEnum))
            {
                regexPattern.Append(cgMem.MyCgType.RegexPatternName);
            }
            else
            {
                if (varNames.Length > 0)
                {
                    regexPattern.Append("(");
                    regexPattern.Append(string.Join(@"\x2e|",
                        varNames.Select(x => x.EscapeString())));
                    regexPattern.Append(@"\x2e");
                    regexPattern.Append(")");
                }
                else
                {
                    regexPattern.Append(@"((this\x2e)|(?<!\.))");
                }

            }

            regexPattern.AppendFormat(@"\b{0}\b", cgMem.Name);

            if (cgMem.IsGeneric)
            {
                //needs to handle crazy shit like 'global::System.Tuple<int, Func<Mynamespace.MyType, global::System.Int64>>'
                regexPattern.Append(@"\x3c.*?\x3e");
            }

            if (cgMem.MyCgType != null && cgMem.MyCgType.IsEnum && cgMem.MyCgType.EnumValueDictionary.Values.Count > 0)
            {
                regexPattern.Append("(");
                regexPattern.Append(string.Join("|", cgMem.MyCgType.EnumValueDictionary.Values.SelectMany(x => x)));
                regexPattern.Append(")");
            }
            else if (cgMem.Args.Count > 0)
                regexPattern.AppendFormat(@"\s*?\({0}\)", string.Join(@"\,", cgMem.Args.Select(x => x.AsInvokeRegexPattern)));
            else if (cgMem.IsMethod)
                regexPattern.Append(@"\(\s*?\)");

            return regexPattern.ToString();
        }
示例#40
0
文件: Cs.cs 项目: nofuture-git/31g
 public string GetEnclosureCloseToken(CgMember cgMem)
 {
     return(C_CLOSE_CURLY.ToString());
 }
示例#41
0
文件: Cs.cs 项目: nofuture-git/31g
        public CgArg ToParam(CgMember cgMem, bool asFunctionPtr)
        {
            if (!asFunctionPtr)
            {
                var isReadOnlyProp = cgMem.HasGetter && !cgMem.HasSetter;

                var addByRef = (cgMem.TypeName == "string" || cgMem.TypeName == "System.String" ||
                                IsPrimitiveTypeName(cgMem.TypeName)) && !isReadOnlyProp;

                return new CgArg
                {
                    ArgName = cgMem.Name,
                    ArgType = (addByRef ? string.Format("ref {0}", cgMem.TypeName) : cgMem.TypeName)
                };

            }

            if (string.IsNullOrWhiteSpace(cgMem.TypeName) || cgMem.TypeName == "void" || cgMem.TypeName == "System.Void")//as an Action
            {
                if (cgMem.Args.Count <= 0)
                    return new CgArg { ArgName = cgMem.Name, ArgType = "Action" };

                var actBldr = new StringBuilder();
                actBldr.Append("Action<");
                actBldr.Append(string.Join(", ", cgMem.Args.Select(x => x.ArgType)));
                actBldr.Append(">");
                return new CgArg { ArgName = cgMem.Name, ArgType = actBldr.ToString() };
            }

            var funcBldr = new StringBuilder();
            funcBldr.Append("Func<");
            if (cgMem.Args.Count > 0)
            {
                funcBldr.Append(string.Join(", ", cgMem.Args.Select(x => x.ArgType)));
                funcBldr.Append(", ");
            }
            funcBldr.AppendFormat("{0}>", cgMem.TypeName);
            return new CgArg { ArgName = cgMem.Name, ArgType = funcBldr.ToString() };
        }
示例#42
0
        /// <summary>
        /// Test for if <see cref="someMember"/> belongs to this instance.
        /// </summary>
        /// <param name="someMember"></param>
        /// <returns></returns>
        public bool ContainsThisMember(CgMember someMember)
        {
            if (Properties.Any(p => p.Equals(someMember)))
                return true;
            if (Fields.Any(f => f.Equals(someMember)))
                return true;
            if (Events.Any(e => e.Equals(someMember)))
                return true;
            if (Methods.Any(m => m.Equals(someMember)))
                return true;

            return false;
        }