예제 #1
0
파일: Import.cs 프로젝트: alexphaus/jsc
 static ExpTree.NamespaceI GetNamespace(string ns)
 {
     if (namespaces.TryGetValue(ns, out var namespaceI))
     {
         return(namespaceI);
     }
     else
     {
         string[] spaces = ns.Split('.');
         namespaceI = new ExpTree.NamespaceI {
             fields = new Dictionary <string, ExpTree.Exp>(), name = ns
         };
         if (spaces.Length == 1)
         {
             globals.Add(ns, namespaceI);
         }
         else
         {
             var ant = GetNamespace(ns.Substring(0, ns.LastIndexOf('.')));
             ant.fields.Add(spaces[spaces.Length - 1], namespaceI);
         }
         namespaces.Add(ns, namespaceI);
         return(namespaceI);
     }
 }
예제 #2
0
파일: Import.cs 프로젝트: alexphaus/jsc
        public static void Import(string fileName)
        {
            if (fileName.EndsWith(".js", StringComparison.Ordinal))
            {
                var lcp = locals;
                locals = new Scope();

                var tk = Tokenize(System.IO.File.ReadAllText(fileName));
                var bl = ParseBlock(tk, false);
                bl.SetVariables();
                bl.loc = new dynamic[bl.lcsize];
                bl.Exec();

                lcp.Last.previous = locals;
                locals            = lcp;
            }
            else if (fileName.EndsWith(".dll", StringComparison.Ordinal))
            {
                foreach (Type t in System.Reflection.Assembly.LoadFrom(fileName).GetExportedTypes())
                {
                    ExpTree.NamespaceI namespaceI = GetNamespace(t.Namespace);
                    if (t.Name.Contains("`"))
                    {
                        string[] split          = t.Name.Split('`');
                        string   name           = split[0];
                        int      typeArgsLength = int.Parse(split[1]);
                        if (namespaceI.fields.TryGetValue(name, out ExpTree.Exp exp))
                        {
                            ExpTree.TypeI typeI = (ExpTree.TypeI)exp;
                            if (typeI.genericTypes is null)
                            {
                                typeI.genericTypes = new Dictionary <int, Type>();
                            }
                            typeI.genericTypes.Add(typeArgsLength, t);
                        }
                        else
                        {
                            namespaceI.fields.Add(name, new ExpTree.TypeI {
                                genericTypes = new Dictionary <int, Type> {
                                    { typeArgsLength, t }
                                }
                            });
                        }
                    }
                    else
                    {
                        if (namespaceI.fields.TryGetValue(t.Name, out ExpTree.Exp exp))
                        {
                            var typeI = (ExpTree.TypeI)exp;
                            typeI.type = t;
                        }
                        else
                        {
                            namespaceI.fields.Add(t.Name, new ExpTree.TypeI {
                                type = t
                            });
                        }
                    }
                }
            }
            else
            {
                throw new Exception("Only packages with extension '.js' or '.dll' can be imported");
            }
            //string src = System.IO.File.ReadAllText(fileName + ".js");
            //var lang = new jsc(src);
            //lang.Run();
        }