44namespace StyleCop . Analyzers . Lightup
55{
66 using System ;
7- using System . Reflection ;
87 using Microsoft . CodeAnalysis ;
9- using Microsoft . CodeAnalysis . CSharp ;
108 using Microsoft . CodeAnalysis . CSharp . Syntax ;
119
1210 internal struct CommonForEachStatementSyntaxWrapper : ISyntaxWrapper < StatementSyntax >
1311 {
14- private const string CommonForEachStatementSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.CommonForEachStatementSyntax" ;
15-
16- /// <summary>
17- /// Prior to C# 7, <see cref="ForEachStatementSyntax"/> was the base type for all <c>foreach</c> statements. If
18- /// the <c>CommonForEachStatementSyntax</c> type isn't found at runtime, we fall back to using this type
19- /// instead.
20- /// </summary>
21- private const string ForEachStatementSyntaxTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.CommonForEachStatementSyntax" ;
22-
23- private static readonly Type CommonForEachStatementSyntaxType ;
12+ internal const string WrappedTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.CommonForEachStatementSyntax" ;
13+ internal const string FallbackWrappedTypeName = "Microsoft.CodeAnalysis.CSharp.Syntax.ForEachStatementSyntax" ;
14+ private static readonly Type WrappedType ;
2415
2516 private static readonly Func < StatementSyntax , SyntaxToken > ForEachKeywordAccessor ;
2617 private static readonly Func < StatementSyntax , SyntaxToken > OpenParenTokenAccessor ;
@@ -33,14 +24,13 @@ internal struct CommonForEachStatementSyntaxWrapper : ISyntaxWrapper<StatementSy
3324
3425 static CommonForEachStatementSyntaxWrapper ( )
3526 {
36- CommonForEachStatementSyntaxType = typeof ( CSharpSyntaxNode ) . GetTypeInfo ( ) . Assembly . GetType ( CommonForEachStatementSyntaxTypeName )
37- ?? typeof ( CSharpSyntaxNode ) . GetTypeInfo ( ) . Assembly . GetType ( ForEachStatementSyntaxTypeName ) ;
38- ForEachKeywordAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , SyntaxToken > ( CommonForEachStatementSyntaxType , nameof ( ForEachKeyword ) ) ;
39- OpenParenTokenAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , SyntaxToken > ( CommonForEachStatementSyntaxType , nameof ( OpenParenToken ) ) ;
40- InKeywordAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , SyntaxToken > ( CommonForEachStatementSyntaxType , nameof ( InKeyword ) ) ;
41- ExpressionAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , ExpressionSyntax > ( CommonForEachStatementSyntaxType , nameof ( Expression ) ) ;
42- CloseParenTokenAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , SyntaxToken > ( CommonForEachStatementSyntaxType , nameof ( CloseParenToken ) ) ;
43- StatementAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , StatementSyntax > ( CommonForEachStatementSyntaxType , nameof ( Statement ) ) ;
27+ WrappedType = WrapperHelper . GetWrappedType ( typeof ( CommonForEachStatementSyntaxWrapper ) ) ;
28+ ForEachKeywordAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , SyntaxToken > ( WrappedType , nameof ( ForEachKeyword ) ) ;
29+ OpenParenTokenAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , SyntaxToken > ( WrappedType , nameof ( OpenParenToken ) ) ;
30+ InKeywordAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , SyntaxToken > ( WrappedType , nameof ( InKeyword ) ) ;
31+ ExpressionAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , ExpressionSyntax > ( WrappedType , nameof ( Expression ) ) ;
32+ CloseParenTokenAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , SyntaxToken > ( WrappedType , nameof ( CloseParenToken ) ) ;
33+ StatementAccessor = LightupHelpers . CreateSyntaxPropertyAccessor < StatementSyntax , StatementSyntax > ( WrappedType , nameof ( Statement ) ) ;
4434 }
4535
4636 private CommonForEachStatementSyntaxWrapper ( StatementSyntax node )
@@ -112,7 +102,7 @@ public static explicit operator CommonForEachStatementSyntaxWrapper(SyntaxNode n
112102
113103 if ( ! IsInstance ( node ) )
114104 {
115- throw new InvalidCastException ( $ "Cannot cast '{ node . GetType ( ) . FullName } ' to '{ CommonForEachStatementSyntaxTypeName } '") ;
105+ throw new InvalidCastException ( $ "Cannot cast '{ node . GetType ( ) . FullName } ' to '{ WrappedTypeName } '") ;
116106 }
117107
118108 return new CommonForEachStatementSyntaxWrapper ( ( StatementSyntax ) node ) ;
@@ -125,7 +115,7 @@ public static implicit operator StatementSyntax(CommonForEachStatementSyntaxWrap
125115
126116 public static bool IsInstance ( SyntaxNode node )
127117 {
128- return node != null && LightupHelpers . CanWrapNode ( node , CommonForEachStatementSyntaxType ) ;
118+ return node != null && LightupHelpers . CanWrapNode ( node , WrappedType ) ;
129119 }
130120
131121 internal static CommonForEachStatementSyntaxWrapper FromUpcast ( StatementSyntax node )
0 commit comments