public static void Write(this IdentifierNameSyntax syntax, IIndentedTextWriterWrapper textWriter, IContext context) { var symbol = context.SemanticModel.GetSymbolInfo(syntax).Symbol; var classNode = GetClassDeclarionSyntax(syntax); var classSymbol = (ITypeSymbol)ModelExtensions.GetDeclaredSymbol(context.SemanticModel, classNode); var previousToken = syntax.GetFirstToken().GetPreviousToken(); var previousPreviousToken = previousToken.GetPreviousToken(); var isFollowingDot = previousToken.IsKind(SyntaxKind.DotToken); var identifierHasThisOrBaseReference = isFollowingDot && ( previousPreviousToken.IsKind(SyntaxKind.ThisKeyword) || previousPreviousToken.IsKind(SyntaxKind.BaseKeyword)); var isPropertyFieldOrMethod = (symbol.Kind == SymbolKind.Property || symbol.Kind == SymbolKind.Field || symbol.Kind == SymbolKind.Method); if ((!isFollowingDot || identifierHasThisOrBaseReference) && isPropertyFieldOrMethod && IsDeclaringTypeThisOrBase(symbol.ContainingType, classSymbol)) { if (previousPreviousToken.IsKind(SyntaxKind.BaseKeyword)) { textWriter.Write("(element % _M.DOT_LVL(typeObject.Level - 1, true))."); } else { textWriter.Write("(element % _M.DOT_LVL(typeObject.Level))."); } } if (symbol.Kind == SymbolKind.NamedType) { context.TypeReferenceWriter.WriteInteractionElementReference((ITypeSymbol)symbol, textWriter); } else { textWriter.Write(syntax.Identifier.Text); } }