-
Notifications
You must be signed in to change notification settings - Fork 508
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Support PatternSyntax and derived types via light-up
- Loading branch information
Showing
12 changed files
with
792 additions
and
21 deletions.
There are no files selected for viewing
20 changes: 20 additions & 0 deletions
20
StyleCop.Analyzers/StyleCop.Analyzers/Helpers/NodeHelper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved. | ||
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. | ||
|
||
namespace StyleCop.Analyzers.Helpers | ||
{ | ||
using Microsoft.CodeAnalysis; | ||
using Microsoft.CodeAnalysis.CSharp; | ||
using StyleCop.Analyzers.Lightup; | ||
|
||
/// <summary> | ||
/// Provides extension methods and utilities for working with <see cref="SyntaxNode"/>. | ||
/// </summary> | ||
internal static class NodeHelper | ||
{ | ||
public static bool IsKind(this SyntaxNode node, SyntaxKindEx kind) | ||
{ | ||
return node.IsKind((SyntaxKind)kind); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
84 changes: 84 additions & 0 deletions
84
StyleCop.Analyzers/StyleCop.Analyzers/Lightup/ConstantPatternSyntaxWrapper.cs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
// Copyright (c) Tunnel Vision Laboratories, LLC. All Rights Reserved. | ||
// Licensed under the Apache License, Version 2.0. See LICENSE in the project root for license information. | ||
|
||
namespace StyleCop.Analyzers.Lightup | ||
{ | ||
using System; | ||
using System.Reflection; | ||
using Microsoft.CodeAnalysis; | ||
using Microsoft.CodeAnalysis.CSharp; | ||
using Microsoft.CodeAnalysis.CSharp.Syntax; | ||
|
||
internal struct ConstantPatternSyntaxWrapper : ISyntaxWrapper<CSharpSyntaxNode> | ||
{ | ||
private const string ConstantPatternSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.ConstantPatternSyntax"; | ||
private static readonly Type ConstantPatternSyntaxType; | ||
|
||
private static readonly Func<CSharpSyntaxNode, ExpressionSyntax> ExpressionAccessor; | ||
private static readonly Func<CSharpSyntaxNode, ExpressionSyntax, CSharpSyntaxNode> WithExpressionAccessor; | ||
|
||
private readonly CSharpSyntaxNode node; | ||
|
||
static ConstantPatternSyntaxWrapper() | ||
{ | ||
ConstantPatternSyntaxType = typeof(CSharpSyntaxNode).GetTypeInfo().Assembly.GetType(ConstantPatternSyntaxTypeName); | ||
ExpressionAccessor = LightupHelpers.CreateSyntaxPropertyAccessor<CSharpSyntaxNode, ExpressionSyntax>(ConstantPatternSyntaxType, nameof(Expression)); | ||
WithExpressionAccessor = LightupHelpers.CreateSyntaxWithPropertyAccessor<CSharpSyntaxNode, ExpressionSyntax>(ConstantPatternSyntaxType, nameof(Expression)); | ||
} | ||
|
||
private ConstantPatternSyntaxWrapper(CSharpSyntaxNode node) | ||
{ | ||
this.node = node; | ||
} | ||
|
||
public CSharpSyntaxNode SyntaxNode => this.node; | ||
|
||
public ExpressionSyntax Expression | ||
{ | ||
get | ||
{ | ||
return ExpressionAccessor(this.SyntaxNode); | ||
} | ||
} | ||
|
||
public static explicit operator ConstantPatternSyntaxWrapper(PatternSyntaxWrapper node) | ||
{ | ||
return (ConstantPatternSyntaxWrapper)node.SyntaxNode; | ||
} | ||
|
||
public static explicit operator ConstantPatternSyntaxWrapper(SyntaxNode node) | ||
{ | ||
if (node == null) | ||
{ | ||
return default(ConstantPatternSyntaxWrapper); | ||
} | ||
|
||
if (!IsInstance(node)) | ||
{ | ||
throw new InvalidCastException($"Cannot cast '{node.GetType().FullName}' to '{ConstantPatternSyntaxTypeName}'"); | ||
} | ||
|
||
return new ConstantPatternSyntaxWrapper((CSharpSyntaxNode)node); | ||
} | ||
|
||
public static implicit operator PatternSyntaxWrapper(ConstantPatternSyntaxWrapper wrapper) | ||
{ | ||
return PatternSyntaxWrapper.FromUpcast(wrapper.node); | ||
} | ||
|
||
public static implicit operator CSharpSyntaxNode(ConstantPatternSyntaxWrapper wrapper) | ||
{ | ||
return wrapper.node; | ||
} | ||
|
||
public static bool IsInstance(SyntaxNode node) | ||
{ | ||
return node != null && LightupHelpers.CanWrapNode(node, ConstantPatternSyntaxType); | ||
} | ||
|
||
public ConstantPatternSyntaxWrapper WithExpression(ExpressionSyntax expression) | ||
{ | ||
return new ConstantPatternSyntaxWrapper(WithExpressionAccessor(this.SyntaxNode, expression)); | ||
} | ||
} | ||
} |
Oops, something went wrong.