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); }