public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context) { if (!context.Snapshot.ContentType.IsOfType(ContentTypeDefinitions.TeamsManifestContentTypeConstants.ContentTypeName)) { return(Enumerable.Empty <JsonCompletionEntry>()); } if (!(context.ContextNode is MemberNode property)) { return(Enumerable.Empty <JsonCompletionEntry>()); } var propertyName = property.UnquotedNameText; var completionSession = (ICompletionSession)context.Session; var dte = (DTE2)ServiceProvider.GetService(typeof(DTE)); switch (propertyName) { case "color": case "outline": return(GetIconFileCompletionList(dte, completionSession)); } return(Enumerable.Empty <JsonCompletionEntry>()); }
private List <JsonCompletionEntry> GetCompletionList(MemberNode memberNode, JsonCompletionContext context, CompletionSet completionSet, int count) { int start = memberNode.Value.Start; ITrackingSpan trackingSpan = context.Snapshot.CreateTrackingSpan(start + 1 + completionSet.Start, completionSet.Length, SpanTrackingMode.EdgeExclusive); bool isVersionCompletion = (completionSet.CompletionType == CompletionSortOrder.Version); List <JsonCompletionEntry> results = new List <JsonCompletionEntry>(); foreach (CompletionItem item in completionSet.Completions) { string insertionText = item.InsertionText.Replace("\\\\", "\\").Replace("\\", "\\\\"); ImageMoniker moniker = item.DisplayText.EndsWith("/") || item.DisplayText.EndsWith("\\") ? _folderIcon : _libraryIcon; if (isVersionCompletion) { results.Add(new VersionCompletionEntry(item.DisplayText, insertionText, item.Description, moniker, trackingSpan, context.Session, ++count)); } else { results.Add(new SimpleCompletionEntry(item.DisplayText, insertionText, item.Description, moniker, trackingSpan, context.Session, ++count)); } } return(results); }
public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context) { if (!context.Snapshot.ContentType.IsOfType(TeamsManifestContentTypeConstants.ContentTypeName)) { return(Enumerable.Empty <JsonCompletionEntry>()); } if (!(context.ContextNode is MemberNode property)) { return(Enumerable.Empty <JsonCompletionEntry>()); } var propertyName = property.Name.GetCanonicalizedText(); var completionSession = (ICompletionSession)context.Session; switch (propertyName) { case "version": return(new JsonCompletionEntry[] { new JsonCompletionEntry("1.0", "\"1.0\"", "Version 1.0", null, "", false, completionSession) }); case "id": var newGuid = Guid.NewGuid().ToString("D"); return(new JsonCompletionEntry[] { new JsonCompletionEntry( "New id...", $"\"{newGuid}\"", "Generate new GUID", null, "", false, completionSession) }); } return(Enumerable.Empty <JsonCompletionEntry>()); }
public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context) { if (!context.Snapshot.ContentType.IsOfType(ContentTypeDefinitions.TeamsManifestContentTypeConstants.ContentTypeName)) { return(Enumerable.Empty <JsonCompletionEntry>()); } if (!(context.ContextNode is MemberNode property)) { return(Enumerable.Empty <JsonCompletionEntry>()); } var propertyName = property.Name.GetCanonicalizedText(); var completionSession = (ICompletionSession)context.Session; var dte = (DTE2)ServiceProvider.GetService(typeof(DTE)); switch (propertyName) { case "color": case "outline": return(new JsonCompletionEntry[] { new NewFileCompletionEntry(completionSession, dte) }); } return(Enumerable.Empty <JsonCompletionEntry>()); }
private FrameworkElement GetPresenter(JsonCompletionContext context) { var presenter = context?.Session?.Presenter as FrameworkElement; presenter?.SetBinding(ImageThemingUtilities.ImageBackgroundColorProperty, new Binding("Background") { Source = presenter, Converter = new BrushToColorConverter() }); return(presenter); }
public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context) { if (DocumentService.TryGetTextDocument(context.Snapshot.TextBuffer, out ITextDocument document)) { ConfigFilePath = document.FilePath; string fileName = Path.GetFileName(document.FilePath); if (fileName.Equals(Constants.ConfigFileName, StringComparison.OrdinalIgnoreCase)) { return(GetEntries(context)); } } return(Empty); }
private static IEnumerable <string> GetUsedFiles(JsonCompletionContext context) { ArrayNode array = context.ContextNode.FindType <ArrayNode>(); if (array == null) { yield break; } foreach (ArrayElementNode arrayElement in array.Elements) { if (arrayElement.Value is TokenNode token && token.Text != context.ContextNode.GetText()) { yield return(token.GetCanonicalizedText()); } } }
protected override IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context) { MemberNode member = context.ContextNode.FindType <MemberNode>(); if (member == null || (member.UnquotedNameText != ManifestConstants.Destination && member.UnquotedNameText != ManifestConstants.DefaultDestination)) { yield break; } MemberNode parent = member.FindType <ObjectNode>()?.FindType <MemberNode>(); if (member.UnquotedNameText == ManifestConstants.Destination && (parent == null || parent.UnquotedNameText != ManifestConstants.Libraries)) { yield break; } if (member.UnquotedNameText == ManifestConstants.DefaultDestination && parent != null) { yield break; } int caretPosition = context.Session.TextView.Caret.Position.BufferPosition - member.Value.Start - 1; if (caretPosition > member.UnquotedValueText.Length) { yield break; } var dependencies = _dependenciesFactory.FromConfigFile(ConfigFilePath); string cwd = dependencies?.GetHostInteractions().WorkingDirectory; if (string.IsNullOrEmpty(cwd)) { yield break; } IEnumerable <Tuple <string, string> > completions = GetCompletions(cwd, member.UnquotedValueText, caretPosition, out Span span); int start = member.Value.Start; ITrackingSpan trackingSpan = context.Snapshot.CreateTrackingSpan(start + 1 + span.Start, span.Length, SpanTrackingMode.EdgeInclusive); foreach (Tuple <string, string> item in completions) { yield return(new SimpleCompletionEntry(item.Item1, item.Item2, KnownMonikers.FolderClosed, trackingSpan, context.Session)); } }
protected void UpdateListEntriesSync(JsonCompletionContext context, IEnumerable <JsonCompletionEntry> allEntries) { if (context.Session.IsDismissed) { return; } foreach (CompletionSet curCompletionSet in (context.Session as ICompletionSession)?.CompletionSets) { if (curCompletionSet is WebCompletionSet webCompletionSet) { WebEditor.DispatchOnUIThread(() => { // only delete our completion entries webCompletionSet.UpdateCompletions(s => s is SimpleCompletionEntry, allEntries); }); // The UpdateCompletions call above may modify the collection we're enumerating. That's ok, as we're done anyways. break; } } }
protected override IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context) { var member = context.ContextNode as MemberNode; if (member == null || (member.UnquotedNameText != ManifestConstants.Provider && member.UnquotedNameText != ManifestConstants.DefaultProvider)) { yield break; } var dependencies = _dependenciesFactory.FromConfigFile(ConfigFilePath); IEnumerable <string> providerIds = dependencies.Providers?.Select(p => p.Id); if (providerIds == null || !providerIds.Any()) { yield break; } foreach (string id in providerIds) { yield return(new SimpleCompletionEntry(id, _libraryIcon, context.Session)); } }
public IEnumerable <JsonCompletionEntry> GetListEntries(JsonCompletionContext context) { if (!context.Snapshot.ContentType.IsOfType(TeamsManifestContentTypeConstants.ContentTypeName)) { return(Enumerable.Empty <JsonCompletionEntry>()); } if (!(context.ContextNode is MemberNode property)) { return(Enumerable.Empty <JsonCompletionEntry>()); } var propertyName = property.Name.GetCanonicalizedText(); var completionSession = (ICompletionSession)context.Session; switch (propertyName) { case "accentColor": return(GetColorCompletionList(completionSession)); } return(Enumerable.Empty <JsonCompletionEntry>()); }
protected abstract IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context);
protected override IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context) { MemberNode member = context.ContextNode.FindType <MemberNode>(); if (member == null || member.UnquotedNameText != "files") { yield break; } var parent = member.Parent as ObjectNode; if (!JsonHelpers.TryGetInstallationState(parent, out ILibraryInstallationState state)) { yield break; } if (string.IsNullOrEmpty(state.Name)) { yield break; } var dependencies = _dependenciesFactory.FromConfigFile(ConfigFilePath); IProvider provider = dependencies.GetProvider(state.ProviderId); ILibraryCatalog catalog = provider?.GetCatalog(); if (catalog == null) { yield break; } Task <ILibrary> task = catalog.GetLibraryAsync(state.Name, state.Version, CancellationToken.None); FrameworkElement presenter = GetPresenter(context); IEnumerable <string> usedFiles = GetUsedFiles(context); if (task.IsCompleted) { if (!(task.Result is ILibrary library)) { yield break; } foreach (string file in library.Files.Keys) { if (!usedFiles.Contains(file)) { ImageSource glyph = WpfUtil.GetIconForFile(presenter, file, out bool isThemeIcon); yield return(new SimpleCompletionEntry(file, glyph, context.Session)); } } } else { yield return(new SimpleCompletionEntry(Resources.Text.Loading, string.Empty, KnownMonikers.Loading, context.Session)); _ = task.ContinueWith(async(t) => { await VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); if (!(t.Result is ILibrary library)) { return; } if (!context.Session.IsDismissed) { var results = new List <JsonCompletionEntry>(); foreach (string file in library.Files.Keys) { if (!usedFiles.Contains(file)) { ImageSource glyph = WpfUtil.GetIconForFile(presenter, file, out bool isThemeIcon); results.Add(new SimpleCompletionEntry(file, glyph, context.Session)); } } UpdateListEntriesSync(context, results); } }, TaskScheduler.Default); } }
protected override IEnumerable <JsonCompletionEntry> GetEntries(JsonCompletionContext context) { var member = context.ContextNode as MemberNode; if (member == null || member.UnquotedNameText != ManifestConstants.Library) { yield break; } var parent = member.Parent as ObjectNode; if (!JsonHelpers.TryGetInstallationState(parent, out ILibraryInstallationState state)) { yield break; } var dependencies = Dependencies.FromConfigFile(ConfigFilePath); IProvider provider = dependencies.GetProvider(state.ProviderId); ILibraryCatalog catalog = provider?.GetCatalog(); if (catalog == null) { yield break; } // member.Value is null when there is no value yet, e.g. when typing a space at "library":| // where | represents caret position. In this case, set caretPosition to "1" to short circuit execution of this function // and return no entries (member.UnquotedValueText will be empty string in that case). int caretPosition = member.Value != null ? context.Session.TextView.Caret.Position.BufferPosition - member.Value.Start - 1 : 1; if (caretPosition > member.UnquotedValueText.Length) { yield break; } Task <CompletionSet> task = catalog.GetLibraryCompletionSetAsync(member.UnquotedValueText, caretPosition); int count = 0; if (!context.Session.Properties.ContainsProperty(CompletionController.RetriggerCompletion)) { context.Session.Properties.AddProperty(CompletionController.RetriggerCompletion, true); } if (task.IsCompleted) { CompletionSet completionSet = task.Result; if (completionSet.Completions != null) { List <JsonCompletionEntry> results = GetCompletionList(member, context, completionSet, count); foreach (JsonCompletionEntry completionEntry in results) { yield return(completionEntry); } } } else { yield return(new SimpleCompletionEntry(Resources.Text.Loading, string.Empty, KnownMonikers.Loading, context.Session)); task.ContinueWith((a) => { if (!context.Session.IsDismissed) { CompletionSet completionSet = task.Result; if (completionSet.Completions != null) { List <JsonCompletionEntry> results = GetCompletionList(member, context, completionSet, count); UpdateListEntriesSync(context, results); } } }); } }