提交 35b9e897 编写于 作者: D Dustin Campbell

Greatly improve performance of Object Browser first open

Object Browser was forcing compilations to be realized just to compute the assembly identity for each of a compilation's metadata references. With this change, the Object Browser will use the metadata references from the project and call the same utility function that is used to read assembly identity for analyzer assemblies.
上级 85885b53
......@@ -75,8 +75,8 @@
<Compile Include="..\..\Shared\CoreClrAnalyzerAssemblyLoader.cs">
<Link>CoreClrAnalyzerAssemblyLoader.cs</Link>
</Compile>
<Compile Include="..\..\Shared\AnalyzerAssemblyLoadUtils.cs">
<Link>AnalyzerAssemblyLoadUtils.cs</Link>
<Compile Include="..\..\Shared\AssemblyIdentityUtils.cs">
<Link>AssemblyIdentityUtils.cs</Link>
</Compile>
<Compile Include="Csc.cs" />
<Compile Include="Program.cs" />
......
......@@ -53,8 +53,8 @@
<Compile Include="..\..\Shared\AbstractAnalyzerAssemblyLoader.cs">
<Link>AbstractAnalyzerAssemblyLoader.cs</Link>
</Compile>
<Compile Include="..\..\Shared\AnalyzerAssemblyLoadUtils.cs">
<Link>AnalyzerAssemblyLoadUtils.cs</Link>
<Compile Include="..\..\Shared\AssemblyIdentityUtils.cs">
<Link>AssemblyIdentityUtils.cs</Link>
</Compile>
<Compile Include="..\..\Shared\ConsoleUtil.cs">
<Link>ConsoleUtil.cs</Link>
......
......@@ -51,8 +51,8 @@
<Compile Include="..\..\Shared\AbstractAnalyzerAssemblyLoader.cs">
<Link>AbstractAnalyzerAssemblyLoader.cs</Link>
</Compile>
<Compile Include="..\..\Shared\AnalyzerAssemblyLoadUtils.cs">
<Link>AnalyzerAssemblyLoadUtils.cs</Link>
<Compile Include="..\..\Shared\AssemblyIdentityUtils.cs">
<Link>AssemblyIdentityUtils.cs</Link>
</Compile>
<Compile Include="..\..\Shared\ShadowCopyAnalyzerAssemblyLoader.cs">
<Link>ShadowCopyAnalyzerAssemblyLoader.cs</Link>
......
......@@ -11,7 +11,7 @@
using System.Reflection.PortableExecutable;
using Roslyn.Utilities;
using static Microsoft.CodeAnalysis.AnalyzerAssemblyLoadUtils;
using static Microsoft.CodeAnalysis.AssemblyIdentityUtils;
namespace Microsoft.CodeAnalysis
{
......
......@@ -9,7 +9,7 @@
namespace Microsoft.CodeAnalysis
{
internal static class AnalyzerAssemblyLoadUtils
internal static class AssemblyIdentityUtils
{
public static AssemblyIdentity TryGetAssemblyIdentity(string filePath)
{
......@@ -34,6 +34,7 @@ public static AssemblyIdentity TryGetAssemblyIdentity(string filePath)
ImmutableArray<byte> publicKeyOrToken = !publicKeyHandle.IsNil
? metadataReader.GetBlobBytes(publicKeyHandle).AsImmutableOrNull()
: default(ImmutableArray<byte>);
return new AssemblyIdentity(name, version, cultureName, publicKeyOrToken, hasPublicKey);
}
}
......
......@@ -9,7 +9,7 @@
using System.Runtime.Loader;
using Roslyn.Utilities;
using static Microsoft.CodeAnalysis.AnalyzerAssemblyLoadUtils;
using static Microsoft.CodeAnalysis.AssemblyIdentityUtils;
namespace Microsoft.CodeAnalysis
{
......
......@@ -74,8 +74,8 @@
<Compile Include="..\..\Shared\CoreClrAnalyzerAssemblyLoader.cs">
<Link>CoreClrAnalyzerAssemblyLoader.cs</Link>
</Compile>
<Compile Include="..\..\Shared\AnalyzerAssemblyLoadUtils.cs">
<Link>AnalyzerAssemblyLoadUtils.cs</Link>
<Compile Include="..\..\Shared\AssemblyIdentityUtils.cs">
<Link>AssemblyIdentityUtils.cs</Link>
</Compile>
<Compile Include="Vbc.cs" />
<Compile Include="Program.cs" />
......
......@@ -72,8 +72,8 @@
<Compile Include="..\..\Shared\AbstractAnalyzerAssemblyLoader.cs">
<Link>AbstractAnalyzerAssemblyLoader.cs</Link>
</Compile>
<Compile Include="..\..\Shared\AnalyzerAssemblyLoadUtils.cs">
<Link>AnalyzerAssemblyLoadUtils.cs</Link>
<Compile Include="..\..\Shared\AssemblyIdentityUtils.cs">
<Link>AssemblyIdentityUtils.cs</Link>
</Compile>
<Compile Include="..\..\Shared\ConsoleUtil.cs">
<Link>ConsoleUtil.cs</Link>
......
......@@ -90,8 +90,8 @@
<Compile Include="..\..\..\Compilers\Shared\AbstractAnalyzerAssemblyLoader.cs">
<Link>AbstractAnalyzerAssemblyLoader.cs</Link>
</Compile>
<Compile Include="..\..\..\Compilers\Shared\AnalyzerAssemblyLoadUtils.cs">
<Link>AnalyzerAssemblyLoadUtils.cs</Link>
<Compile Include="..\..\..\Compilers\Shared\AssemblyIdentityUtils.cs">
<Link>AssemblyIdentityUtils.cs</Link>
</Compile>
<Compile Include="..\..\..\Compilers\Shared\SimpleAnalyzerAssemblyLoader.cs">
<Link>SimpleAnalyzerAssemblyLoader.cs</Link>
......
......@@ -626,28 +626,20 @@ public ImmutableArray<ObjectListItem> GetProjectListItems(Solution solution, str
assemblyIdentitySet = new HashSet<AssemblyIdentity>();
}
var compilation = project.GetCompilationAsync(cancellationToken).WaitAndGetResult(cancellationToken);
foreach (var reference in compilation.References)
foreach (var reference in project.MetadataReferences)
{
if (reference is CompilationReference)
{
continue;
}
var assemblySymbol = compilation.GetAssemblyOrModuleSymbol(reference) as IAssemblySymbol;
if (assemblySymbol == null)
var portableExecutableReference = reference as PortableExecutableReference;
if (portableExecutableReference != null)
{
continue;
}
if (assemblyIdentitySet.Contains(assemblySymbol.Identity))
{
continue;
var assemblyIdentity = AssemblyIdentityUtils.TryGetAssemblyIdentity(portableExecutableReference.FilePath);
if (assemblyIdentity != null && !assemblyIdentitySet.Contains(assemblyIdentity))
{
assemblyIdentitySet.Add(assemblyIdentity);
var referenceListItem = new ReferenceListItem(projectId, assemblyIdentity.Name, reference);
referenceListItemBuilder.Add(referenceListItem);
}
}
assemblyIdentitySet.Add(assemblySymbol.Identity);
referenceListItemBuilder.Add(new ReferenceListItem(projectId, assemblySymbol.Name, reference));
}
}
}
......
......@@ -950,33 +950,25 @@ protected override bool TryGetBrowseContainerData(uint index, ref VSCOMPONENTSEL
return false;
}
var metadataReference = referenceListItem.MetadataReference as PortableExecutableReference;
if (metadataReference == null)
var portableExecutableReference = referenceListItem.MetadataReference as PortableExecutableReference;
if (portableExecutableReference == null)
{
return false;
}
var compilation = referenceListItem.GetCompilation(this.LibraryManager.Workspace);
if (compilation == null)
var assemblyIdentity = AssemblyIdentityUtils.TryGetAssemblyIdentity(portableExecutableReference.FilePath);
if (assemblyIdentity == null)
{
return false;
}
var assemblySymbol = referenceListItem.GetAssembly(compilation);
if (assemblySymbol == null)
{
return false;
}
data.bstrFile = metadataReference.FilePath;
data.bstrFile = portableExecutableReference.FilePath;
data.type = VSCOMPONENTTYPE.VSCOMPONENTTYPE_ComPlus;
var identity = assemblySymbol.Identity;
data.wFileMajorVersion = (ushort)identity.Version.Major;
data.wFileMinorVersion = (ushort)identity.Version.Minor;
data.wFileBuildNumber = (ushort)identity.Version.Build;
data.wFileRevisionNumber = (ushort)identity.Version.Revision;
data.wFileMajorVersion = (ushort)assemblyIdentity.Version.Major;
data.wFileMinorVersion = (ushort)assemblyIdentity.Version.Minor;
data.wFileBuildNumber = (ushort)assemblyIdentity.Version.Build;
data.wFileRevisionNumber = (ushort)assemblyIdentity.Version.Revision;
}
return true;
......
......@@ -59,8 +59,8 @@
<Compile Include="..\..\..\Compilers\Shared\AbstractAnalyzerAssemblyLoader.cs">
<Link>InternalUtilities\AbstractAnalyzerAssemblyLoader.cs</Link>
</Compile>
<Compile Include="..\..\..\Compilers\Shared\AnalyzerAssemblyLoadUtils.cs">
<Link>AnalyzerAssemblyLoadUtils.cs</Link>
<Compile Include="..\..\..\Compilers\Shared\AssemblyIdentityUtils.cs">
<Link>AssemblyIdentityUtils.cs</Link>
</Compile>
<Compile Include="..\..\..\Compilers\Shared\GlobalAssemblyCacheHelpers\GlobalAssemblyCacheLocation.cs">
<Link>InternalUtilities\GlobalAssemblyCache.cs</Link>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册