Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create rule S6932: Use model binding instead of reading raw request data #8902

Closed
wants to merge 70 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
fc3844c
WIP: Add the RegisterSymbolStart wrapper
martin-strecker-sonarsource Feb 22, 2024
5292552
Clean up
martin-strecker-sonarsource Feb 27, 2024
749ffd6
Rename
martin-strecker-sonarsource Feb 27, 2024
1af1a2e
More explanations
martin-strecker-sonarsource Feb 27, 2024
1ee7248
Add RegisterCodeBlockStartActionCS and RegisterOperationAction
martin-strecker-sonarsource Feb 28, 2024
c9fa25b
Add remaining register methods
martin-strecker-sonarsource Feb 28, 2024
808d845
Clean up
martin-strecker-sonarsource Feb 29, 2024
837463d
Add explanation
martin-strecker-sonarsource Feb 29, 2024
4455f4a
Add tests for missing VB support
martin-strecker-sonarsource Feb 29, 2024
d20e1a4
Add comments
martin-strecker-sonarsource Feb 29, 2024
30364b4
Formatting of comment
martin-strecker-sonarsource Feb 29, 2024
7ffd749
Add the Sonar wrapping
martin-strecker-sonarsource Feb 29, 2024
5c3e724
Move TestDiagnosticAnalyzer
martin-strecker-sonarsource Feb 29, 2024
dede597
Fix comment
martin-strecker-sonarsource Feb 29, 2024
d78c9ad
Cleanup
martin-strecker-sonarsource Feb 29, 2024
6cb5d33
Formattings
martin-strecker-sonarsource Mar 4, 2024
6946d47
Use property accessor instead of passing per ctor
martin-strecker-sonarsource Mar 4, 2024
b14acd4
Move registerCodeBlockAction and registerCodeBlockStartActionCS to Sy…
martin-strecker-sonarsource Mar 4, 2024
2ba613b
Move registerOperationAction
martin-strecker-sonarsource Mar 4, 2024
6c2b473
Move registerOperationBlockAction, registerOperationBlockStartAction,…
martin-strecker-sonarsource Mar 4, 2024
d778bb8
Move registerSyntaxNodeActionCS
martin-strecker-sonarsource Mar 4, 2024
1a95c97
Move comments
martin-strecker-sonarsource Mar 4, 2024
48dd732
Make SymbolStartAnalysisContext a readonly struct
martin-strecker-sonarsource Mar 4, 2024
1064cf6
Fix typo
martin-strecker-sonarsource Mar 4, 2024
ac551d9
Prepare tests
martin-strecker-sonarsource Mar 4, 2024
56887c7
Code review.
martin-strecker-sonarsource Mar 4, 2024
f6fa0f3
Remove unused using
martin-strecker-sonarsource Mar 4, 2024
439f729
Refactorings
martin-strecker-sonarsource Mar 5, 2024
844f5e5
Improve RegisterSymbolStartAction_SymbolStartProperties
martin-strecker-sonarsource Mar 5, 2024
6e4cdc6
Add registration tests.
martin-strecker-sonarsource Mar 5, 2024
a9e80e7
Add Microsoft.CodeAnalysis.VisualBasic.Workspaces dependency
martin-strecker-sonarsource Mar 5, 2024
9b7cab0
Add support for VB
martin-strecker-sonarsource Mar 5, 2024
bfd1b17
Add links to issues
martin-strecker-sonarsource Mar 6, 2024
934e746
Add packages.lock.json
martin-strecker-sonarsource Mar 6, 2024
0c66297
Remove packages.locks.json (VS created it after re-base)
martin-strecker-sonarsource Mar 6, 2024
8bc3099
Fix RS1001
martin-strecker-sonarsource Mar 6, 2024
003f84d
Rename SymbolStartAnalysisContext to SymbolStartAnalysisContextWrapper
martin-strecker-sonarsource Mar 11, 2024
f1fd978
Fix lambda comments
martin-strecker-sonarsource Mar 11, 2024
decc21e
Fix comment => placement
martin-strecker-sonarsource Mar 11, 2024
77634c4
Make fields readonly and rename
martin-strecker-sonarsource Mar 11, 2024
bb3dc6a
Move property
martin-strecker-sonarsource Mar 11, 2024
894e48e
Remove alias
martin-strecker-sonarsource Mar 11, 2024
e2d0ac4
Code review: UTs
martin-strecker-sonarsource Mar 11, 2024
aaf20e7
Use primary constructor in TestAnalyzerCS
martin-strecker-sonarsource Mar 11, 2024
36c4407
Inline "code" variable
martin-strecker-sonarsource Mar 11, 2024
49da9a5
Add RegisterSymbolStartAction_RegisterCodeBlockAction_ConditionalRegi…
martin-strecker-sonarsource Mar 11, 2024
a8c2e5e
Add ew line
martin-strecker-sonarsource Mar 11, 2024
362c5d0
Code smell and misleading comment and disable RS1036
martin-strecker-sonarsource Mar 11, 2024
9887381
Improve test coverage
martin-strecker-sonarsource Mar 11, 2024
358c360
Scaffold rule with ./scripts/rspec/rspec -language cs -ruleKey S6932 …
martin-strecker-sonarsource Mar 11, 2024
c72cfff
Add registrations for asp.net core controller
martin-strecker-sonarsource Mar 11, 2024
b35baa3
Pick changes from Martin/S2077_PetaPoco2 branch
martin-strecker-sonarsource Mar 11, 2024
e1692e1
Use tracker
martin-strecker-sonarsource Mar 11, 2024
7d4fc90
Add support for Form access
martin-strecker-sonarsource Mar 11, 2024
04e97f3
Comments
martin-strecker-sonarsource Mar 11, 2024
e270543
Support all NonCompliant cases
martin-strecker-sonarsource Mar 12, 2024
b664372
Add support for overrides
martin-strecker-sonarsource Mar 12, 2024
31ed892
Add IsOverridingFilterMethods and use ConcurrentStack
martin-strecker-sonarsource Mar 13, 2024
07282e4
Extract descriptors
martin-strecker-sonarsource Mar 13, 2024
9b5f929
Re-factor
martin-strecker-sonarsource Mar 13, 2024
255752a
Styling
martin-strecker-sonarsource Mar 13, 2024
8a5ab11
Add invokedMemberNodeConstraint to ArgumentDescriptor
martin-strecker-sonarsource Mar 13, 2024
84a10c9
Refactor and comments
martin-strecker-sonarsource Mar 14, 2024
844e049
Fix UT
martin-strecker-sonarsource Mar 14, 2024
344d1b1
Use LanguageFacade
martin-strecker-sonarsource Mar 14, 2024
6003c7f
Collection expression
martin-strecker-sonarsource Mar 14, 2024
d749c27
Add Request.RouteValues write test case and simplify descriptors. Pas…
martin-strecker-sonarsource Mar 14, 2024
837f3f9
Move Compliant() and NoncompliantKeyVariations to parameterized tests.
martin-strecker-sonarsource Mar 14, 2024
2f3698a
Add CombinatorialDataAttribute
martin-strecker-sonarsource Mar 14, 2024
9efa674
Move remaining parameterized tests
martin-strecker-sonarsource Mar 14, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
336 changes: 336 additions & 0 deletions analyzers/rspec/cs/S6932.html

Large diffs are not rendered by default.

25 changes: 25 additions & 0 deletions analyzers/rspec/cs/S6932.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
{
"title": "Use model binding instead of reading raw request data",
"type": "CODE_SMELL",
"status": "ready",
"remediation": {
"func": "Constant\/Issue",
"constantCost": "5min"
},
"tags": [
"asp.net"
],
"defaultSeverity": "Major",
"ruleSpecification": "RSPEC-6932",
"sqKey": "S6932",
"scope": "Main",
"quickfix": "infeasible",
"code": {
"impacts": {
"MAINTAINABILITY": "HIGH",
"RELIABILITY": "MEDIUM",
"SECURITY": "MEDIUM"
},
"attribute": "FOCUSED"
}
}
3 changes: 2 additions & 1 deletion analyzers/rspec/cs/Sonar_way_profile.json
Original file line number Diff line number Diff line change
Expand Up @@ -307,6 +307,7 @@
"S6797",
"S6798",
"S6800",
"S6803"
"S6803",
"S6932"
]
}
1 change: 1 addition & 0 deletions analyzers/src/RuleDescriptorGenerator/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -929,6 +929,7 @@
"type": "Project",
"dependencies": {
"Microsoft.CodeAnalysis.CSharp.Workspaces": "[1.3.2, )",
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": "[1.3.2, )",
"Microsoft.Composition": "[1.0.27, )",
"System.Collections.Immutable": "[1.1.37, )"
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* SonarAnalyzer for .NET
* Copyright (C) 2015-2024 SonarSource SA
* mailto: contact AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

using System.Diagnostics.CodeAnalysis;
using static System.Linq.Expressions.Expression;

namespace SonarAnalyzer.ShimLayer.AnalysisContext;

// Code is executed in static initializers and is not detected by the coverage tool
// See the SonarAnalysisContextTest.SonarCompilationStartAnalysisContext_RegisterSymbolStartAction family of tests to check test coverage manually
[ExcludeFromCodeCoverage]
public static class CompilationStartAnalysisContextExtensions
{
private static readonly Action<CompilationStartAnalysisContext, Action<SymbolStartAnalysisContextWrapper>, SymbolKind> RegisterSymbolStartActionWrapper =
CreateRegisterSymbolStartAnalysisWrapper();

public static void RegisterSymbolStartAction(this CompilationStartAnalysisContext context, Action<SymbolStartAnalysisContextWrapper> action, SymbolKind symbolKind) =>
RegisterSymbolStartActionWrapper(context, action, symbolKind);

private static Action<CompilationStartAnalysisContext, Action<SymbolStartAnalysisContextWrapper>, SymbolKind> CreateRegisterSymbolStartAnalysisWrapper()
{
if (typeof(CompilationStartAnalysisContext).GetMethod(nameof(RegisterSymbolStartAction)) is not { } registerMethod)
{
return static (_, _, _) => { };
}

var contextParameter = Parameter(typeof(CompilationStartAnalysisContext));
var shimmedActionParameter = Parameter(typeof(Action<SymbolStartAnalysisContextWrapper>));
var symbolKindParameter = Parameter(typeof(SymbolKind));

var roslynSymbolStartAnalysisContextType = typeof(CompilationStartAnalysisContext).Assembly.GetType("Microsoft.CodeAnalysis.Diagnostics.SymbolStartAnalysisContext");
var roslynSymbolStartAnalysisActionType = typeof(Action<>).MakeGenericType(roslynSymbolStartAnalysisContextType);
var roslynSymbolStartAnalysisContextParameter = Parameter(roslynSymbolStartAnalysisContextType);
var sonarSymbolStartAnalysisContextCtor = typeof(SymbolStartAnalysisContextWrapper).GetConstructors().Single();

// Action<Roslyn.SymbolStartAnalysisContext> registerAction = roslynSymbolStartAnalysisContextParameter =>
// shimmedActionParameter.Invoke(new Sonar.SymbolStartAnalysisContextWrapper(roslynSymbolStartAnalysisContextParameter))
var registerAction = Lambda(
delegateType: roslynSymbolStartAnalysisActionType,
body: Call(shimmedActionParameter, nameof(Action.Invoke), [], New(sonarSymbolStartAnalysisContextCtor, roslynSymbolStartAnalysisContextParameter)),
parameters: roslynSymbolStartAnalysisContextParameter);

// (contextParameter, shimmedActionParameter, symbolKindParameter) => contextParameter.RegisterSymbolStartAction(registerAction, symbolKindParameter)
return Lambda<Action<CompilationStartAnalysisContext, Action<SymbolStartAnalysisContextWrapper>, SymbolKind>>(
Call(contextParameter, registerMethod, registerAction, symbolKindParameter),
contextParameter, shimmedActionParameter, symbolKindParameter).Compile();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,165 @@
/*
* SonarAnalyzer for .NET
* Copyright (C) 2015-2024 SonarSource SA
* mailto: contact AT sonarsource DOT com
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/

using System.Diagnostics.CodeAnalysis;
using static System.Linq.Expressions.Expression;
using CS = Microsoft.CodeAnalysis.CSharp;
using VB = Microsoft.CodeAnalysis.VisualBasic;

namespace SonarAnalyzer.ShimLayer.AnalysisContext;

// Code is executed in static initializers and is not detected by the coverage tool
// See the RegisterSymbolStartActionWrapperTest family of tests to check test coverage manually
[ExcludeFromCodeCoverage]
public readonly struct SymbolStartAnalysisContextWrapper
{
private static readonly Func<object, CancellationToken> CancellationTokenAccessor;
private static readonly Func<object, Compilation> CompilationAccessor;
private static readonly Func<object, AnalyzerOptions> OptionsAccessor;
private static readonly Func<object, ISymbol> SymbolAccessor;

private static readonly Action<object, Action<CodeBlockAnalysisContext>> RegisterCodeBlockActionMethod;
private static readonly Action<object, Action<CodeBlockStartAnalysisContext<CS.SyntaxKind>>> RegisterCodeBlockStartActionCS;
private static readonly Action<object, Action<CodeBlockStartAnalysisContext<VB.SyntaxKind>>> RegisterCodeBlockStartActionVB;
private static readonly Action<object, Action<OperationAnalysisContext>, ImmutableArray<OperationKind>> RegisterOperationActionMethod;
private static readonly Action<object, Action<OperationBlockAnalysisContext>> RegisterOperationBlockActionMethod;
private static readonly Action<object, Action<OperationBlockStartAnalysisContext>> RegisterOperationBlockStartActionMethod;
private static readonly Action<object, Action<SymbolAnalysisContext>> RegisterSymbolEndActionMethod;
private static readonly Action<object, Action<SyntaxNodeAnalysisContext>, ImmutableArray<CS.SyntaxKind>> RegisterSyntaxNodeActionCS;
private static readonly Action<object, Action<SyntaxNodeAnalysisContext>, ImmutableArray<VB.SyntaxKind>> RegisterSyntaxNodeActionVB;

public CancellationToken CancellationToken => CancellationTokenAccessor(RoslynSymbolStartAnalysisContext);
public Compilation Compilation => CompilationAccessor(RoslynSymbolStartAnalysisContext);
public AnalyzerOptions Options => OptionsAccessor(RoslynSymbolStartAnalysisContext);
public ISymbol Symbol => SymbolAccessor(RoslynSymbolStartAnalysisContext);
private object RoslynSymbolStartAnalysisContext { get; }

static SymbolStartAnalysisContextWrapper()
{
var symbolStartAnalysisContextType = typeof(CompilationStartAnalysisContext).Assembly.GetType("Microsoft.CodeAnalysis.Diagnostics.SymbolStartAnalysisContext");
CancellationTokenAccessor = CreatePropertyAccessor<CancellationToken>(nameof(CancellationToken));
CompilationAccessor = CreatePropertyAccessor<Compilation>(nameof(Compilation));
OptionsAccessor = CreatePropertyAccessor<AnalyzerOptions>(nameof(Options));
SymbolAccessor = CreatePropertyAccessor<ISymbol>(nameof(Symbol));
RegisterCodeBlockActionMethod = CreateRegistrationMethod<CodeBlockAnalysisContext>(nameof(RegisterCodeBlockAction));
RegisterCodeBlockStartActionCS =
CreateRegistrationMethod<CodeBlockStartAnalysisContext<CS.SyntaxKind>>(nameof(RegisterCodeBlockStartAction), typeof(CS.SyntaxKind));
RegisterCodeBlockStartActionVB =
CreateRegistrationMethod<CodeBlockStartAnalysisContext<VB.SyntaxKind>>(nameof(RegisterCodeBlockStartAction), typeof(VB.SyntaxKind));
RegisterOperationActionMethod =
CreateRegistrationMethodWithAdditionalParameter<OperationAnalysisContext, ImmutableArray<OperationKind>>(nameof(RegisterOperationAction));
RegisterOperationBlockActionMethod = CreateRegistrationMethod<OperationBlockAnalysisContext>(nameof(RegisterOperationBlockAction));
RegisterOperationBlockStartActionMethod = CreateRegistrationMethod<OperationBlockStartAnalysisContext>(nameof(RegisterOperationBlockStartAction));
RegisterSymbolEndActionMethod = CreateRegistrationMethod<SymbolAnalysisContext>(nameof(RegisterSymbolEndAction));
RegisterSyntaxNodeActionCS = CreateRegistrationMethodWithAdditionalParameter<SyntaxNodeAnalysisContext, ImmutableArray<CS.SyntaxKind>>(
nameof(RegisterSyntaxNodeAction), typeof(CS.SyntaxKind));
RegisterSyntaxNodeActionVB = CreateRegistrationMethodWithAdditionalParameter<SyntaxNodeAnalysisContext, ImmutableArray<VB.SyntaxKind>>(
nameof(RegisterSyntaxNodeAction), typeof(VB.SyntaxKind));

// receiverParameter => ((symbolStartAnalysisContextType)receiverParameter)."propertyName"
Func<object, TProperty> CreatePropertyAccessor<TProperty>(string propertyName)
{
var receiverParameter = Parameter(typeof(object));
return Lambda<Func<object, TProperty>>(
Property(Convert(receiverParameter, symbolStartAnalysisContextType), propertyName),
receiverParameter).Compile();
}

// (object receiverParameter, Action<TContext> registerActionParameter) =>
// ((symbolStartAnalysisContextType)receiverParameter)."registrationMethodName"<typeArguments>(registerActionParameter)
Action<object, Action<TContext>> CreateRegistrationMethod<TContext>(string registrationMethodName, params Type[] typeArguments)
{
var receiverParameter = Parameter(typeof(object));
var registerActionParameter = Parameter(typeof(Action<TContext>));
return Lambda<Action<object, Action<TContext>>>(
Call(Convert(receiverParameter, symbolStartAnalysisContextType), registrationMethodName, typeArguments, registerActionParameter),
receiverParameter,
registerActionParameter).Compile();
}

// (object receiverParameter, Action<TContext> registerActionParameter, TParameter additionalParameter) =>
// ((symbolStartAnalysisContextType)receiverParameter)."registrationMethodName"<typeArguments>(registerActionParameter, additionalParameter)
Action<object, Action<TContext>, TParameter> CreateRegistrationMethodWithAdditionalParameter<TContext, TParameter>(string registrationMethodName, params Type[] typeArguments)
{
var receiverParameter = Parameter(typeof(object));
var registerActionParameter = Parameter(typeof(Action<TContext>));
var additionalParameter = Parameter(typeof(TParameter));
return Lambda<Action<object, Action<TContext>, TParameter>>(
Call(Convert(receiverParameter, symbolStartAnalysisContextType), registrationMethodName, typeArguments, registerActionParameter, additionalParameter),
receiverParameter,
registerActionParameter,
additionalParameter).Compile();
}
}

public SymbolStartAnalysisContextWrapper(object roslynSymbolStartAnalysisContext) =>
RoslynSymbolStartAnalysisContext = roslynSymbolStartAnalysisContext;

public void RegisterCodeBlockAction(Action<CodeBlockAnalysisContext> action) =>
RegisterCodeBlockActionMethod(RoslynSymbolStartAnalysisContext, action);

public void RegisterCodeBlockStartAction<TLanguageKindEnum>(Action<CodeBlockStartAnalysisContext<TLanguageKindEnum>> action) where TLanguageKindEnum : struct
{
var languageKindType = typeof(TLanguageKindEnum);
if (languageKindType == typeof(CS.SyntaxKind))
{
var cast = (Action<CodeBlockStartAnalysisContext<CS.SyntaxKind>>)action;
RegisterCodeBlockStartActionCS(RoslynSymbolStartAnalysisContext, cast);
}
else if (languageKindType == typeof(VB.SyntaxKind))
{
var cast = (Action<CodeBlockStartAnalysisContext<VB.SyntaxKind>>)action;
RegisterCodeBlockStartActionVB(RoslynSymbolStartAnalysisContext, cast);
}
else
{
throw new ArgumentException("Invalid type parameter.", nameof(TLanguageKindEnum));
}
}

public void RegisterOperationAction(Action<OperationAnalysisContext> action, ImmutableArray<OperationKind> operationKinds) =>
RegisterOperationActionMethod(RoslynSymbolStartAnalysisContext, action, operationKinds);

public void RegisterOperationBlockAction(Action<OperationBlockAnalysisContext> action) =>
RegisterOperationBlockActionMethod(RoslynSymbolStartAnalysisContext, action);

public void RegisterOperationBlockStartAction(Action<OperationBlockStartAnalysisContext> action) =>
RegisterOperationBlockStartActionMethod(RoslynSymbolStartAnalysisContext, action);

public void RegisterSymbolEndAction(Action<SymbolAnalysisContext> action) =>
RegisterSymbolEndActionMethod(RoslynSymbolStartAnalysisContext, action);

public void RegisterSyntaxNodeAction<TLanguageKindEnum>(Action<SyntaxNodeAnalysisContext> action, params TLanguageKindEnum[] syntaxKinds) where TLanguageKindEnum : struct
{
var languageKindType = typeof(TLanguageKindEnum);
if (languageKindType == typeof(CS.SyntaxKind))
{
RegisterSyntaxNodeActionCS(RoslynSymbolStartAnalysisContext, action, syntaxKinds.Cast<CS.SyntaxKind>().ToImmutableArray());
}
else if (languageKindType == typeof(VB.SyntaxKind))
{
RegisterSyntaxNodeActionVB(RoslynSymbolStartAnalysisContext, action, syntaxKinds.Cast<VB.SyntaxKind>().ToImmutableArray());
}
else
{
throw new ArgumentException("Invalid type parameter.", nameof(TLanguageKindEnum));
}
}
}
1 change: 1 addition & 0 deletions analyzers/src/SonarAnalyzer.CFG/SonarAnalyzer.CFG.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" Version="1.3.2" />
<PackageReference Include="Microsoft.CodeAnalysis.VisualBasic.Workspaces" Version="1.3.2" />
<PackageReference Include="Microsoft.CodeAnalysis.PerformanceSensitiveAnalyzers" Version="3.3.1">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
Expand Down
18 changes: 18 additions & 0 deletions analyzers/src/SonarAnalyzer.CFG/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,16 @@
"resolved": "3.3.1",
"contentHash": "eT+kgNCDdTRbQ5WF6BGx1HI3D5jYfHteza/koefhWC2vNZGxObA74XxwWfg40dy3uUv7dn3OGKLK5GUPLroVog=="
},
"Microsoft.CodeAnalysis.VisualBasic.Workspaces": {
"type": "Direct",
"requested": "[1.3.2, )",
"resolved": "1.3.2",
"contentHash": "I5Z2WBgFsx0G22Na1uVFPDkT6Ob4XI+g91GPN8JWldYUMlmIBcUDBfGmfr8oQPdUipvThpaU1x1xZrnNwRR8JA==",
"dependencies": {
"Microsoft.CodeAnalysis.VisualBasic": "[1.3.2]",
"Microsoft.CodeAnalysis.Workspaces.Common": "[1.3.2]"
}
},
"Microsoft.Composition": {
"type": "Direct",
"requested": "[1.0.27, )",
Expand Down Expand Up @@ -117,6 +127,14 @@
"Microsoft.CodeAnalysis.Common": "[1.3.2]"
}
},
"Microsoft.CodeAnalysis.VisualBasic": {
"type": "Transitive",
"resolved": "1.3.2",
"contentHash": "yllH3rSYEc0bV15CJ2T9Jtx+tSXO5/OVNb+xofuWrACn65Q5VqeFBKgcbgwpyVY/98ypPcGQIWNQL2A/L1seJg==",
"dependencies": {
"Microsoft.CodeAnalysis.Common": "1.3.2"
}
},
"Microsoft.CodeAnalysis.Workspaces.Common": {
"type": "Transitive",
"resolved": "1.3.2",
Expand Down
Loading