Avoid extra-node lookup during mutation

Avoid extra-node lookup during mutation

The lookup during mutation is not necessary and we can re-use
the already cached builder node.

--- Src/AutoFixture/SpecimenBuilderNodeAdapterCollection.cs
+++ Src/AutoFixture/SpecimenBuilderNodeAdapterCollection.cs
@@ -21,10 +21,10 @@
     public class SpecimenBuilderNodeAdapterCollection : IList<ISpecimenBuilder>
     {
         private readonly Func<ISpecimenBuilderNode, bool> isAdaptedBuilder;
-        private IEnumerable<ISpecimenBuilder> adaptedBuilders;
+        private ISpecimenBuilderNode adaptedBuilderNode;
         private ISpecimenBuilderNode graph;

-        private IEnumerable<ISpecimenBuilder> AdaptedBuilders
+        private ISpecimenBuilderNode AdaptedBuilderNode
         {
             get
             {
@@ -33,17 +33,21 @@
                 // Some of the collections are not even touched after the construction and are immediately
                 // recreated again after a subsequent customization.
                 // To cover such scenarios we evaluate value on demand only saving the initialization time.
-                if (this.adaptedBuilders != null) return this.adaptedBuilders;
+                if (this.adaptedBuilderNode != null) return this.adaptedBuilderNode;
+
+                var markerNode = this.Graph.FindFirstNode(this.isAdaptedBuilder);

                 // The intermediate "result" variable is needed to ensure that null value can be never returned
                 // in case of concurrency (we set field to null). While current collection implementation doesn't
                 // seem to support concurrency, the additional guard adds more safety.
-                var result = this.adaptedBuilders = FindAdaptedBuilderNode();
+                var result = this.adaptedBuilderNode = (ISpecimenBuilderNode)markerNode.First();
                 return result;
             }
         }

-        private void InvalidateCachedAdaptedBuilders() => this.adaptedBuilders = null;
+        private void InvalidateCachedAdaptedBuilderNode() => this.adaptedBuilderNode = null;
+
+        private IEnumerable<ISpecimenBuilder> AdaptedBuilders => this.AdaptedBuilderNode;

         /// <summary>
@@ -426,7 +430,7 @@
             private set
             {
                 this.graph = value;
-                this.InvalidateCachedAdaptedBuilders();
+                this.InvalidateCachedAdaptedBuilderNode();
             }
         }

@@ -444,19 +448,13 @@

         private void Mutate(IEnumerable<ISpecimenBuilder> builders)
         {
-            var adaptedBuilder = FindAdaptedBuilderNode();
+            var adaptedNode = this.AdaptedBuilderNode;

             this.Graph = this.Graph.ReplaceNodes(
                 with: builders,
-                when: adaptedBuilder.Equals);
+                when: adaptedNode.Equals);

             this.OnGraphChanged(new SpecimenBuilderNodeEventArgs(this.Graph));
-        }
-
-        private ISpecimenBuilderNode FindAdaptedBuilderNode()
-        {
-            var markerNode = this.Graph.FindFirstNode(this.isAdaptedBuilder);
-            return (ISpecimenBuilderNode) markerNode.First();
         }
     }
 }


quick fix

quick fix

--- StudyBox/StudyBox.Core/Messages/MessageToMenuControl.cs
+++ StudyBox/StudyBox.Core/Messages/MessageToMenuControl.cs
@@ -15,13 +15,12 @@
         public string TitleString { get; set; }
         public bool AddFlashcardButton { get; set; }

-        public MessageToMenuControl(bool search, bool save, bool exit, string title="", bool addFlashcard = false)
+        public MessageToMenuControl(bool search, bool save, bool exit, string title="")
         {
             SearchButton = search;
             SaveButton = save;
             ExitButton = exit;
             TitleString = title;
-            AddFlashcardButton = addFlashcard;
         }

     }


Add unit test

Add unit test

--- UnitTestUsefullFunctions/UnitTestFunctionsMathPrimes.cs
+++ UnitTestUsefullFunctions/UnitTestFunctionsMathPrimes.cs
@@ -1534,6 +1534,15 @@
     public void TestMethod_IsPrime_859()
     {
       const int source = 859;
+      const bool expected = true;
+      bool result = FunctionsMath.IsPrime(source);
+      Assert.AreEqual(result, expected);
+    }
+
+    [TestMethod]
+    public void TestMethod_IsPrime_863()
+    {
+      const int source = 863;
       const bool expected = true;
       bool result = FunctionsMath.IsPrime(source);
       Assert.AreEqual(result, expected);


Add unit test

Add unit test

--- UnitTestUsefullFunctions/UnitTestFunctionsMathPrimes.cs
+++ UnitTestUsefullFunctions/UnitTestFunctionsMathPrimes.cs
@@ -949,6 +949,15 @@
     public void TestMethod_IsPrime_433()
     {
       const int source = 433;
+      const bool expected = true;
+      bool result = FunctionsMath.IsPrime(source);
+      Assert.AreEqual(result, expected);
+    }
+
+    [TestMethod]
+    public void TestMethod_IsPrime_439()
+    {
+      const int source = 439;
       const bool expected = true;
       bool result = FunctionsMath.IsPrime(source);
       Assert.AreEqual(result, expected);


fixing ECS-Entitymanager deserialization

--- Unity/Assets/GameFramework/Modules/ECS/EntityManager.cs
+++ Unity/Assets/GameFramework/Modules/ECS/EntityManager.cs
@@ -679,6 +679,7 @@
             //((List<UID>)recycledIds).ForEach(o => _recycledEntityIds.Enqueue(o));
             int recycledIdsCount = manual.GetInt(2);
             List<object> tempList = FlatBufferSerializer.poolListObject.GetList(recycledIdsCount);
+            for (int i = 0; i < recycledIdsCount; i++) tempList.Add(manual.GetListElemAt<Serial.FBUID>(3,i));
             List<UID> recycledIds = (List<UID>)FlatBufferSerializer.DeserializeList<UID, Serial.FBUID>(3, recycledIdsCount, tempList, null, false);
             recycledIds.ForEach(o => _recycledEntityIds.Enqueue(o));
             FlatBufferSerializer.poolListObject.Release(tempList);
@@ -688,6 +689,9 @@
             //((List<UID>)recycledIds).ForEach(o => _recycledComponentIds.Enqueue(o));
             recycledIdsCount = manual.GetInt(4);
             tempList = FlatBufferSerializer.poolListObject.GetList(recycledIdsCount);
+            int listLength = manual.GetListLength(5);
+            for (int i = 0; i < recycledIdsCount; i++) tempList.Add(manual.GetListElemAt<Serial.FBUID>(5, i));
+
             recycledIds = (List<UID>)FlatBufferSerializer.DeserializeList<UID, Serial.FBUID>(5, recycledIdsCount, tempList, null, false);
             recycledIds.ForEach(o => _recycledComponentIds.Enqueue(o));
             FlatBufferSerializer.poolListObject.Release(tempList);


Fixes names?

Fixes names?

--- UnityProject/Assets/Scripts/Managers/ConnectedPlayer.cs
+++ UnityProject/Assets/Scripts/Managers/ConnectedPlayer.cs
@@ -55,7 +55,14 @@

 	public string Name
 	{
-		get => name;
+		get
+		{
+			if (string.IsNullOrEmpty(name))
+			{
+				return gameObject.name;
+			}
+			return name;
+		}
 		set
 		{
 			TryChangeName(value);


More css methods.

More css methods.

--- sources/HDocument/HQuery/AttributeExtensions.cs
+++ sources/HDocument/HQuery/AttributeExtensions.cs
@@ -210,6 +210,7 @@
         /// </summary>
         public static String Css(this HElement element, String propertyName)
         {
+            if (element == null || String.IsNullOrWhiteSpace(propertyName)) return String.Empty;
             var styles = element.Css();
             String result;
             if (styles.TryGetValue(ConvertCamelNameToStyleName(propertyName), out result))
@@ -253,8 +254,45 @@
             return elements.First().Css(propertyNames);
         }

-        // TODO css( String propertyName, String value )
-        // TODO css( String propertyName, Func<HElement, int, String> callback )
+        /// <summary>
+        /// Set a style property in the element
+        /// </summary>
+        public static HElement Css(this HElement element, String propertyName, String value)
+        {
+            if (element == null || String.IsNullOrWhiteSpace(propertyName)) return element;
+            var styles = element.Css();
+            styles[ConvertCamelNameToStyleName(propertyName)] = value;
+            return element.Attr("style", String.Join(";", styles.Where(kvp => !String.IsNullOrWhiteSpace(kvp.Value)).Select(kvp => String.Concat(kvp.Key, "=", kvp.Value))));
+        }
+
+        /// <summary>
+        /// Set a style property in a set of elements
+        /// </summary>
+        public static IEnumerable<HElement> Css(this IEnumerable<HElement> elements, String propertyName, String value)
+        {
+            if (elements == null || String.IsNullOrWhiteSpace(propertyName)) return elements;
+            foreach (var element in elements)
+                element.Css(propertyName, value);
+            return elements;
+        }
+
+        /// <summary>
+        /// Set a style property from a callback in the element
+        /// </summary>
+        public static IEnumerable<HElement> Css(this IEnumerable<HElement> elements, String propertyName, Func<HElement, int, String> getValue)
+        {
+            if (elements != null && !String.IsNullOrWhiteSpace(propertyName))
+            {
+                int i = 0;
+                foreach (var element in elements)
+                {
+                    String value = getValue != null ? getValue(element, i++) : null;
+                    element.Css(propertyName, value);
+                }
+            }
+            return elements;
+        }
+
         // TODO css( Object properties )

         #endregion


No need to allow synchronous IO.

No need to allow synchronous IO.

--- src/FacilityConformance/FacilityConformanceApp.cs
+++ src/FacilityConformance/FacilityConformanceApp.cs
@@ -83,7 +83,7 @@
 				});

 			await new WebHostBuilder()
-				.UseKestrel(options => options.AllowSynchronousIO = true)
+				.UseKestrel()
 				.UseUrls(url)
 				.Configure(app => app.Run(httpContext => HostAsync(httpContext, service, jsonSerializer)))
 				.Build()


removed unused usings in StatusRiotApi, #68

--- RiotSharp/StatusRiotApi.cs
+++ RiotSharp/StatusRiotApi.cs
@@ -1,7 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
+using System.Collections.Generic;
 using System.Threading.Tasks;
 using Newtonsoft.Json;
 using RiotSharp.StatusEndpoint;


#218 Defaults data to be included in relationships rather than only when "include" for that relationship is set.

--- src/JsonApiDotNetCore/Builders/DocumentBuilder.cs
+++ src/JsonApiDotNetCore/Builders/DocumentBuilder.cs
@@ -158,20 +158,17 @@
                     if (r.DocumentLinks.HasFlag(Link.Related))
                         relationshipData.Links.Related = linkBuilder.GetRelatedRelationLink(contextEntity.EntityName, entity.StringId, r.PublicRelationshipName);
                 }
-
-                if (RelationshipIsIncluded(r.PublicRelationshipName))
-                {
-                    var navigationEntity = _jsonApiContext.ContextGraph
-                        .GetRelationship(entity, r.InternalRelationshipName);
-
-                    if (navigationEntity == null)
-                        relationshipData.SingleData = null;
-                    else if (navigationEntity is IEnumerable)
-                        relationshipData.ManyData = GetRelationships((IEnumerable<object>)navigationEntity);
-                    else
-                        relationshipData.SingleData = GetRelationship(navigationEntity);
-                }
-
+
+                var navigationEntity = _jsonApiContext.ContextGraph
+                    .GetRelationship(entity, r.InternalRelationshipName);
+
+                if (navigationEntity == null)
+                    relationshipData.SingleData = null;
+                else if (navigationEntity is IEnumerable)
+                    relationshipData.ManyData = GetRelationships((IEnumerable<object>)navigationEntity);
+                else
+                    relationshipData.SingleData = GetRelationship(navigationEntity);
+
                 data.Relationships.Add(r.PublicRelationshipName, relationshipData);
             });
         }


- making static

- making static

--- src/JsonFx.Json/CodeGen/DynamicMethodGenerator.cs
+++ src/JsonFx.Json/CodeGen/DynamicMethodGenerator.cs
@@ -8,7 +8,7 @@
 	public delegate object GetterDelegate(object target);
 	public delegate void SetterDelegate(object target, object value);

-	internal class DynamicMethodGenerator
+	internal static class DynamicMethodGenerator
 	{
 		#region Dynamic Method Generators

@@ -26,7 +26,7 @@

 			MethodInfo methodInfo = propertyInfo.GetGetMethod();

-			// Create a dynamic method with a return type of object, and one parameter taking the instance
+			// Create a dynamic method with a return type of object, and one parameter taking the instance.
 			// Create the method in the module that owns the instance type
 			DynamicMethod dynamicMethod = new DynamicMethod(
 				propertyInfo.DeclaringType.FullName+".get_"+propertyInfo.Name,
@@ -100,7 +100,7 @@
 				throw new ArgumentNullException("fieldInfo");
 			}

-			// Create a dynamic method with a return type of void, one parameter taking the instance and the other taking the new value.
+			// Create a dynamic method with a return type of object, one parameter taking the instance.
 			// Create the method in the module that owns the instance type
 			DynamicMethod dynamicMethod = new DynamicMethod(
 				fieldInfo.DeclaringType.FullName+".get_"+fieldInfo.Name,
@@ -179,7 +179,7 @@
 				return null;
 			}

-			// Create a dynamic method with a return type of void, one parameter taking the instance and the other taking the new value.
+			// Create a dynamic method with a return type of object and one parameter for each argument.
 			// Create the method in the module that owns the instance type
 			DynamicMethod dynamicMethod = new DynamicMethod(
 				type.FullName+".ctor_"+args.Length,


Media link extension to support MP3 by default

I presume MP3 wasn't intentionally left out this list?

--- src/Markdig/Extensions/MediaLinks/MediaOptions.cs
+++ src/Markdig/Extensions/MediaLinks/MediaOptions.cs
@@ -68,6 +68,7 @@
                 {".wma", "audio/x-ms-wma"},
                 {".wax", "audio/x-ms-wax"},
                 {".mid", "audio/midi"},
+                {".mp3", "audio/mpeg"},
                 {".mpga", "audio/mpeg"},
                 {".mp4a", "audio/mp4"},
                 {".ecelp4800", "audio/vnd.nuera.ecelp4800"},
@@ -88,4 +89,4 @@

         public Dictionary<string, string> ExtensionToMimeType { get; }
     }
-}+}


Fix NPE in plugin.

Fix NPE in plugin.

--- src/MiNET/TestPlugin/NiceLobby/NiceLobbyPlugin.cs
+++ src/MiNET/TestPlugin/NiceLobby/NiceLobbyPlugin.cs
@@ -49,8 +49,8 @@
 			server.PlayerFactory.PlayerCreated += (sender, args) =>
 			{
 				Player player = args.Player;
-				player.PlayerJoin += (o, eventArgs) => eventArgs.Level.BroadcastMessage($"{ChatColors.Gold}[{ChatColors.Green}+{ChatColors.Gold}]{ChatFormatting.Reset} {eventArgs.Player.Username}");
-				player.PlayerLeave += (o, eventArgs) => eventArgs.Level.BroadcastMessage($"{ChatColors.Gold}[{ChatColors.Red}-{ChatColors.Gold}]{ChatFormatting.Reset} {eventArgs.Player.Username}");
+				player.PlayerJoin += (o, eventArgs) => eventArgs?.Level.BroadcastMessage($"{ChatColors.Gold}[{ChatColors.Green}+{ChatColors.Gold}]{ChatFormatting.Reset} {eventArgs.Player.Username}");
+				player.PlayerLeave += (o, eventArgs) => eventArgs?.Level.BroadcastMessage($"{ChatColors.Gold}[{ChatColors.Red}-{ChatColors.Gold}]{ChatFormatting.Reset} {eventArgs.Player.Username}");
 			};

 			_popupTimer = new Timer(DoDevelopmentPopups, null, 10000, 30000);


More tweaks on ParticleManager

More tweaks on ParticleManager

--- Scripts/ParticleManager.cs
+++ Scripts/ParticleManager.cs
@@ -4,7 +4,7 @@
 using UnityEngine;
 using UnityEngine.Events;

-// TODO FIX: Some births aren't being caught - all deaths are, though! HRM.
+// TODO FIX: Some births aren't being caught. Seems to be an issue with the ParticleSystem. Bug reported.
 namespace Spewnity
 {
     /// <summary>
@@ -22,8 +22,6 @@
         [Header("Self Destruction")]
         [Tooltip("When checked, will destroy this GameObject when the attached ParticleSystem has finished its job")]
         public bool destroyWhenFinished = false;
-        [Tooltip("Includes child particle systems in finished check")]
-        public bool includeChildren = true;

         [Header("Events")]
         public ParticleSystemEvent systemStarted;
@@ -47,14 +45,15 @@
         {
             particleBorn.ThrowIfNull();
             if (particleBorn.GetPersistentEventCount() > 0)
-                AddSubEmitter(ref psBirthTester, ParticleSystemSubEmitterType.Birth, particleBorn);
+                AddSubEmitter(ref psBirthTester, ParticleSystemSubEmitterType.Birth, (v) => { particleBorn.Invoke(v); });

             particleDied.ThrowIfNull();
             if (particleDied.GetPersistentEventCount() > 0)
-                AddSubEmitter(ref psDeathTester, ParticleSystemSubEmitterType.Death, particleDied);
+                AddSubEmitter(ref psDeathTester, ParticleSystemSubEmitterType.Death, (v) => { particleDied.Invoke(v); });
         }

-        private void AddSubEmitter(ref ParticleSystem subPS, ParticleSystemSubEmitterType type, ParticleEvent callback)
+        private void AddSubEmitter(ref ParticleSystem subPS, ParticleSystemSubEmitterType type,
+            System.Action<Vector3> callback)
         {
             // Create SubEmitter object
             GameObject go = new GameObject("subemitter-" + type.ToString());
@@ -73,10 +72,9 @@
             main.startSize = 0f;
             main.startSpeed = 0f;
             main.maxParticles = ps.main.maxParticles;
-            main.loop = false;
-            main.playOnAwake = false;
+            main.loop = true;
+            main.playOnAwake = true;
             ParticleSystem.EmissionModule emission = subPS.emission;
-            emission.enabled = true;
             emission.rateOverTime = 0f;
             emission.SetBursts(new ParticleSystem.Burst[]
             {
@@ -101,7 +99,7 @@
         {
             if (alive)
             {
-                if (!ps.IsAlive(includeChildren))
+                if (!ps.IsAlive())
                 {
                     systemFinished.Invoke(ps);
                     if (destroyWhenFinished)
@@ -111,7 +109,7 @@
             }
             else
             {
-                if (ps.IsAlive(includeChildren))
+                if (ps.IsAlive())
                 {
                     systemStarted.Invoke(ps);
                     alive = true;
@@ -131,7 +129,7 @@
 {
     public class SubEmitterHandler : MonoBehaviour
     {
-        public ParticleEvent callback;
+        public System.Action<Vector3> callback;
         private ParticleSystem ps;
         private ParticleSystem.Particle[] particles;

@@ -148,7 +146,7 @@
                 int count = ps.GetParticles(particles);
                 Debug.Assert(count == ps.particleCount);
                 for (int i = 0; i < count; i++)
-                    callback.Invoke(particles[i].position);
+                    callback(particles[i].position);
                 ps.Clear();
             }
         }


Dist: StudentT density more robust for very large degrees of freedom #44

--- src/Numerics/Distributions/Continuous/StudentT.cs
+++ src/Numerics/Distributions/Continuous/StudentT.cs
@@ -352,15 +352,14 @@
         public double Density(double x)
         {
             // TODO JVG we can probably do a better job for Cauchy special case
-            if (Double.IsPositiveInfinity(_dof))
+            if (_dof >= 1e+8d)
             {
                 return Normal.Density(_location, _scale, x);
             }

             var d = (x - _location) / _scale;
-            return SpecialFunctions.Gamma((_dof + 1.0) / 2.0)
+            return Math.Exp(SpecialFunctions.GammaLn((_dof + 1.0) / 2.0) - SpecialFunctions.GammaLn(_dof / 2.0))
                    * Math.Pow(1.0 + (d * d / _dof), -0.5 * (_dof + 1.0))
-                   / SpecialFunctions.Gamma(_dof / 2.0)
                    / Math.Sqrt(_dof * Math.PI)
                    / _scale;
         }
@@ -373,7 +372,7 @@
         public double DensityLn(double x)
         {
             // TODO JVG we can probably do a better job for Cauchy special case
-            if (Double.IsPositiveInfinity(_dof))
+            if (_dof >= 1e+8d)
             {
                 return Normal.DensityLn(_location, _scale, x);
             }


Reducing the warning count. Call me pedantic...

--- src/Samples/PizzaSample/Pizza.Ordering/Program.cs
+++ src/Samples/PizzaSample/Pizza.Ordering/Program.cs
@@ -55,7 +55,9 @@
                 {
                     case "1":

+#pragma warning disable 4014
                         FindOutHowLongItWillBe(bus);
+#pragma warning restore 4014

                         break;

@@ -63,7 +65,9 @@

                         var command = new OrderPizzaCommand {PizzaId = nextPizzaId};

+#pragma warning disable 4014
                         bus.Send(command);
+#pragma warning restore 4014

                         Console.WriteLine("Pizza number {0} ordered", nextPizzaId);


[Activation] Cache disconnected blocks (#2025)

* cache disconnected blocks

* typo

* fixes per review

--- src/Stratis.Bitcoin/Consensus/ConsensusManager.cs
+++ src/Stratis.Bitcoin/Consensus/ConsensusManager.cs
@@ -525,10 +525,10 @@
             // If the new block is not on the current chain as our current consensus tip then rewind consensus tip to the common fork.
             bool isExtension = fork == oldTip;

+            List<ChainedHeaderBlock> disconnectedBlocks = null;
+
             if (!isExtension)
-            {
-                await this.RewindToForkPointAsync(fork, oldTip).ConfigureAwait(false);
-            }
+                disconnectedBlocks = await this.RewindToForkPointAsync(fork, oldTip).ConfigureAwait(false);

             List<ChainedHeaderBlock> blocksToConnect = await this.TryGetBlocksToConnectAsync(newTip, fork.Height + 1).ConfigureAwait(false);

@@ -560,17 +560,8 @@
                 return connectBlockResult;
             }

-            List<ChainedHeaderBlock> blocksToReconnect = await this.TryGetBlocksToConnectAsync(oldTip, fork.Height + 1).ConfigureAwait(false);
-
-            // Sanity check. This should never happen.
-            if (blocksToReconnect == null)
-            {
-                this.logger.LogCritical("Blocks to reconnect are missing!");
-                this.logger.LogTrace("(-)[NO_BLOCK_TO_RECONNECT]");
-                throw new ConsensusException("Blocks to reconnect are missing!");
-            }
-
-            ConnectBlocksResult reconnectionResult = await this.ReconnectOldChainAsync(fork, blocksToReconnect).ConfigureAwait(false);
+            // Reconnect disconnected blocks.
+            ConnectBlocksResult reconnectionResult = await this.ReconnectOldChainAsync(fork, disconnectedBlocks).ConfigureAwait(false);

             this.logger.LogTrace("(-):'{0}'", reconnectionResult);
             return reconnectionResult;
@@ -580,7 +571,8 @@
         /// <param name="fork">The fork point. It can't be ahead of <paramref name="oldTip"/>.</param>
         /// <param name="oldTip">The old tip.</param>
         /// <exception cref="ConsensusException">Thrown in case <paramref name="fork"/> is ahead of the <paramref name="oldTip"/>.</exception>
-        private async Task RewindToForkPointAsync(ChainedHeader fork, ChainedHeader oldTip)
+        /// <returns>List of blocks that were disconnected.</returns>
+        private async Task<List<ChainedHeaderBlock>> RewindToForkPointAsync(ChainedHeader fork, ChainedHeader oldTip)
         {
             this.logger.LogTrace("({0}:'{1}',{2}:'{3}'", nameof(fork), fork, nameof(oldTip), oldTip);

@@ -591,6 +583,10 @@
                 throw new ConsensusException("Fork can't be ahead of tip!");
             }

+            // Save blocks that will be disconnected in case we will need to
+            // reconnect them. This might happen if connection of a new chain fails.
+            var disconnectedBlocks = new List<ChainedHeaderBlock>(oldTip.Height - fork.Height);
+
             ChainedHeader current = oldTip;

             while (current != fork)
@@ -602,12 +598,18 @@
                     this.SetConsensusTipInternalLocked(current.Previous);
                 }

-                this.signals.SignalBlockDisconnected(new ChainedHeaderBlock(current.Block, current));
+                var disconnectedBlock = new ChainedHeaderBlock(current.Block, current);
+                disconnectedBlocks.Add(disconnectedBlock);
+
+                this.signals.SignalBlockDisconnected(disconnectedBlock);

                 current = current.Previous;
             }

-            this.logger.LogTrace("(-)");
+            disconnectedBlocks.Reverse();
+
+            this.logger.LogTrace("(-):*.{0}={1}", nameof(disconnectedBlocks.Count), disconnectedBlocks.Count);
+            return disconnectedBlocks;
         }

         /// <summary>Connects new chain.</summary>


[trunk] Don't try to install files with no QMake data

--- packages/Publisher/dev/QMakeBuilder/ProductModule.cs
+++ packages/Publisher/dev/QMakeBuilder/ProductModule.cs
@@ -63,6 +63,11 @@
             foreach (var dependency in dependents)
             {
                 var proData = dependency.Data as QMakeData;
+                if (null == proData)
+                {
+                    continue;
+                }
+
                 var module = dependency.Module;
                 var moduleType = module.GetType();
                 var flags = System.Reflection.BindingFlags.Instance |


improve doc comments on SemVersionStyles

--- Semver/SemVersionStyles.cs
+++ Semver/SemVersionStyles.cs
@@ -3,15 +3,17 @@
 namespace Semver
 {
     /// <summary>
-    /// Determines the styles that are allowed in version strings passed to the
-    /// <c>Parse</c> and <c>TryParse</c> methods of <see cref="SemVersion"/>.
+    /// <para>Determines the styles that are allowed in version strings passed to the
+    /// <see cref="SemVersion.Parse(string,SemVersionStyles,int)"/> and <see cref="SemVersion.TryParse(string,SemVersionStyles,out SemVersion,int)"/>
+    /// <c>Parse</c> and <c>TryParse</c> methods of <see cref="SemVersion"/>.</para>
+    ///
+    /// <para>This enumeration supports a bitwise combination of its member values.</para>
     /// </summary>
     [Flags]
     public enum SemVersionStyles
     {
         /// <summary>
-        /// Accept version strings strictly conforming to the latest supported SemVer spec.
-        /// Currently, that is SemVer 2.0.0.
+        /// Accept version strings strictly conforming to the SemVer 2.0 spec.
         /// </summary>
         Strict = 0,

@@ -65,9 +67,9 @@
         /// <summary>
         /// Accept any version string format supported.
         /// </summary>
-        /// <remarks>This is a composite semantic version style.
+        /// <remarks><para>This is a composite semantic version style.</para>
         ///
-        /// The formats accepted by this style will change when more formats are supported.</remarks>
+        /// <para>The formats accepted by this style will change when more formats are supported.</para></remarks>
         Any = unchecked((int)0xFFFF_FFFF),
     }
 }