2016-09-05 8 views
5

CSharpSyntaxWalkernameof 표현을 사용하려고했지만, AST에 NameOfExpressionSyntax이없는 것으로 나타났습니다. 대신 SemanticModel.GetSymbolInfo이 일치하는 기호를 반환하지 않는 InvocationExpressionSyntax이 표시되고 호출의 표현식은 식별자 토큰 "nameof"을 포함하는 IdentifierNameSyntax입니다. Roslyn에서 이름의 구문 분석하기

그래서 식별자가 nameof인지를 찾고, GetSymbolInfo 아무것도 반환 여부에 대해 그렇지 않은 경우보고, VisitInvocationExpression에 나는 특별한 경우를 추가 한 것 nameof 표현을 인식합니다. 그러나, 그것은 저에게 iffy 조금 소리가 난다. 그런 종류의 탐지 논리를 파서로 옮기는 더 좋은 방법이 있을까요?

(P.S : 나는이 아마 이전 버전과의 호환성을 위해 다음과 같은 구문 분석 알고 있습니다. 단지 nameof 정상 호출을 구별하기위한 API가 있는지 궁금)

+4

[다른 사람도이 사실을 알고 있습니다.] (https://joshvarty.wordpress.com/2015/02/16/lrn-quick-tips-working-with-nameof/). – Rawling

+1

여전히 C# 6에 대한 공식 사양이 없지만 [이 초안] (https://github.com/ljw1004/csharpspec/blob/f12213c4ffe77a51dbc5412250bef6af75333f32/expressions.md#nameof-expressions)은 모호한 구문 분석 및 추가 추론이 필요합니다. –

+1

@Damien_The_Unbeliever : 실제로 Roslyn의 소스 코드에서 그 위치를 찾아내는 것을 시도했지만, 어디에서 그렇게했는지는 결정할 수 없었습니다. 어쩌면 다시 봐야 할 것 같아. – Joey

답변

1
지금 실제로 다음 코드를 사용

:

if (symbolInfo.Symbol == null && 
    symbolInfo.CandidateSymbols.IsEmpty && 
    symbolInfo.CandidateReason == CandidateReason.None) { 
    var identifier = node.Expression as IdentifierNameSyntax; 
    if (identifier != null && identifier.Identifier.Kind() == SyntaxKind.IdentifierToken && identifier.Identifier.Text == "nameof") { 
    // We have a nameof expression 
    } 
} 

난 그냥 경우 C# 8의 검출을위한 상수 값을 이용하지 않는 것을 선택 또는 그래서 정맥 아직 다른 연산자를 추가, 즉도 가질 수있는 상수 값이지만, nameof이 아닙니다. 예약 된 키워드 아니다

nameof 때문에하는 nameof 표현은 항상 단순 명 nameof의 호출과 구문 모호 : 꽤 많이 검출은 사양이 nameof 표현되는 호출을 결정하는 데 사용됩니다 말합니다 정확히 감지 . 호환성을 위해 이름이 nameof 인 이름 조회가 성공하면 표현식은 호출이 합법적인지 여부에 관계없이 invocation_expression으로 처리됩니다. 그렇지 않으면 nameof_expression입니다.

3

nameof 표현은 컴파일 시간을 일정하게한다. 이 사실을 사용하여 정상적인 호출과 구별 할 수 있습니다. InvocationExpressionSyntax에서 SematicModel.GetConstantValue()으로 전화 할 수 있습니다. nameof 인 경우 Optional<object>.Value (HasValue도 true를 반환합니다.) 문자열/이름이 반환됩니다.

+1

GetConstantValue는 기호를 사용자 지정 이름에 매핑해야하지만 부여 할 수 있으므로이 경우에는 도움이되지 않습니다. 일반적으로 상수가 아닌 다른 호출로부터. – Joey