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

Add "IsWrittenTo" from Roslyn #8947

Merged
merged 18 commits into from
Apr 24, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
7cec07e
Copy ExpressionSyntaxExtensions from Roslyn
martin-strecker-sonarsource Mar 18, 2024
f4072ca
Add remaining "IsWrittenTo" dependencies
martin-strecker-sonarsource Mar 18, 2024
741db02
Adopt header and namespace: ExpressionSyntaxExtensions.Roslyn.cs
martin-strecker-sonarsource Mar 26, 2024
de8f33f
Remove partial
martin-strecker-sonarsource Mar 26, 2024
fe18d8d
Adopt header and namespace: SyntaxNodeExtensions.Roslyn.cs
martin-strecker-sonarsource Mar 26, 2024
30292c3
Adopt header and namespace: SyntaxNodeExtensions.Roslyn.cs
martin-strecker-sonarsource Mar 26, 2024
bfc8f5e
Adopt header and namespace: ExpressionSyntaxExtensions.Roslyn.cs
martin-strecker-sonarsource Mar 26, 2024
e39d7d0
Organize
martin-strecker-sonarsource Mar 26, 2024
f42578d
Add CodeCopiedFromAttribute attribute and use it in src\SonarAnalyzer…
martin-strecker-sonarsource Apr 15, 2024
0a626fa
Add CodeCopiedFrom to AltCoverAttributeFilter
martin-strecker-sonarsource Apr 15, 2024
66c99a1
Try annotate VB extension fo CI
martin-strecker-sonarsource Apr 15, 2024
8bed1c5
Remove CodeCopiedFrom from class
martin-strecker-sonarsource Apr 15, 2024
4398dad
Add ExcludeFromCodeCoverage
martin-strecker-sonarsource Apr 17, 2024
5b23ade
Remove CopiedCodeFrom Attribute
martin-strecker-sonarsource Apr 18, 2024
4597f68
Restore old steate
martin-strecker-sonarsource Apr 18, 2024
f2558ab
Fix xml doc comment
martin-strecker-sonarsource Apr 18, 2024
2cd55e4
Code comments
martin-strecker-sonarsource Apr 23, 2024
4f98632
Remove "partial" and rename parameter
martin-strecker-sonarsource Apr 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,14 @@
// The .NET Foundation licenses this file to you under the MIT license.
// See the LICENSE file in the project root for more information.

using System.CodeDom.Compiler;

namespace Microsoft.CodeAnalysis.CSharp.Extensions;

[GeneratedCode("Copied From Roslyn", "575bc42589145ba18b4f1cc2267d02695f861d8f")]
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs")]
public static class ExpressionSyntaxExtensions
{
// Copied from
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L319
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L319")]
public static bool IsWrittenTo(
antonioaversa marked this conversation as resolved.
Show resolved Hide resolved
this ExpressionSyntax expression,
SemanticModel semanticModel,
Expand Down Expand Up @@ -75,8 +74,8 @@ public static class ExpressionSyntaxExtensions
return false;
}

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L221
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L221")]
private static ExpressionSyntax GetExpressionToAnalyzeForWrites(ExpressionSyntax? expression)
{
if (expression.IsRightSideOfDotOrArrow())
Expand All @@ -89,13 +88,13 @@ private static ExpressionSyntax GetExpressionToAnalyzeForWrites(ExpressionSyntax
return expression;
}

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L63
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L63")]
public static bool IsRightSideOfDotOrArrow(this ExpressionSyntax name)
=> IsAnyMemberAccessExpressionName(name) || IsRightSideOfQualifiedName(name);

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L41
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L41")]
public static bool IsAnyMemberAccessExpressionName(this ExpressionSyntax expression)
{
if (expression == null)
Expand All @@ -105,19 +104,19 @@ public static bool IsAnyMemberAccessExpressionName(this ExpressionSyntax express
expression.IsMemberBindingExpressionName();
}

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L50
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L50")]
public static bool IsMemberBindingExpressionName(this ExpressionSyntax expression)
=> expression?.Parent is MemberBindingExpressionSyntax memberBinding &&
memberBinding.Name == expression;

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L54
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L54")]
public static bool IsRightSideOfQualifiedName(this ExpressionSyntax expression)
=> expression?.Parent is QualifiedNameSyntax qualifiedName && qualifiedName.Right == expression;

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L233
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L233")]
public static bool IsOnlyWrittenTo(this ExpressionSyntax expression)
{
expression = GetExpressionToAnalyzeForWrites(expression);
Expand Down Expand Up @@ -158,8 +157,8 @@ public static bool IsOnlyWrittenTo(this ExpressionSyntax expression)
///
/// copied from SyntaxExtensions.GetContainingDeconstruction.
/// </summary>
// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L273
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L273")]
private static bool IsExpressionOfArgumentInDeconstruction(ExpressionSyntax expr)
{
if (!expr.IsParentKind(SyntaxKind.Argument))
Expand Down Expand Up @@ -206,31 +205,31 @@ private static bool IsExpressionOfArgumentInDeconstruction(ExpressionSyntax expr
}
}

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L190
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L190")]
public static bool IsInOutContext(this ExpressionSyntax expression)
=> expression?.Parent is ArgumentSyntax { RefOrOutKeyword: SyntaxToken { RawKind: (int)SyntaxKind.OutKeyword } } argument &&
argument.Expression == expression;

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L383
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L383")]
public static bool IsAttributeNamedArgumentIdentifier(this ExpressionSyntax expression)
{
var nameEquals = expression?.Parent as NameEqualsSyntax;
return nameEquals.IsParentKind(SyntaxKind.AttributeArgument);
}

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L194
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L194")]
public static bool IsInRefContext(this ExpressionSyntax expression)
=> IsInRefContext(expression, out _);

/// <summary>
/// Returns true if this expression is in some <c>ref</c> keyword context. If <see langword="true"/> then
/// <paramref name="refParent"/> will be the node containing the <see langword="ref"/> keyword.
/// </summary>
// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L201
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L201")]
public static bool IsInRefContext(this ExpressionSyntax expression, out SyntaxNode refParent)
{
while (expression?.Parent is ParenthesizedExpressionSyntax or PostfixUnaryExpressionSyntax { RawKind: (int)SyntaxKindEx.SuppressNullableWarningExpression })
Expand All @@ -251,8 +250,8 @@ public static bool IsInRefContext(this ExpressionSyntax expression, out SyntaxNo
return false;
}

// Copy of
// https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L389
[CodeCopiedFrom(TrustedCodeSource.Roslyn,
"https://github.com/dotnet/roslyn/blob/575bc42589145ba18b4f1cc2267d02695f861d8f/src/Workspaces/SharedUtilitiesAndExtensions/Compiler/CSharp/Extensions/ExpressionSyntaxExtensions.cs#L389")]
public static bool IsOperandOfIncrementOrDecrementExpression(this ExpressionSyntax expression)
{
if (expression?.Parent is SyntaxNode parent)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
/*
* 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.
*/

namespace SonarAnalyzer.Helpers;
antonioaversa marked this conversation as resolved.
Show resolved Hide resolved

public enum TrustedCodeSource
{
Roslyn,
StyleCop
}

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Interface | AttributeTargets.Method | AttributeTargets.Constructor | AttributeTargets.Property,
antonioaversa marked this conversation as resolved.
Show resolved Hide resolved
AllowMultiple = true, Inherited = false)]
antonioaversa marked this conversation as resolved.
Show resolved Hide resolved
public sealed class CodeCopiedFromAttribute : Attribute
{
public CodeCopiedFromAttribute(TrustedCodeSource trustedCodeSource, string permanentUrl)
{
TrustedCodeSource = trustedCodeSource;
PermanentUrl = permanentUrl;
}

public TrustedCodeSource TrustedCodeSource { get; }
public string PermanentUrl { get; }
public string Reasoning { get; set; }
antonioaversa marked this conversation as resolved.
Show resolved Hide resolved
}