Example #1
0
        /// <summary>
        /// Creates a field that holds <see cref="QueryTypeProperties{T}"/> for the module.
        /// </summary>
        protected FieldDeclarationSyntax CreatePropertiesField(
            Module module, string resultClassName, FieldDeclarationSyntax propsField, SortType? sortType)
        {
            var queryTypePropertiesType = SyntaxEx.GenericName("QueryTypeProperties", resultClassName);

            var propertiesInitializer = SyntaxEx.ObjectCreation(
                queryTypePropertiesType,
                SyntaxEx.Literal(module.Name),
                SyntaxEx.Literal(module.Prefix),
                module.QueryType == null
                    ? (ExpressionSyntax)SyntaxEx.NullLiteral()
                    : SyntaxEx.MemberAccess("QueryType", module.QueryType.ToString()),
                sortType == null
                    ? (ExpressionSyntax)SyntaxEx.NullLiteral()
                    : SyntaxEx.MemberAccess("SortType", sortType.ToString()),
                CreateTupleListExpression(GetBaseParameters(module)),
                propsField == null ? (ExpressionSyntax)SyntaxEx.NullLiteral() : (NamedNode)propsField,
                resultClassName == "object"
                    ? (ExpressionSyntax)SyntaxEx.LambdaExpression("_", SyntaxEx.NullLiteral())
                    : SyntaxEx.MemberAccess(resultClassName, "Parse"));

            return SyntaxEx.FieldDeclaration(
                new[] { SyntaxKind.PrivateKeyword, SyntaxKind.StaticKeyword, SyntaxKind.ReadOnlyKeyword },
                queryTypePropertiesType, ClassNameBase + "Properties", propertiesInitializer);
        }
            public override SyntaxNode VisitFieldDeclaration(FieldDeclarationSyntax node)
            {
                bool isInstance;
                if (!NeedsRewrite(node, out isInstance))
                {
                    return node;
                }

                var declarators = new List<VariableDeclaratorSyntax>(node.Declarators.Count);
                foreach (var d in node.Declarators)
                {
                    var list = new List<ModifiedIdentifierSyntax>(d.Names.Count);
                    foreach (var v in d.Names)
                    {
                        var local = v;
                        if (!IsGoodPrivateFieldName(v.Identifier.ValueText, isInstance))
                        {
                            local = local.WithAdditionalAnnotations(s_markerAnnotationArray);
                            _count++;
                        }

                        list.Add(local);
                    }

                    declarators.Add(d.WithNames(SyntaxFactory.SeparatedList(list)));
                }

                return node.WithDeclarators(SyntaxFactory.SeparatedList(declarators));
            }
 public FieldMover(SemanticModel semanticModel, Symbol symbol, FieldDeclarationSyntax fds, PropertyDeclarationSyntax prop,  ClassDeclarationSyntax parent)
 {
     this.semanticModel = semanticModel;
     this.parent = parent;
     this.fieldSymbol = symbol;
     this.fds = fds;
     this.prop = prop;
 }
 public LockInfo(
     FieldDeclarationSyntax declaration,
     FieldSymbol symbol,
     AttributeData associatedAttribute,
     SemanticModel semanticModel)
     : base(declaration, symbol, associatedAttribute, semanticModel)
 {
 }
 internal FieldMemberBuilder(NamedTypeSymbol owner, Binder enclosing, FieldDeclarationSyntax declaration, TypeSymbol type, VariableDeclaratorSyntax declarator)
     : base(enclosing.Location(declarator) as SourceLocation, owner, enclosing)
 {
     this.owner = owner;
     this.declaration = declaration;
     this.declarator = declarator;
     this.Type = type;
 }
 public GuardedFieldInfo(
     FieldDeclarationSyntax declaration,
     FieldSymbol symbol,
     AttributeData associatedAttribute,
     SemanticModel semanticModel)
     : base(declaration, symbol, associatedAttribute, semanticModel)
 {
     _declaredLockHierarchy = LockHierarchy.FromStringList(Attribute.ConstructorArguments.SelectMany(arg => arg.Values.Select(argVal => argVal.Value.ToString())).ToList());
 }
        public CodeAction(ICodeActionEditFactory editFactory, IDocument document, FieldDeclarationSyntax member, ClassDeclarationSyntax parent)
        {
            this.editFactory = editFactory;
            this.document = document;
            this.field = member;
            this.parentClass = parent;

            this.Description = "Move member to parent class";
            this.Icon = null;
        }
        public override SyntaxNode VisitFieldDeclaration(FieldDeclarationSyntax field)
        {
            // Retrieve the symbol for the field
            if (field.Declaration.Variables.Count == 1)
            {
                if (semanticModel.GetDeclaredSymbol(field) == backingField)
                {
                    return null;
                }
            }

            return field;
        }
        protected override SyntaxNode VisitFieldDeclaration(FieldDeclarationSyntax field)
        {
            // Retrieve the symbol for the field
            if (field.Declaration.Variables.Count == 1)
            {
                if (semanticModel.GetDeclaredSymbol(field) == fieldSymbol)
                {
                    //hide field from child class
                    return null;
                }
            }

            return field;
        }
            private bool NeedsRewrite(FieldDeclarationSyntax fieldSyntax, out bool isInstance)
            {
                if (!IsPrivateField(fieldSyntax, out isInstance))
                {
                    return false;
                }

                foreach (var d in fieldSyntax.Declarators)
                {
                    foreach (var v in d.Names)
                    {
                        if (!IsGoodPrivateFieldName(v.Identifier.ValueText, isInstance))
                        {
                            return true;
                        }
                    }
                }

                return false;
            }
Example #11
0
        public override async Task RegisterCodeFixesAsync(CodeFixContext context)
        {
            var syntaxRoot = await context.Document.GetSyntaxRootAsync(context.CancellationToken)
                             .ConfigureAwait(false);

            var semanticModel = await context.Document.GetSemanticModelAsync(context.CancellationToken)
                                .ConfigureAwait(false);

            foreach (var diagnostic in context.Diagnostics)
            {
                if (syntaxRoot.TryFindNodeOrAncestor(diagnostic, out ObjectCreationExpressionSyntax? objectCreation) &&
                    semanticModel.TryGetType(objectCreation, context.CancellationToken, out var type) &&
                    type.TrySingleDeclaration(context.CancellationToken, out ClassDeclarationSyntax? declaration))
                {
                    if (diagnostic.Id == Descriptors.GURA08aShouldBeInternal.Id)
                    {
                        context.RegisterCodeFix(
                            CodeAction.Create(
                                "Make internal.",
                                cancellationToken => Task.FromResult(
                                    context.Document.Project.Solution
                                    .GetDocument(declaration.SyntaxTree)
                                    .WithSyntaxRoot(
                                        declaration.SyntaxTree.GetRoot(cancellationToken).ReplaceNode(
                                            declaration,
                                            Make(declaration, SyntaxFactory.Token(SyntaxKind.InternalKeyword))))),
                                nameof(AccessibilityFix)),
                            diagnostic);
                    }
                    else if (diagnostic.Id == Descriptors.GURA08bShouldBePublic.Id)
                    {
                        context.RegisterCodeFix(
                            CodeAction.Create(
                                "Make public.",
                                cancellationToken => Task.FromResult(
                                    context.Document.Project.Solution
                                    .GetDocument(declaration.SyntaxTree)
                                    .WithSyntaxRoot(
                                        declaration.SyntaxTree.GetRoot(cancellationToken).ReplaceNode(
                                            declaration,
                                            Make(declaration, SyntaxFactory.Token(SyntaxKind.PublicKeyword))))),
                                nameof(AccessibilityFix)),
                            diagnostic);
                    }

                    MemberDeclarationSyntax Make(MemberDeclarationSyntax before, SyntaxToken token)
                    {
                        return(before switch
                        {
                            FieldDeclarationSyntax field => field.WithModifiers(Public(field.Modifiers)),
                            PropertyDeclarationSyntax property => property.WithModifiers(Public(property.Modifiers)),
                            ClassDeclarationSyntax @class => @class.WithModifiers(Public(@class.Modifiers)),
                            _ => before,
                        });

                        SyntaxTokenList Public(SyntaxTokenList modifiers)
                        {
                            if (modifiers.TryFirst(out var first))
                            {
                                switch (first.Kind())
                                {
                                case SyntaxKind.InternalKeyword:
                                case SyntaxKind.PublicKeyword:
                                    return(modifiers.Replace(
                                               first,
                                               token.WithTriviaFrom(first)));

                                default:
                                    return(modifiers.Insert(0, token));
                                }
                            }

                            return(SyntaxTokenList.Create(token));
                        }
                    }
                }
            }
Example #12
0
 public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     //Visit(node.Declaration);
 }
Example #13
0
 public static bool IsVisible(FieldDeclarationSyntax field)
 {
     return(IsVisible(field.Modifiers));
 }
Example #14
0
            PropertyDeclarationSyntax ConvertProperty(PropertyDeclarationSyntax propertyDeclaration, FieldDeclarationSyntax relatedField)
            {
                var leadingList = new SyntaxTriviaList();

                if (relatedField.Declaration.Variables.Count == 1)
                {
                    leadingList = leadingList.AddRange(relatedField.GetLeadingTrivia());
                }

                var propertyDeclaration_GetLeadingTrivia = propertyDeclaration.GetLeadingTrivia();

                if (leadingList.Any() && propertyDeclaration_GetLeadingTrivia.First().IsKind(SyntaxKind.EndOfLineTrivia) == false)
                {
                    var endOfLine = relatedField.GetLeadingTrivia().FirstOrDefault(x => x.IsKind(SyntaxKind.EndOfLineTrivia));

                    if (endOfLine != null)
                    {
                        leadingList = leadingList.Add(endOfLine);
                    }
                }

                leadingList = leadingList.AddRange(propertyDeclaration.GetLeadingTrivia());

                var getNode = propertyDeclaration.AccessorList.Accessors.FirstOrDefault(x => x.Keyword.IsKind(SyntaxKind.GetKeyword));
                var setNode = propertyDeclaration.AccessorList.Accessors.FirstOrDefault(x => x.Keyword.IsKind(SyntaxKind.SetKeyword));

                propertyDeclaration =
                    propertyDeclaration
                    .WithAccessorList
                    (
                        propertyDeclaration.AccessorList.WithAccessors(

                            new SyntaxList <AccessorDeclarationSyntax>()
                            .Add(
                                getNode
                                .WithBody(null)
                                .WithTrailingTrivia()
                                .WithSemicolonToken(
                                    SyntaxFactory.ParseToken(";")
                                    .WithTrailingTrivia(SyntaxFactory.Space)
                                    )
                                .WithLeadingTrivia(SyntaxFactory.Space)

                                )
                            .Add(
                                setNode
                                .WithBody(null)
                                .WithTrailingTrivia()
                                .WithSemicolonToken(
                                    SyntaxFactory.ParseToken(";")
                                    .WithTrailingTrivia(SyntaxFactory.Space)

                                    )
                                .WithLeadingTrivia(SyntaxFactory.Space)
                                )
                            )
                        .WithOpenBraceToken(propertyDeclaration.AccessorList.OpenBraceToken.WithLeadingTrivia().WithTrailingTrivia())
                        .WithCloseBraceToken(propertyDeclaration.AccessorList.CloseBraceToken.WithLeadingTrivia())
                    )
                    .WithIdentifier(propertyDeclaration.Identifier.WithTrailingTrivia(SyntaxFactory.Space))
                    .WithLeadingTrivia(leadingList);

                return(propertyDeclaration);
            }
            public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
            {
                VariableDeclaratorSyntax variableDeclaration = node.DescendantNodes().OfType<VariableDeclaratorSyntax>().First();

                FieldSymbol field = (FieldSymbol) _semanticModel.GetDeclaredSymbol(variableDeclaration);

                if (field != null)
                {

                    var attributes = field.GetAttributes();

                    foreach (AttributeData attribute in attributes)
                    {
                        if (attribute.IsInstanceOfAttributeType<GuardedByAttribute>())
                        {
                            GuardedFieldInfo guardedField = new GuardedFieldInfo(node, field, attribute, _semanticModel);

                            _guardedFields.Add(guardedField);
                        }
                        else if (attribute.IsInstanceOfAttributeType<LockAttribute>())
                        {
                            LockInfo lockField = new LockInfo(node, field, attribute, _semanticModel);

                            _locks.Add(lockField);
                        }
                        else
                        {
                            //do nothing
                        }
                    }
                }
                base.VisitFieldDeclaration(node);
            }
        private static void HandleFieldDeclaration(SyntaxNodeAnalysisContext context)
        {
            FieldDeclarationSyntax syntax = (FieldDeclarationSyntax)context.Node;

            if (NamedTypeHelpers.IsContainedInNativeMethodsClass(syntax))
            {
                return;
            }

            if (syntax.Modifiers.Any(SyntaxKind.ConstKeyword))
            {
                // this diagnostic does not apply to constant fields
                return;
            }

            if (syntax.Modifiers.Any(SyntaxKind.PublicKeyword) ||
                syntax.Modifiers.Any(SyntaxKind.InternalKeyword))
            {
                // this diagnostic does not apply to public or internal read only fields
                return;
            }

            if (syntax.Modifiers.Any(SyntaxKind.ReadOnlyKeyword) &&
                syntax.Modifiers.Any(SyntaxKind.ProtectedKeyword))
            {
                // this diagnostic does not apply to non-private read only fields
                return;
            }

            if (syntax.Modifiers.Any(SyntaxKind.ReadOnlyKeyword) &&
                syntax.Modifiers.Any(SyntaxKind.StaticKeyword))
            {
                // this diagnostic does not apply to static read only fields
                return;
            }

            var variables = syntax.Declaration?.Variables;

            if (variables == null)
            {
                return;
            }

            foreach (VariableDeclaratorSyntax variableDeclarator in variables.Value)
            {
                if (variableDeclarator == null)
                {
                    continue;
                }

                var identifier = variableDeclarator.Identifier;
                if (identifier.IsMissing)
                {
                    continue;
                }

                string name = identifier.ValueText;
                if (string.IsNullOrEmpty(name))
                {
                    continue;
                }

                var index = 0;
                while ((index < name.Length) && name[index] == '_')
                {
                    index++;
                }

                if (index == name.Length)
                {
                    // ignore fields with all underscores
                    continue;
                }

                if (char.IsLower(name, index))
                {
                    continue;
                }

                // Field names must begin with lower-case letter
                context.ReportDiagnostic(Diagnostic.Create(Descriptor, identifier.GetLocation(), name));
            }
        }
 public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     base.VisitFieldDeclaration(node);
 }
Example #18
0
 public void VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     VisitBaseFieldDeclaration(node);
 }
Example #19
0
        /// <summary>
        /// Creates an entry method, that is used to execute query for normal modules
        /// or that can be used as a base for a query for query modules.
        /// </summary>
        protected void GenerateMethod(
            Module module, IEnumerable<Parameter> methodParameters, string resultClassName,
            FieldDeclarationSyntax propsField, string fileName, bool nullableParameters, SortType? sortType)
        {
            var propertiesField = CreatePropertiesField(module, resultClassName, propsField, sortType);

            ExpressionSyntax queryParameters = SyntaxEx.Invocation(
                SyntaxEx.MemberAccess("QueryParameters", SyntaxEx.GenericName("Create", resultClassName)));

            var queryParametersLocal = SyntaxEx.LocalDeclaration("var", "queryParameters", queryParameters);

            var documentationElements = new List<XmlElementSyntax>();

            var summary = SyntaxEx.DocumentationSummary(module.Description);
            documentationElements.Add(summary);

            var parameters = new List<ParameterSyntax>();
            IList<StatementSyntax> statements = new List<StatementSyntax>();

            statements.Add(queryParametersLocal);

            methodParameters = methodParameters.Where(p => !p.Deprecated)
                .OrderByDescending(p => p.Required);

            foreach (var methodParameter in methodParameters)
            {
                var nullable = nullableParameters && !methodParameter.Required;
                var typeName = Wiki.TypeManager.GetTypeName(methodParameter, ClassNameBase, nullable, false);
                var parameterName = GetPropertyName(methodParameter.Name);
                var parameter = SyntaxEx.Parameter(typeName, parameterName, nullable ? SyntaxEx.NullLiteral() : null);

                parameters.Add(parameter);

                ExpressionSyntax valueExpression = (NamedNode)parameter;

                if (nullable && typeName.EndsWith("?"))
                    valueExpression = SyntaxEx.MemberAccess(valueExpression, "Value");

                var queryParametersAssignment = SyntaxEx.Assignment(
                    queryParametersLocal, SyntaxEx.Invocation(
                        SyntaxEx.MemberAccess(queryParametersLocal, "AddSingleValue"),
                        SyntaxEx.Literal(methodParameter.Name),
                        SyntaxEx.Invocation(SyntaxEx.MemberAccess(valueExpression, "ToQueryString"))));

                if (nullable)
                {
                    var assignmentWithCheck = SyntaxEx.If(
                        SyntaxEx.NotEquals((NamedNode)parameter, SyntaxEx.NullLiteral()), queryParametersAssignment);

                    statements.Add(assignmentWithCheck);
                }
                else
                    statements.Add(queryParametersAssignment);

                var parameterDocumentation = SyntaxEx.DocumentationParameter(
                    parameterName, new System.Xml.Linq.XText(methodParameter.Description).ToString());

                documentationElements.Add(parameterDocumentation);
            }

            statements = GenerateMethodBody(
                SyntaxEx.ObjectCreation(
                    SyntaxEx.GenericName("QueryProcessor", resultClassName),
                    Syntax.IdentifierName("m_wiki"),
                    (NamedNode)propertiesField), (NamedNode)queryParametersLocal, statements);

            var modifiers = new List<SyntaxKind> { SyntaxKind.PublicKeyword };
            if (statements == null)
                modifiers.Add(SyntaxKind.AbstractKeyword);

            var method = SyntaxEx.MethodDeclaration(
                modifiers, GenerateMethodResultType(), ClassNameBase, parameters, statements)
                .WithLeadingTrivia(Syntax.Trivia(SyntaxEx.DocumentationComment(documentationElements)));

            AddMembersToClass(fileName, propertiesField, method);
        }
Example #20
0
        public static FieldDeclarationSyntax FieldDeclaration(VariableDeclarationSyntax declaration = null)
        {
            var result = new FieldDeclarationSyntax();

            result.Declaration = declaration;

            return result;
        }
Example #21
0
        public static FieldDeclarationSyntax FieldDeclaration(IEnumerable<AttributeListSyntax> attributeLists = null, Modifiers modifiers = default(Modifiers), VariableDeclarationSyntax declaration = null)
        {
            var result = new FieldDeclarationSyntax();

            if (attributeLists != null)
                result.AttributeLists.AddRange(attributeLists);
            result.Modifiers = modifiers;
            result.Declaration = declaration;

            return result;
        }
        private bool CanBecameReadOnlyField(FieldDeclarationSyntax field)
        {
            var noPrivate = field.Modifiers.Any(p => p.IsKind(SyntaxKind.PublicKeyword) || p.IsKind(SyntaxKind.ProtectedKeyword) || p.IsKind(SyntaxKind.InternalKeyword));

            return(noPrivate ? !field.Modifiers.Any(p => p.IsKind(SyntaxKind.ConstKeyword) || p.IsKind(SyntaxKind.ReadOnlyKeyword)) : false);
        }
 public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     AsChild(node, node.Declaration.Variables.First().Identifier.Text, node.Declaration.Variables.First().Identifier.GetLocation());
 }
        internal static void AddField(this DocumentEditor editor, TypeDeclarationSyntax containingType, FieldDeclarationSyntax field)
        {
            FieldDeclarationSyntax existing = null;

            foreach (var member in containingType.Members)
            {
                if (member is FieldDeclarationSyntax fieldDeclaration)
                {
                    if (IsInsertBefore(fieldDeclaration))
                    {
                        editor.InsertBefore(fieldDeclaration, field);
                        return;
                    }

                    existing = fieldDeclaration;
                    continue;
                }

                editor.InsertBefore(member, field);
                return;
            }

            if (existing != null)
            {
                editor.InsertAfter(existing, field);
            }
            else
            {
                editor.AddMember(containingType, field);
            }
        }
Example #25
0
        private static IEnumerable <MemberDeclarationSyntax> CreateMembers(IEnumerable <AnalyzerMetadata> analyzers)
        {
            foreach (AnalyzerMetadata analyzer in analyzers)
            {
                FieldDeclarationSyntax fieldDeclaration = FieldDeclaration(
                    Modifiers.Public_Static_ReadOnly(),
                    IdentifierName("DiagnosticDescriptor"),
                    analyzer.Identifier,
                    ObjectCreationExpression(
                        IdentifierName("DiagnosticDescriptor"),
                        ArgumentList(
                            Argument(
                                NameColon("id"),
                                SimpleMemberAccessExpression(IdentifierName("DiagnosticIdentifiers"), IdentifierName(analyzer.Identifier))),
                            Argument(
                                NameColon("title"),
                                StringLiteralExpression(analyzer.Title)),
                            Argument(
                                NameColon("messageFormat"),
                                StringLiteralExpression(analyzer.MessageFormat)),
                            Argument(
                                NameColon("category"),
                                SimpleMemberAccessExpression(IdentifierName("DiagnosticCategories"), IdentifierName(analyzer.Category))),
                            Argument(
                                NameColon("defaultSeverity"),
                                SimpleMemberAccessExpression(IdentifierName("DiagnosticSeverity"), IdentifierName(analyzer.DefaultSeverity))),
                            Argument(
                                NameColon("isEnabledByDefault"),
                                BooleanLiteralExpression(analyzer.IsEnabledByDefault)),
                            Argument(
                                NameColon("description"),
                                NullLiteralExpression()),
                            Argument(
                                NameColon("helpLinkUri"),
                                ParseExpression($"$\"{{HelpLinkUriRoot}}{{DiagnosticIdentifiers.{analyzer.Identifier}}}\"")),
                            Argument(
                                NameColon("customTags"),
                                (analyzer.SupportsFadeOut)
                                    ? SimpleMemberAccessExpression(IdentifierName("WellKnownDiagnosticTags"), IdentifierName("Unnecessary"))
                                    : ParseExpression("Array.Empty<string>()"))
                            ))).AddObsoleteAttributeIf(analyzer.IsObsolete, error: true);

                if (!analyzer.IsObsolete)
                {
                    var settings = new DocumentationCommentGeneratorSettings(
                        summary: new string[] { analyzer.Id },
                        indentation: "        ",
                        singleLineSummary: true);

                    fieldDeclaration = fieldDeclaration.WithNewSingleLineDocumentationComment(settings);
                }

                yield return(fieldDeclaration);

                if (analyzer.SupportsFadeOutAnalyzer)
                {
                    yield return(FieldDeclaration(
                                     Modifiers.Public_Static_ReadOnly(),
                                     IdentifierName("DiagnosticDescriptor"),
                                     analyzer.Identifier + "FadeOut",
                                     SimpleMemberInvocationExpression(
                                         IdentifierName(analyzer.Identifier),
                                         IdentifierName("CreateFadeOut"))).AddObsoleteAttributeIf(analyzer.IsObsolete, error: true));
                }
            }
        }
 public override SyntaxNode VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     node = (FieldDeclarationSyntax)base.VisitFieldDeclaration(node);
     Classes.Add(node);
     return(node);
 }
Example #27
0
 bool CheckVisibility(FieldDeclarationSyntax baseFieldFieldDeclaration, AccessorDeclarationSyntax getNode, AccessorDeclarationSyntax setNode, PropertyDeclarationSyntax propertyDeclaration)
 {
     if (baseFieldFieldDeclaration.IsPrivate())
     {
         return(true);
     }
     else
     {
         if (baseFieldFieldDeclaration.IsPublic())
         {
             if (propertyDeclaration.IsPublic() == false)
             {
                 return(false);
             }
             if (getNode.Modifiers.Any())
             {
                 return(false);
             }
             if (setNode.Modifiers.Any())
             {
                 return(false);
             }
         }
         else if (baseFieldFieldDeclaration.IsProtected())
         {
             if (propertyDeclaration.IsPrivate() == false)
             {
                 return(false);
             }
             if (propertyDeclaration.IsProtected())
             {
                 if (getNode.Modifiers.Any())
                 {
                     return(false);
                 }
                 if (setNode.Modifiers.Any())
                 {
                     return(false);
                 }
             }
             else if (propertyDeclaration.IsPublic())
             {
                 if (baseFieldFieldDeclaration.IsInternal() == false)
                 {
                     if (getNode.Modifiers.Any(x => x.IsKind(SyntaxKind.PrivateKeyword) || x.IsKind(SyntaxKind.InternalKeyword)))
                     {
                         return(false);
                     }
                     if (setNode.Modifiers.Any(x => x.IsKind(SyntaxKind.PrivateKeyword) || x.IsKind(SyntaxKind.InternalKeyword)))
                     {
                         return(false);
                     }
                 }
                 else
                 {
                     if (getNode.Modifiers.Any(x => x.IsKind(SyntaxKind.PrivateKeyword)))
                     {
                         return(false);
                     }
                     if (setNode.Modifiers.Any(x => x.IsKind(SyntaxKind.PrivateKeyword)))
                     {
                         return(false);
                     }
                 }
             }
         }
         else if (baseFieldFieldDeclaration.IsInternal())
         {
             if (propertyDeclaration.IsPrivate() == false)
             {
                 return(false);
             }
             if (propertyDeclaration.IsInternal())
             {
                 if (getNode.Modifiers.Any())
                 {
                     return(false);
                 }
                 if (setNode.Modifiers.Any())
                 {
                     return(false);
                 }
             }
             else if (propertyDeclaration.IsPublic())
             {
                 if (getNode.Modifiers.Any(x => x.IsKind(SyntaxKind.PrivateKeyword) || x.IsKind(SyntaxKind.ProtectedKeyword)))
                 {
                     return(false);
                 }
                 if (setNode.Modifiers.Any(x => x.IsKind(SyntaxKind.PrivateKeyword) || x.IsKind(SyntaxKind.ProtectedKeyword)))
                 {
                     return(false);
                 }
             }
         }
     }
     return(true);
 }
Example #28
0
 public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     base.VisitFieldDeclaration(node);
     FilterType(node.Declaration.Type);
 }
Example #29
0
        private List <System.Attribute> GetFieldAttributes(FieldDeclarationSyntax node)
        {
            List <System.Attribute> attributes = new List <System.Attribute>();

            if (node.AttributeLists != null)
            {
                foreach (AttributeListSyntax attributeList in node.AttributeLists)
                {
                    UpdateSyntaxNode(attributeList);

                    foreach (AttributeSyntax attribute in attributeList.Attributes)
                    {
                        using (ExpressionCaptureScope attributeTypeCapture = new ExpressionCaptureScope(visitorContext, null))
                        {
                            attributeTypeCapture.isAttributeCaptureScope = true;
                            Visit(attribute.Name);

                            System.Type captureType = attributeTypeCapture.captureType;

                            if (captureType == typeof(UdonSyncedAttribute))
                            {
                                UdonSyncMode syncMode = UdonSyncMode.NotSynced;

                                if (attribute.ArgumentList == null ||
                                    attribute.ArgumentList.Arguments == null ||
                                    attribute.ArgumentList.Arguments.Count == 0)
                                {
                                    syncMode = UdonSyncMode.None;
                                }
                                else
                                {
                                    using (ExpressionCaptureScope attributeCaptureScope = new ExpressionCaptureScope(visitorContext, null))
                                    {
                                        Visit(attribute.ArgumentList.Arguments[0].Expression);

                                        if (!attributeCaptureScope.IsEnum())
                                        {
                                            throw new System.Exception("Invalid attribute argument provided for sync");
                                        }

                                        syncMode = (UdonSyncMode)attributeCaptureScope.GetEnumValue();
                                    }
                                }
                                attributes.Add(new UdonSyncedAttribute(syncMode));
                            }
                            else if (captureType != null)
                            {
                                try
                                {
                                    object attributeObject = null;

                                    if (attribute.ArgumentList == null ||
                                        attribute.ArgumentList.Arguments == null ||
                                        attribute.ArgumentList.Arguments.Count == 0)
                                    {
                                        attributeObject = System.Activator.CreateInstance(captureType);
                                    }
                                    else
                                    {
                                        // todo: requires constant folding to support decently
                                        object[] attributeArgs = new object[attribute.ArgumentList.Arguments.Count];

                                        for (int i = 0; i < attributeArgs.Length; ++i)
                                        {
                                            AttributeArgumentSyntax attributeArg = attribute.ArgumentList.Arguments[i];

                                            using (ExpressionCaptureScope attributeCapture = new ExpressionCaptureScope(visitorContext, null))
                                            {
                                                Visit(attributeArg);

                                                SymbolDefinition attrSymbol = attributeCapture.ExecuteGet();

                                                if (!attrSymbol.declarationType.HasFlag(SymbolDeclTypeFlags.Constant))
                                                {
                                                    throw new System.ArgumentException("Attributes do not support non-constant expressions");
                                                }

                                                attributeArgs[i] = attrSymbol.symbolDefaultValue;
                                            }
                                        }

                                        attributeObject = System.Activator.CreateInstance(captureType, attributeArgs);
                                    }

                                    if (attributeObject != null)
                                    {
                                        attributes.Add((System.Attribute)attributeObject);
                                    }
                                }
                                catch (System.Reflection.TargetInvocationException constructionException)
                                {
                                    throw constructionException.InnerException;
                                }
                            }
                        }
                    }
                }
            }

            return(attributes);
        }
Example #30
0
 /// <summary>
 /// Obtient la location d'un nom de field.
 /// </summary>
 /// <param name="node">Node de field.</param>
 /// <returns>Location du field.</returns>
 public static Location GetFieldNameLocation(this FieldDeclarationSyntax node)
 {
     /* Suppose qu'il n'y a qu'une seule variable. */
     return(node.Declaration.Variables.First().Identifier.GetLocation());
 }
 private bool CanEncapsulate(FieldDeclarationSyntax field)
 => field.Parent is TypeDeclarationSyntax;
Example #32
0
        /// <summary>
        /// Creates methods to create <see cref="ListSourceBase{TPage}"/> page sources
        /// for the <c>Wiki</c> class.
        /// </summary>
        private static IEnumerable<MethodDeclarationSyntax> CreatePageSourceMethods(FieldDeclarationSyntax wikiField)
        {
            var pageSources =
                new[]
                {
                    new { type = "string", name = "titles", sourceType = typeof(TitlesSource<>) },
                    new { type = "long", name = "pageIds", sourceType = typeof(PageIdsSource<>) },
                    new { type = "long", name = "revIds", sourceType = typeof(RevIdsSource<>) }
                };

            foreach (var pageSource in pageSources)
            {
                string sourceTypeName = pageSource.sourceType.Name;
                sourceTypeName = sourceTypeName.Substring(0, sourceTypeName.IndexOf('`'));

                var parameterVersions =
                    new[]
                    {
                        SyntaxEx.Parameter(SyntaxEx.GenericName("IEnumerable", pageSource.type), pageSource.name),
                        SyntaxEx.Parameter(
                            pageSource.type + "[]", pageSource.name, modifiers: new[] { SyntaxKind.ParamsKeyword })
                    };

                foreach (var parameter in parameterVersions)
                {
                    var returnStatement = SyntaxEx.Return(
                        SyntaxEx.ObjectCreation(
                            SyntaxEx.GenericName(sourceTypeName, Names.Page),
                            (NamedNode)wikiField, (NamedNode)parameter));

                    yield return SyntaxEx.MethodDeclaration(
                        new[] { SyntaxKind.PublicKeyword }, SyntaxEx.GenericName("PagesSource", Names.Page),
                        "Create" + sourceTypeName, new[] { parameter }, returnStatement);
                }
            }
        }
Example #33
0
 /// <summary>
 /// Creates a new <see cref="Syntax.ModifierListInfo"/> from the specified field declaration.
 /// </summary>
 /// <param name="fieldDeclaration"></param>
 /// <returns></returns>
 public static ModifierListInfo ModifierListInfo(FieldDeclarationSyntax fieldDeclaration)
 {
     return(Syntax.ModifierListInfo.Create(fieldDeclaration));
 }
 public virtual void VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     DefaultVisit(node);
 }
        static async Task <Solution> MoveMessagePrefixToCallSitesAsync(Document document,
                                                                       FieldDeclarationSyntax fieldDecl, CancellationToken cancellationToken)
        {
            // TODO: simplify this using SyntaxEditor?

            var messageDocId = document.Id;

            // we'll need to track the field across renames
            var fieldDeclAnnotation = new SyntaxAnnotation();
            var root = await document.GetSyntaxRootAsync(cancellationToken);

            document = document.WithSyntaxRoot(
                root.ReplaceNode(
                    fieldDecl,
                    fieldDecl.WithAdditionalAnnotations(fieldDeclAnnotation)));
            var solution = document.Project.Solution;

            FieldDeclarationSyntax FindFieldDecl(SyntaxNode node) =>
            node.DescendantNodes()
            .OfType <FieldDeclarationSyntax>()
            .Single(n => n.HasAnnotation(fieldDeclAnnotation));

            ExpressionSyntax FindFormatExpr(SyntaxNode node) =>
            FindFieldDecl(node)
            .DescendantNodes()
            .OfType <AttributeSyntax>()
            .First(a => a.Name.ToString() == "Message" || a.Name.ToString() == "MessageAttribute")
            .DescendantNodes()
            .OfType <AttributeArgumentSyntax>()
            .First()
            .Expression;

            // get format string and split it into prefix + rest
            var semanticModel = await document.GetSemanticModelAsync(cancellationToken);

            root = await document.GetSyntaxRootAsync(cancellationToken);

            var formatStr = (string)semanticModel.GetConstantValue(FindFormatExpr(root), cancellationToken).Value;
            var match     = MessageConstantAnalyzer.PrefixedMessageFormatRegex.Match(formatStr);
            var prefix    = match.Groups["prefix"].Value;
            var rest      = match.Groups["rest"].Value;

            var newFormatStr = "{0}" + IncrementFormatTokens(rest);

            // replace format string
            var newFormatExpr = SyntaxFactory.LiteralExpression(
                SyntaxKind.StringLiteralExpression,
                SyntaxFactory.Literal(newFormatStr));

            var pendingReplacements = ImmutableList.Create(
                new PendingReplacement(document, FindFormatExpr(root), newFormatExpr));

            async Task ApplyPendingReplacementsAsync()
            {
                // ReSharper disable AccessToModifiedClosure
                var replacementsByDocument = pendingReplacements.GroupBy(pr => pr.Document);

                pendingReplacements = pendingReplacements.Clear();

                foreach (var group in replacementsByDocument)
                {
                    var syntaxMapping = group.ToDictionary(pr => pr.Old, pr => pr.New);

                    var syntaxRoot = await group.Key.GetSyntaxRootAsync(cancellationToken);

                    var newSyntaxRoot = syntaxRoot.ReplaceNodes(syntaxMapping.Keys, (node, _) => syntaxMapping[node]);

                    solution = solution.WithDocumentSyntaxRoot(group.Key.Id, newSyntaxRoot);
                }
                // ReSharper restore AccessToModifiedClosure
            }

            var fieldSymbol = semanticModel.GetDeclaredSymbol(
                FindFieldDecl(await document.GetSyntaxRootAsync(cancellationToken)).Declaration.Variables[0],
                cancellationToken);

            if (fieldSymbol != null)
            {
                // rename constant if the name matches the old message format
                if (fieldSymbol.Name == ErrorExceptionUsageCodeFixProvider.GetConstantNameFromMessageFormat(formatStr))
                {
                    await ApplyPendingReplacementsAsync();

                    var newCompilation = await solution.GetDocument(messageDocId).Project.GetCompilationAsync(cancellationToken);

                    fieldSymbol = SymbolFinder.FindSimilarSymbols(fieldSymbol, newCompilation, cancellationToken).First();

                    var newName = ErrorExceptionUsageCodeFixProvider.GetConstantNameFromMessageFormat(newFormatStr);
                    solution = await Renamer.RenameSymbolAsync(solution, fieldSymbol, newName,
                                                               solution.Workspace.Options, cancellationToken);

                    var newDocument = solution.GetDocument(messageDocId);
                    var newRoot     = await newDocument.GetSyntaxRootAsync(cancellationToken);

                    var newFieldDecl     = FindFieldDecl(newRoot);
                    var newSemanticModel = await newDocument.GetSemanticModelAsync(cancellationToken);

                    fieldSymbol = newSemanticModel.GetDeclaredSymbol(newFieldDecl.Declaration.Variables[0]);
                }

                // update call sites
                var prefixSyntax = SyntaxFactory.LiteralExpression(
                    SyntaxKind.StringLiteralExpression,
                    SyntaxFactory.Literal(prefix));

                var references = await SymbolFinder.FindReferencesAsync(fieldSymbol, solution, cancellationToken);

                var rs = references.SingleOrDefault();

                if (rs != null)
                {
                    foreach (var location in rs.Locations.Where(l => !l.IsCandidateLocation && !l.IsImplicit))
                    {
                        var replacement = await ReplacementCallSiteWithPrefixInsertedAsync(location, prefixSyntax, cancellationToken);

                        if (replacement != null)
                        {
                            pendingReplacements = pendingReplacements.Add(replacement);
                        }
                    }
                }
            }

            // apply pending replacements
            await ApplyPendingReplacementsAsync();

            return(solution);
        }
        /// <summary>
        /// Creates class that used in the <c>select</c> clause.
        /// </summary>
        private ClassDeclarationSyntax GenerateSelect(IEnumerable<PropertyGroup> propertyGroups, bool first)
        {
            propertyGroups = propertyGroups.Where(pg => pg.Name != null).ToArray();

            var propsField = CreatePropsField(propertyGroups);

            m_selectProps = propsField;

            AddMembersToClass(MethodClassName, propsField);

            var properties = propertyGroups.SelectMany(g => g.Properties).Distinct();

            return GenerateClassForProperties(m_selectClassName, properties, first ? "IFirst" : null);
        }
Example #37
0
 /// <summary>
 /// Obtient le nom d'un node de field.
 /// </summary>
 /// <param name="node">Node de field.</param>
 /// <returns>Nom du field.</returns>
 public static string GetFieldName(this FieldDeclarationSyntax node)
 {
     /* Suppose qu'il n'y a qu'une seule variable. */
     return(node.Declaration.Variables.First().Identifier.ValueText);
 }
            private bool IsPrivateField(FieldDeclarationSyntax node, out bool isInstance)
            {
                var isPrivate = true;
                isInstance = !_inModule;

                foreach (var modifier in node.Modifiers)
                {
                    switch (modifier.Kind())
                    {
                        case SyntaxKind.PublicKeyword:
                        case SyntaxKind.FriendKeyword:
                        case SyntaxKind.ProtectedKeyword:
                            isPrivate = false;
                            break;
                        case SyntaxKind.SharedKeyword:
                            isInstance = false;
                            break;
                    }
                }

                return isPrivate;
            }
 private bool CanEncapsulate(FieldDeclarationSyntax field)
 {
     return(field.Parent is TypeDeclarationSyntax);
 }
Example #40
0
            public void Add(FieldDeclarationSyntax node)
            {
                // add field info
                Add(node.Modifiers, node.Declaration);

                /*
                // Summary:
                //     Gets the attribute declaration list.
                public override SyntaxList<AttributeListSyntax> AttributeLists { get; }
                public override VariableDeclarationSyntax Declaration { get; }
                //
                // Summary:
                //     Gets the modifier list.
                public override SyntaxTokenList Modifiers { get; }
                public override SyntaxToken SemicolonToken { get; }
                 */

                // add to metadata for runtime type building
                FlatArrayBuilder fab = new FlatArrayBuilder();

                fab.Add(FlatValue.Int32(node.Modifiers.ToString().Contains("static") ? (int)ClassMemberType.StaticField : (int)ClassMemberType.Field));
                TypeInfo ti = Chunk.Model.GetTypeInfo(node.Declaration.Type);

                fab.Add(FlatValue.String(ti.ConvertedType.GetFullyQualifiedName()));

                {
                    FlatArrayBuilder varList = new FlatArrayBuilder();
                    foreach (VariableDeclaratorSyntax vds in node.Declaration.Variables)
                    {
                        if (vds.ArgumentList != null)
                        {
                            throw new NotImplementedException("array field");
                        }
                        varList.Add(FlatValue.String(vds.Identifier.ToString()));
                    }

                    fab.Add(varList.GetFlatValue());
                }

                Members.Add(fab.GetFlatValue());
            }
        private void HandleFieldDeclarationSyntax(SyntaxNodeAnalysisContext context)
        {
            FieldDeclarationSyntax syntax = (FieldDeclarationSyntax)context.Node;
            bool isStatic = false;

            foreach (SyntaxToken token in syntax.Modifiers)
            {
                switch (token.Kind())
                {
                case SyntaxKind.StaticKeyword:
                    isStatic = true;
                    break;

                case SyntaxKind.ReadOnlyKeyword:
                case SyntaxKind.ConstKeyword:
                    // This analyzer only looks at static, non-const, non-readonly fields.
                    return;

                case SyntaxKind.InternalKeyword:
                case SyntaxKind.ProtectedKeyword:
                case SyntaxKind.PublicKeyword:
                    // This analyzer only looks at private fields.
                    return;

                default:
                    break;
                }
            }

            if (!isStatic)
            {
                return;
            }

            if (NamedTypeHelpers.IsContainedInNativeMethodsClass(syntax))
            {
                return;
            }

            var variables = syntax.Declaration?.Variables;

            if (variables == null)
            {
                return;
            }

            foreach (VariableDeclaratorSyntax variableDeclarator in variables.Value)
            {
                if (variableDeclarator == null)
                {
                    continue;
                }

                var identifier = variableDeclarator.Identifier;
                if (identifier.IsMissing)
                {
                    continue;
                }

                if (identifier.ValueText.StartsWith("_"))
                {
                    continue;
                }

                // Static field '{name}' must begin with an underscore
                string name = identifier.ValueText;
                context.ReportDiagnostic(Diagnostic.Create(Descriptor, identifier.GetLocation(), name));
            }
        }
 public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     AddField(node);
     base.VisitFieldDeclaration(node);
 }
Example #43
0
 public override SyntaxNode VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     // the script compile treats Dims at the top level as FieldDeclarations which doesn't make sense in context, so just
     // globally swap them to LocalDeclarations
     return(Microsoft.CodeAnalysis.VisualBasic.SyntaxFactory.LocalDeclarationStatement(node.Modifiers, node.Declarators));
 }
Example #44
0
        private static MethodDeclarationSyntax ParseMethod(string code, bool usesUnderscoreNames, FieldDeclarationSyntax field = null)
        {
            if (field != null &&
                field.Name() != "disposed")
            {
                code = code.Replace("disposed", field.Name());
            }

            if (usesUnderscoreNames)
            {
                code = code.Replace("this.", string.Empty);
            }

            return((MethodDeclarationSyntax)SyntaxFactory.ParseCompilationUnit(code)
                   .Members
                   .Single()
                   .WithSimplifiedNames()
                   .WithLeadingTrivia(SyntaxFactory.ElasticMarker)
                   .WithTrailingTrivia(SyntaxFactory.ElasticMarker)
                   .WithAdditionalAnnotations(Formatter.Annotation));
        }
Example #45
0
 internal static IFieldSymbol GetDeclaredSymbolSafe(this SemanticModel semanticModel, FieldDeclarationSyntax node, CancellationToken cancellationToken)
 {
     return((IFieldSymbol)semanticModel.SemanticModelFor(node)
            ?.GetDeclaredSymbol(node, cancellationToken));
 }
 /// <summary>
 /// Creates the proper helper.
 /// </summary>
 /// <param name="node"></param>
 /// <param name="semanticModel"></param>
 /// <returns></returns>
 /// <remarks>
 /// Must return a type deriving from <see cref="FieldDeclaration"/>.
 /// </remarks>
 protected virtual FieldDeclaration CreateHelper(FieldDeclarationSyntax node, SemanticModel semanticModel)
 {
     return(new FieldDeclaration(this.Node as FieldDeclarationSyntax, this.SemanticModel));
 }
Example #47
0
        private static void HandleFieldDeclarationSyntax(SyntaxNodeAnalysisContext context)
        {
            FieldDeclarationSyntax syntax = (FieldDeclarationSyntax)context.Node;

            if (NamedTypeHelpers.IsContainedInNativeMethodsClass(syntax))
            {
                return;
            }

            var variables = syntax.Declaration?.Variables;

            if (variables == null)
            {
                return;
            }

            foreach (VariableDeclaratorSyntax variableDeclarator in variables.Value)
            {
                if (variableDeclarator == null)
                {
                    continue;
                }

                var identifier = variableDeclarator.Identifier;
                if (identifier.IsMissing)
                {
                    continue;
                }

                switch (identifier.ValueText.IndexOf('_'))
                {
                case -1:
                    // no _ character
                    continue;

                case 0:
                    // leading underscore -> report as SA1309
                    continue;

                case 1:
                    switch (identifier.ValueText[0])
                    {
                    case 'm':
                    case 's':
                    case 't':
                        // m_, s_, and t_ prefixes are reported as SA1308
                        continue;

                    default:
                        break;
                    }

                    break;

                default:
                    break;
                }

                // Field '{name}' must not contain an underscore
                string name = identifier.ValueText;
                context.ReportDiagnostic(Diagnostic.Create(Descriptor, identifier.GetLocation(), name));
            }
        }
Example #48
0
 /// <inheritdoc />
 public override void VisitFieldDeclaration(FieldDeclarationSyntax node)
 {
     // don't walk
 }
Example #49
0
            public override SyntaxNode VisitFieldDeclaration(FieldDeclarationSyntax node)
            {
                node = (FieldDeclarationSyntax)base.VisitFieldDeclaration(node);

                return(node.AppendToTrailingTrivia(NewLine()));
            }
        public static async Task ComputeRefactoringsAsync(RefactoringContext context, FieldDeclarationSyntax fieldDeclaration)
        {
            if (fieldDeclaration.IsConst())
            {
                if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceConstantWithField) &&
                    fieldDeclaration.Span.Contains(context.Span))
                {
                    context.RegisterRefactoring(
                        "Replace constant with field",
                        cancellationToken => ReplaceConstantWithFieldRefactoring.RefactorAsync(context.Document, fieldDeclaration, cancellationToken));
                }
            }
            else if (context.IsRefactoringEnabled(RefactoringIdentifiers.ReplaceFieldWithConstant) &&
                     fieldDeclaration.Modifiers.Contains(SyntaxKind.ReadOnlyKeyword) &&
                     fieldDeclaration.IsStatic() &&
                     fieldDeclaration.Span.Contains(context.Span))
            {
                if (await ReplaceFieldWithConstantRefactoring.CanRefactorAsync(context, fieldDeclaration).ConfigureAwait(false))
                {
                    context.RegisterRefactoring(
                        "Replace field with constant",
                        cancellationToken => ReplaceFieldWithConstantRefactoring.RefactorAsync(context.Document, fieldDeclaration, cancellationToken));
                }
            }

            if (context.IsRefactoringEnabled(RefactoringIdentifiers.MarkMemberAsStatic) &&
                fieldDeclaration.Span.Contains(context.Span) &&
                MarkMemberAsStaticRefactoring.CanRefactor(fieldDeclaration))
            {
                context.RegisterRefactoring(
                    "Mark field as static",
                    cancellationToken => MarkMemberAsStaticRefactoring.RefactorAsync(context.Document, fieldDeclaration, cancellationToken));
            }
        }
        public CodeRefactoring GetRefactoring(IDocument document, TextSpan textSpan, CancellationToken cancellationToken)
        {
            SyntaxNode     root  = (SyntaxNode)document.GetSyntaxRoot(cancellationToken);
            ISemanticModel model = document.GetSemanticModel(cancellationToken);

            SyntaxToken token = root.FindToken(textSpan.Start, findInsideTrivia: true);

            // Verify is the selected token an identifier within field declaration
            if (token.Kind == SyntaxKind.IdentifierToken && token.Span.Start <= textSpan.End && textSpan.End <= token.Span.End)
            {
                SyntaxNode parentNode = token.Parent;

                if (parentNode == null)
                {
                    return(null);
                }

                FieldDeclarationSyntax fieldDeclaration = parentNode.FirstAncestorOrSelf <FieldDeclarationSyntax>();
                if (fieldDeclaration == null)
                {
                    return(null);
                }

                // If the FieldDeclaration has some errors, then no refactoring should take place
                if (fieldDeclaration.HasDiagnostics)
                {
                    return(null);
                }

                // Get the container that the field belongs to
                TypeDeclarationSyntax containingType = fieldDeclaration.FirstAncestorOrSelf <TypeDeclarationSyntax>();
                if (containingType == null)
                {
                    return(null);
                }

                // Obtain TypeSymbol for class declaration
                ITypeSymbol containingTypeSymbol = model.GetDeclaredSymbol(containingType, cancellationToken) as ITypeSymbol;
                if (containingTypeSymbol == null)
                {
                    return(null);
                }

                // Check is there a base class that the field can be moved to
                INamedTypeSymbol baseTypeSymbol = containingTypeSymbol.BaseType;
                if (baseTypeSymbol == null)
                {
                    return(null);
                }

                // Check is the class defined in source, so that it can be extended
                CommonLocation baseTypeLocation = baseTypeSymbol.Locations.First();
                if (baseTypeLocation != null && baseTypeLocation.IsInSource)
                {
                    int position = baseTypeLocation.SourceSpan.Start;
                    BaseTypeDeclarationSyntax baseTypeDeclaration = baseTypeLocation.SourceTree.GetRoot().FindToken(position).Parent.FirstAncestorOrSelf <BaseTypeDeclarationSyntax>();
                    if (baseTypeDeclaration == null)
                    {
                        return(null);
                    }

                    return(new CodeRefactoring(
                               new[] { new PullUpFieldAction(document, fieldDeclaration, containingType, baseTypeDeclaration) }
                               , fieldDeclaration.Span));
                }
            }

            return(null);
        }
Example #52
0
        private Variables TraverseField(FieldDeclarationSyntax fds)
        {
            Variables retVar = new Variables();

            //Name

            //Encapsulation
            foreach (SyntaxToken st in fds.Modifiers)
            {
                string modifier = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(st.ValueText);
                Encapsulation encap;
                Qualifiers qual;
                if (System.Enum.TryParse<Encapsulation>(modifier, out encap))
                {
                    retVar.Accessibility.Add(encap);
                }
                else if (System.Enum.TryParse<Qualifiers>(modifier, out qual))
                {
                    retVar.Qualifiers.Add(qual);
                }
            }

            return retVar;
        }