protected RawAbstractItem([NotNull] ItemType itemType, [NotNull] string namespaceName, [NotNull] string className,
                           [NotNull] string assemblyName, [CanBeNull] string assemblyVersion, [CanBeNull] string assemblyCulture,
                           [CanBeNull] string memberName, [CanBeNull, ItemNotNull] string[] markers, [NotNull] WorkingGraph readingGraph)
 {
     if (itemType == null)
     {
         throw new ArgumentNullException(nameof(itemType));
     }
     if (namespaceName == null)
     {
         throw new ArgumentNullException(nameof(namespaceName));
     }
     if (className == null)
     {
         throw new ArgumentNullException(nameof(className));
     }
     if (assemblyName == null)
     {
         throw new ArgumentNullException(nameof(assemblyName));
     }
     ItemType         = itemType;
     NamespaceName    = string.Intern(namespaceName);
     ClassName        = string.Intern(className);
     AssemblyName     = string.Intern(assemblyName);
     _assemblyVersion = string.Intern(assemblyVersion ?? "");
     _assemblyCulture = string.Intern(assemblyCulture ?? "");
     MemberName       = string.Intern(memberName ?? "");
     _markers         = markers;
     _readingGraph    = readingGraph;
 }
Example #2
0
        public void TestWriteOverlappingCycles()
        {
            const string cycleMarkerPrefix = "X";

            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var a = graph.CreateItem(ItemType.SIMPLE, "a");
            var b = graph.CreateItem(ItemType.SIMPLE, "b");
            var c = graph.CreateItem(ItemType.SIMPLE, "c");
            var d = graph.CreateItem(ItemType.SIMPLE, "d");
            var e = graph.CreateItem(ItemType.SIMPLE, "e");

            List <Dependency> dependencies = CreateDependenciesAndFindCycles(gc, a, b, c, d, e, keepOnlyCyclesOption: false, markerPrefix: cycleMarkerPrefix);

            using (var s = new MemoryStream()) {
                var w = new FlatPathWriter();
                w.RenderToStreamForUnitTests(gc, dependencies, s, cycleMarkerPrefix + "* -sm");
                string result = Encoding.ASCII.GetString(s.ToArray());
                Assert.AreEqual(@"-- X0
SIMPLE:a'X0
SIMPLE:c'X1
SIMPLE:d
SIMPLE:e
<= SIMPLE:a'X0 $

-- X1
SIMPLE:c'X1
SIMPLE:d
<= SIMPLE:c'X1 $", result.Trim());
            }
        }
Example #3
0
        public void TestOverlappingCycles()
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var a = graph.CreateItem(ItemType.SIMPLE, "a");
            var b = graph.CreateItem(ItemType.SIMPLE, "b");
            var c = graph.CreateItem(ItemType.SIMPLE, "c");
            var d = graph.CreateItem(ItemType.SIMPLE, "d");
            var e = graph.CreateItem(ItemType.SIMPLE, "e");

            List <Dependency> result = CreateDependenciesAndFindCycles(gc, a, b, c, d, e, keepOnlyCyclesOption: true, markerPrefix: "Kreis");

            Assert.AreEqual(5, result.Count);
            Assert.AreEqual(a, result[0].UsingItem);
            Assert.AreEqual(1, result[0].BadCt);
            Assert.AreEqual(c, result[1].UsingItem);
            Assert.AreEqual(1, result[1].BadCt);
            Assert.AreEqual(d, result[2].UsingItem);
            Assert.AreEqual(1, result[2].BadCt);
            Assert.AreEqual(d, result[3].UsingItem);
            Assert.AreEqual(1, result[3].BadCt);
            Assert.AreEqual(e, result[4].UsingItem);
            Assert.AreEqual(1, result[4].BadCt);
        }
        public void TestSimpleFlatPathWriterForOnePath()
        {
            var gc = new GlobalContext {
                IgnoreCase = true
            };
            WorkingGraph graph = gc.CurrentGraph;

            ItemType t3 = ItemType.New("T3(ShortName:MiddleName:LongName)");
            var      RegexPathMarker = "P0";

            Item a = graph.CreateItem(t3, "a:aa:aaa".Split(':'));

            a.MarkPathElement(RegexPathMarker, 0, isStart: false, isEnd: false, isMatchedByCountSymbol: false,
                              isLoopBack: false);
            Item b = graph.CreateItem(t3, "b:bb:bbb".Split(':'));

            b.SetMarker(RegexPathMarker, 1);

            var d = CreateDependency(graph, a, b, RegexPathMarker, true, true, false, false);

            Dependency[] dependencies = { d };

            using (var s = new MemoryStream()) {
                var w = new FlatPathWriter();
                w.RenderToStreamForUnitTests(gc, dependencies, s, "P*");
                string result = Encoding.ASCII.GetString(s.ToArray());
                Assert.AreEqual(@"-- P0
a:aa:aaa
b:bb:bbb $", result.Trim());
            }
        }
Example #5
0
        private static List <Dependency> CreateDependenciesAndFindCycles(GlobalContext gc, Item a, Item b, Item c, Item d, Item e, bool keepOnlyCyclesOption, string markerPrefix)
        {
            WorkingGraph graph = gc.CurrentGraph;

            var deps = new[] {
                // "Confusing" edges to sink b
                graph.CreateDependency(a, b, null, "", 1),
                graph.CreateDependency(b, b, null, "", 1),
                graph.CreateDependency(c, b, null, "", 1),
                graph.CreateDependency(d, b, null, "", 1),

                // a->c->d->e
                graph.CreateDependency(a, c, null, "", 1),
                graph.CreateDependency(c, d, null, "", 1),
                graph.CreateDependency(d, e, null, "", 1),

                // Cycle edges c<-d and a<-e
                graph.CreateDependency(d, c, null, "", 1),
                graph.CreateDependency(e, a, null, "", 1),
            };
            var result = new List <Dependency>();

            new MarkCycleDeps().Transform(gc, Ignore.Om,
                                          new MarkCycleDeps.TransformOptions {
                KeepOnlyCycleDependencies = keepOnlyCyclesOption,
                IndexedMarkerPrefix       = markerPrefix
            },
                                          deps, result);

            result.Sort((x, y) => string.Compare(x.UsingItemAsString, y.UsingItemAsString, StringComparison.Ordinal));
            return(result);
        }
Example #6
0
        public void TestLoopIsNotEndless()
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;
            Item         a     = graph.CreateItem(ItemType.SIMPLE, "a");
            Item         b     = graph.CreateItem(ItemType.SIMPLE, "b");
            Item         c     = graph.CreateItem(ItemType.SIMPLE, "c");
            Item         d     = graph.CreateItem(ItemType.SIMPLE, "d");

            graph.AddDependencies(new[] {
                graph.CreateDependency(a, b, null, "", 1),
                // Loop on b & c; but we never reach d!
                graph.CreateDependency(b, c, null, "", 1),
                graph.CreateDependency(c, b, null, "", 1),

                // Loop on d so that it remains in graph
                graph.CreateDependency(d, d, null, "", 1)
            });

            // We want to go from a to d - this will never succeed; but we must make sure that
            // there is no endless loop around b and c.
            var traverser = new TestTraverser(graph.VisibleDependencies, new PathRegex("a.(b.c.)*d"));

            traverser.Traverse(a);

            Assert.AreEqual(0, traverser.RecordedPaths.Count());
        }
Example #7
0
 private Dependency NewDependency(WorkingGraph workingGraph, string usingA, string usingN, string usingC, string usedA, string usedN,
                                  string usedC)
 {
     return(workingGraph.CreateDependency(workingGraph.CreateItem(ITEMTYPE, usingA, usingN, usingC),
                                          workingGraph.CreateItem(ITEMTYPE, usedA, usedN, usedC),
                                          null, "Test", ct: 1));
 }
Example #8
0
 private Dependency ResolveItemProxies(WorkingGraph readingGraph, Dependency d, Dictionary <Item, Item> itemsDictionary)
 {
     return(d.UsingItem is ItemProxy || d.UsedItem is ItemProxy
         ? readingGraph.CreateDependency(itemsDictionary[d.UsingItem], itemsDictionary[d.UsedItem],
                                         d.Source, d.MarkerSet, d.Ct, d.QuestionableCt, d.BadCt, d.NotOkReason, d.ExampleInfo)
         : d);
 }
Example #9
0
        private FromTo ProjectDependency(WorkingGraph currentWorkingGraph, Dependency d, Dictionary <FromTo, Dependency> localCollector,
                                         Func <bool> onMissingPattern)
        {
            Item usingItem = _projector.Project(cachingGraph: currentWorkingGraph, item: d.UsingItem, left: true);
            Item usedItem  = _projector.Project(cachingGraph: currentWorkingGraph, item: d.UsedItem, left: false);

            if (usingItem == null)
            {
                if (onMissingPattern())
                {
                    Log.WriteWarning("No projection pattern found for " + d.UsingItem.AsString() + " - I ignore it");
                }
                return(null);
            }
            else if (usedItem == null)
            {
                if (onMissingPattern())
                {
                    Log.WriteWarning("No projection pattern found for " + d.UsedItem.AsString() + " - I ignore it");
                }
                return(null);
            }
            else if (usingItem.IsEmpty() || usedItem.IsEmpty())
            {
                // ignore this edge!
                return(null);
            }
            else
            {
                return(new FromTo(usingItem, usedItem).AggregateDependency(currentWorkingGraph, d, localCollector));
            }
        }
Example #10
0
        public void TestToTooFewFields()
        {
            var          pi           = new ProjectItems((p, i) => new ProjectItems.SelfOptimizingPrefixTrieProjector(p, i, 2, "prefixTrie"));
            var          gc           = new GlobalContext();
            const string THREE_FIELDS = "THREE_FIELDS";

            pi.Configure(gc, $@"{{ -pl
    $ {THREE_FIELDS}(F1:F2:F3) ---% {THREE_FIELDS}

    ! a:b:c ---% ::
    ! a:b   ---% : // this threw an exception before a fix
    ! a    ---%
}}", forceReload: false);

            ItemType     threeFields = ItemType.Find(THREE_FIELDS);
            WorkingGraph graph       = gc.CurrentGraph;
            Item         abc         = graph.CreateItem(threeFields, "a:b:c");
            Item         ab          = graph.CreateItem(threeFields, "a:b:-");
            Item         a           = graph.CreateItem(threeFields, "a:-:-");

            var result = new List <Dependency>();

            pi.Transform(gc, new[] {
                graph.CreateDependency(abc, abc, null, "abc", 1),
                graph.CreateDependency(ab, ab, null, "ab", 1),
                graph.CreateDependency(a, a, null, "a", 1),
            }, "", result, s => null);

            Assert.AreEqual(0, result.Count);
        }
Example #11
0
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph transformingGraph)
        {
            var s1 = transformingGraph.CreateItem(ItemType.SIMPLE, "S1");
            var s2 = transformingGraph.CreateItem(ItemType.SIMPLE, "S2");
            var a  = transformingGraph.CreateItem(ItemType.SIMPLE, "A");
            var t1 = transformingGraph.CreateItem(ItemType.SIMPLE, "T1");
            var t2 = transformingGraph.CreateItem(ItemType.SIMPLE, "T2");
            var b  = transformingGraph.CreateItem(ItemType.SIMPLE, "B");
            var c  = transformingGraph.CreateItem(ItemType.SIMPLE, "C");
            var d  = transformingGraph.CreateItem(ItemType.SIMPLE, "D");
            var t3 = transformingGraph.CreateItem(ItemType.SIMPLE, "T3");
            var t4 = transformingGraph.CreateItem(ItemType.SIMPLE, "T4");

            return(new[] {
                transformingGraph.CreateDependency(s1, a, source: null, markers: "1", ct: 10, questionableCt: 5, badCt: 3, notOkReason: "test"),
                transformingGraph.CreateDependency(s1, d, source: null, markers: "D", ct: 10, questionableCt: 5, badCt: 3, notOkReason: "test"),
                transformingGraph.CreateDependency(s1, t4, source: null, markers: "D", ct: 10, questionableCt: 5, badCt: 3, notOkReason: "test"),
                transformingGraph.CreateDependency(s2, a, source: null, markers: "2", ct: 10, questionableCt: 5, badCt: 3, notOkReason: "test"),

                transformingGraph.CreateDependency(a, t1, source: null, markers: "1", ct: 1, questionableCt: 0, badCt: 0),
                transformingGraph.CreateDependency(a, t2, source: null, markers: "2", ct: 2, questionableCt: 0, badCt: 0),
                transformingGraph.CreateDependency(a, t2, source: null, markers: "2", ct: 3, questionableCt: 0, badCt: 0),

                transformingGraph.CreateDependency(a, b, source: null, markers: "", ct: 1, questionableCt: 0, badCt: 0),
                transformingGraph.CreateDependency(b, c, source: null, markers: "", ct: 1, questionableCt: 0, badCt: 0),
                transformingGraph.CreateDependency(c, b, source: null, markers: "", ct: 1, questionableCt: 0, badCt: 0),

                transformingGraph.CreateDependency(c, t3, source: null, markers: "3", ct: 5, questionableCt: 0, badCt: 2, notOkReason: "test"),

                transformingGraph.CreateDependency(d, t4, source: null, markers: "4", ct: 5, questionableCt: 0, badCt: 2, notOkReason: "test"),
            });
        }
        private ItemTail ExtractCustomSections(WorkingGraph readingGraph, CustomAttribute customAttribute, ItemTail parent)
        {
            TypeReference  customAttributeTypeReference = customAttribute.AttributeType;
            TypeDefinition attributeType      = Resolve(customAttributeTypeReference);
            bool           isSectionAttribute = attributeType != null && attributeType.Interfaces.Any(i => i.FullName == "NDepCheck.ISectionAttribute");

            if (isSectionAttribute)
            {
                string[]        keys = attributeType.Properties.Select(property => property.Name).ToArray();
                FieldDefinition itemTypeNameField = attributeType.Fields.FirstOrDefault(f => f.Name == "ITEM_TYPE");
                if (itemTypeNameField == null)
                {
                    //??? Log.WriteError();
                    throw new Exception("string constant ITEM_TYPE not defined in " + attributeType.FullName);
                }
                else
                {
                    string   itemTypeName = "" + itemTypeNameField.Constant;
                    ItemType itemType     = GetOrDeclareType(itemTypeName, Enumerable.Repeat("CUSTOM", keys.Length), keys.Select(k => "." + k));
                    var      args         = keys.Select((k, i) => new {
                        Key      = k,
                        Index    = i,
                        Property = customAttribute.Properties.FirstOrDefault(p => p.Name == k)
                    });
                    string[] values = args.Select(a => a.Property.Name == null
                        ? parent?.Values[a.Index]
                        : "" + a.Property.Argument.Value).ToArray();
                    return(ItemTail.New(readingGraph.ItemTailCache, itemType, values));
                }
            }
            else
            {
                return(parent);
            }
        }
            public Dependency ToDependencyWithTail(WorkingGraph readingGraph, int depth, string containerUri)
            {
                // ?? fires if reader == null (i.e., target assembly is not read in), or if assemblies do not match (different compiles) and hence a used item is not found in target reader.
                Item usedItem = (_readerForUsedItem == null ? null : UsedItem.ToItemWithTail(readingGraph, _readerForUsedItem, depth)) ?? UsedItem.ToItem();

                return(ToDependency(readingGraph, usedItem, containerUri));
            }
 private Dependency ToDependency(WorkingGraph readingGraph, Item usedItem, string containerUri)
 {
     return(readingGraph.CreateDependency(UsingItem.ToItem(), usedItem, _sequencePoint == null
                 ? (ISourceLocation) new LocalSourceLocation(containerUri, UsingItem.NamespaceName + "." + UsingItem.ClassName + (string.IsNullOrWhiteSpace(UsingItem.MemberName) ? "" : "." + UsingItem.MemberName))
                 : new ProgramFileSourceLocation(containerUri, _sequencePoint.Document.Url, _sequencePoint.StartLine, _sequencePoint.StartColumn, _sequencePoint.EndLine, _sequencePoint.EndColumn),
                                          Usage.ToString(), 1));
 }
        public void TestSimpleFlatPathWriterForYPath()
        {
            ItemType t3 = ItemType.New("T3(ShortName:MiddleName:LongName)");

            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var a = graph.CreateItem(t3, "a:aa:aaa".Split(':'));
            var b = graph.CreateItem(t3, "b:bb:bbb".Split(':'));
            var c = graph.CreateItem(t3, "c:cc:ccc".Split(':'));
            var d = graph.CreateItem(t3, "d:dd:ddd".Split(':'));

            var dependencies = new[] {
                FromTo(graph, a, b),
                FromTo(graph, b, c),
                FromTo(graph, b, d),
            };

            string result = FindPathsAndWriteFlat(gc, dependencies, "A", CreateDefaultOptions("A"));

            Assert.AreEqual(@"-- A0
T3:a:aa:aaa'A0
T3:b:bb:bbb'A $
T3:d:dd:ddd'A $", result.Trim());
        }
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph renderingGraph)
        {
            ItemType amo = ItemType.New("AMO(Assembly:Module:Order)");

            var bac     = renderingGraph.CreateItem(amo, "BAC:BAC:0100".Split(':'));
            var kst     = renderingGraph.CreateItem(amo, "KST:KST:0200".Split(':'));
            var kah     = renderingGraph.CreateItem(amo, "KAH:KAH:0300".Split(':'));
            var kah_mi  = renderingGraph.CreateItem(amo, "Kah.MI:KAH:0301".Split(':'));
            var vkf     = renderingGraph.CreateItem(amo, "VKF:VKF:0400".Split(':'));
            var vkf1_mi = renderingGraph.CreateItem(amo, "Vkf1.MI:VKF:0401".Split(':'));
            var vkf2_mi = renderingGraph.CreateItem(amo, "Vkf2.MI:VKF:0402".Split(':'));
            //var vkf3_mi = renderingGraph.ItemAndDependencyFactory.New(amo, "Vkf3.MI:VKF:0402".Split(':'));
            //var vkf4_mi = renderingGraph.ItemAndDependencyFactory.New(amo, "Vkf4.MI:VKF:0402".Split(':'));
            var wlg     = renderingGraph.CreateItem(amo, "WLG:WLG:0500".Split(':'));
            var wlg1_mi = renderingGraph.CreateItem(amo, "Wlg1.MI:WLG:0501".Split(':'));
            var wlg2_mi = renderingGraph.CreateItem(amo, "Wlg2.MI:WLG:0502".Split(':'));
            //var imp = renderingGraph.ItemAndDependencyFactory.New(amo, "IMP:IMP:0600".Split(':'));
            var imp_mi = renderingGraph.CreateItem(amo, "Imp.MI:IMP:0601".Split(':'));

            //var top = renderingGraph.ItemAndDependencyFactory.New(amo, "Top:TOP:0700".Split(':'));

            return(new[] {
                FromTo(renderingGraph, kst, bac), FromTo(renderingGraph, kst, kah_mi),
                FromTo(renderingGraph, kst, vkf1_mi), FromTo(renderingGraph, kst, vkf2_mi),
                FromTo(renderingGraph, kst, wlg1_mi), FromTo(renderingGraph, kst, wlg2_mi),
                FromTo(renderingGraph, kah, bac), FromTo(renderingGraph, kah, vkf1_mi),
                FromTo(renderingGraph, kah, vkf2_mi), FromTo(renderingGraph, kah, wlg, 4, 3) /* ===> */,
                FromTo(renderingGraph, vkf, bac), FromTo(renderingGraph, vkf, kst),
                FromTo(renderingGraph, vkf, kah, 3), FromTo(renderingGraph, vkf, kah_mi, 2, 2) /* <:: */,
                FromTo(renderingGraph, vkf, imp_mi), FromTo(renderingGraph, vkf1_mi, bac),
                FromTo(renderingGraph, vkf2_mi, bac),
                // ... more to come
            });
        }
Example #17
0
        public void TestOldCountPaths() {
            ItemType xy = ItemType.New("NL(Name:Layer)");
            var gc = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            Item a = graph.CreateItem(xy, "a", "1");
            Item b = graph.CreateItem(xy, "b", "2");
            Item c = graph.CreateItem(xy, "c", "2");
            Item d = graph.CreateItem(xy, "d", "3");
            Item e = graph.CreateItem(xy, "e", "4");
            Item f = graph.CreateItem(xy, "f", "4");
            Item g = graph.CreateItem(xy, "g", "5");
            Dependency[] dependencies = {
                FromTo(graph, a, b),
                FromTo(graph, a, c),
                FromTo(graph, b, d),
                FromTo(graph, c, d),
                FromTo(graph, d, e),
                FromTo(graph, d, f),
                FromTo(graph, e, g),
                FromTo(graph, f, g)
            };

            string o = FindPathsAndWriteFlat(gc, dependencies, "A", "{ -im A -pi a -ci 2 -pi g }".Replace(" ", Environment.NewLine));

            Console.WriteLine(o);
            Assert.IsTrue(o.Contains("b:2 #"));
            Assert.IsTrue(o.Contains("c:2 #"));
            Assert.IsTrue(o.Contains("d:3'A=2"));
            Assert.IsTrue(o.Contains("e:4'A=2"));
            Assert.IsTrue(o.Contains("g:5'A=2 $"));
        }
Example #18
0
        protected override IEnumerable <RawUsingItem> ReadUsingItems(int depth, WorkingGraph readingGraph)
        {
            Log.WriteInfo("Reading " + FullFileName);
            AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(FullFileName);

            try {
                assembly.MainModule.ReadSymbols();
            } catch (Exception ex) {
                Log.WriteWarning(
                    $"Loading symbols for assembly {FullFileName} failed - maybe .PDB file is missing. ({ex.Message})", FullFileName, 0);
            }

            ItemTail customSections = GetCustomSections(readingGraph, assembly.CustomAttributes, null);

            foreach (TypeDefinition type in assembly.MainModule.Types)
            {
                if (type.Name == "<Module>")
                {
                    continue;
                }

                foreach (var usingItem in AnalyzeType(type, customSections, readingGraph))
                {
                    yield return(usingItem);
                }
            }

            AssemblyNameDefinition currentAssembly = assembly.Name;

            yield return(RawUsingItem.New(_rawUsingItemsCache, DOTNETASSEMBLY,
                                          namespaceName: "", className: "", assemblyName: currentAssembly.Name,
                                          assemblyVersion: currentAssembly.Version.ToString(), assemblyCulture: currentAssembly.Culture,
                                          memberName: "", markers: null, tail: null, readingGraph: readingGraph));
        }
Example #19
0
        public void TestFindAllGraphs()
        {
            // All graphs in a->b-->b1->b2->b3->b4->b5
            //                 / \\_
            //                 +-+  \->c
            // are:

            WorkingGraph graph = CreateGraphWithLongTail();

            var traverser = new TestTraverser(graph.VisibleDependencies, new PathRegex(":(.:)*"));

            traverser.Traverse(graph.VisibleDependencies.First().UsingItem);

            Assert.AreEqual(15, traverser.RecordedPaths.Count());
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:0");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:0", "b:0");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:0", "c:");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:0", "b:1");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:0", "b:1", "b:2");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:0", "b:1", "b:2", "b:3");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:0", "b:1", "b:2", "b:3", "b:4");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:0", "b:1", "b:2", "b:3", "b:4", "b:5");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "c:");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:1");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:1", "b:2");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:1", "b:2", "b:3");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:1", "b:2", "b:3", "b:4");
            AssertRecordedDependenciesContainPath(traverser.RecordedPaths, "a:", "b:0", "b:1", "b:2", "b:3", "b:4", "b:5");
        }
Example #20
0
        private FromTo ProjectDependency(WorkingGraph currentWorkingGraph, Dependency d,
                                         Dictionary <Item, Item> leftSideCache, Dictionary <Item, Item> rightSideCache,
                                         Dictionary <FromTo, Dependency> localCollector, int dependencyProjectCountForLogging, Func <bool> onMissingPattern)
        {
            Item usingItem = ProjectItem(currentWorkingGraph, leftSideCache, d.UsingItem, left: true,
                                         dependencyProjectCountForLogging: dependencyProjectCountForLogging);
            Item usedItem = ProjectItem(currentWorkingGraph, rightSideCache, d.UsedItem, left: false,
                                        dependencyProjectCountForLogging: dependencyProjectCountForLogging);

            if (usingItem == null)
            {
                if (onMissingPattern())
                {
                    Log.WriteWarning("No projection pattern found for " + d.UsingItem.AsString() + " - I ignore it");
                }
                return(null);
            }
            else if (usedItem == null)
            {
                if (onMissingPattern())
                {
                    Log.WriteWarning("No projection pattern found for " + d.UsedItem.AsString() + " - I ignore it");
                }
                return(null);
            }
            else if (usingItem.IsEmpty() || usedItem.IsEmpty())
            {
                // ignore this edge!
                return(null);
            }
            else
            {
                return(new FromTo(usingItem, usedItem).AggregateDependency(currentWorkingGraph, d, localCollector));
            }
        }
Example #21
0
        protected IEnumerable <RawDependency> ReadRawDependencies(int depth, WorkingGraph readingGraph)
        {
            Log.WriteInfo(new string(' ', 2 * depth) + "Reading " + FullFileName);
            var resolver = new DefaultAssemblyResolver();

            resolver.AddSearchDirectory(Path.GetDirectoryName(FullFileName));
            // readingGraph: Additional search directories should be specifiable in options
            resolver.AddSearchDirectory(@"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\Silverlight\v5.0");
            AssemblyDefinition assembly = AssemblyDefinition.ReadAssembly(FullFileName, new ReaderParameters {
                AssemblyResolver = resolver
            });

            try {
                assembly.MainModule.ReadSymbols();
            } catch (Exception ex) {
                Log.WriteWarning($"Loading symbols for assembly {FullFileName} failed - maybe .PDB file is missing. ({ex.Message})", FullFileName, 0);
            }

            ItemTail customSections = GetCustomSections(readingGraph, assembly.CustomAttributes, null);

            foreach (TypeDefinition type in assembly.MainModule.Types)
            {
                if (type.Name == "<Module>")
                {
                    continue;
                }

                foreach (var dependency in AnalyzeType(type, customSections, readingGraph))
                {
                    yield return(dependency);
                }
            }
        }
Example #22
0
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph transformingGraph)
        {
            ItemType t3 = ItemType.New("T3(ShortName:MiddleName:LongName)");

            var a = transformingGraph.CreateItem(t3, "a:aa:aaa".Split(':'));
            var b = transformingGraph.CreateItem(t3, "b:bb:bbb".Split(':'));
            var c = transformingGraph.CreateItem(t3, "c:cc:ccc".Split(':'));
            var d = transformingGraph.CreateItem(t3, "d:dd:ddd".Split(':'));
            var e = transformingGraph.CreateItem(t3, "e:ee:eee".Split(':'));
            var f = transformingGraph.CreateItem(t3, "f:ff:fff".Split(':'));
            var g = transformingGraph.CreateItem(t3, "g:gg:ggg".Split(':'));
            var h = transformingGraph.CreateItem(t3, "h:hh:hhh".Split(':'));

            return(new[] {
                FromTo(transformingGraph, a, b),
                FromTo(transformingGraph, a, h),
                FromTo(transformingGraph, b, c),
                FromTo(transformingGraph, c, d),
                FromTo(transformingGraph, d, e),
                FromTo(transformingGraph, d, b),
                FromTo(transformingGraph, e, f),
                FromTo(transformingGraph, b, g),
                FromTo(transformingGraph, h, g),
            });
        }
Example #23
0
        public void TestSimpleCycle()
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var nodes = new[] {
                graph.CreateItem(ItemType.SIMPLE, new[] { "n1" }),
                graph.CreateItem(ItemType.SIMPLE, new[] { "n2" }),
                graph.CreateItem(ItemType.SIMPLE, new[] { "n3" })
            };
            var edges = new[] {
                CreateDependency(graph, nodes[2], nodes[1], 55),
                CreateDependency(graph, nodes[2], nodes[0], 111),
                CreateDependency(graph, nodes[1], nodes[0], 77),
                CreateDependency(graph, nodes[0], nodes[2], 7),
                CreateDependency(graph, nodes[0], nodes[0], 999),
            };

            using (var s = new MemoryStream()) {
                new MatrixRenderer1().RenderToStreamForUnitTests(gc, edges, s, "");
                Assert.AreEqual(@"Id  ;Name;001;    ;002;    ;003;    
001;n3  ;    ;    ;    ;    ;#  7;    
002;n2  ;  55;    ;    ;    ;    ;    
003;n1  ; 111;    ;  77;    ; 999;    
", Encoding.ASCII.GetString(s.ToArray()));
            }
        }
Example #24
0
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph transformingGraph)
        {
            Item a = transformingGraph.CreateItem(ItemType.SIMPLE, "Ax");
            Item b = transformingGraph.CreateItem(ItemType.SIMPLE, "Bx");
            Item c = transformingGraph.CreateItem(ItemType.SIMPLE, "Cloop");
            Item d = transformingGraph.CreateItem(ItemType.SIMPLE, "Dloop");
            Item e = transformingGraph.CreateItem(ItemType.SIMPLE, "Eselfloop");
            Item f = transformingGraph.CreateItem(ItemType.SIMPLE, "Fy");
            Item g = transformingGraph.CreateItem(ItemType.SIMPLE, "Gy");
            Item h = transformingGraph.CreateItem(ItemType.SIMPLE, "Hy");
            Item i = transformingGraph.CreateItem(ItemType.SIMPLE, "Iy");
            Item j = transformingGraph.CreateItem(ItemType.SIMPLE, "Jy");

            return(new[] {
                // Pure sources
                transformingGraph.CreateDependency(a, b, source: null, markers: "", ct: 10, questionableCt: 5, badCt: 3, notOkReason: "test data"),
                transformingGraph.CreateDependency(b, c, source: null, markers: "", ct: 1, questionableCt: 0, badCt: 0),

                // Long cycle
                transformingGraph.CreateDependency(c, d, source: null, markers: "", ct: 5, questionableCt: 0, badCt: 2, notOkReason: "test data"),
                transformingGraph.CreateDependency(d, c, source: null, markers: "", ct: 5, questionableCt: 0, badCt: 2, notOkReason: "test data"),

                transformingGraph.CreateDependency(d, e, source: null, markers: "", ct: 5, questionableCt: 3, badCt: 2, notOkReason: "test data"),
                // Self cycle
                transformingGraph.CreateDependency(e, e, source: null, markers: "", ct: 5, questionableCt: 3, badCt: 2, notOkReason: "test data"),
                // Pure sinks
                transformingGraph.CreateDependency(e, f, source: null, markers: "", ct: 5, questionableCt: 3, badCt: 2, notOkReason: "test data"),
                transformingGraph.CreateDependency(f, g, source: null, markers: "", ct: 5, questionableCt: 3, badCt: 2, notOkReason: "test data"),
                transformingGraph.CreateDependency(g, h, source: null, markers: "", ct: 5, questionableCt: 3, badCt: 2, notOkReason: "test data"),
                transformingGraph.CreateDependency(h, i, source: null, markers: "", ct: 5, questionableCt: 3, badCt: 2, notOkReason: "test data"),
                transformingGraph.CreateDependency(h, j, source: null, markers: "", ct: 5, questionableCt: 3, badCt: 2, notOkReason: "test data"),
            });
        }
Example #25
0
        private static List <Dependency> FindLaterCycle(string cycleMarkerPrefix)
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var a    = graph.CreateItem(ItemType.SIMPLE, "a");
            var b    = graph.CreateItem(ItemType.SIMPLE, "b");
            var c    = graph.CreateItem(ItemType.SIMPLE, "c");
            var d    = graph.CreateItem(ItemType.SIMPLE, "d");
            var e    = graph.CreateItem(ItemType.SIMPLE, "e");
            var deps = new[] {
                graph.CreateDependency(a, b, null, "", 1),
                graph.CreateDependency(b, c, null, "", 1),
                graph.CreateDependency(c, d, null, "", 1),
                graph.CreateDependency(d, e, null, "", 1),
                graph.CreateDependency(e, c, null, "", 1),
            };
            var result = new List <Dependency>();

            new MarkCycleDeps().Transform(gc, Ignore.Om, new MarkCycleDeps.TransformOptions {
                IndexedMarkerPrefix = cycleMarkerPrefix
            }, deps, result);

            result.Sort((x, y) => string.Compare(x.UsingItemAsString, y.UsingItemAsString, StringComparison.Ordinal));
            return(result);
        }
Example #26
0
        public void TestMarkCutFromMultipleSources()
        {
            var gc = new GlobalContext();

            Dependency[] exampleDependencies = CreateExampleGraph(gc);
            Item         s     = exampleDependencies[0].UsingItem;
            WorkingGraph graph = gc.CurrentGraph;
            Item         r0    = graph.CreateItem(ItemType.SIMPLE, "r0");
            Item         r1    = graph.CreateItem(ItemType.SIMPLE, "r1");
            Item         r2    = graph.CreateItem(ItemType.SIMPLE, "r2");

            Dependency[] dependencies = exampleDependencies.Concat(new[] {
                graph.CreateDependency(r0, s, null, "r0_s", 1000, 0, 1000, notOkReason: "test data"),
                graph.CreateDependency(r1, s, null, "r1_s", 1000, 0, 1000, notOkReason: "test data"),
                graph.CreateDependency(r2, s, null, "r2_s", 1000, 0, 1000, notOkReason: "test data"),
            }).ToArray();

            const string             mark   = "CUT";
            IEnumerable <Dependency> result = Run(gc, new MarkMinimalCutDeps.TransformOptions {
                SourceMatches = new List <ItemMatch> {
                    new ItemMatch("r*", false, anyWhereMatcherOk: true)
                },
                TargetMatches = new List <ItemMatch> {
                    new ItemMatch("t", false, anyWhereMatcherOk: true)
                },
                MarkerToAddToCut = mark
            }, dependencies);

            Assert.IsTrue(result.All(z => z.MarkersContain(mark) == new[] { 12, 36, 78 }.Contains(z.Ct)),
                          string.Join("\r\n", result.Select(z => z.AsLimitableStringWithTypes(withExampleInfo: false, threeLines: false))));
        }
Example #27
0
        public void TestMarkLaterCycleWithExplicitAsserts()
        {
            var          gc    = new GlobalContext();
            WorkingGraph graph = gc.CurrentGraph;

            var a    = graph.CreateItem(ItemType.SIMPLE, "a");
            var b    = graph.CreateItem(ItemType.SIMPLE, "b");
            var c    = graph.CreateItem(ItemType.SIMPLE, "c");
            var d    = graph.CreateItem(ItemType.SIMPLE, "d");
            var e    = graph.CreateItem(ItemType.SIMPLE, "e");
            var deps = new[] {
                graph.CreateDependency(a, b, null, "", 1),
                graph.CreateDependency(b, c, null, "", 1),
                graph.CreateDependency(c, d, null, "", 1),
                graph.CreateDependency(d, e, null, "", 1),
                graph.CreateDependency(e, c, null, "", 1),
            };
            var result = new List <Dependency>();

            new MarkCycleDeps().Transform(gc, Ignore.Om,
                                          new MarkCycleDeps.TransformOptions {
                KeepOnlyCycleDependencies = true
            }, deps, result);

            result.Sort((x, y) => string.Compare(x.UsingItemAsString, y.UsingItemAsString, StringComparison.Ordinal));

            Assert.AreEqual(3, result.Count);
            Assert.AreEqual(c, result[0].UsingItem);
            Assert.AreEqual(1, result[0].BadCt);
            Assert.AreEqual(d, result[1].UsingItem);
            Assert.AreEqual(1, result[1].BadCt);
            Assert.AreEqual(e, result[2].UsingItem);
            Assert.AreEqual(1, result[2].BadCt);
        }
Example #28
0
        public void TestMarkTrivialCut()
        {
            var          gc           = new GlobalContext();
            WorkingGraph graph        = gc.CurrentGraph;
            Item         a            = graph.CreateItem(ItemType.SIMPLE, "a");
            Item         b            = graph.CreateItem(ItemType.SIMPLE, "b");
            Item         c            = graph.CreateItem(ItemType.SIMPLE, "c");
            Item         d            = graph.CreateItem(ItemType.SIMPLE, "d");
            var          dependencies = new[] {
                graph.CreateDependency(a, b, null, "D10", 10, 0, 4, notOkReason: "test data"),
                graph.CreateDependency(b, c, null, "D20", 20, 0, 2, notOkReason: "test data"), // critical edge
                graph.CreateDependency(c, d, null, "D30", 30, 0, 1, notOkReason: "test data"),
                graph.CreateDependency(c, d, null, "D40", 40, 0, 3, notOkReason: "test data"),
            };

            const string             mark   = "CUT";
            IEnumerable <Dependency> result = Run(gc,
                                                  new MarkMinimalCutDeps.TransformOptions {
                SourceMatches = new List <ItemMatch> {
                    new ItemMatch("a", false, anyWhereMatcherOk: true)
                },
                TargetMatches = new List <ItemMatch> {
                    new ItemMatch("d", false, anyWhereMatcherOk: true)
                },
                MarkerToAddToCut = mark
            }, dependencies);

            Assert.IsTrue(result.All(z => z.MarkersContain(mark) == (z.Ct == 20)), string.Join("\r\n", result.Select(z => z.AsLimitableStringWithTypes(withExampleInfo: false, threeLines: false))));
        }
Example #29
0
        public override IEnumerable <Dependency> CreateSomeTestDependencies(WorkingGraph transformingGraph)
        {
            Item a = transformingGraph.CreateItem(ItemType.SIMPLE, "A");
            Item b = transformingGraph.CreateItem(ItemType.SIMPLE, "B");
            Item c = transformingGraph.CreateItem(ItemType.SIMPLE, "C");
            Item d = transformingGraph.CreateItem(ItemType.SIMPLE, "D");
            Item e = transformingGraph.CreateItem(ItemType.SIMPLE, "E");
            Item f = transformingGraph.CreateItem(ItemType.SIMPLE, "F");
            Item g = transformingGraph.CreateItem(ItemType.SIMPLE, "G");
            Item h = transformingGraph.CreateItem(ItemType.SIMPLE, "H");
            Item i = transformingGraph.CreateItem(ItemType.SIMPLE, "I");
            Item j = transformingGraph.CreateItem(ItemType.SIMPLE, "J");

            //   a<=>b->c->d->e<=>f->g
            //          ^  ^         |
            // h<=>i->j-+  +---------+
            return(new[] {
                transformingGraph.CreateDependency(a, b, source: null, markers: "", ct: 1), // on cycle
                transformingGraph.CreateDependency(b, a, source: null, markers: "", ct: 1), // on cycle
                transformingGraph.CreateDependency(b, c, source: null, markers: "", ct: 1),
                transformingGraph.CreateDependency(c, d, source: null, markers: "", ct: 1),
                transformingGraph.CreateDependency(d, e, source: null, markers: "", ct: 1), // on cycle
                transformingGraph.CreateDependency(e, f, source: null, markers: "", ct: 1), // on cycle
                transformingGraph.CreateDependency(f, e, source: null, markers: "", ct: 1), // on cycle
                transformingGraph.CreateDependency(f, g, source: null, markers: "", ct: 1), // on cycle
                transformingGraph.CreateDependency(g, d, source: null, markers: "", ct: 1), // on cycle
                transformingGraph.CreateDependency(h, i, source: null, markers: "", ct: 1), // on cycle
                transformingGraph.CreateDependency(i, h, source: null, markers: "", ct: 1), // on cycle
                transformingGraph.CreateDependency(i, j, source: null, markers: "", ct: 1),
                transformingGraph.CreateDependency(j, c, source: null, markers: "", ct: 1),
            });
        }
Example #30
0
        /// <summary>
        /// Return projected string for some item.
        /// </summary>
        /// <param name="cachingGraph"></param>
        /// <param name="item">Iitem to be projected.</param>
        /// <param name="left">Item is on left side of dependency</param>
        /// <returns>Projected item; or <c>null</c> if item does not
        /// match projection</returns>
        public Item Match(WorkingGraph cachingGraph, [NotNull] Item item, bool left)
        {
            if (left && !_forLeftSide || !left && !_forRightSide)
            {
                return(null);
            }
            else
            {
                var matchResultGroups = ItemMatch.Matches(item);

                if (!matchResultGroups.Success)
                {
                    return(null);
                }
                else
                {
                    IEnumerable <string> targets = _targetSegments;
                    for (int i = 0; i < matchResultGroups.Groups.Length; i++)
                    {
                        int matchResultIndex = i;
                        targets = targets.Select(s => s.Replace("\\" + (matchResultIndex + 1), matchResultGroups.Groups[matchResultIndex]));
                    }
                    _matchCount++;
                    return(cachingGraph.CreateItem(_targetItemType, targets.Select(t => GlobalContext.ExpandHexChars(t)).ToArray()));
                }
            }
        }