C#: Fix loop that iterates only once

This commit is contained in:
Tamas Vajk
2020-10-02 10:37:38 +02:00
parent 79eff06828
commit 412b87c5c7
4 changed files with 42 additions and 34 deletions

View File

@@ -56,17 +56,19 @@ namespace Semmle.Extraction.PDB
public static MetadataPdbReader? CreateFromAssembly(string assemblyPath, PEReader peReader)
{
foreach (var provider in peReader.
ReadDebugDirectory().
Where(d => d.Type == DebugDirectoryEntryType.EmbeddedPortablePdb).
Select(dirEntry => peReader.ReadEmbeddedPortablePdbDebugDirectoryData(dirEntry)))
var provider = peReader
.ReadDebugDirectory()
.Where(d => d.Type == DebugDirectoryEntryType.EmbeddedPortablePdb)
.Select(dirEntry => peReader.ReadEmbeddedPortablePdbDebugDirectoryData(dirEntry))
.FirstOrDefault();
if (provider is object)
{
return new MetadataPdbReader(provider);
}
try
{
MetadataReaderProvider provider;
string pdbPath;
if (peReader.TryOpenAssociatedPortablePdb(assemblyPath, s => new FileStream(s, FileMode.Open, FileAccess.Read, FileShare.Read), out provider, out pdbPath))
{

View File

@@ -96,11 +96,13 @@ namespace Semmle.Extraction.PDB
var debugDirectory = peReader.ReadDebugDirectory();
foreach (var path in debugDirectory.
Where(d => d.Type == DebugDirectoryEntryType.CodeView).
Select(peReader.ReadCodeViewDebugDirectoryData).
Select(cv => cv.Path).
Where(path => File.Exists(path)))
var path = debugDirectory
.Where(d => d.Type == DebugDirectoryEntryType.CodeView)
.Select(peReader.ReadCodeViewDebugDirectoryData)
.Select(cv => cv.Path)
.FirstOrDefault(File.Exists);
if (path is object)
{
return new NativePdbReader(path);
}

View File

@@ -27,8 +27,12 @@ namespace Semmle.Extraction.CSharp.Standalone
: new[] { "/usr/share/dotnet", @"C:\Program Files\dotnet" };
var coreDirs = dotnetDirs.Select(d => Path.Combine(d, "shared", "Microsoft.NETCore.App"));
foreach (var dir in coreDirs.Where(Directory.Exists))
var dir = coreDirs.FirstOrDefault(Directory.Exists);
if (dir is object)
{
return Directory.EnumerateDirectories(dir).OrderByDescending(Path.GetFileName);
}
return Enumerable.Empty<string>();
}
}
@@ -48,15 +52,17 @@ namespace Semmle.Extraction.CSharp.Standalone
if (Directory.Exists(@"C:\Windows\Microsoft.NET\Framework64"))
{
return Directory.EnumerateDirectories(@"C:\Windows\Microsoft.NET\Framework64", "v*").
OrderByDescending(Path.GetFileName);
return Directory.EnumerateDirectories(@"C:\Windows\Microsoft.NET\Framework64", "v*")
.OrderByDescending(Path.GetFileName);
}
foreach (var dir in monoDirs.Where(Directory.Exists))
var dir = monoDirs.FirstOrDefault(Directory.Exists);
if (dir is object)
{
return Directory.EnumerateDirectories(dir).
Where(d => Char.IsDigit(Path.GetFileName(d)[0])).
OrderByDescending(Path.GetFileName);
return Directory.EnumerateDirectories(dir)
.Where(d => Char.IsDigit(Path.GetFileName(d)[0]))
.OrderByDescending(Path.GetFileName);
}
return Enumerable.Empty<string>();

View File

@@ -256,25 +256,23 @@ namespace Semmle.Extraction.CSharp
}
else
{
bool referenceFound = false;
var composed = referencePaths.Value
.Select(path => Path.Combine(path, clref.Reference))
.Where(path => File.Exists(path))
.Select(path => canonicalPathCache.GetCanonicalPath(path))
.FirstOrDefault();
if (composed is object)
{
foreach (var composed in referencePaths.Value.
Select(path => Path.Combine(path, clref.Reference)).
Where(path => File.Exists(path)).
Select(path => canonicalPathCache.GetCanonicalPath(path)))
var reference = MakeReference(clref, composed);
ret.Add(reference);
}
else
{
lock (analyser)
{
referenceFound = true;
var reference = MakeReference(clref, composed);
ret.Add(reference);
break;
}
if (!referenceFound)
{
lock (analyser)
{
analyser.Logger.Log(Severity.Error, " Unable to resolve reference '{0}'", clref.Reference);
++analyser.CompilationErrors;
}
analyser.Logger.Log(Severity.Error, " Unable to resolve reference '{0}'", clref.Reference);
++analyser.CompilationErrors;
}
}
}