예제 #1
0
파일: SyntaxTree.cs 프로젝트: sys27/Edge
 public SyntaxTree(IEnumerable<string> namespaces, ObjectNode rootObject, IEnumerable<ObjectNode> objects)
 {
     if (namespaces != null)
         this.namespaces = new HashSet<string>(namespaces);
     this.rootObject = rootObject;
     this.objects = new List<ObjectNode>(objects);
 }
예제 #2
0
파일: EdgeParser.cs 프로젝트: sys27/Edge
        private ReferenceNode Object()
        {
            var token = GetToken();
            if (!(token is TypeToken))
                // todo: error message
                throw new EdgeParserException();

            var type = ((TypeToken)token).Type;
            var id = ObjectId(type);
            objects[id] = null;
            var ctor = CtorArgs();
            var properties = Properties();

            var obj = new ObjectNode(type, id, ctor, properties);
            objects[id] = obj;

            return new ReferenceNode(id, type);
        }
예제 #3
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);
 }
예제 #4
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();
        }
예제 #5
0
파일: SyntaxTree.cs 프로젝트: sys27/Edge
 public void AddObject(ObjectNode node)
 {
     objects.Add(node);
 }
예제 #6
0
파일: SyntaxTree.cs 프로젝트: sys27/Edge
 public SyntaxTree(ObjectNode rootObject, IEnumerable<ObjectNode> objects)
     : this(null, rootObject, objects)
 {
 }
예제 #7
0
파일: SyntaxTree.cs 프로젝트: sys27/Edge
 public void RemoveObject(ObjectNode node)
 {
     objects.Remove(node);
 }
예제 #8
0
 public void RemoveObject(ObjectNode node)
 {
     objects.Remove(node);
 }
예제 #9
0
 public void AddObject(ObjectNode node)
 {
     objects.Add(node);
 }
예제 #10
0
 public SyntaxTree(ObjectNode rootObject, IEnumerable <ObjectNode> objects)
     : this(null, rootObject, objects)
 {
 }
예제 #11
0
파일: CSharpBuilder.cs 프로젝트: sys27/Edge
        private string CreateConstructor(ObjectNode node)
        {
            if (node.ConstructorArguments == null)
                return $"new {node.Type}()";

            return $"new {node.Type}({string.Join("m", node.ConstructorArguments.Select(CreateValue))})";
        }