Example #1
0
        public static Tuple <string, IEnumerable <HandlebarsException> > Compile(string content, string @namespace, string name, Project containingProject)
        {
            var parser   = new HbsParser();
            var template = parser.Parse(content);

            template.Namespace = @namespace;
            template.Name      = name;
            if (!(template.ParseErrors?.Any() ?? false))
            {//No parser errors
                var codeGenerator = new CodeGenerationVisitor(new RoslynIntrospector(containingProject), template);
                if (!codeGenerator.ErrorList.Any())
                {//No code generator initialization errors
                    return(new Tuple <string, IEnumerable <HandlebarsException> >(
                               codeGenerator.GenerateCode().NormalizeWhitespace(indentation: "  ").ToFullString(), codeGenerator.ErrorList));
                }
                return(new Tuple <string, IEnumerable <HandlebarsException> >(string.Empty, codeGenerator.ErrorList));
            }
            return(new Tuple <string, IEnumerable <HandlebarsException> >(string.Empty, template.ParseErrors));
        }
Example #2
0
        // have entered the body the header should have finished being
        // parsed and currentNode ready all we do is set up a body visitor
        // and tell it to run through all the statements it handles
        // everything from that point onwards
        public override void EnterBody(YarnSpinnerParser.BodyContext context)
        {
            // if it is a regular node
            if (!RawTextNode)
            {
                // This is the start of a node that we can jump to. Add a
                // label at this point.
                CurrentNode.Labels.Add(RegisterLabel(), CurrentNode.Instructions.Count);

                CodeGenerationVisitor visitor = new CodeGenerationVisitor(this);

                foreach (var statement in context.statement())
                {
                    visitor.Visit(statement);
                }
            }
            // We are a rawText node. Don't compile it; instead, note the string
            else
            {
                CurrentNode.SourceTextStringID = Compiler.GetLineIDForNodeName(CurrentNode.Name);
            }
        }
Example #3
0
        public void Test_Program(string program)
        {
            StreamReader FakeReader = CreateFakeReader(program, Encoding.UTF8);
            Tokeniser    tokeniser  = new Tokeniser(FakeReader);

            tokeniser.GenerateTokens();
            List <ScannerToken> tokens = tokeniser.Tokens.ToList();

            Parser.Parser parser = new Parser.Parser(tokens);
            parser.Parse(out nowhere);
            if (Parser.Parser.HasError)
            {
                Assert.Fail();
            }
            parser.Root.Accept(new TypeChecker(new List <string>()
            {
                "3", "5", "6", "9", "10", "11"
            }));
            CodeGenerationVisitor codeGenerationVisitor = new CodeGenerationVisitor("Codegen_output.cpp", new List <string>());

            parser.Root.Accept(codeGenerationVisitor);
        }
        public void Test_CodeGenVisitor_pin_fail()
        {
            StreamReader FakeReader = CreateFakeReader(pin_fail, Encoding.UTF8);
            Tokeniser    tokeniser  = new Tokeniser(FakeReader);

            tokeniser.GenerateTokens();
            List <ScannerToken> tokens = tokeniser.Tokens.ToList();

            Parser.Parser parser = new Parser.Parser(tokens);
            parser.Parse(out dbg);
            if (Parser.Parser.HasError)
            {
                Assert.Fail("The parser encountered an error\n\n" + dbg);
            }
            parser.Root.Accept(new TypeChecker(new List <string>()
            {
                "3", "5", "6", "9", "10", "11"
            }));
            Assert.IsFalse(TypeChecker.HasError, "Typechecker visitor encountered an error");
            CodeGenerationVisitor codeGenerationVisitor = new CodeGenerationVisitor("Codegen_output.cpp", new List <string>());

            parser.Root.Accept(codeGenerationVisitor);
            Assert.IsTrue(CodeGenerationVisitor.HasError, "Code gen visitor encountered an error");
        }
Example #5
0
        public virtual string Generate(Window window)
        {
            window.ReInitialize(InitializeOption.WithCache);
            var stringBuilder = new StringBuilder();
            var stringWriter  = new StringWriter(stringBuilder);

            var            cscProvider          = new CSharpCodeProvider();
            ICodeGenerator codeGenerator        = cscProvider.CreateGenerator(stringWriter);
            var            codeGeneratorOptions = new CodeGeneratorOptions {
                BlankLinesBetweenMembers = false, VerbatimOrder = false
            };

            codeGenerator.GenerateCodeFromCompileUnit(new CodeSnippetCompileUnit(string.Format("using {0};", typeof(UIItem).Namespace)), stringWriter, codeGeneratorOptions);
            codeGenerator.GenerateCodeFromCompileUnit(new CodeSnippetCompileUnit(string.Format("using {0};", typeof(Window).Namespace)), stringWriter, codeGeneratorOptions);
            codeGenerator.GenerateCodeFromCompileUnit(new CodeSnippetCompileUnit(string.Format("using {0};", typeof(AppScreen).Namespace)), stringWriter, codeGeneratorOptions);

            CodeNamespace codeNamespace = null;

            if (S.IsNotEmpty(options.Namespace))
            {
                codeNamespace = new CodeNamespace(options.Namespace);
            }

            var classDefinition = new CodeTypeDeclaration
            {
                IsClass        = true,
                IsPartial      = true,
                Name           = window.Title.Trim().Replace(" ", string.Empty),
                TypeAttributes = TypeAttributes.Public
            };

            classDefinition.BaseTypes.Add(typeof(AppScreen));

            var constructor = new CodeConstructor {
                Attributes = MemberAttributes.Family
            };

            classDefinition.Members.Add(constructor);

            constructor = new CodeConstructor {
                Attributes = MemberAttributes.Public
            };
            constructor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(Window), "window"));
            constructor.Parameters.Add(new CodeParameterDeclarationExpression(typeof(ScreenRepository), "screenRepository"));
            constructor.BaseConstructorArgs.Add(new CodeVariableReferenceExpression("window"));
            constructor.BaseConstructorArgs.Add(new CodeVariableReferenceExpression("screenRepository"));
            classDefinition.Members.Add(constructor);

            var visitor = new CodeGenerationVisitor(new WindowCodeGenerationStrategy(options));

            window.Visit(visitor);
            visitor.Generate(classDefinition);

            if (codeNamespace != null)
            {
                codeNamespace.Types.Add(classDefinition);
                codeGenerator.GenerateCodeFromNamespace(codeNamespace, stringWriter, codeGeneratorOptions);
            }
            else
            {
                codeGenerator.GenerateCodeFromType(classDefinition, stringWriter, codeGeneratorOptions);
            }

            stringWriter.Close();
            return(stringBuilder.ToString());
        }