public static SourcePropertyAccessorSymbol CreateAccessorSymbol(
            NamedTypeSymbol containingType,
            SourcePropertySymbol property,
            DeclarationModifiers propertyModifiers,
            string propertyName,
            AccessorDeclarationSyntax syntax,
            PropertySymbol explicitlyImplementedPropertyOpt,
            string aliasQualifierOpt,
            bool isAutoPropertyAccessor,
            bool isExplicitInterfaceImplementation,
            DiagnosticBag diagnostics)
        {
            Debug.Assert(syntax.Kind() == SyntaxKind.GetAccessorDeclaration ||
                         syntax.Kind() == SyntaxKind.SetAccessorDeclaration ||
                         syntax.Kind() == SyntaxKind.InitAccessorDeclaration);

            bool   isGetMethod = (syntax.Kind() == SyntaxKind.GetAccessorDeclaration);
            string name;
            ImmutableArray <MethodSymbol> explicitInterfaceImplementations;

            GetNameAndExplicitInterfaceImplementations(
                explicitlyImplementedPropertyOpt,
                propertyName,
                property.IsCompilationOutputWinMdObj(),
                aliasQualifierOpt,
                isGetMethod,
                out name,
                out explicitInterfaceImplementations);

            var methodKind = isGetMethod ? MethodKind.PropertyGet : MethodKind.PropertySet;

            bool hasBody           = syntax.Body is object;
            bool hasExpressionBody = syntax.ExpressionBody is object;

            CheckForBlockAndExpressionBody(syntax.Body, syntax.ExpressionBody, syntax, diagnostics);
            return(new SourcePropertyAccessorSymbol(
                       containingType,
                       name,
                       property,
                       propertyModifiers,
                       explicitInterfaceImplementations,
                       syntax.Keyword.GetLocation(),
                       syntax,
                       hasBody,
                       hasExpressionBody,
                       isIterator: SyntaxFacts.HasYieldOperations(syntax.Body),
                       syntax.Modifiers,
                       methodKind,
                       syntax.Keyword.IsKind(SyntaxKind.InitKeyword),
                       isAutoPropertyAccessor,
                       isExplicitInterfaceImplementation,
                       diagnostics));
        }
Ejemplo n.º 2
0
        internal SourceCustomEventAccessorSymbol(
            SourceEventSymbol @event,
            AccessorDeclarationSyntax syntax,
            EventSymbol explicitlyImplementedEventOpt,
            string aliasQualifierOpt,
            bool isNullableAnalysisEnabled,
            BindingDiagnosticBag diagnostics
            )
            : base(
                @event,
                syntax.GetReference(),
                ImmutableArray.Create(syntax.Keyword.GetLocation()),
                explicitlyImplementedEventOpt,
                aliasQualifierOpt,
                isAdder: syntax.Kind() == SyntaxKind.AddAccessorDeclaration,
                isIterator: SyntaxFacts.HasYieldOperations(syntax.Body),
                isNullableAnalysisEnabled: isNullableAnalysisEnabled
                )
        {
            Debug.Assert(syntax != null);
            Debug.Assert(
                syntax.Kind() == SyntaxKind.AddAccessorDeclaration ||
                syntax.Kind() == SyntaxKind.RemoveAccessorDeclaration
                );

            CheckFeatureAvailabilityAndRuntimeSupport(
                syntax,
                this.Location,
                hasBody: true,
                diagnostics: diagnostics
                );

            if (syntax.Body != null || syntax.ExpressionBody != null)
            {
                if (IsExtern && !IsAbstract)
                {
                    diagnostics.Add(ErrorCode.ERR_ExternHasBody, this.Location, this);
                }
                // Do not report error for IsAbstract && IsExtern. Dev10 reports CS0180 only
                // in that case ("member cannot be both extern and abstract").
            }

            if (syntax.Modifiers.Count > 0)
            {
                diagnostics.Add(
                    ErrorCode.ERR_NoModifiersOnAccessor,
                    syntax.Modifiers[0].GetLocation()
                    );
            }

            CheckForBlockAndExpressionBody(syntax.Body, syntax.ExpressionBody, syntax, diagnostics);
        }
Ejemplo n.º 3
0
        private static AccessorDeclarationSyntax UseExpressionOrBlockBodyIfDesired(
            DocumentOptionSet documentOptions, ParseOptions parseOptions,
            AccessorDeclarationSyntax accessorDeclaration)
        {
            var preferExpressionBody = documentOptions.GetOption(CSharpCodeStyleOptions.PreferExpressionBodiedAccessors).Value;

            if (accessorDeclaration?.Body != null && preferExpressionBody)
            {
                if (accessorDeclaration.Body.TryConvertToExpressionBody(
                        parseOptions, out var arrowExpression, out var semicolonToken))
                {
                    return(accessorDeclaration.WithBody(null)
                           .WithExpressionBody(arrowExpression)
                           .WithSemicolonToken(semicolonToken)
                           .WithAdditionalAnnotations(Formatter.Annotation));
                }
            }
            else if (accessorDeclaration?.ExpressionBody != null && !preferExpressionBody)
            {
                var block = accessorDeclaration.ExpressionBody.ConvertToBlock(
                    accessorDeclaration.SemicolonToken,
                    createReturnStatementForExpression: accessorDeclaration.Kind() == SyntaxKind.GetAccessorDeclaration);
                return(accessorDeclaration.WithExpressionBody(null)
                       .WithSemicolonToken(default(SyntaxToken))
                       .WithBody(block)
                       .WithAdditionalAnnotations(Formatter.Annotation));
            }

            return(accessorDeclaration);
        }
Ejemplo n.º 4
0
        private static AccessorDeclarationSyntax UseExpressionBodyIfDesired(
            CodeGenerationOptions options,
            AccessorDeclarationSyntax declaration,
            ParseOptions parseOptions
            )
        {
            if (declaration.ExpressionBody == null)
            {
                var expressionBodyPreference =
                    options.Options.GetOption(
                        CSharpCodeStyleOptions.PreferExpressionBodiedAccessors
                        ).Value;
                if (
                    declaration.Body.TryConvertToArrowExpressionBody(
                        declaration.Kind(),
                        parseOptions,
                        expressionBodyPreference,
                        out var expressionBody,
                        out var semicolonToken
                        )
                    )
                {
                    declaration = declaration
                                  .WithBody(null)
                                  .WithExpressionBody(expressionBody)
                                  .WithSemicolonToken(semicolonToken);
                }
            }

            return(declaration);
        }
Ejemplo n.º 5
0
        public static SourcePropertyAccessorSymbol CreateAccessorSymbol(
            NamedTypeSymbol containingType,
            SourcePropertySymbol property,
            DeclarationModifiers propertyModifiers,
            string propertyName,
            AccessorDeclarationSyntax syntax,
            PropertySymbol explicitlyImplementedPropertyOpt,
            string aliasQualifierOpt,
            bool isAutoPropertyAccessor,
            bool isExplicitInterfaceImplementation,
            DiagnosticBag diagnostics)
        {
            Debug.Assert(syntax.Kind() == SyntaxKind.GetAccessorDeclaration || syntax.Kind() == SyntaxKind.SetAccessorDeclaration);

            bool   isGetMethod = (syntax.Kind() == SyntaxKind.GetAccessorDeclaration);
            string name;
            ImmutableArray <MethodSymbol> explicitInterfaceImplementations;

            GetNameAndExplicitInterfaceImplementations(
                explicitlyImplementedPropertyOpt,
                propertyName,
                property.IsCompilationOutputWinMdObj(),
                aliasQualifierOpt,
                isGetMethod,
                out name,
                out explicitInterfaceImplementations);

            var methodKind = isGetMethod ? MethodKind.PropertyGet : MethodKind.PropertySet;

            return(new SourcePropertyAccessorSymbol(
                       containingType,
                       name,
                       property,
                       propertyModifiers,
                       explicitInterfaceImplementations,
                       syntax.Keyword.GetLocation(),
                       syntax,
                       methodKind,
                       isAutoPropertyAccessor,
                       isExplicitInterfaceImplementation,
                       diagnostics));
        }
Ejemplo n.º 6
0
        public static SourcePropertyAccessorSymbol CreateAccessorSymbol(
            NamedTypeSymbol containingType,
            SourcePropertySymbol property,
            DeclarationModifiers propertyModifiers,
            AccessorDeclarationSyntax syntax,
            bool isAutoPropertyAccessor,
            BindingDiagnosticBag diagnostics
            )
        {
            Debug.Assert(
                syntax.Kind() == SyntaxKind.GetAccessorDeclaration ||
                syntax.Kind() == SyntaxKind.SetAccessorDeclaration ||
                syntax.Kind() == SyntaxKind.InitAccessorDeclaration
                );

            bool isGetMethod = (syntax.Kind() == SyntaxKind.GetAccessorDeclaration);
            var  methodKind  = isGetMethod ? MethodKind.PropertyGet : MethodKind.PropertySet;

            bool hasBody                   = syntax.Body is object;
            bool hasExpressionBody         = syntax.ExpressionBody is object;
            bool isNullableAnalysisEnabled =
                containingType.DeclaringCompilation.IsNullableAnalysisEnabledIn(syntax);

            CheckForBlockAndExpressionBody(syntax.Body, syntax.ExpressionBody, syntax, diagnostics);
            return(new SourcePropertyAccessorSymbol(
                       containingType,
                       property,
                       propertyModifiers,
                       syntax.Keyword.GetLocation(),
                       syntax,
                       hasBody,
                       hasExpressionBody,
                       isIterator: SyntaxFacts.HasYieldOperations(syntax.Body),
                       syntax.Modifiers,
                       methodKind,
                       syntax.Keyword.IsKind(SyntaxKind.InitKeyword),
                       isAutoPropertyAccessor,
                       isNullableAnalysisEnabled: isNullableAnalysisEnabled,
                       diagnostics
                       ));
        }
        public static ExpressionSyntax GetReturnExpression(AccessorListSyntax accessorList)
        {
            AccessorDeclarationSyntax accessor = accessorList?.Accessors.SingleOrDefault(shouldThrow: false);

            if (accessor?.Kind() == SyntaxKind.GetAccessorDeclaration &&
                !accessor.AttributeLists.Any())
            {
                return(GetReturnExpression(accessor.Body));
            }

            return(default(ExpressionSyntax));
        }
Ejemplo n.º 8
0
        private string getAccessorName(AccessorDeclarationSyntax par)
        {
            string methodName = "";
            var    attrPar    = par.Parent.Parent as PropertyDeclarationSyntax;
            string attrName   = attrPar.Identifier.Text;
            string mtype      = "set";

            if (par.Kind().ToString().ToLower().Contains("get"))
            {
                mtype = "get";
            }
            methodName = attrName + "." + mtype;
            return(methodName);
        }
Ejemplo n.º 9
0
        static string GetMessageArgument(AccessorDeclarationSyntax node)
        {
            switch (node.Kind())
            {
            case SyntaxKind.SetAccessorDeclaration:
                return(GettextCatalog.GetString("setter"));

            case SyntaxKind.AddAccessorDeclaration:
                return(GettextCatalog.GetString("add accessor"));

            case SyntaxKind.RemoveAccessorDeclaration:
                return(GettextCatalog.GetString("remove accessor"));
            }
            return(null);
        }
Ejemplo n.º 10
0
        private static string GetAccessorName(AccessorDeclarationSyntax node)
        {
            var prefix = node.Kind() == SyntaxKind.GetAccessorDeclaration ? "get_" : "set_";

            var indexerDecl = node.Parent.Parent as IndexerDeclarationSyntax;

            if (indexerDecl != null)
            {
                return(prefix + "Item");
            }

            var propertyName = ((PropertyDeclarationSyntax)node.Parent.Parent).Identifier;

            return(prefix + propertyName);
        }
Ejemplo n.º 11
0
        public override void VisitAccessorDeclaration(AccessorDeclarationSyntax node)
        {
            var accessor = new ApexAccessorDeclarationSyntax
            {
                IsGetter  = node.Kind() == SyntaxKind.GetAccessorDeclaration,
                Modifiers = node.Modifiers.Select(m => m.ToString()).ToList(),
            };

            if (node.Body != null)
            {
                node.Body.Accept(this);
                accessor.Body = LastBlock;
            }

            LastAccessor = accessor;
        }
Ejemplo n.º 12
0
        public PropertyAccessorDefinition(IPropertyDefinition declaringProperty, AccessorDeclarationSyntax node) :
            base(node)
        {
            declaringProperty = declaringProperty ?? throw new ArgumentNullException(nameof(declaringProperty));

            AccessModifiers = DetermineAccessModifier(node);
            IsVisible       = DetermineIsVisible(declaringProperty, AccessModifiers);

            var nameSuffix = node.Kind() == SyntaxKind.GetAccessorDeclaration ? "_get" : "_set";
            var name       = declaringProperty.Name + nameSuffix;

            Name        = name;
            FullName    = declaringProperty.FullName + nameSuffix;
            FullRawName = declaringProperty.FullRawName + nameSuffix;
            RawName     = declaringProperty.RawName + nameSuffix;
        }
Ejemplo n.º 13
0
        private static AccessorDeclarationSyntax UseExpressionBodyIfDesired(
            CSharpCodeGenerationContextInfo info, AccessorDeclarationSyntax declaration)
        {
            if (declaration.ExpressionBody == null)
            {
                if (declaration.Body?.TryConvertToArrowExpressionBody(
                        declaration.Kind(), info.LanguageVersion, info.Options.PreferExpressionBodiedAccessors.Value,
                        out var expressionBody, out var semicolonToken) == true)
                {
                    declaration = declaration.WithBody(null)
                                  .WithExpressionBody(expressionBody)
                                  .WithSemicolonToken(semicolonToken);
                }
            }

            return(declaration);
        }
Ejemplo n.º 14
0
        public static bool CanRefactor(RefactoringContext context, PropertyDeclarationSyntax propertyDeclaration)
        {
            AccessorDeclarationSyntax accessor = propertyDeclaration.AccessorList?.Accessors.SingleOrDefault(shouldThrow: false);

            if (accessor?.Kind() != SyntaxKind.GetAccessorDeclaration)
            {
                return(false);
            }

            if (accessor.BodyOrExpressionBody() != null)
            {
                return(true);
            }

            return(context.SupportsCSharp6 &&
                   accessor.IsAutoImplemented() &&
                   propertyDeclaration.Initializer?.Value != null);
        }
Ejemplo n.º 15
0
 private static bool IsMutable(AccessorDeclarationSyntax a)
 {
     return(a.Kind() == SyntaxKind.SetAccessorDeclaration);
 }
Ejemplo n.º 16
0
        internal static bool IsFixable(
            IndexerDeclarationSyntax indexerDeclaration,
            AccessorDeclarationSyntax accessor,
            SemanticModel semanticModel,
            CancellationToken cancellationToken)
        {
            switch (accessor.Kind())
            {
            case SyntaxKind.GetAccessorDeclaration:
            {
                ExpressionSyntax expression = GetGetAccessorExpression(accessor);

                if (expression?.IsKind(SyntaxKind.ElementAccessExpression) != true)
                {
                    return(false);
                }

                var elementAccess = (ElementAccessExpressionSyntax)expression;

                if (elementAccess.Expression?.IsKind(SyntaxKind.BaseExpression) != true)
                {
                    return(false);
                }

                if (elementAccess.ArgumentList == null)
                {
                    return(false);
                }

                IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(indexerDeclaration, cancellationToken);

                IPropertySymbol overriddenProperty = propertySymbol?.OverriddenProperty;

                if (overriddenProperty == null)
                {
                    return(false);
                }

                ISymbol symbol = semanticModel.GetSymbol(elementAccess, cancellationToken);

                return(overriddenProperty.Equals(symbol) &&
                       CheckParameters(indexerDeclaration.ParameterList, elementAccess.ArgumentList, semanticModel, cancellationToken) &&
                       CheckDefaultValues(propertySymbol.Parameters, overriddenProperty.Parameters));
            }

            case SyntaxKind.SetAccessorDeclaration:
            {
                ExpressionSyntax expression = GetSetAccessorExpression(accessor);

                if (expression?.IsKind(SyntaxKind.SimpleAssignmentExpression) != true)
                {
                    return(false);
                }

                var assignment = (AssignmentExpressionSyntax)expression;

                ExpressionSyntax left = assignment.Left;

                if (left?.IsKind(SyntaxKind.ElementAccessExpression) != true)
                {
                    return(false);
                }

                var elementAccess = (ElementAccessExpressionSyntax)left;

                if (elementAccess.Expression?.IsKind(SyntaxKind.BaseExpression) != true)
                {
                    return(false);
                }

                if (elementAccess.ArgumentList == null)
                {
                    return(false);
                }

                ExpressionSyntax right = assignment.Right;

                if (right?.IsKind(SyntaxKind.IdentifierName) != true)
                {
                    return(false);
                }

                var identifierName = (IdentifierNameSyntax)right;

                if (identifierName.Identifier.ValueText != "value")
                {
                    return(false);
                }

                IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(indexerDeclaration, cancellationToken);

                IPropertySymbol overriddenProperty = propertySymbol?.OverriddenProperty;

                if (overriddenProperty == null)
                {
                    return(false);
                }

                ISymbol symbol = semanticModel.GetSymbol(elementAccess, cancellationToken);

                return(overriddenProperty.Equals(symbol) &&
                       CheckParameters(indexerDeclaration.ParameterList, elementAccess.ArgumentList, semanticModel, cancellationToken) &&
                       CheckDefaultValues(propertySymbol.Parameters, overriddenProperty.Parameters));
            }

            case SyntaxKind.UnknownAccessorDeclaration:
            {
                return(false);
            }

            default:
            {
                Debug.Fail(accessor.Kind().ToString());
                return(false);
            }
            }
        }
Ejemplo n.º 17
0
        internal static bool IsFixable(
            PropertyDeclarationSyntax propertyDeclaration,
            AccessorDeclarationSyntax accessor,
            SemanticModel semanticModel,
            CancellationToken cancellationToken)
        {
            switch (accessor.Kind())
            {
            case SyntaxKind.GetAccessorDeclaration:
            {
                ExpressionSyntax expression = GetGetAccessorExpression(accessor);

                if (expression?.IsKind(SyntaxKind.SimpleMemberAccessExpression) != true)
                {
                    return(false);
                }

                var memberAccess = (MemberAccessExpressionSyntax)expression;

                if (memberAccess.Expression?.IsKind(SyntaxKind.BaseExpression) != true)
                {
                    return(false);
                }

                SimpleNameSyntax simpleName = memberAccess.Name;

                IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(propertyDeclaration, cancellationToken);

                IPropertySymbol overriddenProperty = propertySymbol?.OverriddenProperty;

                if (overriddenProperty == null)
                {
                    return(false);
                }

                ISymbol symbol = semanticModel.GetSymbol(simpleName, cancellationToken);

                return(overriddenProperty.Equals(symbol));
            }

            case SyntaxKind.SetAccessorDeclaration:
            {
                ExpressionSyntax expression = GetSetAccessorExpression(accessor);

                if (expression?.IsKind(SyntaxKind.SimpleAssignmentExpression) != true)
                {
                    return(false);
                }

                var assignment = (AssignmentExpressionSyntax)expression;

                ExpressionSyntax left = assignment.Left;

                if (left?.IsKind(SyntaxKind.SimpleMemberAccessExpression) != true)
                {
                    return(false);
                }

                var memberAccess = (MemberAccessExpressionSyntax)left;

                if (memberAccess.Expression?.IsKind(SyntaxKind.BaseExpression) != true)
                {
                    return(false);
                }

                ExpressionSyntax right = assignment.Right;

                if (right?.IsKind(SyntaxKind.IdentifierName) != true)
                {
                    return(false);
                }

                var identifierName = (IdentifierNameSyntax)right;

                if (identifierName.Identifier.ValueText != "value")
                {
                    return(false);
                }

                SimpleNameSyntax simpleName = memberAccess.Name;

                if (simpleName == null)
                {
                    return(false);
                }

                IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(propertyDeclaration, cancellationToken);

                IPropertySymbol overriddenProperty = propertySymbol?.OverriddenProperty;

                if (overriddenProperty == null)
                {
                    return(false);
                }

                ISymbol symbol = semanticModel.GetSymbol(simpleName, cancellationToken);

                return(overriddenProperty.Equals(symbol));
            }

            case SyntaxKind.UnknownAccessorDeclaration:
            {
                return(false);
            }

            default:
            {
                Debug.Fail(accessor.Kind().ToString());
                return(false);
            }
            }
        }
Ejemplo n.º 18
0
 public override SyntaxNode VisitAccessorDeclaration(AccessorDeclarationSyntax node)
 {
     return(node.Kind() switch
     {
         SyntaxKind.GetAccessorDeclaration => node.WithSemicolonToken(default)
Ejemplo n.º 19
0
 private bool IsGetter(AccessorDeclarationSyntax accessor)
 => accessor.Kind() == SyntaxKind.GetAccessorDeclaration;
Ejemplo n.º 20
0
 public static bool IsGetterWithNoBody(this AccessorDeclarationSyntax accessor)
 {
     return(accessor.Kind() == SyntaxKind.GetAccessorDeclaration && accessor.Body == null);
 }
Ejemplo n.º 21
0
        internal SourceCustomEventAccessorSymbol(
            SourceEventSymbol @event,
            AccessorDeclarationSyntax syntax,
            EventSymbol explicitlyImplementedEventOpt,
            string aliasQualifierOpt,
            DiagnosticBag diagnostics)
            : base(@event,
                   syntax.GetReference(),
                   ImmutableArray.Create(syntax.Keyword.GetLocation()))
        {
            Debug.Assert(syntax != null);
            Debug.Assert(syntax.Kind() == SyntaxKind.AddAccessorDeclaration || syntax.Kind() == SyntaxKind.RemoveAccessorDeclaration);

            bool isAdder = syntax.Kind() == SyntaxKind.AddAccessorDeclaration;

            string name;
            ImmutableArray <MethodSymbol> explicitInterfaceImplementations;

            if ((object)explicitlyImplementedEventOpt == null)
            {
                name = SourceEventSymbol.GetAccessorName(@event.Name, isAdder);
                explicitInterfaceImplementations = ImmutableArray <MethodSymbol> .Empty;
            }
            else
            {
                MethodSymbol implementedAccessor = isAdder ? explicitlyImplementedEventOpt.AddMethod : explicitlyImplementedEventOpt.RemoveMethod;
                string       accessorName        = (object)implementedAccessor != null ? implementedAccessor.Name : SourceEventSymbol.GetAccessorName(explicitlyImplementedEventOpt.Name, isAdder);

                name = ExplicitInterfaceHelpers.GetMemberName(accessorName, explicitlyImplementedEventOpt.ContainingType, aliasQualifierOpt);
                explicitInterfaceImplementations = (object)implementedAccessor == null ? ImmutableArray <MethodSymbol> .Empty : ImmutableArray.Create <MethodSymbol>(implementedAccessor);
            }

            _explicitInterfaceImplementations = explicitInterfaceImplementations;
            _name = name;
            this.MakeFlags(
                isAdder ? MethodKind.EventAdd : MethodKind.EventRemove,
                @event.Modifiers,
                returnsVoid: false, // until we learn otherwise (in LazyMethodChecks).
                isExtensionMethod: false,
                isMetadataVirtualIgnoringModifiers: explicitInterfaceImplementations.Any());

            if (@event.ContainingType.IsInterface)
            {
                diagnostics.Add(ErrorCode.ERR_EventPropertyInInterface, this.Location);
            }
            else
            {
                if (syntax.Body != null || syntax.ExpressionBody != null)
                {
                    if (IsExtern && !IsAbstract)
                    {
                        diagnostics.Add(ErrorCode.ERR_ExternHasBody, this.Location, this);
                    }
                    else if (IsAbstract && !IsExtern)
                    {
                        diagnostics.Add(ErrorCode.ERR_AbstractHasBody, this.Location, this);
                    }
                    // Do not report error for IsAbstract && IsExtern. Dev10 reports CS0180 only
                    // in that case ("member cannot be both extern and abstract").
                }
            }

            _name = GetOverriddenAccessorName(@event, isAdder) ?? _name;

            if (syntax.Modifiers.Count > 0)
            {
                diagnostics.Add(ErrorCode.ERR_NoModifiersOnAccessor, syntax.Modifiers[0].GetLocation());
            }

            CheckForBlockAndExpressionBody(
                syntax.Body, syntax.ExpressionBody, syntax, diagnostics);
        }
 private static AccessorDeclarationSyntax Clone([NotNull] AccessorDeclarationSyntax accessor)
 {
     return(SyntaxFactory.AccessorDeclaration(accessor.Kind(), SyntaxFactory.Block(CreateNotImplementedStatement()))
            .WithModifiers(accessor.Modifiers));
 }
Ejemplo n.º 23
0
        internal static bool IsFixable(
            PropertyDeclarationSyntax propertyDeclaration,
            AccessorDeclarationSyntax accessor,
            SemanticModel semanticModel,
            CancellationToken cancellationToken)
        {
            switch (accessor.Kind())
            {
            case SyntaxKind.GetAccessorDeclaration:
            {
                ExpressionSyntax expression = GetGetAccessorExpression(accessor);

                if (expression?.IsKind(SyntaxKind.SimpleMemberAccessExpression) != true)
                {
                    return(false);
                }

                var memberAccess = (MemberAccessExpressionSyntax)expression;

                if (memberAccess.Expression?.IsKind(SyntaxKind.BaseExpression) != true)
                {
                    return(false);
                }

                SimpleNameSyntax simpleName = memberAccess.Name;

                IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(propertyDeclaration, cancellationToken);

                if (propertySymbol == null)
                {
                    return(false);
                }

                IPropertySymbol overriddenProperty = propertySymbol.OverriddenProperty;

                if (overriddenProperty == null)
                {
                    return(false);
                }

                ISymbol symbol = semanticModel.GetSymbol(simpleName, cancellationToken);

                return(SymbolEqualityComparer.Default.Equals(overriddenProperty, symbol));
            }

            case SyntaxKind.SetAccessorDeclaration:
            {
                ExpressionSyntax expression = GetSetAccessorExpression(accessor);

                SimpleAssignmentExpressionInfo assignment = SyntaxInfo.SimpleAssignmentExpressionInfo(expression);

                if (!assignment.Success)
                {
                    return(false);
                }

                if (assignment.Left.Kind() != SyntaxKind.SimpleMemberAccessExpression)
                {
                    return(false);
                }

                var memberAccess = (MemberAccessExpressionSyntax)assignment.Left;

                if (memberAccess.Expression?.IsKind(SyntaxKind.BaseExpression) != true)
                {
                    return(false);
                }

                if (assignment.Right.Kind() != SyntaxKind.IdentifierName)
                {
                    return(false);
                }

                var identifierName = (IdentifierNameSyntax)assignment.Right;

                if (identifierName.Identifier.ValueText != "value")
                {
                    return(false);
                }

                SimpleNameSyntax simpleName = memberAccess.Name;

                if (simpleName == null)
                {
                    return(false);
                }

                IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(propertyDeclaration, cancellationToken);

                if (propertySymbol == null)
                {
                    return(false);
                }

                IPropertySymbol overriddenProperty = propertySymbol.OverriddenProperty;

                if (overriddenProperty == null)
                {
                    return(false);
                }

                ISymbol symbol = semanticModel.GetSymbol(simpleName, cancellationToken);

                return(SymbolEqualityComparer.Default.Equals(overriddenProperty, symbol));
            }

            case SyntaxKind.UnknownAccessorDeclaration:
            {
                return(false);
            }

            default:
            {
                SyntaxDebug.Fail(accessor);
                return(false);
            }
            }
        }
Ejemplo n.º 24
0
        internal static bool IsFixable(
            IndexerDeclarationSyntax indexerDeclaration,
            AccessorDeclarationSyntax accessor,
            SemanticModel semanticModel,
            CancellationToken cancellationToken)
        {
            switch (accessor.Kind())
            {
            case SyntaxKind.GetAccessorDeclaration:
            {
                ExpressionSyntax expression = GetGetAccessorExpression(accessor);

                if (expression is not ElementAccessExpressionSyntax elementAccess)
                {
                    return(false);
                }

                if (elementAccess.Expression?.IsKind(SyntaxKind.BaseExpression) != true)
                {
                    return(false);
                }

                if (elementAccess.ArgumentList == null)
                {
                    return(false);
                }

                IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(indexerDeclaration, cancellationToken);

                if (propertySymbol == null)
                {
                    return(false);
                }

                IPropertySymbol overriddenProperty = propertySymbol.OverriddenProperty;

                if (overriddenProperty == null)
                {
                    return(false);
                }

                ISymbol symbol = semanticModel.GetSymbol(elementAccess, cancellationToken);

                return(SymbolEqualityComparer.Default.Equals(overriddenProperty, symbol) &&
                       CheckParameters(indexerDeclaration.ParameterList, elementAccess.ArgumentList, semanticModel, cancellationToken) &&
                       CheckDefaultValues(propertySymbol.Parameters, overriddenProperty.Parameters));
            }

            case SyntaxKind.SetAccessorDeclaration:
            {
                ExpressionSyntax expression = GetSetAccessorExpression(accessor);

                SimpleAssignmentExpressionInfo assignment = SyntaxInfo.SimpleAssignmentExpressionInfo(expression);

                if (!assignment.Success)
                {
                    return(false);
                }

                if (assignment.Left.Kind() != SyntaxKind.ElementAccessExpression)
                {
                    return(false);
                }

                var elementAccess = (ElementAccessExpressionSyntax)assignment.Left;

                if (elementAccess.Expression?.IsKind(SyntaxKind.BaseExpression) != true)
                {
                    return(false);
                }

                if (elementAccess.ArgumentList == null)
                {
                    return(false);
                }

                if (assignment.Right.Kind() != SyntaxKind.IdentifierName)
                {
                    return(false);
                }

                var identifierName = (IdentifierNameSyntax)assignment.Right;

                if (identifierName.Identifier.ValueText != "value")
                {
                    return(false);
                }

                IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(indexerDeclaration, cancellationToken);

                if (propertySymbol == null)
                {
                    return(false);
                }

                IPropertySymbol overriddenProperty = propertySymbol.OverriddenProperty;

                if (overriddenProperty == null)
                {
                    return(false);
                }

                ISymbol symbol = semanticModel.GetSymbol(elementAccess, cancellationToken);

                return(SymbolEqualityComparer.Default.Equals(overriddenProperty, symbol) &&
                       CheckParameters(indexerDeclaration.ParameterList, elementAccess.ArgumentList, semanticModel, cancellationToken) &&
                       CheckDefaultValues(propertySymbol.Parameters, overriddenProperty.Parameters));
            }

            case SyntaxKind.UnknownAccessorDeclaration:
            {
                return(false);
            }

            default:
            {
                SyntaxDebug.Fail(accessor);
                return(false);
            }
            }
        }
Ejemplo n.º 25
0
        internal static bool CanRefactor(
            IndexerDeclarationSyntax indexerDeclaration,
            AccessorDeclarationSyntax accessor,
            SemanticModel semanticModel,
            CancellationToken cancellationToken)
        {
            switch (accessor.Kind())
            {
            case SyntaxKind.GetAccessorDeclaration:
                {
                    ExpressionSyntax expression = GetGetAccessorExpression(accessor);

                    if (expression?.IsKind(SyntaxKind.ElementAccessExpression) == true)
                    {
                        var elementAccess = (ElementAccessExpressionSyntax)expression;

                        if (elementAccess.Expression?.IsKind(SyntaxKind.BaseExpression) == true &&
                            elementAccess.ArgumentList != null)
                        {
                            IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(indexerDeclaration, cancellationToken);

                            if (propertySymbol != null)
                            {
                                IPropertySymbol overriddenProperty = propertySymbol.OverriddenProperty;

                                if (overriddenProperty != null)
                                {
                                    ISymbol symbol = semanticModel.GetSymbol(elementAccess, cancellationToken);

                                    if (overriddenProperty.Equals(symbol))
                                    {
                                        return(true);
                                    }
                                }
                            }
                        }
                    }

                    return(false);
                }

            case SyntaxKind.SetAccessorDeclaration:
            {
                ExpressionSyntax expression = GetSetAccessorExpression(accessor);

                if (expression?.IsKind(SyntaxKind.SimpleAssignmentExpression) == true)
                {
                    var assignment = (AssignmentExpressionSyntax)expression;

                    ExpressionSyntax left = assignment.Left;

                    if (left?.IsKind(SyntaxKind.ElementAccessExpression) == true)
                    {
                        var elementAccess = (ElementAccessExpressionSyntax)left;

                        if (elementAccess.Expression?.IsKind(SyntaxKind.BaseExpression) == true &&
                            elementAccess.ArgumentList != null)
                        {
                            ExpressionSyntax right = assignment.Right;

                            if (right?.IsKind(SyntaxKind.IdentifierName) == true)
                            {
                                var identifierName = (IdentifierNameSyntax)right;

                                if (identifierName.Identifier.ValueText == "value")
                                {
                                    IPropertySymbol propertySymbol = semanticModel.GetDeclaredSymbol(indexerDeclaration, cancellationToken);

                                    if (propertySymbol != null)
                                    {
                                        IPropertySymbol overriddenProperty = propertySymbol.OverriddenProperty;

                                        if (overriddenProperty != null)
                                        {
                                            ISymbol symbol = semanticModel.GetSymbol(elementAccess, cancellationToken);

                                            if (overriddenProperty.Equals(symbol))
                                            {
                                                return(true);
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }

                return(false);
            }

            case SyntaxKind.UnknownAccessorDeclaration:
            {
                return(false);
            }

            default:
            {
                Debug.Assert(false, accessor.Kind().ToString());
                return(false);
            }
            }
        }