Exemplo n.º 1
0
        public override string VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            SymbolInfo exprSymbol = GetModel(node).GetSymbolInfo(node.Expression);

            if (exprSymbol.Symbol.Kind == SymbolKind.NamedType)
            {
                SymbolInfo symbolInfo = GetModel(node).GetSymbolInfo(node);
                ISymbol    symbol     = symbolInfo.Symbol;

                // Enum field
                INamedTypeSymbol namedTypeSymbol = (INamedTypeSymbol)exprSymbol.Symbol;
                if (namedTypeSymbol.TypeKind == TypeKind.Enum)
                {
                    IFieldSymbol enumFieldSymbol     = (IFieldSymbol)symbol;
                    string       constantValueString = enumFieldSymbol.ConstantValue.ToString();
                    if (namedTypeSymbol.EnumUnderlyingType.SpecialType == SpecialType.System_UInt32)
                    {
                        // TODO: We need to do this for literal values too, if they don't already have this suffix,
                        // so this should be refactored.
                        constantValueString += "u";
                    }
                    return(constantValueString);
                }

                // Static member access
                if (symbol.Kind == SymbolKind.Property || symbol.Kind == SymbolKind.Field)
                {
                    return(Visit(node.Name));
                }

                string typeName   = Utilities.GetFullMetadataName(exprSymbol.Symbol);
                string targetName = Visit(node.Name);
                return(_backend.FormatInvocation(_setName, typeName, targetName, Array.Empty <InvocationParameterInfo>()));
            }
            else
            {
                // Other accesses
                bool   isIndexerAccess = _backend.IsIndexerAccess(GetModel(node).GetSymbolInfo(node.Name));
                string expr            = Visit(node.Expression);
                string name            = Visit(node.Name);

                if (!isIndexerAccess)
                {
                    return(Visit(node.Expression)
                           + node.OperatorToken.ToFullString()
                           + Visit(node.Name));
                }
                else
                {
                    return(Visit(node.Expression)
                           + Visit(node.Name));
                }
            }
        }
        public override string VisitMemberAccessExpression(MemberAccessExpressionSyntax node)
        {
            SymbolInfo exprSymbol = GetModel(node).GetSymbolInfo(node.Expression);

            if (exprSymbol.Symbol.Kind == SymbolKind.NamedType)
            {
                // Static member access
                SymbolInfo symbolInfo = GetModel(node).GetSymbolInfo(node);
                ISymbol    symbol     = symbolInfo.Symbol;
                if (symbol.Kind == SymbolKind.Property)
                {
                    return(Visit(node.Name));
                }

                string typeName   = Utilities.GetFullMetadataName(exprSymbol.Symbol);
                string targetName = Visit(node.Name);
                return(_backend.FormatInvocation(_setName, typeName, targetName, Array.Empty <InvocationParameterInfo>()));
            }
            else
            {
                // Other accesses
                bool   isIndexerAccess = _backend.IsIndexerAccess(GetModel(node).GetSymbolInfo(node.Name));
                string expr            = Visit(node.Expression);
                string name            = Visit(node.Name);

                if (!isIndexerAccess)
                {
                    return(Visit(node.Expression)
                           + node.OperatorToken.ToFullString()
                           + Visit(node.Name));
                }
                else
                {
                    return(Visit(node.Expression)
                           + Visit(node.Name));
                }
            }
        }