private static void HandleDtoUpdate(Document document, INativeTypesHandler typesHandler, OutputWindowWriter outputWindowWriter) { string fullPath = document.ProjectItem.GetFullPath(); outputWindowWriter.ShowOutputPane(document.DTE); outputWindowWriter.Show(); outputWindowWriter.WriteLine( "--- Updating ServiceStack Reference '" + fullPath.Substring(fullPath.LastIndexOf("\\", StringComparison.Ordinal) + 1) + "' ---"); var existingGeneratedCode = File.ReadAllLines(fullPath).Join(Environment.NewLine); string baseUrl; if (!typesHandler.TryExtractBaseUrl(existingGeneratedCode, out baseUrl)) { outputWindowWriter.WriteLine("Failed to update ServiceStack Reference: Unabled to find BaseUrl"); return; } try { var options = typesHandler.ParseComments(existingGeneratedCode); string updatedCode = typesHandler.GetUpdatedCode(baseUrl, options); //Can't work out another way that ensures UI is updated. //Overwriting the file inconsistently prompts the user that file has changed. //Sometimes old code persists even though file has changed. document.Close(); using (var streamWriter = File.CreateText(fullPath)) { streamWriter.Write(updatedCode); streamWriter.Flush(); } try { bool optOutOfStats = Dte.GetOptOutStatsSetting(); if (!optOutOfStats) { var langName = typesHandler.RelativeTypesUrl.Substring(6); Analytics.SubmitAnonymousUpdateReferenceUsage(langName); } } catch (Exception) { // Ignore errors } //HACK to ensure new file is loaded Task.Run(() => { document.DTE.ItemOperations.OpenFile(fullPath); }); } catch (Exception e) { outputWindowWriter.WriteLine("Failed to update ServiceStack Reference: Unhandled error - " + e.Message); } outputWindowWriter.WriteLine("--- Update ServiceStack Reference Complete ---"); }