public static Tuple <AstNode, IReadOnlyList <string> > Process(AstNode n) { var v = new ImportVisitor(); n = n.AcceptVisitor(v) ?? n; return(Tuple.Create <AstNode, IReadOnlyList <string> >(n, v._namespaces.ToList())); }
public static IList <JsStatement> Process(IMetadataImporter metadataImporter, INamer namer, ICompilation compilation, IList <JsStatement> statements) { var usedSymbols = UsedSymbolsGatherer.Analyze(statements); var importer = new ImportVisitor(metadataImporter, namer, compilation.MainAssembly, usedSymbols); var body = statements.Select(s => importer.VisitStatement(s, null)).ToList(); var moduleDependencies = importer._moduleAliases.Concat(MetadataUtils.GetAdditionalDependencies(compilation.MainAssembly)); if (MetadataUtils.IsAsyncModule(compilation.MainAssembly)) { body.InsertRange(0, new[] { JsStatement.UseStrict, JsStatement.Var("exports", JsExpression.ObjectLiteral()) }); body.Add(JsStatement.Return(JsExpression.Identifier("exports"))); var pairs = new[] { new KeyValuePair <string, string>("mscorlib", namer.GetVariableName("_", usedSymbols)) } .Concat(moduleDependencies.OrderBy(x => x.Key)) .ToList(); body = new List <JsStatement> { JsExpression.Invocation( JsExpression.Identifier("define"), JsExpression.ArrayLiteral(pairs.Select(p => JsExpression.String(p.Key))), JsExpression.FunctionDefinition( pairs.Select(p => p.Value), JsStatement.Block(body) ) ) }; } else if (moduleDependencies.Any()) { // If we require any module, we require mscorlib. This should work even if we are a leaf module that doesn't include any other module because our parent script will do the mscorlib require for us. body.InsertRange(0, new[] { JsStatement.UseStrict, JsExpression.Invocation(JsExpression.Identifier("require"), JsExpression.String("mscorlib")) } .Concat(moduleDependencies .OrderBy(x => x.Key).OrderBy(x => x.Key) .Select(x => JsStatement.Var( x.Value, JsExpression.Invocation( JsExpression.Identifier("require"), JsExpression.String(x.Key)))) .ToList())); } else { body.Insert(0, JsStatement.UseStrict); body = new List <JsStatement> { JsExpression.Invocation(JsExpression.FunctionDefinition(new string[0], JsStatement.Block(body))) }; } return(body); }
public static string Format(NamespacedEntityDeclaration item) { var imported = ImportVisitor.Process(item.EntityDeclaration); var st = new SyntaxTree(); st.Members.AddRange(imported.Item2.Where(ns => ns != item.Namespace && !item.Namespace.StartsWith(ns + ".")).OrderBy(ns => ns).Select(ns => new UsingDeclaration(ns))); var a = new NamespaceDeclaration(item.Namespace) { Members = { imported.Item1 } }; st.Members.Add(a); return(st.ToString(FormattingOptions)); }
public static IList <JsStatement> Process(IScriptSharpMetadataImporter metadataImporter, INamer namer, IAssembly mainAssembly, IList <JsStatement> statements) { var usedSymbols = UsedSymbolsGatherer.Analyze(statements); var importer = new ImportVisitor(metadataImporter, namer, mainAssembly, usedSymbols); var body = statements.Select(s => importer.VisitStatement(s, null)).ToList(); if (metadataImporter.IsAsyncModule) { body.Insert(0, new JsVariableDeclarationStatement("exports", JsExpression.ObjectLiteral())); body.Add(new JsReturnStatement(JsExpression.Identifier("exports"))); var pairs = new[] { new KeyValuePair <string, string>("mscorlib", namer.GetVariableName("_", usedSymbols)) }.Concat(importer._moduleAliases.OrderBy(x => x.Key)).ToList(); body = new List <JsStatement> { new JsExpressionStatement( JsExpression.Invocation( JsExpression.Identifier("define"), JsExpression.ArrayLiteral(pairs.Select(p => JsExpression.String(p.Key))), JsExpression.FunctionDefinition( pairs.Select(p => p.Value), new JsBlockStatement(body) ) ) ) }; } else if (importer._moduleAliases.Count > 0) { // If we require any module, we require mscorlib. This should work even if we are a leaf module that doesn't include any other module because our parent script will do the mscorlib require for us. body.InsertRange(0, new[] { (JsStatement) new JsExpressionStatement(JsExpression.Invocation(JsExpression.Identifier("require"), JsExpression.String("mscorlib"))) } .Concat(importer._moduleAliases.OrderBy(x => x.Key) .Select(x => new JsVariableDeclarationStatement( x.Value, JsExpression.Invocation( JsExpression.Identifier("require"), JsExpression.String(x.Key)))) .ToList())); } return(body); }
public IList <JsStatement> Process(IList <JsStatement> statements) { return(ImportVisitor.Process(_metadataImporter, _namer, _compilation, statements)); }
public IList <JsStatement> Process(IList <JsStatement> statements, IAssembly mainAssembly) { return(ImportVisitor.Process(_metadataImporter, _namer, mainAssembly, statements)); }
public static IList <JsStatement> Process(IMetadataImporter metadataImporter, INamer namer, IAttributeStore attributeStore, ICompilation compilation, IList <JsStatement> statements) { var locals = LocalVariableGatherer.Analyze(statements); var globals = ImplicitGlobalsGatherer.Analyze(statements, locals, reportGlobalsAsUsedInAllParentScopes: false); var introducedNames = IntroducedNamesGatherer.Analyze(statements, metadataImporter, attributeStore, compilation.MainAssembly); var renameMap = RenameMapBuilder.BuildMap(statements, locals, globals, introducedNames, namer); var usedSymbols = new HashSet <string>(); foreach (var sym in locals.Values.SelectMany(v => v) // Declared locals. .Concat(globals.Values.SelectMany(v => v)) // Implicitly declared globals. .Concat(renameMap.Values.SelectMany(v => v.Values)) // Locals created during preparing rename. .Concat(introducedNames.Values.SelectMany(v => v)) // All global types used. ) { usedSymbols.Add(sym); } statements = IdentifierRenamer.Process(statements, renameMap).ToList(); bool isModule = MetadataUtils.GetModuleName(compilation.MainAssembly, attributeStore) != null || MetadataUtils.IsAsyncModule(compilation.MainAssembly, attributeStore); var importer = new ImportVisitor(metadataImporter, namer, attributeStore, compilation.MainAssembly, usedSymbols, JsExpression.Identifier(isModule ? "exports" : "$asm")); var body = (!isModule ? new[] { JsStatement.Var("$asm", JsExpression.ObjectLiteral()) } : new JsStatement[0]).Concat(statements.Select(s => importer.VisitStatement(s, null))).ToList(); var moduleDependencies = importer._moduleAliases.Concat(MetadataUtils.GetAdditionalDependencies(compilation.MainAssembly, attributeStore)); if (MetadataUtils.IsAsyncModule(compilation.MainAssembly, attributeStore)) { body.InsertRange(0, new[] { JsStatement.UseStrict, JsStatement.Var("exports", JsExpression.ObjectLiteral()) }); body.Add(JsStatement.Return(JsExpression.Identifier("exports"))); var pairs = new[] { new KeyValuePair <string, string>("mscorlib", namer.GetVariableName("_", usedSymbols)) } .Concat(moduleDependencies.OrderBy(x => x.Key)) .ToList(); body = new List <JsStatement> { JsExpression.Invocation( JsExpression.Identifier("define"), JsExpression.ArrayLiteral(pairs.Select(p => JsExpression.String(p.Key))), JsExpression.FunctionDefinition( pairs.Select(p => p.Value), JsStatement.Block(body) ) ) }; } else if (moduleDependencies.Any()) { // If we require any module, we require mscorlib. This should work even if we are a leaf module that doesn't include any other module because our parent script will do the mscorlib require for us. body.InsertRange(0, new[] { JsStatement.UseStrict, JsExpression.Invocation(JsExpression.Identifier("require"), JsExpression.String("mscorlib")) } .Concat(moduleDependencies .OrderBy(x => x.Key).OrderBy(x => x.Key) .Select(x => JsStatement.Var( x.Value, JsExpression.Invocation( JsExpression.Identifier("require"), JsExpression.String(x.Key)))) .ToList())); } else { body.Insert(0, JsStatement.UseStrict); body = new List <JsStatement> { JsExpression.Invocation(JsExpression.FunctionDefinition(new string[0], JsStatement.Block(body))) }; } return(body); }