static Optional <ProjectBytecode> TryCompile(ProjectMarkup markup, IObserver <IBinaryMessage> buildEvents, Guid buildId) { try { var projectDirectory = Path.GetDirectoryName(markup.Build.Project); var dependencies = ImmutableList.ToImmutableList( markup.Project.RootClasses .SelectMany(node => ImportExpression.FindFiles(node, projectDirectory)) .Distinct()); var ids = ProjectObjectIdentifiers.Create(markup.Project, markup.Build.TypeInfo, onError: e => ReportFactory.FallbackReport.Exception("Failed to create identifiers for document", e)); var ctx = new Context( names: new UniqueNames(), tryGetTagHash: ids.TryGetIdentifier, projectDirectory: projectDirectory, typesDeclaredInUx: markup.Project .AllNodesInProject() .OfType <ClassNode>() .Select(c => c.GetTypeName()) .ToImmutableHashSet()); var reify = markup.Project.GenerateGlobalScopeConstructor(ctx); var metadata = markup.Project.GenerateMetadata(ids); return(new ProjectBytecode(reify, dependencies, metadata)); } catch (Exception e) { buildEvents.OnNext(new BuildIssueDetected(BuildIssueType.Error, "", e.Message, Optional.None(), buildId)); return(Optional.None()); } }
public IObservable <IBinaryMessage> Update(IObservable <UpdateAttribute> args) { return(_reifier.Result.Switch(maybeBuild => maybeBuild.MatchWith( none: () => args.Select(arg => (IBinaryMessage) new ReifyRequired()), some: m => { var objectIdentifiers = ProjectObjectIdentifiers.Create(m.Project, m.Build.TypeInfo, onError: e => ReportFactory.FallbackReport.Exception("Failed to create identifiers for document", e)); var valueParser = new ValueParser(m.Build.TypeInfo, m.Build.Project); var context = new Context( new UniqueNames(), null, null, typesDeclaredInUx: m.Project .AllNodesInProject() .OfType <ClassNode>() .Select(c => c.GetTypeName()) .ToImmutableHashSet()); return args .SelectMany(p => { if (p.Value.HasValue && ContainsUXExpression(p.Value.Value)) { return new IBinaryMessage[] { new ReifyRequired() } } ; if (p.Property.StartsWith("ux:", StringComparison.InvariantCultureIgnoreCase)) { return new IBinaryMessage[] { new ReifyRequired() } } ; if (p.Property.Contains(".")) { return new IBinaryMessage[] { new ReifyRequired() } } ; if (p.Property == "Layer") { return new IBinaryMessage[] { new ReifyRequired() } } ; var node = objectIdentifiers.TryGetNode(p.Object); if (!node.HasValue) { return new IBinaryMessage[] { new ReifyRequired() } } ; // If this attribute contained an UX expression last reify, // we must require reify to remove old binding objects. var currentValue = node.Value.RawProperties .Where(x => x.Name == p.Property) .Select(x => x.Value) .FirstOrDefault(); if (ContainsUXExpression(currentValue)) { return new IBinaryMessage[] { new ReifyRequired() } } ; try { var message = Execute(p.Object, instance => new SingleProperties(node.Value, context, instance) .UpdateValue(p.Property, p.Value, valueParser)); return new[] { new Started { Command = p }, message, new Ended { Command = p, Success = true, BuildDirectory = AbsoluteFilePath.Parse(m.Build.Assembly).ContainingDirectory } }; } catch (Exception) { return new IBinaryMessage[] { new ReifyRequired() }; } }); }))); }