void Analyze (CompletionEngine engine,SemanticModel model, SyntaxNode node, ISymbol within, List<CompletionData> list, ParameterListSyntax parameterList, ISymbol symbol, HashSet<string> addedSymbols, CancellationToken cancellationToken)
		{
			var type = CheckParameterList (model, parameterList, symbol, cancellationToken);
			if (type == null)
				return;
			var startType = type;

			while (type.SpecialType != SpecialType.System_Object) {
				foreach (var member in type.GetMembers ()) {
					if (member.IsImplicitlyDeclared || member.IsStatic)
						continue;
					if (member.IsOrdinaryMethod () || member.Kind == SymbolKind.Field || member.Kind == SymbolKind.Property) {
						if (member.IsAccessibleWithin (within)) {
							var completionData = engine.Factory.CreateCastCompletionData(this, member, node, startType);
							if (addedSymbols.Contains (completionData.DisplayText))
								continue;
							addedSymbols.Add (completionData.DisplayText);
							list.Add (completionData);
						}
					}
				}

				type = type.BaseType;
			}
		}
		protected override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var position = completionContext.Position;
			var document = completionContext.Document;
			var syntaxTree = ctx.SyntaxTree;
			if (syntaxTree.IsInNonUserCode(position, cancellationToken) ||
				syntaxTree.IsPreProcessorDirectiveContext(position, cancellationToken))
				return Task.FromResult (Enumerable.Empty<CompletionData> ());
			if (!syntaxTree.IsRightOfDotOrArrowOrColonColon(position, cancellationToken))
				return Task.FromResult (Enumerable.Empty<CompletionData> ());
			var ma = ctx.LeftToken.Parent as MemberAccessExpressionSyntax;
			if (ma == null)
				return Task.FromResult (Enumerable.Empty<CompletionData> ());

			var model = ctx.CSharpSyntaxContext.SemanticModel;

			var symbolInfo = model.GetSymbolInfo (ma.Expression);
			if (symbolInfo.Symbol == null || symbolInfo.Symbol.Kind != SymbolKind.Parameter)
				return Task.FromResult (Enumerable.Empty<CompletionData> ());
			var list = new List<CompletionData> ();
			var within = model.GetEnclosingNamedTypeOrAssembly(position, cancellationToken);
			var addedSymbols = new HashSet<string> ();

			foreach (var ano in ma.AncestorsAndSelf ().OfType<AnonymousMethodExpressionSyntax> ()) {
				Analyze (engine, model, ma.Expression, within, list, ano.ParameterList, symbolInfo.Symbol, addedSymbols, cancellationToken);
			}

			foreach (var ano in ma.AncestorsAndSelf ().OfType<ParenthesizedLambdaExpressionSyntax> ()) {
				Analyze (engine, model, ma.Expression, within, list, ano.ParameterList, symbolInfo.Symbol, addedSymbols, cancellationToken);
			}

			return Task.FromResult ((IEnumerable<CompletionData>)list);
		}
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var model = ctx.SemanticModel;
			var tree = ctx.SyntaxTree;
			if (tree.IsInNonUserCode (completionContext.Position, cancellationToken))
				return Enumerable.Empty<CompletionData> ();

			var token = tree.FindTokenOnLeftOfPosition (completionContext.Position, cancellationToken);
			if (token.IsMandatoryNamedParameterPosition ())
				return Enumerable.Empty<CompletionData> ();
			var result = new List<CompletionData> ();

			// check if it's the first parameter and set autoselect == false if a parameterless version exists.
			if (token.IsKind (SyntaxKind.OpenParenToken)) {
				var parent = token.Parent?.Parent;
				if (parent == null)
					return Enumerable.Empty<CompletionData> ();
				var symbolInfo = model.GetSymbolInfo (parent);
				foreach (var symbol in new [] { symbolInfo.Symbol }.Concat (symbolInfo.CandidateSymbols)) {
					if (symbol != null && symbol.IsKind (SymbolKind.Method)) {
						if (symbol.GetParameters ().Length == 0) {
							completionResult.AutoSelect = false;
							break;
						}
					}
				}
			}

			foreach (var _type in ctx.InferredTypes) {
				var type = _type;
				if (type.OriginalDefinition.SpecialType == SpecialType.System_Nullable_T) {
					type = type.GetTypeArguments ().FirstOrDefault ();
					if (type == null)
						continue;
				}

				if (type.TypeKind != TypeKind.Enum)
					continue;
				if (!type.IsEditorBrowsable ())
					continue;

				// Does type have any aliases?
				ISymbol alias = await type.FindApplicableAlias (completionContext.Position, model, cancellationToken).ConfigureAwait (false);

				var displayString = RoslynCompletionData.SafeMinimalDisplayString (type, model, completionContext.Position, SymbolDisplayFormat.CSharpErrorMessageFormat);
				if (string.IsNullOrEmpty (completionResult.DefaultCompletionString)) {
					completionResult.DefaultCompletionString = displayString;
					completionResult.AutoCompleteEmptyMatch = true;

				}
				if (!IsReachable (model,  type, token.Parent))
					result.Add (engine.Factory.CreateSymbolCompletionData (this, type, displayString));
				foreach (IFieldSymbol field in type.GetMembers ().OfType<IFieldSymbol> ()) {
					if (field.DeclaredAccessibility == Accessibility.Public && (field.IsConst || field.IsStatic)) {
						result.Add (engine.Factory.CreateEnumMemberCompletionData (this, alias, field));
					}
				}
			}
			return result;
		}
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var document = completionContext.Document;
			var position = completionContext.Position;
			var tree = ctx.SyntaxTree;

			//DeclarationModifiers modifiers;
			SyntaxToken token;

			var semanticModel = ctx.SemanticModel;
			var enclosingSymbol = semanticModel.GetEnclosingSymbol (position, cancellationToken) as INamedTypeSymbol;

			// Only inside classes and structs
			if (enclosingSymbol == null || !(enclosingSymbol.TypeKind == TypeKind.Struct || enclosingSymbol.TypeKind == TypeKind.Class)) {
				return Enumerable.Empty<CompletionData> ();
			}

			if (!IsPartialCompletionContext (tree, position, cancellationToken/*, out modifiers*/, out token)) {
				if (enclosingSymbol != null && (token.IsKind (SyntaxKind.OpenBraceToken) || token.IsKind (SyntaxKind.CloseBraceToken) || token.IsKind (SyntaxKind.SemicolonToken))) {
					return CreateCompletionData (engine, semanticModel, position, enclosingSymbol, token, false, cancellationToken);
				}
				return Enumerable.Empty<CompletionData> ();
			}

			return CreateCompletionData (engine, semanticModel, position, enclosingSymbol, token, true, cancellationToken);
		}
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var position = completionContext.Position;
			var document = completionContext.Document;
			var span = new TextSpan(position, 0);
			var semanticModel = await document.GetCSharpSemanticModelForSpanAsync(span, cancellationToken).ConfigureAwait(false);
			var syntaxTree = semanticModel.SyntaxTree;
			//	var ctx = await completionContext.GetSyntaxContextAsync (engine.Workspace, cancellationToken).ConfigureAwait (false);

			if (syntaxTree.IsInNonUserCode(position, cancellationToken) ||
				syntaxTree.IsPreProcessorDirectiveContext(position, cancellationToken))
			{
				return Enumerable.Empty<CompletionData> ();
			}

			if (!syntaxTree.IsRightOfDotOrArrowOrColonColon(position, cancellationToken))
			{
				return Enumerable.Empty<CompletionData> ();
			}

			var node = syntaxTree.FindTokenOnLeftOfPosition(position, cancellationToken)
				.GetPreviousTokenIfTouchingWord(position)
				.Parent;

			if (node.Kind() == SyntaxKind.ExplicitInterfaceSpecifier)
			{
				return await GetCompletionsOffOfExplicitInterfaceAsync(
					engine, document, semanticModel, position, ((ExplicitInterfaceSpecifierSyntax)node).Name, cancellationToken).ConfigureAwait(false);
			}

			return Enumerable.Empty<CompletionData> ();
		}
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var document = completionContext.Document;
			var position = completionContext.Position;
			var semanticModel = ctx.SemanticModel;

			if (ctx.TargetToken.Parent != null && ctx.TargetToken.Parent.Parent != null && 
			    ctx.TargetToken.Parent.Parent.IsKind(SyntaxKind.Argument)) {
				SourceText text;
				if (!completionContext.Document.TryGetText (out text)) {
					text = await completionContext.Document.GetTextAsync ();
				}
				var currentChar = text [completionContext.Position - 1];
				if (ctx.TargetToken.Parent == null || !ctx.TargetToken.Parent.IsKind(SyntaxKind.StringLiteralExpression) ||
				    ctx.TargetToken.Parent.Parent == null || !ctx.TargetToken.Parent.Parent.IsKind(SyntaxKind.Argument) ||
				    ctx.TargetToken.Parent.Parent.Parent == null || !ctx.TargetToken.Parent.Parent.Parent.IsKind(SyntaxKind.ArgumentList) ||
				    ctx.TargetToken.Parent.Parent.Parent.Parent == null || !ctx.TargetToken.Parent.Parent.Parent.Parent.IsKind(SyntaxKind.InvocationExpression)) {
					return Enumerable.Empty<CompletionData> ();
				}
				var formatArgument = GetFormatItemNumber(document, position);
				var invocationExpression = ctx.TargetToken.Parent.Parent.Parent.Parent as InvocationExpressionSyntax;
				return GetFormatCompletionData(engine, semanticModel, invocationExpression, formatArgument, currentChar);
			}

			return Enumerable.Empty<CompletionData> ();
		}
        IEnumerable <CompletionData> GetFormatCompletionData(CompletionEngine engine, bool isVerbatimString)
        {
            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "d", "Digit character", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "D", "Non-digit character", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "b", "Word boundary", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "B", "Non-word boundary", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "w", "Word character", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "W", "Non-word character", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "s", "White-space character", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "S", "Non-white-space character", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "A", "Start boundary", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "Z", "End boundary", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "k<name>", "Named backreference", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "P{name}", "Negative unicode category or unicode block", null));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") + "p{name}", "Unicode category or unicode block", null));
        }
		IEnumerable<CompletionData> GenerateNumberFormatitems(CompletionEngine engine, bool isFloatingPoint)
		{
			yield return engine.Factory.CreateFormatItemCompletionData(this, "D", "decimal", 123);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "D5", "decimal", 123);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "C", "currency", 123);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "C0", "currency", 123);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "E", "exponential", 1.23E4);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "E2", "exponential", 1.234);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "e2", "exponential", 1.234);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "F", "fixed-point", 123.45);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "F1", "fixed-point", 123.45);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "G", "general", 1.23E+56);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "g2", "general", 1.23E+56);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "N", "number", 12345.68);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "N1", "number", 12345.68);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "P", "percent", 12.34);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "P1", "percent", 12.34);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "R", "round-trip", 0.1230000001);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "X", "hexadecimal", 1234);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "x8", "hexadecimal", 1234);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "0000", "custom", 123);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "####", "custom", 123);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "##.###", "custom", 1.23);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "##.000", "custom", 1.23);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "## 'items'", "custom", 12);
		}
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var document = completionContext.Document;
			var position = completionContext.Position;

			var tree = ctx.SyntaxTree;

			if (tree.IsInNonUserCode(position, cancellationToken))
				return Enumerable.Empty<CompletionData> ();

			var targetToken = tree.FindTokenOnLeftOfPosition(position, cancellationToken).GetPreviousTokenIfTouchingWord(position);
			if (targetToken.IsKind(SyntaxKind.AliasKeyword) && targetToken.Parent.IsKind(SyntaxKind.ExternAliasDirective))
			{
				var compilation = await document.GetCSharpCompilationAsync(cancellationToken).ConfigureAwait(false);
				var aliases = compilation.ExternalReferences.Where(r => r.Properties.Aliases != null).SelectMany(r => r.Properties.Aliases).ToSet();

				if (aliases.Any())
				{
					var root = await tree.GetRootAsync(cancellationToken).ConfigureAwait(false);
					var usedAliases = root.ChildNodes().OfType<ExternAliasDirectiveSyntax>().Where(e => !e.Identifier.IsMissing).Select(e => e.Identifier.ValueText);
					foreach (var used in usedAliases) {
						aliases.Remove (used); 
					}
					aliases.Remove(MetadataReferenceProperties.GlobalAlias);
					return aliases.Select (e => engine.Factory.CreateGenericData (this, e, GenericDataType.Undefined));
				}
			}

			return Enumerable.Empty<CompletionData> ();
		}
        void Analyze(CompletionEngine engine, SyntaxNode node, ITypeSymbol type, ITypeSymbol stopAt, ISymbol within, List <CompletionData> list, HashSet <string> addedSymbols, CancellationToken cancellationToken)
        {
            var startType = type;

            while (type != null && type.SpecialType != SpecialType.System_Object && type != stopAt)
            {
                foreach (var member in type.GetMembers())
                {
                    cancellationToken.ThrowIfCancellationRequested();
                    if (member.IsImplicitlyDeclared || member.IsStatic)
                    {
                        continue;
                    }
                    if (member.IsOrdinaryMethod() || member.Kind == SymbolKind.Field || member.Kind == SymbolKind.Property)
                    {
                        if (member.IsAccessibleWithin(within))
                        {
                            var completionData = engine.Factory.CreateCastCompletionData(this, member, node, startType);
                            if (addedSymbols.Contains(completionData.DisplayText))
                            {
                                continue;
                            }
                            addedSymbols.Add(completionData.DisplayText);
                            list.Add(completionData);
                        }
                    }
                }

                type = type.BaseType;
            }
        }
		protected override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult result, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var document = completionContext.Document;
			var position = completionContext.Position;

			var tree = ctx.SyntaxTree;
			var model = ctx.SemanticModel;
			if (tree.IsInNonUserCode (position, cancellationToken))
				return Task.FromResult (Enumerable.Empty<CompletionData> ());

			if (!ctx.CSharpSyntaxContext.IsAnyExpressionContext)
				return Task.FromResult (Enumerable.Empty<CompletionData> ());
			var enclosingType = model.GetEnclosingNamedType (position, cancellationToken);
			var memberMethods = enclosingType.GetMembers ().OfType<IMethodSymbol> ().Where (m => m.MethodKind == MethodKind.Ordinary).ToArray ();

			var list = new List<CompletionData> ();
			foreach (var type in ctx.InferredTypes) {
				if (type.TypeKind != TypeKind.Delegate)
					continue;

				AddCompatibleMethods (engine, list, type, memberMethods, cancellationToken);

				string delegateName = null;

				if (ctx.TargetToken.IsKind (SyntaxKind.PlusEqualsToken)) {
					delegateName = GuessEventHandlerBaseName (ctx.LeftToken.Parent, ctx.ContainingTypeDeclaration);
				}

				AddDelegateHandlers (list, ctx.TargetToken.Parent, model, engine, result, type, position, delegateName, cancellationToken);
			}
			if (list.Count > 0) {
				result.AutoSelect = false;
			}
			return Task.FromResult ((IEnumerable<CompletionData>)list);
		}
        IEnumerable <CompletionData> GenerateTimeSpanFormatitems(CompletionEngine engine)
        {
            yield return(engine.Factory.CreateFormatItemCompletionData(this, "c", "invariant", new TimeSpan(0, 1, 23, 456)));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "G", "general long", new TimeSpan(0, 1, 23, 456)));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "g", "general short", new TimeSpan(0, 1, 23, 456)));
        }
예제 #13
0
 Task <IEnumerable <CompletionData> > GetSnippetCompletionItemsAsync(CancellationToken cancellationToken)
 {
     if (CompletionEngine.SnippetCallback == null)
     {
         return(Task.FromResult(Enumerable.Empty <CompletionData>()));
     }
     return(CompletionEngine.SnippetCallback(cancellationToken));
 }
예제 #14
0
//
//		public override bool SendEnterThroughToEditor(ICompletionData ICompletionData, string textTypedSoFar)
//		{
//			return false;
//		}

        private IEnumerable <CompletionData> GetTopLevelSingleUseNames(CompletionEngine engine, DocumentationCommentTriviaSyntax parentTrivia, TextSpan span)
        {
            var names = new HashSet <string>(new[] { "summary", "remarks", "example", "completionlist" });

            RemoveExistingTags(parentTrivia, names, (x) => x.StartTag.Name.LocalName.ValueText);

            return(names.Select(n => GetItem(engine, n, span)));
        }
예제 #15
0
 protected CompletionData GetItem(CompletionEngine engine, string n, TextSpan span)
 {
     if (_tagMap.ContainsKey(n))
     {
         var value = _tagMap[n];
         return(engine.Factory.CreateXmlDocCompletionData(this, n, null, value [0] + "|" + value [1]));
     }
     return(engine.Factory.CreateXmlDocCompletionData(this, n));
 }
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var document = completionContext.Document;
			var position = completionContext.Position;

			return await document.GetUnionResultsFromDocumentAndLinks(
				UnionCompletionItemComparer.Instance,
				async (doc, ct) => await GetSpeculativeTCompletions(engine, doc, position, ct).ConfigureAwait(false),
				cancellationToken).ConfigureAwait(false);
		}
        IEnumerable <CompletionData> GenerateEnumFormatitems(CompletionEngine engine)
        {
            yield return(engine.Factory.CreateFormatItemCompletionData(this, "G", "string value", TestEnum.EnumCaseName));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "F", "flags value", TestEnum.Flags));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "D", "integer value", TestEnum.Flags));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "X", "hexadecimal", TestEnum.Flags));
        }
        IEnumerable <CompletionData> GenerateGuidFormatitems(CompletionEngine engine)
        {
            yield return(engine.Factory.CreateFormatItemCompletionData(this, "N", "digits", defaultGuid));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "D", "hypens", defaultGuid));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "B", "braces", defaultGuid));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "P", "parentheses", defaultGuid));
        }
예제 #19
0
        protected IEnumerable <CompletionData> GetAttributeItem(CompletionEngine engine, string n, TextSpan span)
        {
            var items = _attributeMap.Where(x => x[0] == n).Select(x => engine.Factory.CreateXmlDocCompletionData(this, x[1], null, x[2] + "|" + x[3]));

            if (items.Any())
            {
                return(items);
            }

            return(new [] { engine.Factory.CreateXmlDocCompletionData(this, n) });
        }
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var document = completionContext.Document;
			var position = completionContext.Position;

			var syntaxTree = await document.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);

			if (syntaxTree.IsInNonUserCode(position, cancellationToken) ||
				syntaxTree.IsRightOfDotOrArrowOrColonColon(position, cancellationToken) ||
				syntaxTree.GetContainingTypeOrEnumDeclaration(position, cancellationToken) is EnumDeclarationSyntax)
			{
				return Enumerable.Empty<CompletionData>();
			}

			// var span = new TextSpan(position, 0);
//			var semanticModel = await document.GetCSharpSemanticModelForSpanAsync(span, cancellationToken).ConfigureAwait(false);
			if (syntaxTree.IsPreProcessorDirectiveContext(position, cancellationToken))
			{
				var directive = syntaxTree.GetRoot(cancellationToken).FindTokenOnLeftOfPosition(position, includeDirectives: true).GetAncestor<DirectiveTriviaSyntax>();
				if (directive.DirectiveNameToken.IsKind(
					SyntaxKind.IfKeyword,
					SyntaxKind.RegionKeyword,
					SyntaxKind.ElseKeyword,
					SyntaxKind.ElifKeyword,
					SyntaxKind.ErrorKeyword,
					SyntaxKind.LineKeyword,
					SyntaxKind.PragmaKeyword,
					SyntaxKind.EndIfKeyword,
					SyntaxKind.UndefKeyword,
					SyntaxKind.EndRegionKeyword,
					SyntaxKind.WarningKeyword))
				{
					return Enumerable.Empty<CompletionData>();
				}

				return await GetSnippetCompletionItemsAsync(cancellationToken).ConfigureAwait(false);
			}
			var tokenLeftOfPosition = syntaxTree.FindTokenOnLeftOfPosition (position, cancellationToken);

			if (syntaxTree.IsGlobalStatementContext(position, cancellationToken) ||
				syntaxTree.IsExpressionContext(position, tokenLeftOfPosition, true, cancellationToken) ||
				syntaxTree.IsStatementContext(position, tokenLeftOfPosition, cancellationToken) ||
				syntaxTree.IsTypeContext(position, cancellationToken) ||
				syntaxTree.IsTypeDeclarationContext(position, tokenLeftOfPosition, cancellationToken) ||
				syntaxTree.IsNamespaceContext(position, cancellationToken) ||
				syntaxTree.IsMemberDeclarationContext(position, tokenLeftOfPosition, cancellationToken) ||
				syntaxTree.IsLabelContext(position, cancellationToken))
			{
				return await GetSnippetCompletionItemsAsync(cancellationToken).ConfigureAwait(false);
			}

			return Enumerable.Empty<CompletionData>();
		}
예제 #21
0
        private IEnumerable <CompletionData> GetTagsForProperty(CompletionEngine engine, IPropertySymbol symbol, TextSpan filterSpan, DocumentationCommentTriviaSyntax trivia)
        {
            var items = new List <CompletionData>();

            var typeParameters = symbol.GetTypeArguments().Select(p => p.Name).ToSet();

            RemoveExistingTags(trivia, typeParameters, x => AttributeSelector(x, "typeparam"));

            items.AddRange(typeParameters.Select(t => engine.Factory.CreateXmlDocCompletionData(this, "typeparam", null, "name$" + t)));
            items.Add(engine.Factory.CreateXmlDocCompletionData(this, "value"));
            return(items);
        }
        IEnumerable <CompletionData> GetFormatCompletionForType(CompletionEngine engine, ITypeSymbol type)
        {
            if (type == null)
            {
                return(GenerateNumberFormatitems(engine, false)
                       .Concat(GenerateDateTimeFormatitems(engine))
                       .Concat(GenerateTimeSpanFormatitems(engine))
                       .Concat(GenerateEnumFormatitems(engine))
                       .Concat(GenerateGuidFormatitems(engine)));
            }

            switch (type.ToString())
            {
            case "long":
            case "System.Int64":
            case "ulong":
            case "System.UInt64":
            case "int":
            case "System.Int32":
            case "uint":
            case "System.UInt32":
            case "short":
            case "System.Int16":
            case "ushort":
            case "System.UInt16":
            case "byte":
            case "System.Byte":
            case "sbyte":
            case "System.SByte":
                return(GenerateNumberFormatitems(engine, false));

            case "float":
            case "System.Single":
            case "double":
            case "System.Double":
            case "decimal":
            case "System.Decimal":
                return(GenerateNumberFormatitems(engine, true));

            case "System.Enum":
                return(GenerateEnumFormatitems(engine));

            case "System.DateTime":
                return(GenerateDateTimeFormatitems(engine));

            case "System.TimeSpan":
                return(GenerateTimeSpanFormatitems(engine));

            case "System.Guid":
                return(GenerateGuidFormatitems(engine));
            }
            return(CompletionResult.Empty.Data);
        }
        void AddCompatibleMethods(CompletionEngine engine, List <CompletionData> list, ITypeSymbol delegateType, IMethodSymbol [] memberMethods, CancellationToken cancellationToken)
        {
            var delegateMethod = delegateType.GetDelegateInvokeMethod();

            foreach (var method in memberMethods)
            {
                if (method.ReturnType.Equals(delegateMethod.ReturnType) && SignatureComparer.HaveSameSignature(delegateMethod.Parameters, method.Parameters, false, false))
                {
                    list.Add(engine.Factory.CreateExistingMethodDelegate(this, method));
                }
            }
        }
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var model = ctx.SemanticModel;

			var result = new List<CompletionData> ();
			if (ctx.IsPreProcessorExpressionContext) {
				var parseOptions = model.SyntaxTree.Options as CSharpParseOptions;
				foreach (var define in parseOptions.PreprocessorSymbolNames) {
					result.Add(engine.Factory.CreateGenericData (this, define, GenericDataType.PreprocessorSymbol));
				}
			}
			return result;
		}
예제 #25
0
        private IEnumerable <CompletionData> GetTagsForType(CompletionEngine engine, INamedTypeSymbol symbol, TextSpan filterSpan, DocumentationCommentTriviaSyntax trivia)
        {
            var items = new List <CompletionData>();

            var typeParameters = symbol.TypeParameters.Select(p => p.Name).ToSet();

            RemoveExistingTags(trivia, typeParameters, x => AttributeSelector(x, "typeparam"));

            items.AddRange(typeParameters.Select(t => engine.Factory.CreateXmlDocCompletionData(
                                                     this,
                                                     FormatParameter("typeparam", t))));
            return(items);
        }
예제 #26
0
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			// var ctx = await completionContext.GetSyntaxContextAsync (engine.Workspace, cancellationToken).ConfigureAwait (false);
			var document = completionContext.Document;
			var semanticModel = ctx.SemanticModel;
			var tree = ctx.SyntaxTree;
			if (tree.IsInNonUserCode(completionContext.Position, cancellationToken))
				return Enumerable.Empty<CompletionData> ();

			var text = await document.GetTextAsync (cancellationToken).ConfigureAwait (false);

			var startLineNumber = text.Lines.IndexOf (completionContext.Position);

			// modifiers* override modifiers* type? |
			Accessibility seenAccessibility;
			//DeclarationModifiers modifiers;
			var token = tree.FindTokenOnLeftOfPosition(completionContext.Position, cancellationToken);
			if (token.Parent == null)
				return Enumerable.Empty<CompletionData> ();

			var parentMember = token.Parent.AncestorsAndSelf ().OfType<MemberDeclarationSyntax> ().FirstOrDefault (m => !m.IsKind (SyntaxKind.IncompleteMember));

			if (!(parentMember is BaseTypeDeclarationSyntax) &&

				/* May happen in case: 
				 * 
				 * override $
				 * public override string Foo () {} 
				 */
				!(token.IsKind (SyntaxKind.OverrideKeyword) && token.Span.Start <= parentMember.Span.Start))
				return Enumerable.Empty<CompletionData> ();

            var position = completionContext.Position;
            var startToken = token.GetPreviousTokenIfTouchingWord(position);
			ITypeSymbol returnType;
			SyntaxToken tokenBeforeReturnType;
			TryDetermineReturnType (startToken, semanticModel, cancellationToken, out returnType, out tokenBeforeReturnType);
			if (returnType == null) {
				var enclosingType = semanticModel.GetEnclosingSymbol (position, cancellationToken) as INamedTypeSymbol;
				if (enclosingType != null && (startToken.IsKind (SyntaxKind.OpenBraceToken) || startToken.IsKind (SyntaxKind.CloseBraceToken) || startToken.IsKind (SyntaxKind.SemicolonToken))) {
					return CreateCompletionData (engine, semanticModel, position, returnType, Accessibility.NotApplicable, startToken, tokenBeforeReturnType, false, cancellationToken);
				}
			}

			if (!TryDetermineModifiers(ref tokenBeforeReturnType, text, startLineNumber, out seenAccessibility/*, out modifiers*/) ||
			    !TryCheckForTrailingTokens (tree, text, startLineNumber, position, cancellationToken)) {
				return Enumerable.Empty<CompletionData> ();
			}

			return CreateCompletionData (engine, semanticModel, position, returnType, seenAccessibility, startToken, tokenBeforeReturnType, true, cancellationToken);
		}
		private async Task<IEnumerable<CompletionData>> GetSpeculativeTCompletions(CompletionEngine engine, Document document, int position, CancellationToken cancellationToken)
		{
			var syntaxTree = await document.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);
			if (syntaxTree.IsInNonUserCode(position, cancellationToken) ||
				syntaxTree.IsPreProcessorDirectiveContext(position, cancellationToken))
			{
				return Enumerable.Empty<CompletionData>();
			}

			// If we're in a generic type argument context, use the start of the generic type name
			// as the position for the rest of the context checks.
			int testPosition = position;
			var leftToken = syntaxTree.FindTokenOnLeftOfPosition(position, cancellationToken);

			var semanticModel = await document.GetCSharpSemanticModelForNodeAsync(leftToken.Parent, cancellationToken).ConfigureAwait(false);
			if (syntaxTree.IsGenericTypeArgumentContext(position, leftToken, cancellationToken, semanticModel))
			{
				// Walk out until we find the start of the partial written generic
				SyntaxToken nameToken;
				while (syntaxTree.IsInPartiallyWrittenGeneric(testPosition, cancellationToken, out nameToken))
				{
					testPosition = nameToken.SpanStart;
				}

				// If the user types Foo<T, automatic brace completion will insert the close brace
				// and the generic won't be "partially written".
				if (testPosition == position)
				{
					var typeArgumentList = leftToken.GetAncestor<TypeArgumentListSyntax>();
					if (typeArgumentList != null)
					{
						if (typeArgumentList.LessThanToken != default(SyntaxToken) && typeArgumentList.GreaterThanToken != default(SyntaxToken))
						{
							testPosition = typeArgumentList.LessThanToken.SpanStart;
						}
					}
				}
			}

			if ((!leftToken.GetPreviousTokenIfTouchingWord(position).IsKindOrHasMatchingText(SyntaxKind.AsyncKeyword) &&
				syntaxTree.IsMemberDeclarationContext(testPosition, contextOpt: null, validModifiers: SyntaxKindSet.AllMemberModifiers, validTypeDeclarations: SyntaxKindSet.ClassInterfaceStructTypeDeclarations, canBePartial: false, cancellationToken: cancellationToken)) ||
				syntaxTree.IsGlobalMemberDeclarationContext(testPosition, SyntaxKindSet.AllGlobalMemberModifiers, cancellationToken) ||
				syntaxTree.IsGlobalStatementContext(testPosition, cancellationToken) ||
				syntaxTree.IsDelegateReturnTypeContext(testPosition, syntaxTree.FindTokenOnLeftOfPosition(testPosition, cancellationToken), cancellationToken))
			{
				const string T = "T";
				return new [] { engine.Factory.CreateGenericData (this, T, GenericDataType.Undefined) };
			}
			return Enumerable.Empty<CompletionData>();
		}
예제 #28
0
        private Task <IEnumerable <CompletionData> > GetNameColonItemsAsync(
            CompletionEngine engine, Workspace workspace, SemanticModel semanticModel, int position, SyntaxToken token, AttributeSyntax attributeSyntax, ISet <string> existingNamedParameters,
            CancellationToken cancellationToken)
        {
            var parameterLists = GetParameterLists(semanticModel, position, attributeSyntax, cancellationToken);

            parameterLists = parameterLists.Where(pl => IsValid(pl, existingNamedParameters));

            // var text = await semanticModel.SyntaxTree.GetTextAsync(cancellationToken).ConfigureAwait(false);
            return(Task.FromResult(
                       from pl in parameterLists
                       from p in pl
                       where !existingNamedParameters.Contains(p.Name)
                       select engine.Factory.CreateGenericData(this, p.Name + ":", GenericDataType.NamedParameter)));
        }
        IEnumerable <CompletionData> GenerateDateTimeFormatitems(CompletionEngine engine)
        {
            yield return(engine.Factory.CreateFormatItemCompletionData(this, "D", "long date", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "d", "short date", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "F", "full date long", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "f", "full date short", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "G", "general long", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "g", "general short", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "M", "month", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "O", "ISO 8601", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "R", "RFC 1123", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "s", "sortable", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "T", "long time", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "t", "short time", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "U", "universal full", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "u", "universal sortable", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "Y", "year month", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "yy-MM-dd", "custom", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "yyyy MMMMM dd", "custom", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "yy-MMM-dd ddd", "custom", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "yyyy-M-d dddd", "custom", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "hh:mm:ss t z", "custom", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "hh:mm:ss tt zz", "custom", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "HH:mm:ss tt zz", "custom", curDate));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "HH:m:s tt zz", "custom", curDate));
        }
        IEnumerable <CompletionData> GenerateNumberFormatitems(CompletionEngine engine, bool isFloatingPoint)
        {
            yield return(engine.Factory.CreateFormatItemCompletionData(this, "D", "decimal", 123));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "D5", "decimal", 123));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "C", "currency", 123));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "C0", "currency", 123));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "E", "exponential", 1.23E4));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "E2", "exponential", 1.234));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "e2", "exponential", 1.234));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "F", "fixed-point", 123.45));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "F1", "fixed-point", 123.45));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "G", "general", 1.23E+56));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "g2", "general", 1.23E+56));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "N", "number", 12345.68));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "N1", "number", 12345.68));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "P", "percent", 12.34));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "P1", "percent", 12.34));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "R", "round-trip", 0.1230000001));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "X", "hexadecimal", 1234));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "x8", "hexadecimal", 1234));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "0000", "custom", 123));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "####", "custom", 123));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "##.###", "custom", 1.23));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "##.000", "custom", 1.23));

            yield return(engine.Factory.CreateFormatItemCompletionData(this, "## 'items'", "custom", 12));
        }
        IEnumerable <CompletionData> GetFormatCompletionData(CompletionEngine engine, SemanticModel semanticModel, InvocationExpressionSyntax invocationExpression, int formatArgument, char currentChar)
        {
            var symbolInfo = semanticModel.GetSymbolInfo(invocationExpression);
            var method     = symbolInfo.Symbol as IMethodSymbol ?? symbolInfo.CandidateSymbols.OfType <IMethodSymbol> ().FirstOrDefault();
            var ma         = invocationExpression.Expression as MemberAccessExpressionSyntax;

            if (ma != null && ma.Name.ToString() == "ToString")
            {
                if (method == null || currentChar != '"')
                {
                    return(Enumerable.Empty <CompletionData> ());
                }
                if (method != null)
                {
                    return(GetFormatCompletionForType(engine, method.ContainingType));
                }
                else
                {
                    return(Enumerable.Empty <CompletionData> ());
                }
            }
            else
            {
                if (method == null || currentChar != ':')
                {
                    return(Enumerable.Empty <CompletionData> ());
                }
                ExpressionSyntax         fmtArgumets;
                IList <ExpressionSyntax> args;
                if (FormatStringHelper.TryGetFormattingParameters(semanticModel, invocationExpression, out fmtArgumets, out args, null))
                {
                    ITypeSymbol type = null;
                    if (formatArgument + 1 < args.Count)
                    {
                        var invokeArgument = semanticModel.GetSymbolInfo(args[formatArgument + 1]);
                        if (invokeArgument.Symbol != null)
                        {
                            type = invokeArgument.Symbol.GetReturnType();
                        }
                    }

                    return(GetFormatCompletionForType(engine, type));
                }
            }
            return(Enumerable.Empty <CompletionData> ());
        }
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var document = completionContext.Document;
			var position = completionContext.Position;

			var syntaxTree = ctx.SyntaxTree;
			if (syntaxTree.IsInNonUserCode(position, cancellationToken))
			{
				return null;
			}

			var token = syntaxTree.FindTokenOnLeftOfPosition(position, cancellationToken);
			token = token.GetPreviousTokenIfTouchingWord(position);

			if (token.Kind() != SyntaxKind.OpenParenToken && token.Kind() != SyntaxKind.CommaToken)
			{
				return null;
			}

			var attributeArgumentList = token.Parent as AttributeArgumentListSyntax;
			var attributeSyntax = token.Parent.Parent as AttributeSyntax;
			if (attributeSyntax == null || attributeArgumentList == null)
			{
				return null;
			}

			// We actually want to collect two sets of named parameters to present the user.  The
			// normal named parameters that come from the attribute constructors.  These will be
			// presented like "foo:".  And also the named parameters that come from the writable
			// fields/properties in the attribute.  These will be presented like "bar =".  

			var existingNamedParameters = GetExistingNamedParameters(attributeArgumentList, position);

			var workspace = document.Project.Solution.Workspace;
			var semanticModel = await document.GetCSharpSemanticModelForNodeAsync(attributeSyntax, cancellationToken).ConfigureAwait(false);
			var nameColonItems = await GetNameColonItemsAsync(engine, workspace, semanticModel, position, token, attributeSyntax, existingNamedParameters, cancellationToken).ConfigureAwait(false);
			var nameEqualsItems = await GetNameEqualsItemsAsync(engine, workspace, semanticModel, position, token, attributeSyntax, existingNamedParameters, cancellationToken).ConfigureAwait(false);

			// If we're after a name= parameter, then we only want to show name= parameters.
			if (IsAfterNameEqualsArgument(token))
			{
				return nameEqualsItems;
			}

			return nameColonItems.Concat(nameEqualsItems);
		}
		protected override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var document = completionContext.Document;
			var position = completionContext.Position;
			var semanticModel = ctx.SemanticModel;
			if (info.TriggerCharacter == '\\') {
				if (ctx.TargetToken.Parent != null && ctx.TargetToken.Parent.Parent != null &&
				ctx.TargetToken.Parent.Parent.IsKind (SyntaxKind.Argument)) {
					var argument = ctx.TargetToken.Parent.Parent as ArgumentSyntax;

					var symbolInfo = semanticModel.GetSymbolInfo (ctx.TargetToken.Parent.Parent.Parent.Parent);
					if (symbolInfo.Symbol == null)
						return TaskUtil.EmptyEnumerable<CompletionData> ();

					if (SemanticHighlightingVisitor<int>.IsRegexMatchMethod (symbolInfo)) {
						if (((ArgumentListSyntax)argument.Parent).Arguments [1] != argument)
							return TaskUtil.EmptyEnumerable<CompletionData> ();
						completionResult.AutoSelect = false;
						return Task.FromResult (GetFormatCompletionData (engine, argument.Expression.ToString () [0] == '@'));
					}
					if (SemanticHighlightingVisitor<int>.IsRegexConstructor (symbolInfo)) {
						if (((ArgumentListSyntax)argument.Parent).Arguments [0] != argument)
							return TaskUtil.EmptyEnumerable<CompletionData> ();
						completionResult.AutoSelect = false;
						return Task.FromResult (GetFormatCompletionData (engine, argument.Expression.ToString () [0] == '@'));
					}
				}
			} else {
				var ma = ctx.TargetToken.Parent as MemberAccessExpressionSyntax;
				if (ma != null) {
					var symbolInfo = semanticModel.GetSymbolInfo (ma.Expression);
					var typeInfo = semanticModel.GetTypeInfo (ma.Expression);
					var type = typeInfo.Type;
					if (type != null && type.Name == "Match"  && type.ContainingNamespace.GetFullName () == "System.Text.RegularExpressions" ) {
						var items = new List<CompletionData>();
						foreach (var grp in GetGroups (ctx, symbolInfo.Symbol)) {
							items.Add (engine.Factory.CreateGenericData (this, "Groups[\"" + grp + "\"]", GenericDataType.Undefined));
						}

						return Task.FromResult ((IEnumerable<CompletionData>)items);
					}
				}
			}
			return TaskUtil.EmptyEnumerable<CompletionData> ();
		}
		protected override IEnumerable<CompletionData> CreateCompletionData (CompletionEngine engine, SemanticModel semanticModel, int position, ITypeSymbol returnType, Accessibility seenAccessibility, SyntaxToken startToken, SyntaxToken tokenBeforeReturnType, bool afterKeyword, CancellationToken cancellationToken)
		{
			var result = new List<CompletionData> ();
			ISet<ISymbol> overridableMembers;
			if (!TryDetermineOverridableMembers (semanticModel, tokenBeforeReturnType, seenAccessibility, out overridableMembers, cancellationToken)) {
				return result;
			}
			if (returnType != null) {
				overridableMembers = FilterOverrides (overridableMembers, returnType);
			}
			var curType = semanticModel.GetEnclosingSymbol<INamedTypeSymbol> (startToken.SpanStart, cancellationToken);
			var declarationBegin = afterKeyword ? startToken.SpanStart : position - 1;
			foreach (var m in overridableMembers) {
				var data = new ProtocolCompletionData (this, factory, declarationBegin, curType, m, afterKeyword);
				result.Add (data);
			}
			return result;
		}
예제 #35
0
        private Task <IEnumerable <CompletionData> > GetNameEqualsItemsAsync(CompletionEngine engine, Workspace workspace, SemanticModel semanticModel,
                                                                             int position, SyntaxToken token, AttributeSyntax attributeSyntax, ISet <string> existingNamedParameters,
                                                                             CancellationToken cancellationToken)
        {
            var attributeNamedParameters = GetAttributeNamedParameters(semanticModel, position, attributeSyntax, cancellationToken);

            // var unspecifiedNamedParameters = attributeNamedParameters.Where(p => !existingNamedParameters.Contains(p.Name));

            // var text = await semanticModel.SyntaxTree.GetTextAsync(cancellationToken).ConfigureAwait(false);
            return(Task.FromResult(
                       attributeNamedParameters
                       .Where(p => !existingNamedParameters.Contains(p.Name))
                       .Select(p => {
                var result = engine.Factory.CreateSymbolCompletionData(this, p);
                result.DisplayFlags |= DisplayFlags.NamedArgument;
                return (CompletionData)result;
            })));
        }
예제 #36
0
        private IEnumerable <CompletionData> GetTagsForSymbol(CompletionEngine engine, ISymbol symbol, TextSpan filterSpan, DocumentationCommentTriviaSyntax trivia, SyntaxToken token)
        {
            if (symbol is IMethodSymbol)
            {
                return(GetTagsForMethod(engine, (IMethodSymbol)symbol, filterSpan, trivia, token));
            }

            if (symbol is IPropertySymbol)
            {
                return(GetTagsForProperty(engine, (IPropertySymbol)symbol, filterSpan, trivia));
            }

            if (symbol is INamedTypeSymbol)
            {
                return(GetTagsForType(engine, (INamedTypeSymbol)symbol, filterSpan, trivia));
            }

            return(SpecializedCollections.EmptyEnumerable <CompletionData>());
        }
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult result, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var list = new List<CompletionData> ();

			var newExpression = GetObjectCreationNewExpression (ctx.SyntaxTree, completionContext.Position, cancellationToken);
			if (newExpression == null) {
				if (ctx.SyntaxTree.IsInNonUserCode(completionContext.Position, cancellationToken) ||
					ctx.SyntaxTree.IsPreProcessorDirectiveContext(completionContext.Position, cancellationToken))
					return Enumerable.Empty<CompletionData> ();

//				if (!nkr.IsValid (completionContext.Position, ctx.CSharpSyntaxContext, cancellationToken))
//					return Enumerable.Empty<ICompletionData> ();

				var tokenOnLeftOfPosition = ctx.SyntaxTree.FindTokenOnLeftOfPosition (completionContext.Position, cancellationToken);
				if (!tokenOnLeftOfPosition.IsKind (SyntaxKind.EqualsToken) && !tokenOnLeftOfPosition.Parent.IsKind (SyntaxKind.EqualsValueClause))
					return Enumerable.Empty<CompletionData> ();
	
				foreach (var inferredType in SyntaxContext.InferenceService.InferTypes (ctx.CSharpSyntaxContext.SemanticModel, completionContext.Position, cancellationToken)) {
					if (inferredType.IsEnumType () || inferredType.IsInterfaceType () || inferredType.IsAbstract)
						continue;
					foreach (var symbol in await GetPreselectedSymbolsWorker(ctx.CSharpSyntaxContext, inferredType, completionContext.Position - 1, cancellationToken)) {
						var symbolCompletionData = engine.Factory.CreateObjectCreation (this, inferredType, symbol, completionContext.Position, false);
						list.Add (symbolCompletionData);
					}	
				}
				return list;
			}

			var type = SyntaxContext.InferenceService.InferType (ctx.CSharpSyntaxContext.SemanticModel, newExpression, objectAsDefault: false, cancellationToken: cancellationToken);

			foreach (var symbol in await GetPreselectedSymbolsWorker(ctx.CSharpSyntaxContext, type, completionContext.Position, cancellationToken)) {
				var symbolCompletionData = engine.Factory.CreateObjectCreation (this, type, symbol, newExpression.SpanStart, true);
				list.Add (symbolCompletionData);
				if (string.IsNullOrEmpty (result.DefaultCompletionString))
					result.DefaultCompletionString = symbolCompletionData.DisplayText;
			}
			foreach (var keyword in primitiveTypesKeywords) {
				list.Add (engine.Factory.CreateGenericData (this, keyword, GenericDataType.Keyword));
			}
			return list;
		}
		protected virtual IEnumerable<CompletionData> CreateCompletionData (CompletionEngine engine, SemanticModel semanticModel, int position, INamedTypeSymbol enclosingType, SyntaxToken token, bool afterPartialKeyword, CancellationToken cancellationToken)
		{
			var symbols = semanticModel.LookupSymbols(position, container: enclosingType)
				.OfType<IMethodSymbol>()
				.Where(m => IsPartial(m) && m.PartialImplementationPart == null);

			var list = new List<CompletionData> ();

			var declarationBegin = afterPartialKeyword ? token.Parent.SpanStart : position - 1;
			foreach (var m in symbols) {
				var data = engine.Factory.CreatePartialCompletionData (
					this,
					declarationBegin,
					enclosingType,
					m,
					afterPartialKeyword
				);
				list.Add (data); 
			}
			return list;
		}
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var position = completionContext.Position;
			var document = completionContext.Document;
			var syntaxTree = ctx.SyntaxTree;
			if (syntaxTree.IsInNonUserCode(position, cancellationToken) ||
				syntaxTree.IsPreProcessorDirectiveContext(position, cancellationToken))
				return Enumerable.Empty<CompletionData> ();
			if (!syntaxTree.IsRightOfDotOrArrowOrColonColon(position, cancellationToken))
				return Enumerable.Empty<CompletionData> ();
			var ma = ctx.LeftToken.Parent as MemberAccessExpressionSyntax;
			if (ma == null)
				return Enumerable.Empty<CompletionData> ();

			var model = ctx.CSharpSyntaxContext.SemanticModel;

			var symbolInfo = model.GetSymbolInfo (ma.Expression);
			if (symbolInfo.Symbol == null)
				return Enumerable.Empty<CompletionData> ();

			var list = new List<CompletionData> ();
			var within = model.GetEnclosingNamedTypeOrAssembly(position, cancellationToken);
			var addedSymbols = new HashSet<string> ();
			foreach (var ifStmSyntax in ma.Expression.AncestorsAndSelf ().OfType<IfStatementSyntax> ()) {
				var condition = ifStmSyntax.Condition.SkipParens ();
				if (condition == null || !condition.IsKind (SyntaxKind.IsExpression))
					continue;
				var isExpr = ((BinaryExpressionSyntax)condition);
				var leftSymbol = model.GetSymbolInfo (isExpr.Left);

				if (leftSymbol.Symbol == symbolInfo.Symbol) {
					var type = model.GetTypeInfo (isExpr.Right).Type;
					if (type != null) {
						Analyze (engine, ma.Expression, type, within, list, addedSymbols, cancellationToken);
					}
				}
			}

			return list;
		}
예제 #40
0
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var model = ctx.SemanticModel;
			var tree = ctx.SyntaxTree;
			if (tree.IsInNonUserCode(completionContext.Position, cancellationToken))
				return Enumerable.Empty<CompletionData> ();

			var token = tree.FindTokenOnLeftOfPosition(completionContext.Position, cancellationToken);
			if (token.IsMandatoryNamedParameterPosition())
				return Enumerable.Empty<CompletionData> ();
			var result = new List<CompletionData> ();

			foreach (var _type in ctx.InferredTypes) {
				var type = _type;
				if (type.OriginalDefinition.SpecialType == SpecialType.System_Nullable_T) {
					type = type.GetTypeArguments().FirstOrDefault();
					if (type == null)
						continue;
				}

				if (type.TypeKind != TypeKind.Enum)
					continue;
				if (!type.IsEditorBrowsable ())
					continue;

				// Does type have any aliases?
				ISymbol alias = await type.FindApplicableAlias(completionContext.Position, model, cancellationToken).ConfigureAwait(false);

				if (string.IsNullOrEmpty(completionResult.DefaultCompletionString))
					completionResult.DefaultCompletionString = type.Name;

				result.Add (engine.Factory.CreateSymbolCompletionData(this, type, RoslynCompletionData.SafeMinimalDisplayString (type, model, completionContext.Position, SymbolDisplayFormat.CSharpErrorMessageFormat)));
				foreach (IFieldSymbol field in type.GetMembers().OfType<IFieldSymbol>()) {
					if (field.DeclaredAccessibility == Accessibility.Public && (field.IsConst || field.IsStatic)) {
						result.Add (engine.Factory.CreateEnumMemberCompletionData(this, alias, field));
					}
				}
			}
			return result;
		}
        protected virtual IEnumerable <CompletionData> CreateCompletionData(CompletionEngine engine, SemanticModel semanticModel, int position, ITypeSymbol returnType, Accessibility seenAccessibility, SyntaxToken startToken, SyntaxToken tokenBeforeReturnType, bool afterKeyword, CancellationToken cancellationToken)
        {
            var            result = new List <CompletionData> ();
            ISet <ISymbol> overridableMembers;

            if (!TryDetermineOverridableMembers(semanticModel, tokenBeforeReturnType, seenAccessibility, out overridableMembers, cancellationToken))
            {
                return(result);
            }
            if (returnType != null)
            {
                overridableMembers = FilterOverrides(overridableMembers, returnType);
            }
            var curType          = semanticModel.GetEnclosingSymbol <INamedTypeSymbol> (position, cancellationToken);
            var declarationBegin = afterKeyword ? startToken.Parent.SpanStart : position - 1;

            foreach (var m in overridableMembers)
            {
                var data = engine.Factory.CreateNewOverrideCompletionData(this, declarationBegin, curType, m, afterKeyword);
                result.Add(data);
            }
            return(result);
        }
예제 #42
0
        protected virtual IEnumerable <CompletionData> CreateCompletionData(CompletionEngine engine, SemanticModel semanticModel, int position, INamedTypeSymbol enclosingType, SyntaxToken token, bool afterPartialKeyword, CancellationToken cancellationToken)
        {
            var symbols = semanticModel.LookupSymbols(position, container: enclosingType)
                          .OfType <IMethodSymbol>()
                          .Where(m => IsPartial(m) && m.PartialImplementationPart == null);

            var list = new List <CompletionData> ();

            var declarationBegin = afterPartialKeyword ? token.Parent.SpanStart : position - 1;

            foreach (var m in symbols)
            {
                var data = engine.Factory.CreatePartialCompletionData(
                    this,
                    declarationBegin,
                    enclosingType,
                    m,
                    afterPartialKeyword
                    );
                list.Add(data);
            }
            return(list);
        }
예제 #43
0
        void Analyze(CompletionEngine engine, SemanticModel model, SyntaxNode node, ISymbol within, List <CompletionData> list, ParameterListSyntax parameterList, ISymbol symbol, HashSet <string> addedSymbols, CancellationToken cancellationToken)
        {
            var type = CheckParameterList(model, parameterList, symbol, cancellationToken);

            if (type == null)
            {
                return;
            }
            var startType = type;

            while (type.SpecialType != SpecialType.System_Object)
            {
                foreach (var member in type.GetMembers())
                {
                    if (member.IsImplicitlyDeclared || member.IsStatic)
                    {
                        continue;
                    }
                    if (member.IsOrdinaryMethod() || member.Kind == SymbolKind.Field || member.Kind == SymbolKind.Property)
                    {
                        if (member.IsAccessibleWithin(within))
                        {
                            var completionData = engine.Factory.CreateCastCompletionData(this, member, node, startType);
                            if (addedSymbols.Contains(completionData.DisplayText))
                            {
                                continue;
                            }
                            addedSymbols.Add(completionData.DisplayText);
                            list.Add(completionData);
                        }
                    }
                }

                type = type.BaseType;
            }
        }
		IEnumerable<CompletionData> GenerateEnumFormatitems(CompletionEngine engine)
		{
			yield return engine.Factory.CreateFormatItemCompletionData(this, "G", "string value", TestEnum.EnumCaseName);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "F", "flags value", TestEnum.Flags);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "D", "integer value", TestEnum.Flags);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "X", "hexadecimal", TestEnum.Flags);
		}
		IEnumerable<CompletionData> GenerateDateTimeFormatitems(CompletionEngine engine)
		{
			yield return engine.Factory.CreateFormatItemCompletionData(this, "D", "long date", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "d", "short date", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "F", "full date long", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "f", "full date short", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "G", "general long", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "g", "general short", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "M", "month", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "O", "ISO 8601", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "R", "RFC 1123", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "s", "sortable", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "T", "long time", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "t", "short time", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "U", "universal full", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "u", "universal sortable", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "Y", "year month", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "yy-MM-dd", "custom", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "yyyy MMMMM dd", "custom", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "yy-MMM-dd ddd", "custom", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "yyyy-M-d dddd", "custom", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "hh:mm:ss t z", "custom", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "hh:mm:ss tt zz", "custom", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "HH:mm:ss tt zz", "custom", curDate);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "HH:m:s tt zz", "custom", curDate);

		}
예제 #46
0
        protected async override Task <IEnumerable <CompletionData> > GetItemsWorkerAsync(CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
        {
            if (info.IsDebugger)
            {
                return(null);
            }
            if (info.CompletionTriggerReason == CompletionTriggerReason.BackspaceOrDeleteCommand)
            {
                return(null);
            }
            var document = completionContext.Document;
            var position = completionContext.Position;

            var tree = await document.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);

            var token        = tree.FindTokenOnLeftOfPosition(position, cancellationToken);
            var parentTrivia = token.GetAncestor <DocumentationCommentTriviaSyntax>();

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

            var items = new List <CompletionData>();
            var text  = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);

            var span = GetTextChangeSpan(text, position);

            var attachedToken = parentTrivia.ParentTrivia.Token;

            if (attachedToken.Kind() == SyntaxKind.None)
            {
                return(null);
            }

            var semanticModel = await document.GetCSharpSemanticModelForNodeAsync(attachedToken.Parent, cancellationToken).ConfigureAwait(false);

            ISymbol declaredSymbol    = null;
            var     memberDeclaration = attachedToken.GetAncestor <MemberDeclarationSyntax>();

            if (memberDeclaration != null)
            {
                declaredSymbol = semanticModel.GetDeclaredSymbol(memberDeclaration, cancellationToken);
            }
            else
            {
                var typeDeclaration = attachedToken.GetAncestor <TypeDeclarationSyntax>();
                if (typeDeclaration != null)
                {
                    declaredSymbol = semanticModel.GetDeclaredSymbol(typeDeclaration, cancellationToken);
                }
            }

            if (declaredSymbol != null)
            {
                items.AddRange(GetTagsForSymbol(engine, declaredSymbol, span, parentTrivia, token));
            }

            if (token.Parent.Kind() == SyntaxKind.XmlEmptyElement || token.Parent.Kind() == SyntaxKind.XmlText ||
                (token.Parent.IsKind(SyntaxKind.XmlElementEndTag) && token.IsKind(SyntaxKind.GreaterThanToken)) ||
                (token.Parent.IsKind(SyntaxKind.XmlName) && token.Parent.IsParentKind(SyntaxKind.XmlEmptyElement)))
            {
                if (token.Parent.Parent.Kind() == SyntaxKind.XmlElement)
                {
                    items.AddRange(GetNestedTags(engine, span));
                }

                if (token.Parent.Parent.Kind() == SyntaxKind.XmlElement && ((XmlElementSyntax)token.Parent.Parent).StartTag.Name.LocalName.ValueText == "list")
                {
                    items.AddRange(GetListItems(engine, span));
                }

                if (token.Parent.IsParentKind(SyntaxKind.XmlEmptyElement) & token.Parent.Parent.IsParentKind(SyntaxKind.XmlElement))
                {
                    var element = (XmlElementSyntax)token.Parent.Parent.Parent;
                    if (element.StartTag.Name.LocalName.ValueText == "list")
                    {
                        items.AddRange(GetListItems(engine, span));
                    }
                }

                if (token.Parent.Parent.Kind() == SyntaxKind.XmlElement && ((XmlElementSyntax)token.Parent.Parent).StartTag.Name.LocalName.ValueText == "listheader")
                {
                    items.AddRange(GetListHeaderItems(engine, span));
                }

                if (token.Parent.Parent is DocumentationCommentTriviaSyntax)
                {
                    items.AddRange(GetTopLevelSingleUseNames(engine, parentTrivia, span));
                    items.AddRange(GetTopLevelRepeatableItems(engine, span));
                }
            }

            if (token.Parent.Kind() == SyntaxKind.XmlElementStartTag)
            {
                var startTag = (XmlElementStartTagSyntax)token.Parent;

                if (token == startTag.GreaterThanToken && startTag.Name.LocalName.ValueText == "list")
                {
                    items.AddRange(GetListItems(engine, span));
                }

                if (token == startTag.GreaterThanToken && startTag.Name.LocalName.ValueText == "listheader")
                {
                    items.AddRange(GetListHeaderItems(engine, span));
                }
            }

            items.AddRange(GetAlwaysVisibleItems(engine, span));
            return(items);
        }
예제 #47
0
 protected IEnumerable <CompletionData> GetListHeaderItems(CompletionEngine engine, TextSpan span)
 {
     return(new[] { "term", "description" }
            .Select(t => GetItem(engine, t, span)));
 }
		IEnumerable<CompletionData> GetFormatCompletionForType(CompletionEngine engine, ITypeSymbol type)
		{
			if (type == null) {
				return GenerateNumberFormatitems (engine, false)
					.Concat (GenerateDateTimeFormatitems (engine))
					.Concat (GenerateTimeSpanFormatitems (engine))
					.Concat (GenerateEnumFormatitems (engine))
					.Concat (GenerateGuidFormatitems (engine));
			}

			switch (type.ToString()) {
				case "long":
				case "System.Int64":
				case "ulong":
				case "System.UInt64":
				case "int":
				case "System.Int32":
				case "uint":
				case "System.UInt32":
				case "short":
				case "System.Int16":
				case "ushort":
				case "System.UInt16":
				case "byte":
				case "System.Byte":
				case "sbyte":
				case "System.SByte":
				return GenerateNumberFormatitems(engine, false);
				case "float":
				case "System.Single":
				case "double":
				case "System.Double":
				case "decimal":
				case "System.Decimal":
				return GenerateNumberFormatitems(engine, true);
				case "System.Enum":
				return GenerateEnumFormatitems(engine);
				case "System.DateTime":
				return GenerateDateTimeFormatitems(engine);
				case "System.TimeSpan":
				return GenerateTimeSpanFormatitems(engine);
				case "System.Guid":
				return GenerateGuidFormatitems(engine);
			}
			return CompletionResult.Empty;
		}
예제 #49
0
        protected async override Task <IEnumerable <CompletionData> > GetItemsWorkerAsync(CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
        {
            var tree = await completionContext.Document.GetCSharpSyntaxTreeAsync(cancellationToken).ConfigureAwait(false);

            if (tree.IsInNonUserCode(completionContext.Position, cancellationToken) ||
                tree.IsPreProcessorDirectiveContext(completionContext.Position, cancellationToken) ||
                info.CompletionTriggerReason != CompletionTriggerReason.CompletionCommand)
            {
                return(Enumerable.Empty <CompletionData>());
            }

            var token = tree.FindTokenOnLeftOfPosition(completionContext.Position, cancellationToken);

            if (token.Span.End == completionContext.Position)
            {
                return(Enumerable.Empty <CompletionData>());
            }
            var parent = token.Parent.AncestorsAndSelf().OfType <GenericNameSyntax> ().FirstOrDefault() ?? token.Parent;

            if (!parent.Parent.IsKind(SyntaxKind.IncompleteMember) &&
                !IsLocal(parent) &&
                !parent.Parent.IsKind(SyntaxKind.Parameter) &&
                !parent.Parent.IsKind(SyntaxKind.ForEachStatement))
            {
                return(Enumerable.Empty <CompletionData>());
            }

            if (info.TriggerCharacter != ' ' &&
                parent.Parent.IsKind(SyntaxKind.ExpressionStatement))
            {
                return(Enumerable.Empty <CompletionData>());
            }
            var list = new List <CompletionData> ();

            if (parent.IsKind(SyntaxKind.PredefinedType))
            {
                switch (token.Kind())
                {
                case SyntaxKind.ObjectKeyword:
                    list.Add(engine.Factory.CreateGenericData(this, "o", GenericDataType.NameProposal));
                    list.Add(engine.Factory.CreateGenericData(this, "obj", GenericDataType.NameProposal));
                    return(list);

                case SyntaxKind.BoolKeyword:
                    list.Add(engine.Factory.CreateGenericData(this, "b", GenericDataType.NameProposal));
                    list.Add(engine.Factory.CreateGenericData(this, "pred", GenericDataType.NameProposal));
                    return(list);

                case SyntaxKind.CharKeyword:
                    list.Add(engine.Factory.CreateGenericData(this, "c", GenericDataType.NameProposal));
                    list.Add(engine.Factory.CreateGenericData(this, "ch", GenericDataType.NameProposal));
                    return(list);

                case SyntaxKind.StringKeyword:
                    list.Add(engine.Factory.CreateGenericData(this, "str", GenericDataType.NameProposal));
                    return(list);

                case SyntaxKind.DoubleKeyword:
                case SyntaxKind.FloatKeyword:
                case SyntaxKind.DecimalKeyword:
                    list.Add(engine.Factory.CreateGenericData(this, "d", GenericDataType.NameProposal));
                    list.Add(engine.Factory.CreateGenericData(this, "f", GenericDataType.NameProposal));
                    list.Add(engine.Factory.CreateGenericData(this, "m", GenericDataType.NameProposal));
                    return(list);

                default:
                    list.Add(engine.Factory.CreateGenericData(this, "i", GenericDataType.NameProposal));
                    list.Add(engine.Factory.CreateGenericData(this, "j", GenericDataType.NameProposal));
                    list.Add(engine.Factory.CreateGenericData(this, "k", GenericDataType.NameProposal));
                    return(list);
                }
            }
            else
            {
                var incompleteMember = parent.Parent as IncompleteMemberSyntax;
                if (incompleteMember != null)
                {
                    return(list);
                }
                var gns          = parent as GenericNameSyntax;
                var names        = WordParser.BreakWords(gns != null ? gns.Identifier.ToString() : token.ToString().Trim());
                var possibleName = new StringBuilder();
                for (int i = 0; i < names.Count; i++)
                {
                    possibleName.Length = 0;
                    for (int j = i; j < names.Count; j++)
                    {
                        if (string.IsNullOrEmpty(names [j]))
                        {
                            continue;
                        }
                        if (j == i)
                        {
                            names [j] = Char.ToLower(names [j] [0]) + names [j].Substring(1);
                        }
                        possibleName.Append(names [j]);
                    }
                    list.Add(engine.Factory.CreateGenericData(this, possibleName.ToString(), GenericDataType.NameProposal));
                }
            }
            return(list);
        }
        protected async override Task <IEnumerable <CompletionData> > GetItemsWorkerAsync(CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
        {
            // var ctx = await completionContext.GetSyntaxContextAsync (engine.Workspace, cancellationToken).ConfigureAwait (false);
            var document      = completionContext.Document;
            var semanticModel = ctx.SemanticModel;
            var tree          = ctx.SyntaxTree;

            if (tree.IsInNonUserCode(completionContext.Position, cancellationToken))
            {
                return(Enumerable.Empty <CompletionData> ());
            }

            var text = await document.GetTextAsync(cancellationToken).ConfigureAwait(false);

            var startLineNumber = text.Lines.IndexOf(completionContext.Position);

            // modifiers* override modifiers* type? |
            Accessibility seenAccessibility;
            //DeclarationModifiers modifiers;
            var token = tree.FindTokenOnLeftOfPosition(completionContext.Position, cancellationToken);

            if (token.Parent == null)
            {
                return(Enumerable.Empty <CompletionData> ());
            }

            var parentMember = token.Parent.AncestorsAndSelf().OfType <MemberDeclarationSyntax> ().FirstOrDefault(m => !m.IsKind(SyntaxKind.IncompleteMember));

            if (!(parentMember is BaseTypeDeclarationSyntax) &&

                /* May happen in case:
                 *
                 * override $
                 * public override string Foo () {}
                 */
                !(token.IsKind(SyntaxKind.OverrideKeyword) && token.Span.Start <= parentMember.Span.Start))
            {
                return(Enumerable.Empty <CompletionData> ());
            }

            var         position   = completionContext.Position;
            var         startToken = token.GetPreviousTokenIfTouchingWord(position);
            ITypeSymbol returnType;
            SyntaxToken tokenBeforeReturnType;

            TryDetermineReturnType(startToken, semanticModel, cancellationToken, out returnType, out tokenBeforeReturnType);
            if (returnType == null)
            {
                var enclosingType = semanticModel.GetEnclosingSymbol(position, cancellationToken) as INamedTypeSymbol;
                if (enclosingType != null && (startToken.IsKind(SyntaxKind.OpenBraceToken) || startToken.IsKind(SyntaxKind.CloseBraceToken) || startToken.IsKind(SyntaxKind.SemicolonToken)))
                {
                    return(CreateCompletionData(engine, semanticModel, position, returnType, Accessibility.NotApplicable, startToken, tokenBeforeReturnType, false, cancellationToken));
                }
            }

            if (!TryDetermineModifiers(ref tokenBeforeReturnType, text, startLineNumber, out seenAccessibility /*, out modifiers*/) ||
                !TryCheckForTrailingTokens(tree, text, startLineNumber, position, cancellationToken))
            {
                return(Enumerable.Empty <CompletionData> ());
            }

            return(CreateCompletionData(engine, semanticModel, position, returnType, seenAccessibility, startToken, tokenBeforeReturnType, true, cancellationToken));
        }
		IEnumerable<CompletionData> GenerateTimeSpanFormatitems(CompletionEngine engine)
		{
			yield return engine.Factory.CreateFormatItemCompletionData(this, "c", "invariant", new TimeSpan(0, 1, 23, 456));
			yield return engine.Factory.CreateFormatItemCompletionData(this, "G", "general long", new TimeSpan(0, 1, 23, 456));
			yield return engine.Factory.CreateFormatItemCompletionData(this, "g", "general short", new TimeSpan(0, 1, 23, 456));
		}
		protected override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var semanticModel = ctx.SemanticModel;
			var result = new List<CompletionData> ();
			if (info.TriggerCharacter == ' ') {
				var newExpression = ObjectCreationContextHandler.GetObjectCreationNewExpression (ctx.SyntaxTree, completionContext.Position, cancellationToken);
				if (newExpression == null && info.CompletionTriggerReason == CompletionTriggerReason.CharTyped  && !ctx.LeftToken.IsKind (SyntaxKind.EqualsToken) && !ctx.LeftToken.IsKind (SyntaxKind.EqualsEqualsToken))
					return Task.FromResult (Enumerable.Empty<CompletionData> ());

				completionResult.AutoCompleteEmptyMatch = false;
			}

			var parent = ctx.TargetToken.Parent;
			bool isInAttribute = ctx.CSharpSyntaxContext.IsAttributeNameContext;
			bool isInBaseList = parent != null && parent.IsKind (SyntaxKind.BaseList);
			bool isInUsingDirective = parent != null && parent.Parent != null && parent.Parent.IsKind (SyntaxKind.UsingDirective) && !parent.IsKind (SyntaxKind.QualifiedName);
			var isInQuery = ctx.CSharpSyntaxContext.IsInQuery;
			var completionDataLookup = new Dictionary<Tuple<string, SymbolKind>, ISymbolCompletionData> ();
			bool isInCatchTypeExpression = parent != null && parent.IsKind (SyntaxKind.CatchDeclaration) || 
			                               parent.IsKind (SyntaxKind.QualifiedName) && parent.Parent != null && parent.Parent.IsKind (SyntaxKind.CatchDeclaration);
			Action<ISymbolCompletionData> addData = d => {
				var key = Tuple.Create (d.DisplayText, d.Symbol.Kind);
				ISymbolCompletionData data;
				if (completionDataLookup.TryGetValue (key, out data)) {
					data.AddOverload (d);
					return;
				}
				completionDataLookup.Add (key, d);
				result.Add (d);
			};

			var completionCategoryLookup = new Dictionary<string, CompletionCategory> ();
			foreach (var symbol in Recommender.GetRecommendedSymbolsAtPosition (semanticModel, completionContext.Position, engine.Workspace, null, cancellationToken)) {
				if (symbol.Kind == SymbolKind.NamedType) {
					if (isInAttribute) {
						var type = (ITypeSymbol)symbol;
						if (type.IsAttribute ()) {
							var v = type.Name.Substring (0, type.Name.Length - "Attribute".Length);
							var needsEscaping = SyntaxFacts.GetKeywordKind(v) != SyntaxKind.None;
							needsEscaping = needsEscaping || (isInQuery && SyntaxFacts.IsQueryContextualKeyword(SyntaxFacts.GetContextualKeywordKind(v)));
							if (!needsEscaping) {
								addData (engine.Factory.CreateSymbolCompletionData (this, symbol, v));
								continue;
							}
						}
					}
					if (isInBaseList) {
						var type = (ITypeSymbol)symbol;
						if (type.IsSealed || type.IsStatic)
							continue;
					}
					if (isInCatchTypeExpression) {
						var type = (ITypeSymbol)symbol;
						if (!IsException (type))
							continue;
					}
				}

				if (isInUsingDirective && symbol.Kind != SymbolKind.Namespace)
					continue;

				var newData = engine.Factory.CreateSymbolCompletionData (this, symbol, symbol.Name.EscapeIdentifier (isInQuery));
				ISymbol categorySymbol;
				var method = symbol as IMethodSymbol;
				if (method != null) {
					if (method.IsReducedExtension ()) {
						categorySymbol = method.ReceiverType;
					} else {
						categorySymbol = (ISymbol)symbol.ContainingType;
					}
				} else {
					categorySymbol = (ISymbol)symbol.ContainingType ?? symbol.ContainingNamespace;
				}
				if (categorySymbol != null) {
					CompletionCategory category;
					var key = categorySymbol.ToDisplayString ();
					if (!completionCategoryLookup.TryGetValue (key, out category)) {
						completionCategoryLookup [key] = category = engine.Factory.CreateCompletionDataCategory (categorySymbol);
					}
					newData.CompletionCategory = category;
				}
				addData (newData);
			}
			return Task.FromResult ((IEnumerable<CompletionData>)result);
		}
		IEnumerable<CompletionData> GenerateGuidFormatitems(CompletionEngine engine)
		{
			yield return engine.Factory.CreateFormatItemCompletionData(this, "N", "digits", defaultGuid);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "D", "hypens", defaultGuid);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "B", "braces", defaultGuid);
			yield return engine.Factory.CreateFormatItemCompletionData(this, "P", "parentheses", defaultGuid);
		}
예제 #54
0
 protected IEnumerable <CompletionData> GetNestedTags(CompletionEngine engine, TextSpan filterSpan)
 {
     return(new[] { "c", "code", "para", "list", "paramref", "typeparamref" }
            .Select(t => GetItem(engine, t, filterSpan)));
 }
		IEnumerable<CompletionData> GetFormatCompletionData(CompletionEngine engine, SemanticModel semanticModel, InvocationExpressionSyntax invocationExpression, int formatArgument, char currentChar)
		{
			var symbolInfo = semanticModel.GetSymbolInfo (invocationExpression);
			var method = symbolInfo.Symbol as IMethodSymbol ?? symbolInfo.CandidateSymbols.OfType<IMethodSymbol> ().FirstOrDefault ();
			var ma = invocationExpression.Expression as MemberAccessExpressionSyntax;

			if (ma != null && ma.Name.ToString () == "ToString") {
				if (method == null || currentChar != '"') {
					return Enumerable.Empty<CompletionData> ();
				}
				if (method != null) {
					return GetFormatCompletionForType (engine, method.ContainingType);
				} else {
					return Enumerable.Empty<CompletionData> ();
				}
			} else {
				if(method == null || currentChar != ':') {
					return Enumerable.Empty<CompletionData> ();
				}
				ExpressionSyntax fmtArgumets;
				IList<ExpressionSyntax> args;
				if (FormatStringHelper.TryGetFormattingParameters(semanticModel, invocationExpression, out fmtArgumets, out args, null)) {
					ITypeSymbol type = null;
					if (formatArgument  + 1< args.Count) {
						var invokeArgument = semanticModel.GetSymbolInfo(args[formatArgument + 1]);
						if (invokeArgument.Symbol != null)
							type = invokeArgument.Symbol.GetReturnType();
					}

					return GetFormatCompletionForType(engine, type);
				}
			}
			return Enumerable.Empty<CompletionData> ();
		}
예제 #56
0
 protected IEnumerable <CompletionData> GetTopLevelRepeatableItems(CompletionEngine engine, TextSpan filterSpan)
 {
     return(new[] { "exception", "include", "permission" }
            .Select(t => GetItem(engine, t, filterSpan)));
 }
예제 #57
0
 protected IEnumerable <CompletionData> GetAlwaysVisibleItems(CompletionEngine engine, TextSpan filterSpan)
 {
     return(new[] { "see", "seealso", "![CDATA[", "!--" }
            .Select(t => GetItem(engine, t, filterSpan)));
 }
		IEnumerable<CompletionData> GetFormatCompletionData (CompletionEngine engine, bool isVerbatimString)
		{
			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"d", "Digit character", null);
			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"D", "Non-digit character", null);

			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"b", "Word boundary", null);
			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"B", "Non-word boundary", null);

			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"w", "Word character", null);
			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"W", "Non-word character", null);

			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"s", "White-space character", null);
			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"S", "Non-white-space character", null);

			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"A", "Start boundary", null);
			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"Z", "End boundary", null);

			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"k<name>", "Named backreference", null);
			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"P{name}", "Negative unicode category or unicode block", null);
			yield return engine.Factory.CreateFormatItemCompletionData(this, (isVerbatimString ? "" : "\\") +"p{name}", "Unicode category or unicode block", null);
		}
		protected async override Task<IEnumerable<CompletionData>> GetItemsWorkerAsync (CompletionResult completionResult, CompletionEngine engine, CompletionContext completionContext, CompletionTriggerInfo info, SyntaxContext ctx, CancellationToken cancellationToken)
		{
			var document = completionContext.Document;
			var position = completionContext.Position;
			var workspace = document.Project.Solution.Workspace;
			var semanticModel = await document.GetSemanticModelForSpanAsync (new TextSpan (position, 0), cancellationToken).ConfigureAwait (false);
			var typeAndLocation = GetInitializedType (document, semanticModel, position, cancellationToken);
			if (typeAndLocation == null)
				return Enumerable.Empty<CompletionData> ();

			var initializedType = typeAndLocation.Item1 as INamedTypeSymbol;
			var initializerLocation = typeAndLocation.Item2;
			if (initializedType == null)
				return Enumerable.Empty<CompletionData> ();

			// Find the members that can be initialized. If we have a NamedTypeSymbol, also get the overridden members.
			IEnumerable<ISymbol> members = semanticModel.LookupSymbols (position, initializedType);
			members = members.Where (m => IsInitializable (m, initializedType) &&
				 m.CanBeReferencedByName &&
				 IsLegalFieldOrProperty (m) &&
				 !m.IsImplicitlyDeclared);

			// Filter out those members that have already been typed
			var alreadyTypedMembers = GetInitializedMembers (semanticModel.SyntaxTree, position, cancellationToken);
			var uninitializedMembers = members.Where (m => !alreadyTypedMembers.Contains (m.Name));

			uninitializedMembers = uninitializedMembers.Where (m => m.IsEditorBrowsable ());

			// var text = await semanticModel.SyntaxTree.GetTextAsync(cancellationToken).ConfigureAwait(false);
			// var changes = GetTextChangeSpan(text, position);
			var list = new List<CompletionData> ();

			// Return the members
			foreach (var member in uninitializedMembers) {
				list.Add (engine.Factory.CreateSymbolCompletionData (this, member));
			}
			return list;
		}
예제 #60
0
        private IEnumerable <CompletionData> GetTagsForMethod(CompletionEngine engine, IMethodSymbol symbol, TextSpan filterSpan, DocumentationCommentTriviaSyntax trivia, SyntaxToken token)
        {
            var items = new List <CompletionData>();

            var parameters     = symbol.GetParameters().Select(p => p.Name).ToSet();
            var typeParameters = symbol.TypeParameters.Select(t => t.Name).ToSet();

            // User is trying to write a name, try to suggest only names.
            if (token.Parent.IsKind(SyntaxKind.XmlNameAttribute) ||
                (token.Parent.IsKind(SyntaxKind.IdentifierName) && token.Parent.IsParentKind(SyntaxKind.XmlNameAttribute)))
            {
                string parentElementName = null;

                var emptyElement = token.GetAncestor <XmlEmptyElementSyntax>();
                if (emptyElement != null)
                {
                    parentElementName = emptyElement.Name.LocalName.Text;
                }

                // We're writing the name of a paramref or typeparamref
                if (parentElementName == "paramref")
                {
                    items.AddRange(parameters.Select(p => engine.Factory.CreateXmlDocCompletionData(this, p)));
                }
                else if (parentElementName == "typeparamref")
                {
                    items.AddRange(typeParameters.Select(t => engine.Factory.CreateXmlDocCompletionData(this, t)));
                }

                return(items);
            }

            var returns = true;

            RemoveExistingTags(trivia, parameters, x => AttributeSelector(x, "param"));
            RemoveExistingTags(trivia, typeParameters, x => AttributeSelector(x, "typeparam"));

            foreach (var node in trivia.Content)
            {
                var element = node as XmlElementSyntax;
                if (element != null && !element.StartTag.IsMissing && !element.EndTag.IsMissing)
                {
                    var startTag = element.StartTag;

                    if (startTag.Name.LocalName.ValueText == "returns")
                    {
                        returns = false;
                        break;
                    }
                }
            }

            items.AddRange(parameters.Select(p => engine.Factory.CreateXmlDocCompletionData(this, FormatParameter("param", p))));
            items.AddRange(typeParameters.Select(t => engine.Factory.CreateXmlDocCompletionData(this, FormatParameter("typeparam", t))));

            if (returns && !symbol.ReturnsVoid)
            {
                items.Add(engine.Factory.CreateXmlDocCompletionData(this, "returns"));
            }

            return(items);
        }