diff --git a/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs index 5d6a1163..379745d3 100644 --- a/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs +++ b/src/Microsoft.SqlTools.ServiceLayer/LanguageServices/LanguageService.cs @@ -887,6 +887,7 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices /// The ParseResult instance returned from SQL Parser public ParseResult ParseAndBind(ScriptFile scriptFile, ConnectionInfo connInfo) { + Logger.Verbose($"ParseAndBind - {scriptFile}"); // get or create the current parse info object ScriptParseInfo parseInfo = GetScriptParseInfo(scriptFile.ClientUri, createIfNotExists: true); @@ -1487,20 +1488,22 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices /// /// Get function signature help for the current position /// - internal SignatureHelp GetSignatureHelp(TextDocumentPosition textDocumentPosition, ScriptFile scriptFile) + internal SignatureHelp? GetSignatureHelp(TextDocumentPosition textDocumentPosition, ScriptFile scriptFile) { + Logger.Verbose($"GetSignatureHelp - {scriptFile}"); int startLine = textDocumentPosition.Position.Line; int endColumn = textDocumentPosition.Position.Character; - ScriptParseInfo scriptParseInfo = GetScriptParseInfo(scriptFile.ClientUri); + ScriptParseInfo? scriptParseInfo = GetScriptParseInfo(scriptFile.ClientUri); if (scriptParseInfo == null) { + Logger.Verbose($"GetSignatureHelp - Could not find ScriptParseInfo for {scriptFile}"); // Cache not set up yet - skip and wait until later return null; } - ConnectionInfo connInfo; + ConnectionInfo? connInfo; ConnectionServiceInstance.TryFindConnection( scriptFile.ClientUri, out connInfo); @@ -1509,6 +1512,9 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices if (RequiresReparse(scriptParseInfo, scriptFile)) { ParseAndBind(scriptFile, connInfo); + } else + { + Logger.Verbose($"GetSignatureHelp - No reparse needed for {scriptFile}"); } if (scriptParseInfo.ParseResult != null) @@ -1558,6 +1564,7 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices } } } + Logger.Verbose($"GetSignatureHelp - No ScriptParseInfo.ParseResult for {scriptFile}"); // return null if there isn't a tooltip for the current location return null; @@ -1836,10 +1843,12 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices { if (this.ScriptParseInfoMap.ContainsKey(uri)) { + Logger.Verbose($"Updating ScriptParseInfo for uri {uri}"); this.ScriptParseInfoMap[uri] = scriptInfo; } else { + Logger.Verbose($"Adding ScriptParseInfo for uri {uri}"); this.ScriptParseInfoMap.Add(uri, scriptInfo); } @@ -1852,16 +1861,18 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices /// /// /// Creates a new instance if one doesn't exist - internal ScriptParseInfo GetScriptParseInfo(string uri, bool createIfNotExists = false) + internal ScriptParseInfo? GetScriptParseInfo(string uri, bool createIfNotExists = false) { lock (this.parseMapLock) { if (this.ScriptParseInfoMap.ContainsKey(uri)) { + Logger.Verbose($"Found ScriptParseInfo for uri {uri}"); return this.ScriptParseInfoMap[uri]; } else if (createIfNotExists) { + Logger.Verbose($"ScriptParseInfo for uri {uri} did not exist, creating new one"); // create a new script parse info object and initialize with the current settings ScriptParseInfo scriptInfo = new ScriptParseInfo(); this.ScriptParseInfoMap.Add(uri, scriptInfo); @@ -1869,6 +1880,7 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices } else { + Logger.Verbose($"Could not find ScriptParseInfo for uri {uri}"); return null; } } @@ -1880,6 +1892,7 @@ namespace Microsoft.SqlTools.ServiceLayer.LanguageServices { if (this.ScriptParseInfoMap.ContainsKey(uri)) { + Logger.Verbose($"Removing ScriptParseInfo for uri {uri}"); return this.ScriptParseInfoMap.Remove(uri); } else diff --git a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/LanguageServiceTests.cs b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/LanguageServiceTests.cs index 77e70024..1c3c4179 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/LanguageServiceTests.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.IntegrationTests/LanguageServer/LanguageServiceTests.cs @@ -246,12 +246,12 @@ namespace Microsoft.SqlTools.ServiceLayer.IntegrationTests.LanguageServer Thread.Sleep(2000); // We should get back a non-null ScriptParseInfo - ScriptParseInfo parseInfo = service.GetScriptParseInfo(result.ScriptFile.ClientUri); - Assert.NotNull(parseInfo); + ScriptParseInfo? parseInfo = service.GetScriptParseInfo(result.ScriptFile.ClientUri); + Assert.That(parseInfo, Is.Not.Null, "ScriptParseInfo"); // And we should get back a non-null SignatureHelp - SignatureHelp signatureHelp = service.GetSignatureHelp(textDocument, result.ScriptFile); - Assert.NotNull(signatureHelp); + SignatureHelp? signatureHelp = service.GetSignatureHelp(textDocument, result.ScriptFile); + Assert.That(signatureHelp, Is.Not.Null, "SignatureHelp"); } /// diff --git a/test/Microsoft.SqlTools.ServiceLayer.Test.Common/TestServiceProvider.cs b/test/Microsoft.SqlTools.ServiceLayer.Test.Common/TestServiceProvider.cs index 33cbe8be..4d0cc0e3 100644 --- a/test/Microsoft.SqlTools.ServiceLayer.Test.Common/TestServiceProvider.cs +++ b/test/Microsoft.SqlTools.ServiceLayer.Test.Common/TestServiceProvider.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics; using System.IO; using System.Linq; using System.Runtime.CompilerServices; @@ -17,6 +18,7 @@ using Microsoft.SqlTools.ServiceLayer.ObjectExplorer; using Microsoft.SqlTools.ServiceLayer.QueryExecution; using Microsoft.SqlTools.ServiceLayer.SqlContext; using Microsoft.SqlTools.ServiceLayer.Workspace; +using Microsoft.SqlTools.Utility; using NUnit.Framework; namespace Microsoft.SqlTools.ServiceLayer.Test.Common @@ -85,7 +87,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common } /// - /// Runs a query by calling the services directly (not using the test driver) + /// Runs a query by calling the services directly (not using the test driver) /// public void RunQuery(TestServerType serverType, string databaseName, string queryText, bool throwOnError = false) { @@ -94,7 +96,7 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common } /// - /// Runs a query by calling the services directly (not using the test driver) + /// Runs a query by calling the services directly (not using the test driver) /// public async Task RunQueryAsync(TestServerType serverType, string databaseName, string queryText, bool throwOnError = false) { @@ -185,13 +187,18 @@ namespace Microsoft.SqlTools.ServiceLayer.Test.Common const string hostProfileId = "SQLToolsTestService"; Version hostVersion = new Version(1, 0); - // set up the host details and profile paths + // set up the host details and profile paths var hostDetails = new HostDetails(hostName, hostProfileId, hostVersion); SqlToolsContext sqlToolsContext = new SqlToolsContext(hostDetails); // Initialize the ServiceHost, using a MemoryStream for the output stream so that we don't fill up the logs // with a bunch of outgoing messages (which aren't used for anything during tests) ServiceHost serviceHost = HostLoader.CreateAndStartServiceHost(sqlToolsContext, null, new MemoryStream()); + + // Set up our logger to write to Console for tests to help debug issues + Logger.Initialize(autoFlush: true); + Logger.TracingLevel = System.Diagnostics.SourceLevels.All; + Logger.TraceSource.Listeners.Add(new ConsoleTraceListener()); } }