提交 93435e00 编写于 作者: H Heejae Chang

split some files to its own file - PR.feedback

more clean up after feedback
上级 eb2e6f4a
......@@ -50,12 +50,12 @@ public async Task<AnalysisData> GetSyntaxAnalysisDataAsync(DiagnosticAnalyzerDri
}
}
public async Task<AnalysisData> GetDocumentAnalysisDataAsync(DiagnosticAnalyzerDriver analyzerDrvier, StateSet stateSet, VersionArgument versions)
public async Task<AnalysisData> GetDocumentAnalysisDataAsync(DiagnosticAnalyzerDriver analyzerDriver, StateSet stateSet, VersionArgument versions)
{
try
{
var document = analyzerDrvier.Document;
var cancellationToken = analyzerDrvier.CancellationToken;
var document = analyzerDriver.Document;
var cancellationToken = analyzerDriver.CancellationToken;
var state = stateSet.GetState(StateType.Document);
var existingData = await state.TryGetExistingDataAsync(document, cancellationToken).ConfigureAwait(false);
......@@ -65,7 +65,7 @@ public async Task<AnalysisData> GetDocumentAnalysisDataAsync(DiagnosticAnalyzerD
return existingData;
}
var diagnosticData = await GetSemanticDiagnosticsAsync(analyzerDrvier, stateSet.Analyzer).ConfigureAwait(false);
var diagnosticData = await GetSemanticDiagnosticsAsync(analyzerDriver, stateSet.Analyzer).ConfigureAwait(false);
return new AnalysisData(versions.TextVersion, versions.DataVersion, GetExistingItems(existingData), diagnosticData.AsImmutableOrEmpty());
}
catch (Exception e) when (FatalError.ReportUnlessCanceled(e))
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Immutable;
namespace Microsoft.CodeAnalysis.Diagnostics.EngineV1
{
internal partial class DiagnosticIncrementalAnalyzer
{
/// <summary>
/// EventArgs for <see cref="StateManager.ProjectAnalyzerReferenceChanged"/>
///
/// this event args contains information such as <see cref="Project"/> the <see cref="AnalyzerReference"/> has changed
/// and what <see cref="StateSet"/> has changed.
/// </summary>
private class ProjectAnalyzerReferenceChangedEventArgs : EventArgs
{
public readonly Project Project;
public readonly ImmutableArray<StateSet> Added;
public readonly ImmutableArray<StateSet> Removed;
public ProjectAnalyzerReferenceChangedEventArgs(Project project, ImmutableArray<StateSet> added, ImmutableArray<StateSet> removed)
{
Project = project;
Added = added;
Removed = removed;
}
}
}
}
......@@ -152,85 +152,5 @@ private static void VerifyDiagnosticStates(IEnumerable<StateSet> stateSets)
}
}
}
private class ProjectAnalyzerReferenceChangedEventArgs : EventArgs
{
public readonly Project Project;
public readonly ImmutableArray<StateSet> Added;
public readonly ImmutableArray<StateSet> Removed;
public ProjectAnalyzerReferenceChangedEventArgs(Project project, ImmutableArray<StateSet> added, ImmutableArray<StateSet> removed)
{
Project = project;
Added = added;
Removed = removed;
}
}
private class StateSet
{
private const string UserDiagnosticsPrefixTableName = "<UserDiagnostics>";
private readonly string _language;
private readonly DiagnosticAnalyzer _analyzer;
private readonly DiagnosticState[] _state;
public StateSet(string language, DiagnosticAnalyzer analyzer)
{
_language = language;
_analyzer = analyzer;
_state = CreateDiagnosticStates(language, analyzer);
}
public string Language => _language;
public DiagnosticAnalyzer Analyzer => _analyzer;
public DiagnosticState GetState(StateType stateType)
{
return _state[(int)stateType];
}
public void Remove(object key)
{
for (var stateType = 0; stateType < s_stateTypeCount; stateType++)
{
_state[stateType].Remove(key);
}
}
private static DiagnosticState[] CreateDiagnosticStates(string language, DiagnosticAnalyzer analyzer)
{
var states = new DiagnosticState[s_stateTypeCount];
for (int stateType = 0; stateType < s_stateTypeCount; stateType++)
{
var nameAndVersion = GetNameAndVersion(analyzer, (StateType)stateType);
var name = nameAndVersion.Item1;
var version = nameAndVersion.Item2;
states[stateType] = new DiagnosticState(name, version, language);
}
return states;
}
/// <summary>
/// Get the unique state name for the given {type, analyzer} tuple.
/// Note that this name is used by the underlying persistence stream of the corresponding <see cref="DiagnosticState"/> to Read/Write diagnostic data into the stream.
/// If any two distinct {type, analyzer} tuples have the same diagnostic state name, we will end up sharing the persistence stream between them, leading to duplicate/missing/incorrect diagnostic data.
/// </summary>
private static ValueTuple<string, VersionStamp> GetNameAndVersion(DiagnosticAnalyzer analyzer, StateType type)
{
Contract.ThrowIfNull(analyzer);
// Get the unique ID for given diagnostic analyzer.
// note that we also put version stamp so that we can detect changed analyzer.
var tuple = analyzer.GetUniqueId();
return ValueTuple.Create(UserDiagnosticsPrefixTableName + "_" + type.ToString() + "_" + tuple.Item1, tuple.Item2);
}
}
}
}
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using Roslyn.Utilities;
namespace Microsoft.CodeAnalysis.Diagnostics.EngineV1
{
internal partial class DiagnosticIncrementalAnalyzer
{
/// <summary>
/// this contains all states regarding a <see cref="DiagnosticAnalyzer"/>
///
/// use <see cref="StateSet.GetState(StateType)"/> to retrieve specific <see cref="StateType"/> of <see cref="DiagnosticState"/>
/// </summary>
private class StateSet
{
private const string UserDiagnosticsPrefixTableName = "<UserDiagnostics>";
private readonly string _language;
private readonly DiagnosticAnalyzer _analyzer;
private readonly DiagnosticState[] _state;
public StateSet(string language, DiagnosticAnalyzer analyzer)
{
_language = language;
_analyzer = analyzer;
_state = CreateDiagnosticStates(language, analyzer);
}
public string Language => _language;
public DiagnosticAnalyzer Analyzer => _analyzer;
public DiagnosticState GetState(StateType stateType)
{
return _state[(int)stateType];
}
public void Remove(object key)
{
for (var stateType = 0; stateType < s_stateTypeCount; stateType++)
{
_state[stateType].Remove(key);
}
}
private static DiagnosticState[] CreateDiagnosticStates(string language, DiagnosticAnalyzer analyzer)
{
var states = new DiagnosticState[s_stateTypeCount];
for (int stateType = 0; stateType < s_stateTypeCount; stateType++)
{
var nameAndVersion = GetNameAndVersion(analyzer, (StateType)stateType);
var name = nameAndVersion.Item1;
var version = nameAndVersion.Item2;
states[stateType] = new DiagnosticState(name, version, language);
}
return states;
}
/// <summary>
/// Get the unique state name for the given {type, analyzer} tuple.
/// Note that this name is used by the underlying persistence stream of the corresponding <see cref="DiagnosticState"/> to Read/Write diagnostic data into the stream.
/// If any two distinct {type, analyzer} tuples have the same diagnostic state name, we will end up sharing the persistence stream between them, leading to duplicate/missing/incorrect diagnostic data.
/// </summary>
private static ValueTuple<string, VersionStamp> GetNameAndVersion(DiagnosticAnalyzer analyzer, StateType type)
{
Contract.ThrowIfNull(analyzer);
// Get the unique ID for given diagnostic analyzer.
// note that we also put version stamp so that we can detect changed analyzer.
var tuple = analyzer.GetUniqueId();
return ValueTuple.Create(UserDiagnosticsPrefixTableName + "_" + type.ToString() + "_" + tuple.Item1, tuple.Item2);
}
}
}
}
......@@ -179,9 +179,11 @@
<Compile Include="Diagnostics\AnalyzerDriverResources.cs" />
<Compile Include="Diagnostics\AnalyzerHelper.cs" />
<Compile Include="Diagnostics\AbstractHostDiagnosticUpdateSource.cs" />
<Compile Include="Diagnostics\EngineV1\DiagnosticIncrementalAnalyzer.ProjectAnalyzerReferenceChangedEventArgs.cs" />
<Compile Include="Diagnostics\EngineV1\DiagnosticIncrementalAnalyzer.StateManager.cs" />
<Compile Include="Diagnostics\EngineV1\DiagnosticIncrementalAnalyzer.StateManager.HostStates.cs" />
<Compile Include="Diagnostics\EngineV1\DiagnosticIncrementalAnalyzer.StateManager.ProjectStates.cs" />
<Compile Include="Diagnostics\EngineV1\DiagnosticIncrementalAnalyzer.StateSet.cs" />
<Compile Include="Diagnostics\HostAnalyzerManager.cs" />
<Compile Include="Diagnostics\Analyzers\IDEDiagnosticIds.cs" />
<Compile Include="Diagnostics\BaseDiagnosticIncrementalAnalyzer.cs" />
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册