Skip to content

Commit fa4088b

Browse files
Attempted fix for #592
I suspect different visual studio versions are parsing nameof differently. Explicitylt constructing an identifier with the syntax kind may get around this.
1 parent 10d0680 commit fa4088b

2 files changed

Lines changed: 6 additions & 12 deletions

File tree

CodeConverter/CSharp/ExpressionNodeVisitor.cs

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -493,13 +493,7 @@ private static AssignmentExpressionSyntax Assign(ExpressionSyntax left, Identifi
493493

494494
public override async Task<CSharpSyntaxNode> VisitNameOfExpression(VBasic.Syntax.NameOfExpressionSyntax node)
495495
{
496-
return SyntaxFactory.InvocationExpression(NameOf(), SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList<ArgumentSyntax>(SyntaxFactory.Argument((ExpressionSyntax)await node.Argument.AcceptAsync(TriviaConvertingExpressionVisitor)))));
497-
}
498-
499-
private static ExpressionSyntax NameOf()
500-
{
501-
// Usually it'd be preferable to just construct the Identifier ourselves, but the opportunity to inject parse options lets us control the LanguageVersion which needs to be high enough not to consider nameof an error
502-
return SyntaxFactory.ParseExpression("nameof", options: CSharpCompiler.ParseOptions);
496+
return SyntaxFactory.InvocationExpression(ValidSyntaxFactory.NameOf(), SyntaxFactory.ArgumentList(SyntaxFactory.SingletonSeparatedList<ArgumentSyntax>(SyntaxFactory.Argument((ExpressionSyntax)await node.Argument.AcceptAsync(TriviaConvertingExpressionVisitor)))));
503497
}
504498

505499
public override async Task<CSharpSyntaxNode> VisitEqualsValue(VBasic.Syntax.EqualsValueSyntax node)

CodeConverter/CSharp/ValidSyntaxFactory.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -94,14 +94,14 @@ public static MethodDeclarationSyntax CreateParameterlessMethod(string newMethod
9494
/// <remarks>
9595
/// CodeAnalysis upgrade to 3.0.0 needed for VarPattern. Correct text comes out, but tree is invalid so the tests this will generate "CS0825: The contextual keyword 'var' may only appear within a local variable declaration or in script code"
9696
/// </remarks>
97-
public static DeclarationPatternSyntax VarPattern(SyntaxToken varName)
98-
{
99-
return SyntaxFactory.DeclarationPattern(
100-
ValidSyntaxFactory.VarType, SyntaxFactory.SingleVariableDesignation(varName));
101-
}
97+
public static DeclarationPatternSyntax VarPattern(SyntaxToken varName) => SyntaxFactory.DeclarationPattern(VarType, SyntaxFactory.SingleVariableDesignation(varName));
10298

10399
public static PredefinedTypeSyntax ObjectType => SyntaxFactory.PredefinedType(SyntaxFactory.Token(SyntaxKind.ObjectKeyword));
104100
public static LiteralExpressionSyntax NullExpression => SyntaxFactory.LiteralExpression(SyntaxKind.NullLiteralExpression);
105101
public static LiteralExpressionSyntax DefaultExpression => SyntaxFactory.LiteralExpression(SyntaxKind.DefaultLiteralExpression);
102+
103+
public static IdentifierNameSyntax NameOf() => SyntaxFactory.IdentifierName(
104+
SyntaxFactory.Identifier(SyntaxTriviaList.Empty, SyntaxKind.NameOfKeyword, "nameof", "nameof", SyntaxTriviaList.Empty)
105+
);
106106
}
107107
}

0 commit comments

Comments
 (0)