예제 #1
0
        bool MatchingTranspilationDendencies(IFileCache owner, List <DependencyTriplet> transpilationDependencies)
        {
            if (transpilationDependencies == null)
            {
                return(true);
            }
            var hashToName = new Dictionary <byte[], string>(StructuralEqualityComparer <byte[]> .Default);

            hashToName.Add(owner.HashOfContent, owner.FullPath);
            var processed = new StructList <bool>();

            processed.RepeatAdd(false, (uint)transpilationDependencies.Count);
            bool somethingFailed;

            do
            {
                var somethingProcessed = false;
                somethingFailed = false;
                for (var i = 0u; i < processed.Count; i++)
                {
                    if (processed[i])
                    {
                        continue;
                    }
                    var dep = transpilationDependencies[(int)i];
                    if (!hashToName.TryGetValue(dep.SourceHash, out var sourceName))
                    {
                        somethingFailed = true;
                        continue;
                    }

                    somethingProcessed = true;
                    processed[i]       = true;
                    var targetName = ResolveImport(sourceName, dep.Import);
                    if (targetName == "?")
                    {
                        return(false);
                    }

                    Result.Path2FileInfo.TryGetValue(targetName, out var targetInfo);
                    if (!dep.TargetHash.AsSpan().SequenceEqual(targetInfo.Owner.HashOfContent))
                    {
                        return(false);
                    }

                    hashToName.TryAdd(targetInfo.Owner.HashOfContent, targetInfo.Owner.FullPath);
                }

                if (!somethingProcessed)
                {
                    return(!somethingFailed);
                }
            } while (somethingFailed);

            return(true);
        }