private void BuildFileResult(string fileName, ViewCompilationResult view) { var r = new FileCompilationResult(); var visitor = new ResolvedControlInfoVisitor(); if (Options.CheckBindingErrors) { visitor.BindingCompiler = bindingCompiler; } visitor.Result = r; view.ResolvedTree?.Accept(visitor); result.Files.Add(fileName, r); }
protected ViewCompilationResult CompileView(string fileName) { var file = fileLoader.GetMarkup(configuration, fileName); // parse the document var tokenizer = new DothtmlTokenizer(); tokenizer.Tokenize(file.ContentsReaderFactory()); var parser = new DothtmlParser(); var node = parser.Parse(tokenizer.Tokens); var resolvedView = (ResolvedTreeRoot)controlTreeResolver.ResolveTree(node, fileName); var errorCheckingVisitor = new ErrorCheckingVisitor(); resolvedView.Accept(errorCheckingVisitor); foreach (var n in node.EnumerateNodes()) { if (n.HasNodeErrors) { throw new DotvvmCompilationException(string.Join(", ", n.NodeErrors), n.Tokens); } } var contextSpaceVisitor = new DataContextPropertyAssigningVisitor(); resolvedView.Accept(contextSpaceVisitor); var styleVisitor = new StylingVisitor(configuration); resolvedView.Accept(styleVisitor); //TODO: fix usage validator //var validationVisitor = new ControlUsageValidationVisitor(configuration); //resolvedView.Accept(validationVisitor); //if (validationVisitor.Errors.Any()) //{ // var controlUsageError = validationVisitor.Errors.First(); // throw new DotvvmCompilationException(controlUsageError.ErrorMessage, controlUsageError.Nodes.SelectMany(n => n.Tokens)); //} DefaultViewCompilerCodeEmitter emitter = null; string fullClassName = null; if (Options.FullCompile) { var namespaceName = DefaultControlBuilderFactory.GetNamespaceFromFileName(file.FileName, file.LastWriteDateTimeUtc); var className = DefaultControlBuilderFactory.GetClassFromFileName(file.FileName) + "ControlBuilder"; fullClassName = namespaceName + "." + className; emitter = new CompileTimeCodeEmitter(configuration.ServiceProvider.GetService <RefObjectSerializer>(), ObjectsClassName); var compilingVisitor = new ViewCompilingVisitor(emitter, configuration.ServiceProvider.GetService <IBindingCompiler>(), className); resolvedView.Accept(compilingVisitor); // compile master pages if (resolvedView.Directives.ContainsKey("masterPage")) { CompileFile(resolvedView.Directives["masterPage"].Single().Value); } compilation = compilation .AddSyntaxTrees(emitter.BuildTree(namespaceName, className, fileName)) .AddReferences(emitter.UsedAssemblies .Select(a => CompiledAssemblyCache.Instance.GetAssemblyMetadata(a.Key))); } Program2.WriteInfo($"The view { fileName } compiled successfully."); var res = new ViewCompilationResult { BuilderClassName = fullClassName, ControlType = resolvedView.Metadata.Type, DataContextType = emitter?.BuilderDataContextType, ResolvedTree = Options.OutputResolvedDothtmlMap ? resolvedView : null }; BuildFileResult(fileName, res); return(res); }