예제 #1
0
        public IEnumerable<string> Get(CSharpSyntaxContext ctx, SemanticModel semanticModel, int offset, CancellationToken cancellationToken = default(CancellationToken))
        {
            var result = new List<string>();
            var parent = ctx.TargetToken.Parent;
            if (parent != null && parent.IsKind(SyntaxKind.ArrayRankSpecifier))
                return result;
            if (ctx.IsIsOrAsTypeContext)
            {
                foreach (var kw in primitiveTypesKeywords)
                    result.Add(kw);
                return result;
            }
            if (parent != null)
            {
                if (parent.Kind() == SyntaxKind.IdentifierName)
                {
                    if (ctx.LeftToken.Parent.Kind() == SyntaxKind.IdentifierName &&
                        parent.Parent != null && parent.Parent.Kind() == SyntaxKind.ParenthesizedExpression ||
                        ctx.LeftToken.Parent.Kind() == SyntaxKind.CatchDeclaration)
                        return result;
                }
                if (parent.Kind() == SyntaxKind.NamespaceDeclaration)
                {
                    var decl = parent as NamespaceDeclarationSyntax;
                    if (decl.OpenBraceToken.Span.Length > 0 &&
                        decl.OpenBraceToken.SpanStart > ctx.TargetToken.SpanStart)
                        return result;
                }
                if (parent.Kind() == SyntaxKind.ClassDeclaration ||
                    parent.Kind() == SyntaxKind.StructDeclaration ||
                    parent.Kind() == SyntaxKind.InterfaceDeclaration)
                {
                    foreach (var kw in typeLevelKeywords)
                        result.Add(kw);
                    return result;
                }
                if (parent.Kind() == SyntaxKind.EnumDeclaration ||
                    parent.Kind() == SyntaxKind.DelegateDeclaration ||
                    parent.Kind() == SyntaxKind.PredefinedType ||
                    parent.Kind() == SyntaxKind.TypeParameterList ||
                    parent.Kind() == SyntaxKind.QualifiedName ||
                    parent.Kind() == SyntaxKind.SimpleMemberAccessExpression)
                {
                    return result;
                }
            }
            if (parent.IsKind(SyntaxKind.AttributeList))
            {
                if (parent.Parent.Parent == null || parent.Parent.Parent.IsKind(SyntaxKind.CompilationUnit))
                {
                    result.Add("assembly");
                    result.Add("module");
                    result.Add("type");
                }
                else
                {
                    result.Add("param");
                    result.Add("field");
                    result.Add("property");
                    result.Add("method");
                    result.Add("event");
                }
                result.Add("return");
            }
            if (ctx.IsInstanceContext)
            {
                if (ctx.LeftToken.Parent.Ancestors().Any(a => a is SwitchStatementSyntax || a is BlockSyntax && a.ToFullString().IndexOf("switch", StringComparison.Ordinal) > 0))
                {
                    result.Add("case");
                }
            }

            var forEachStatementSyntax = parent as ForEachStatementSyntax;
            if (forEachStatementSyntax != null)
            {
                if (forEachStatementSyntax.Type.Span.Length > 0 &&
                    forEachStatementSyntax.Identifier.Span.Length > 0 &&
                    forEachStatementSyntax.InKeyword.Span.Length == 0)
                {
                    result.Add("in");
                    return result;
                }
            }
            if (parent != null && parent.Kind() == SyntaxKind.ArgumentList)
            {
                result.Add("out");
                result.Add("ref");
            }
            else if (parent != null && parent.Kind() == SyntaxKind.ParameterList)
            {
                result.Add("out");
                result.Add("ref");
                result.Add("params");
                foreach (var kw in primitiveTypesKeywords)
                    result.Add(kw);

                if (ctx.IsParameterTypeContext)
                {
                    bool isFirst = ctx.LeftToken.GetPreviousToken().IsKind(SyntaxKind.OpenParenToken);
                    if (isFirst)
                        result.Add("this");
                }

                return result;
            }
            else
            {
                result.Add("var");
                result.Add("dynamic");
            }

            if (parent != null && parent.Parent != null && parent.IsKind(SyntaxKind.BaseList) && parent.Parent.IsKind(SyntaxKind.EnumDeclaration))
            {
                foreach (var kw in validEnumBaseTypes)
                    result.Add(kw);
                return result;
            }
            if (parent != null &&
                parent.Parent != null &&
                parent.Parent.IsKind(SyntaxKind.FromClause))
            {
                foreach (var kw in linqKeywords)
                    result.Add(kw);
            }
            if (ctx.IsGlobalStatementContext || parent == null || parent is NamespaceDeclarationSyntax)
            {
                foreach (var kw in globalLevelKeywords)
                    result.Add(kw);
                return result;
            }
            else
            {
                foreach (var kw in typeLevelKeywords)
                    result.Add(kw);
            }

            foreach (var kw in primitiveTypesKeywords)
                result.Add(kw);

            foreach (var kw in statementStartKeywords)
                result.Add(kw);

            foreach (var kw in expressionLevelKeywords)
                result.Add(kw);

            if (ctx.IsPreProcessorKeywordContext)
            {
                foreach (var kw in preprocessorKeywords)
                    result.Add(kw);
            }

            if (ctx.IsPreProcessorExpressionContext)
            {
                var parseOptions = semanticModel.SyntaxTree.Options as CSharpParseOptions;
                foreach (var define in parseOptions.PreprocessorSymbolNames)
                {
                    result.Add(define);
                }
            }
            if (parent.IsKind(SyntaxKind.TypeParameterConstraintClause))
            {
                result.Add("new()");
            }
            return result;
        }
        public IEnumerable <string> Get(CSharpSyntaxContext ctx, SemanticModel semanticModel, int offset, CancellationToken cancellationToken = default(CancellationToken))
        {
            var result = new List <string>();
            var parent = ctx.TargetToken.Parent;

            if (parent != null && parent.IsKind(SyntaxKind.ArrayRankSpecifier))
            {
                return(result);
            }
            if (ctx.IsIsOrAsTypeContext)
            {
                foreach (var kw in primitiveTypesKeywords)
                {
                    result.Add(kw);
                }
                return(result);
            }
            if (parent != null)
            {
                if (parent.CSharpKind() == SyntaxKind.IdentifierName)
                {
                    if (ctx.LeftToken.Parent.CSharpKind() == SyntaxKind.IdentifierName &&
                        parent.Parent != null && parent.Parent.CSharpKind() == SyntaxKind.ParenthesizedExpression ||
                        ctx.LeftToken.Parent.CSharpKind() == SyntaxKind.CatchDeclaration)
                    {
                        return(result);
                    }
                }
                if (parent.CSharpKind() == SyntaxKind.NamespaceDeclaration)
                {
                    var decl = parent as NamespaceDeclarationSyntax;
                    if (decl.OpenBraceToken.Span.Length > 0 &&
                        decl.OpenBraceToken.SpanStart > ctx.TargetToken.SpanStart)
                    {
                        return(result);
                    }
                }
                if (parent.CSharpKind() == SyntaxKind.ClassDeclaration ||
                    parent.CSharpKind() == SyntaxKind.StructDeclaration ||
                    parent.CSharpKind() == SyntaxKind.InterfaceDeclaration)
                {
                    foreach (var kw in typeLevelKeywords)
                    {
                        result.Add(kw);
                    }
                    return(result);
                }
                if (parent.CSharpKind() == SyntaxKind.EnumDeclaration ||
                    parent.CSharpKind() == SyntaxKind.DelegateDeclaration ||
                    parent.CSharpKind() == SyntaxKind.PredefinedType ||
                    parent.CSharpKind() == SyntaxKind.TypeParameterList ||
                    parent.CSharpKind() == SyntaxKind.QualifiedName ||
                    parent.CSharpKind() == SyntaxKind.SimpleMemberAccessExpression)
                {
                    return(result);
                }
            }
            if (parent.IsKind(SyntaxKind.AttributeList))
            {
                if (parent.Parent.Parent == null || parent.Parent.Parent.IsKind(SyntaxKind.CompilationUnit))
                {
                    result.Add("assembly");
                    result.Add("module");
                    result.Add("type");
                }
                else
                {
                    result.Add("param");
                    result.Add("field");
                    result.Add("property");
                    result.Add("method");
                    result.Add("event");
                }
                result.Add("return");
            }
            if (ctx.IsInstanceContext)
            {
                if (ctx.LeftToken.Parent.Ancestors().Any(a => a is SwitchStatementSyntax || a is BlockSyntax && a.ToFullString().IndexOf("switch", StringComparison.Ordinal) > 0))
                {
                    result.Add("case");
                }
            }

            var forEachStatementSyntax = parent as ForEachStatementSyntax;

            if (forEachStatementSyntax != null)
            {
                if (forEachStatementSyntax.Type.Span.Length > 0 &&
                    forEachStatementSyntax.Identifier.Span.Length > 0 &&
                    forEachStatementSyntax.InKeyword.Span.Length == 0)
                {
                    result.Add("in");
                    return(result);
                }
            }
            if (parent != null && parent.CSharpKind() == SyntaxKind.ArgumentList)
            {
                result.Add("out");
                result.Add("ref");
            }
            else if (parent != null && parent.CSharpKind() == SyntaxKind.ParameterList)
            {
                result.Add("out");
                result.Add("ref");
                result.Add("params");
                foreach (var kw in primitiveTypesKeywords)
                {
                    result.Add(kw);
                }

                if (ctx.IsParameterTypeContext)
                {
                    bool isFirst = ctx.LeftToken.GetPreviousToken().IsKind(SyntaxKind.OpenParenToken);
                    if (isFirst)
                    {
                        result.Add("this");
                    }
                }

                return(result);
            }
            else
            {
                result.Add("var");
                result.Add("dynamic");
            }

            if (parent != null && parent.Parent != null && parent.IsKind(SyntaxKind.BaseList) && parent.Parent.IsKind(SyntaxKind.EnumDeclaration))
            {
                foreach (var kw in validEnumBaseTypes)
                {
                    result.Add(kw);
                }
                return(result);
            }
            if (parent != null &&
                parent.Parent != null &&
                parent.Parent.IsKind(SyntaxKind.FromClause))
            {
                foreach (var kw in linqKeywords)
                {
                    result.Add(kw);
                }
            }
            if (ctx.IsGlobalStatementContext || parent == null || parent is NamespaceDeclarationSyntax)
            {
                foreach (var kw in globalLevelKeywords)
                {
                    result.Add(kw);
                }
                return(result);
            }
            else
            {
                foreach (var kw in typeLevelKeywords)
                {
                    result.Add(kw);
                }
            }

            foreach (var kw in primitiveTypesKeywords)
            {
                result.Add(kw);
            }

            foreach (var kw in statementStartKeywords)
            {
                result.Add(kw);
            }

            foreach (var kw in expressionLevelKeywords)
            {
                result.Add(kw);
            }

            if (ctx.IsPreProcessorKeywordContext)
            {
                foreach (var kw in preprocessorKeywords)
                {
                    result.Add(kw);
                }
            }

            if (ctx.IsPreProcessorExpressionContext)
            {
                var parseOptions = semanticModel.SyntaxTree.Options as CSharpParseOptions;
                foreach (var define in parseOptions.PreprocessorSymbolNames)
                {
                    result.Add(define);
                }
            }
            if (parent.IsKind(SyntaxKind.TypeParameterConstraintClause))
            {
                result.Add("new()");
            }
            return(result);
        }