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