コード例 #1
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void CheckWrongNamespaceTest()
        {
            var root = new RootObjectNode("Window");
            var st = new SyntaxTree(new List<string> { "System.Windows.Forms" }, root, new List<ObjectNode> { root });

            analyzer.Analyze(st);
        }
コード例 #2
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void CheckTypeTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>
                {
                    new RootObjectNode("ArrayList")
                });

            analyzer.Analyze(st);
        }
コード例 #3
0
ファイル: CSharpBuilder.cs プロジェクト: sys27/Edge
        public string Build(SyntaxTree tree, string @class, string @namespace)
        {
            var result = string.Empty;

            if (tree.Namespaces != null)
                result = CreateNamespaces(tree.Namespaces) + nl;

            result += CreateRootObject(tree, @class, @namespace);

            return result;
        }
コード例 #4
0
ファイル: EdgeAnalyzer.cs プロジェクト: sys27/Edge
        public void Analyze(SyntaxTree tree)
        {
            if (tree.Namespaces != null)
            {
                CheckNamespaces(tree.Namespaces.Concat(namespaces).Distinct());
            }
            else
            {
                tree.Namespaces = namespaces;
                CheckNamespaces(tree.Namespaces);
            }
            CheckObjects(tree);

            tree.Objects = tree.Objects.TSort(obj => GetDependencies(tree.Objects, obj.ConstructorArguments));
        }
コード例 #5
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void SamePropsTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Window", null, new List<PropertyNode>() { new PropertyNode("Width", new NumberNode(1)), new PropertyNode("Width", new NumberNode(1)) })
                });

            analyzer.Analyze(st);
        }
コード例 #6
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void ZeroObjectsTest()
        {
            var st = new SyntaxTree(null, new List<ObjectNode>());

            analyzer.Analyze(st);
        }
コード例 #7
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void PropRefTypeTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new ObjectNode("Uri", "uri", new List<IValueNode>() { new StringNode("ico.ico") }),
                    new RootObjectNode("Window", null, new List<PropertyNode>() { new PropertyNode("Content", new ReferenceNode("uri", "Uri")) })
                });

            analyzer.Analyze(st);
        }
コード例 #8
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void PropStrTypeTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Window", null, new List<PropertyNode>() { new PropertyNode("Title", new StringNode("Hello")) })
                });

            analyzer.Analyze(st);
        }
コード例 #9
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void CtorWrongCountOfArgs2Test()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Uri")
                });

            analyzer.Analyze(st);
        }
コード例 #10
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void PropNotFoundTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Window", null, new List<PropertyNode>() { new PropertyNode("hello", new StringNode("hello")) })
                });

            analyzer.Analyze(st);
        }
コード例 #11
0
ファイル: EdgeAnalyzer.cs プロジェクト: sys27/Edge
        private void CheckCtor(SyntaxTree tree, Type objType, ObjectNode objNode)
        {
            ConstructorInfo ctor;
            List<IValueNode> args = null;
            if (objNode.ConstructorArguments != null)
                args = objNode.ConstructorArguments.ToList();

            if (objNode.ConstructorArguments == null || args.Count == 0)
            {
                ctor = objType.GetConstructor(Type.EmptyTypes);
                if (ctor != null)
                    return;
            }
            else
            {
                var types = new Type[args.Count];

                var strType = typeof(string);
                var doubleType = typeof(double);

                for (int i = 0; i < types.Length; i++)
                {
                    var t = args[0];

                    var refType = t as ReferenceNode;
                    if (refType != null)
                    {
                        types[i] = CheckType(refType.Type);
                    }
                    else if (t is StringNode)
                    {
                        types[i] = strType;
                    }
                    else if (t is NumberNode)
                    {
                        types[i] = doubleType;
                    }
                    else if (t is EnumNode)
                    {
                        types[i] = CheckType(((EnumNode)t).Type);
                    }
                    else
                    {
                        // todo: error message
                        throw new EdgeParserException();
                    }
                }

                ctor = objType.GetConstructor(types);
                if (ctor != null)
                    return;

                // ctor type inference
                // todo: refactor!!!
                var avaliableCtors = objType.GetConstructors()
                                            .Select(t => t.GetParameters())
                                            .Where(t => t.Length == types.Length)
                                            .ToArray();
                var uriType = typeof(Uri);

                for (int i = 0; i < avaliableCtors.Length && ctor == null; i++)
                {
                    var currentCtor = avaliableCtors[i];

                    for (int j = 0; j < currentCtor.Length && ctor == null; j++)
                    {
                        if (currentCtor[j].ParameterType == uriType && types[j] == strType)
                        {
                            types[j] = uriType;

                            // id
                            var urlStrType = char.ToLowerInvariant(uriType.Name[0]) + uriType.Name.Substring(1);
                            string id = null;
                            for (int k = 1; k < int.MaxValue; k++)
                            {
                                id = urlStrType + k;
                                if (!tree.Objects.Any(obj => obj.Id == id))
                                    break;
                            }
                            if (id == null)
                                // todo: message
                                throw new EdgeAnalyzerException();

                            tree.AddObject(new ObjectNode(uriType.Name, id, new[] { args[j] }));
                            args[j] = new ReferenceNode(id, uriType.Name);

                            ctor = objType.GetConstructor(types);
                        }
                    }
                }

                // todo: fix
                if (ctor != null)
                {
                    objNode.ConstructorArguments = args;

                    return;
                }
            }

            // todo: error message
            throw new EdgeAnalyzerException();
        }
コード例 #12
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void CtorWrongTypesTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Uri", new List<IValueNode>() { new NumberNode(1) })
                });

            analyzer.Analyze(st);
        }
コード例 #13
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void ObjectWithTwoRoot()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Window"),
                    new RootObjectNode("Window")
                });

            analyzer.Analyze(st);
        }
コード例 #14
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void CtorTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>
                {
                    new RootObjectNode("Uri", new List<IValueNode>() { new StringNode("icon.ico") })
                });

            analyzer.Analyze(st);
        }
コード例 #15
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void ObjectWithoutRoot()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>
                {
                    new ObjectNode("Window", "hello")
                });

            analyzer.Analyze(st);
        }
コード例 #16
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void ObjectsWithSameId()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new ObjectNode("Window", "w1"),
                    new ObjectNode("Window", "w1")
                });

            analyzer.Analyze(st);
        }
コード例 #17
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void NullNamespacesTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Window")
                });

            analyzer.Analyze(st);
        }
コード例 #18
0
ファイル: EdgeParserTest.cs プロジェクト: sys27/Edge
        private void Test(IEnumerable<IToken> tokens, SyntaxTree expected)
        {
            lexer.Tokens = tokens;

            var tree = parser.Parse("-- // --");

            Assert.AreEqual(expected, tree);
        }
コード例 #19
0
ファイル: EdgeAnalyzer.cs プロジェクト: sys27/Edge
        private void CheckObjects(SyntaxTree tree)
        {
            var objs = tree.Objects.ToList();

            if (objs.Count == 0)
                // todo: error message
                throw new ArgumentException();

            if (objs.Count(obj => obj is RootObjectNode) != 1)
                // todo: error message
                throw new EdgeAnalyzerException();

            ChechAllIDs(objs);

            foreach (var obj in objs)
                CheckObject(tree, obj);
        }
コード例 #20
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void PropEnumTypeTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Window", null, new List<PropertyNode>() { new PropertyNode("WindowState", new EnumNode("WindowState", "Normal")) })
                });

            analyzer.Analyze(st);
        }
コード例 #21
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void CtorWrongCountOfArgsTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Int32", new List<IValueNode>() { new StringNode("icon.ico"), new StringNode("hello") })
                });

            analyzer.Analyze(st);
        }
コード例 #22
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void CtorTypeInferenceTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>
                {
                    new RootObjectNode("BitmapImage", new List<IValueNode>() { new StringNode("icon.ico") })
                });

            analyzer.Analyze(st);
        }
コード例 #23
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void PropIsNotArrayTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Window",
                        new List<PropertyNode>()
                        {
                            new PropertyNode("Title",
                                new ArrayNode("TextBox",
                                    new IValueNode[]
                                    {
                                        new ReferenceNode("tb1", "TextBox"),
                                        new ReferenceNode("tb2", "TextBox")
                                    }))
                        }),
                    new ObjectNode("TextBox", "tb1"),
                    new ObjectNode("TextBox", "tb2")
                });

            analyzer.Analyze(st);
        }
コード例 #24
0
ファイル: EdgeAnalyzer.cs プロジェクト: sys27/Edge
 private void CheckObject(SyntaxTree tree, ObjectNode obj)
 {
     var type = CheckType(obj.Type);
     CheckCtor(tree, type, obj);
     CheckProperties(type, obj.Properties);
 }
コード例 #25
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void PropIsNotEnumValueTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Window", null, new List<PropertyNode>() { new PropertyNode("WindowState", new EnumNode("WindowState", "Hello")) })
                });

            analyzer.Analyze(st);
        }
コード例 #26
0
ファイル: EdgeAnalyzerTest.cs プロジェクト: sys27/Edge
        public void PropIsNotNumberTypeTest()
        {
            var st = new SyntaxTree(null,
                new List<ObjectNode>()
                {
                    new RootObjectNode("Window", null, new List<PropertyNode>() { new PropertyNode("Title", new NumberNode(1024)) })
                });

            analyzer.Analyze(st);
        }
コード例 #27
0
ファイル: CSharpBuilder.cs プロジェクト: sys27/Edge
        private string CreateRootObject(SyntaxTree tree, string @class, string @namespace)
        {
            var sb = new StringBuilder();

            sb.AppendFormat("namespace {0}", @namespace).Append(nl)
              .Append('{').Append(nl).Append(nl)
              .AppendFormat("public partial class {0} : {1}", @class, tree.RootObject.Type).Append(nl)
              .Append('{').Append(nl).Append(nl);

            if (tree != null)
                sb.Append(CreateMembers(tree.Objects)).Append(nl);

            sb.Append(CreateInitMethod(tree.Objects));

            sb.Append('}').Append(nl).Append(nl)
              .Append('}');

            return sb.ToString();
        }