diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpF1Help.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpF1Help.cs new file mode 100644 index 0000000000000000000000000000000000000000..425490c93d9951c998f542ef26a724a756ee3adc --- /dev/null +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/CSharp/CSharpF1Help.cs @@ -0,0 +1,79 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.CodeAnalysis; +using Microsoft.VisualStudio.IntegrationTest.Utilities; +using Roslyn.Test.Utilities; +using Xunit; + +namespace Roslyn.VisualStudio.IntegrationTests.CSharp +{ + [Collection(nameof(SharedIntegrationHostFixture))] + public class CSharpF1Help : AbstractEditorTest + { + protected override string LanguageName => LanguageNames.CSharp; + + public CSharpF1Help(VisualStudioInstanceFactory instanceFactory) + : base(instanceFactory, nameof(CSharpF1Help)) + { + } + + [Fact, Trait(Traits.Feature, Traits.Features.F1Help)] + void F1Help() + { + var text = @" +using System; +using System.IO; +using System.Linq; +using System.Collections.Generic; + +namespace F1TestNamespace +{ + #region TaoRegion + abstract class ShapesClass { } + + class Program$$ + { + public static void Main() + { + } + + public IEnumerable Linq1() + { + int[] numbers = { 5, 4, 1, 3, 9, 8, 6, 7, 2, 0 }; + int i = numbers.First(); + int j = Array.IndexOf(numbers, 1); + + var lowNums1 = + from n in numbers + orderby n ascending + where n < 5 + select n; + + var numberGroups = + from n in numbers + let m = 1 + join p in numbers on i equals p + group n by n % 5 into g + select new { Remainder = g.Key, Numbers = g }; + + foreach (int element in numbers) yield return i; + } + + } + #endregion TaoRegion +}"; + + SetUpEditor(text); + Verify("abstract", "abstract_CSharpKeyword"); + Verify("ascending", "ascending_CSharpKeyword"); + Verify("from", "from_CSharpKeyword"); + Verify("First();", "System.Linq.Enumerable.First``1"); + } + + private void Verify(string word, string expectedKeyword) + { + VisualStudio.Editor.PlaceCaret(word, charsOffset: -1); + Assert.Contains(expectedKeyword, VisualStudio.Editor.GetF1Keyword()); + } + } +} \ No newline at end of file diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicF1Help.cs b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicF1Help.cs new file mode 100644 index 0000000000000000000000000000000000000000..f7d9b5faedcfa8adaae69339bbcecb874c466abc --- /dev/null +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualBasic/BasicF1Help.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.CodeAnalysis; +using Microsoft.VisualStudio.IntegrationTest.Utilities; +using Roslyn.Test.Utilities; +using Xunit; + +namespace Roslyn.VisualStudio.IntegrationTests.Basic +{ + [Collection(nameof(SharedIntegrationHostFixture))] + public class BasicF1Help : AbstractEditorTest + { + protected override string LanguageName => LanguageNames.VisualBasic; + + public BasicF1Help(VisualStudioInstanceFactory instanceFactory) + : base(instanceFactory, nameof(BasicF1Help)) + { + } + + [Fact, Trait(Traits.Feature, Traits.Features.F1Help)] + void F1Help() + { + var text = @" +Imports System +Imports System.Collections.Generic +Imports System.Linq + +Module Program$$ + Sub Main(args As String()) + Dim query = From arg In args + Select args.Any(Function(a) a.Length > 5) + Dim x = 0 + x += 1 + End Sub + Public Function F() As Object + Return Nothing + End Function +End Module"; + + SetUpEditor(text); + Verify("Linq", "System.Linq"); + Verify("String", "vb.String"); + Verify("Any", "System.Linq.Enumerable.Any"); + Verify("From", "vb.QueryFrom"); + Verify("+=", "vb.+="); + Verify("Nothing", "vb.Nothing"); + + } + + private void Verify(string word, string expectedKeyword) + { + VisualStudio.Editor.PlaceCaret(word, charsOffset: -1); + Assert.Contains(expectedKeyword, VisualStudio.Editor.GetF1Keyword()); + } + } +} \ No newline at end of file diff --git a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualStudioIntegrationTests.csproj b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualStudioIntegrationTests.csproj index 2d4d19c6c0b5a5f53043b19a5f91f5f0291fde8c..203fec50400963198c89a387d4152dcd38fedfe1 100644 --- a/src/VisualStudio/IntegrationTest/IntegrationTests/VisualStudioIntegrationTests.csproj +++ b/src/VisualStudio/IntegrationTest/IntegrationTests/VisualStudioIntegrationTests.csproj @@ -22,6 +22,7 @@ + @@ -59,6 +60,7 @@ + diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs index a4f759e952af5c31665b1f1fed49e0211a782f7a..05713d50cb486ca3c088081a4d3222547baa2d20 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/InProcess/Editor_InProc.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.Design; using System.Linq; @@ -12,6 +13,7 @@ using Microsoft.CodeAnalysis.Editor.Shared.Extensions; using Microsoft.VisualStudio.IntegrationTest.Utilities.Common; using Microsoft.VisualStudio.Language.Intellisense; +using Microsoft.VisualStudio.Shell.Interop; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Text.Tagging; @@ -499,5 +501,38 @@ protected override ITextBuffer GetBufferContainingCaret(IWpfTextView view) { return view.GetBufferContainingCaret(); } + + public List GetF1Keywords() + { + return InvokeOnUIThread(() => + { + var results = new List(); + GetActiveVsTextView().GetBuffer(out var textLines); + Marshal.ThrowExceptionForHR(textLines.GetLanguageServiceID(out var languageServiceGuid)); + Marshal.ThrowExceptionForHR(Microsoft.VisualStudio.Shell.ServiceProvider.GlobalProvider.QueryService(languageServiceGuid, out var languageService)); + var languageContextProvider = languageService as IVsLanguageContextProvider; + + IVsMonitorUserContext monitorUserContext = GetGlobalService(); + Marshal.ThrowExceptionForHR(monitorUserContext.CreateEmptyContext(out var emptyUserContext)); + Marshal.ThrowExceptionForHR(GetActiveVsTextView().GetCaretPos(out var line, out var column)); + var span = new TextSpan() + { + iStartLine = line, + iStartIndex = column, + iEndLine = line, + iEndIndex = column + }; + + Marshal.ThrowExceptionForHR(languageContextProvider.UpdateLanguageContext(0, textLines, new[] { span }, emptyUserContext)); + Marshal.ThrowExceptionForHR(emptyUserContext.CountAttributes("keyword", VSConstants.S_FALSE, out var count)); + for (int i = 0; i < count; i++) + { + emptyUserContext.GetAttribute(i, "keyword", VSConstants.S_FALSE, out var key, out var value); + results.Add(value); + } + + return results; + }); + } } } diff --git a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs index 75029c6f38cd3bfc17a9f68ff954f0a40517b45e..ee5c7510dfd8a5702a6ddfe0f56cf20a78a5ff85 100644 --- a/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs +++ b/src/VisualStudio/IntegrationTest/TestUtilities/OutOfProcess/Editor_OutOfProc.cs @@ -3,11 +3,13 @@ using System; using System.Linq; using System.Windows.Automation; +using System.Collections.Generic; using Microsoft.CodeAnalysis.Shared.TestHooks; using Microsoft.CodeAnalysis.Text; using Microsoft.VisualStudio.IntegrationTest.Utilities.Common; using Microsoft.VisualStudio.IntegrationTest.Utilities.InProcess; using Microsoft.VisualStudio.IntegrationTest.Utilities.Input; +using System.Collections.Immutable; namespace Microsoft.VisualStudio.IntegrationTest.Utilities.OutOfProcess { @@ -173,6 +175,8 @@ public void WaitForActiveView(string viewName) public string[] GetErrorTags() => _editorInProc.GetErrorTags(); + public List GetF1Keyword() + => _editorInProc.GetF1Keywords(); public void ExpandProjectNavBar() {