Example #1
0
        private string XlatModule(string pyModule)
        {
            var rdr   = new StringReader(pyModule);
            var lex   = new Lexer("foo.py", rdr);
            var flt   = new CommentFilter(lex);
            var par   = new Parser("foo.py", flt);
            var stm   = par.stmt();
            var unt   = new CodeCompileUnit();
            var gen   = new CodeGenerator(unt, "test", "testModule");
            var types = new TypeReferenceTranslator(new Dictionary <Node, DataType>());
            var xlt   = new StatementTranslator(types, gen, new SymbolGenerator(), new HashSet <string>());

            stm[0].Accept(xlt);
            var pvd    = new CSharpCodeProvider();
            var writer = new StringWriter();

            foreach (CodeNamespace ns in unt.Namespaces)
            {
                foreach (CodeNamespaceImport imp in ns.Imports)
                {
                    writer.WriteLine("using {0};", SanitizeNamespace(imp.Namespace, gen));
                }
                foreach (CodeTypeDeclaration type in ns.Types)
                {
                    pvd.GenerateCodeFromType(
                        type,
                        writer,
                        new CodeGeneratorOptions
                    {
                    });
                }
            }
            return(writer.ToString());
        }
Example #2
0
        private string XlatStmts(string pyStmt)
        {
            var rdr = new StringReader(pyStmt);
            var lex = new Lexer("foo.py", rdr);
            var flt = new CommentFilter(lex);
            var par = new Parser("foo.py", flt);
            var stm = par.stmt();
            var gen = new CodeGenerator(new CodeCompileUnit(), "", "module");

            gen.SetCurrentMethod(new CodeMemberMethod());
            var types = new TypeReferenceTranslator(new Dictionary <Node, DataType>());
            var xlt   = new StatementTranslator(types, gen, new SymbolGenerator(), new HashSet <string>());

            stm[0].Accept(xlt);
            var pvd    = new CSharpCodeProvider();
            var writer = new StringWriter();

            foreach (CodeStatement csStmt in gen.Scope)
            {
                pvd.GenerateCodeFromStatement(
                    csStmt,
                    writer,
                    new CodeGeneratorOptions
                {
                });
            }
            return(writer.ToString());
        }
Example #3
0
        private string XlatMember(string pyModule)
        {
            var rdr   = new StringReader(pyModule);
            var lex   = new Lexer("foo.py", rdr);
            var par   = new Parser("foo.py", lex);
            var stm   = par.stmt();
            var unt   = new CodeCompileUnit();
            var gen   = new CodeGenerator(unt, "test", "testModule");
            var types = new TypeReferenceTranslator(new Dictionary <Node, DataType>());
            var xlt   = new StatementTranslator(types, gen, new SymbolGenerator(), new HashSet <string>());

            stm[0].Accept(xlt);
            var pvd    = new CSharpCodeProvider();
            var writer = new StringWriter();

            foreach (CodeNamespace ns in unt.Namespaces)
            {
                foreach (var member in ns.Types[0].Members)
                {
                    pvd.GenerateCodeFromMember(
                        member, writer,
                        new CodeGeneratorOptions
                    {
                    });
                    writer.WriteLine();
                }
            }
            return(writer.ToString());
        }
        public void Match_GivenNullSpan_ReturnsFalse()
        {
            var sut = new StatementTranslator();

            var result = sut.Match(null);

            Assert.IsFalse(result);
        }
        public void Translate_CallsMatchOnCodeSpanTranslator()
        {
            var span = SpanHelper.BuildSpan("a");
            var sut  = new StatementTranslator(this._codeSpanTranslator.Object);

            sut.Translate(span, this._templateBuilder.Object);

            this._codeSpanTranslator.Verify(c => c.Match(span));
        }
        public void Translate_FoundMatchingCodeSpanTranslator_CallsTranslater()
        {
            this._codeSpanTranslator.Setup(c => c.Match(It.IsAny <Span>())).Returns(true);

            var span = SpanHelper.BuildSpan("a");
            var sut  = new StatementTranslator(this._codeSpanTranslator.Object);

            sut.Translate(span, this._templateBuilder.Object);

            this._codeSpanTranslator.Verify(c => c.Translate(span.Content, this._templateBuilder.Object));
        }
        public void Translate_GivenCodeWithLineBreaks_CleanLineBreaksWhenHandingToTranslator()
        {
            this._codeSpanTranslator.Setup(c => c.Match(It.IsAny <Span>())).Returns(true);

            var span = SpanHelper.BuildSpan("a\r\nb");
            var sut  = new StatementTranslator(this._codeSpanTranslator.Object);

            sut.Translate(span, this._templateBuilder.Object);

            this._codeSpanTranslator.Verify(c => c.Translate("ab", It.IsAny <ITemplateBuilder>()));
        }
        public void Translate_NoMatchingCodeSpanTranslator_DoNotCallTranslater()
        {
            this._codeSpanTranslator.Setup(c => c.Match(It.IsAny <Span>())).Returns(false);

            var span = SpanHelper.BuildSpan("a");
            var sut  = new StatementTranslator(this._codeSpanTranslator.Object);

            sut.Translate(span, this._templateBuilder.Object);

            this._codeSpanTranslator.Verify(c => c.Translate(It.IsAny <string>(), It.IsAny <ITemplateBuilder>()), Times.Never());
        }
        public void Match_GivenMarkupCodeGeneratorSpan_ReturnsTrue()
        {
            var span = new Span(new SpanBuilder()
            {
                CodeGenerator = new MarkupCodeGenerator()
            });

            var sut = new StatementTranslator();

            var result = sut.Match(span);

            Assert.IsFalse(result);
        }
        public void Translate_MultipleMatchingCodeSpanTranslator_CallsFirstTranslater()
        {
            Mock <ICodeSpanTranslator> secondTranslator = new Mock <ICodeSpanTranslator>();

            secondTranslator.Setup(c => c.Match(It.IsAny <Span>())).Returns(true);
            this._codeSpanTranslator.Setup(c => c.Match(It.IsAny <Span>())).Returns(true);

            var span = SpanHelper.BuildSpan("a");
            var sut  = new StatementTranslator(this._codeSpanTranslator.Object, secondTranslator.Object);

            sut.Translate(span, this._templateBuilder.Object);

            this._codeSpanTranslator.Verify(c => c.Translate(span.Content, this._templateBuilder.Object));
            secondTranslator.Verify(c => c.Translate(It.IsAny <string>(), It.IsAny <ITemplateBuilder>()), Times.Never());
        }
        public void Translate_GivenNullTemplateBuilder_ThrowsArgumentNullException()
        {
            var sut = new StatementTranslator();

            sut.Translate(new Span(new SpanBuilder()), null);
        }
        public void Translate_GivenNullSpan_ThrowsArgumentNullException()
        {
            var sut = new StatementTranslator();

            sut.Translate(null, this._templateBuilder.Object);
        }
        /// <summary>
        /// This Translate signature is what the others call into - it doesn't try to hide the fact that externalDependencies should be a NonNullImmutableList
        /// of strings and it requires an ILogInformation implementation to deal with logging warnings
        /// </summary>
        public static NonNullImmutableList <TranslatedStatement> Translate(
            string scriptContent,
            NonNullImmutableList <string> externalDependencies,
            OuterScopeBlockTranslator.OutputTypeOptions outputType,
            ILogInformation logger)
        {
            if (scriptContent == null)
            {
                throw new ArgumentNullException("scriptContent");
            }
            if (externalDependencies == null)
            {
                throw new ArgumentNullException("externalDependencies");
            }
            if ((outputType != OuterScopeBlockTranslator.OutputTypeOptions.Executable) && (outputType != OuterScopeBlockTranslator.OutputTypeOptions.WithoutScaffolding))
            {
                throw new ArgumentOutOfRangeException("outputType");
            }
            if (logger == null)
            {
                throw new ArgumentNullException("logger");
            }

            var startNamespace  = new CSharpName("TranslatedProgram");
            var startClassName  = new CSharpName("Runner");
            var startMethodName = new CSharpName("Go");
            var runtimeDateLiteralValidatorClassName = new CSharpName("RuntimeDateLiteralValidator");
            var supportRefName = new CSharpName("_");
            var envClassName   = new CSharpName("EnvironmentReferences");
            var envRefName     = new CSharpName("_env");
            var outerClassName = new CSharpName("GlobalReferences");
            var outerRefName   = new CSharpName("_outer");
            VBScriptNameRewriter nameRewriter        = name => new CSharpName(DefaultRuntimeSupportClassFactory.DefaultNameRewriter(name.Content));
            var tempNameGeneratorNextNumber          = 0;
            TempValueNameGenerator tempNameGenerator = (optionalPrefix, scopeAccessInformation) =>
            {
                // To get unique names for any given translation, a running counter is maintained and appended to the end of the generated
                // name. This is only run during translation (this code is not used during execution) so there will be a finite number of
                // times that this is called (so there should be no need to worry about the int value overflowing!)
                return(new CSharpName(((optionalPrefix == null) ? "temp" : optionalPrefix.Name) + (++tempNameGeneratorNextNumber).ToString()));
            };
            var statementTranslator = new StatementTranslator(supportRefName, envRefName, outerRefName, nameRewriter, tempNameGenerator, logger);
            var codeBlockTranslator = new OuterScopeBlockTranslator(
                startNamespace,
                startClassName,
                startMethodName,
                runtimeDateLiteralValidatorClassName,
                supportRefName,
                envClassName,
                envRefName,
                outerClassName,
                outerRefName,
                nameRewriter,
                tempNameGenerator,
                statementTranslator,
                new ValueSettingStatementsTranslator(supportRefName, envRefName, outerRefName, nameRewriter, statementTranslator, logger),
                externalDependencies.Select(name => new NameToken(name, 0)).ToNonNullImmutableList(),
                outputType,
                logger
                );

            return(codeBlockTranslator.Translate(
                       Parse(scriptContent).ToNonNullImmutableList()
                       ));
        }