Beispiel #1
0
        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());
            }
        }
Beispiel #2
0
        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() };
                    }
                });
            })));
        }