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); } }
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(); }