public void TryParseGeneratesProperty() { string result; int caretPosition; foreach (string accessibilityLevel in _accessibilityLevels.Keys) { foreach (string modifier in _modifiers.Keys) { foreach (string type in _types.Keys) { string visibility = _accessibilityLevels[accessibilityLevel]; string mod = _modifiers[modifier]; string returns = _types[type]; string mnemonic = accessibilityLevel + modifier + type + "p"; MnemonicParser.TryParse(mnemonic, " ", out result, out caretPosition) .Should() .BeTrue($"Mnemonic {mnemonic} is valid."); result.Should().Be($"{visibility} {mod} {returns} {{ get; set; }}"); } } } }
public override int Exec( ref Guid pguidCmdGroup, uint nCmdID, uint nCmdexecopt, IntPtr pvaIn, IntPtr pvaOut) { if (PackageGuids.GuidEmmetPackageCmdSet != pguidCmdGroup || PackageIds.CmdIDExpandMnemonic != nCmdID) { return(base.Exec(ref pguidCmdGroup, nCmdID, nCmdexecopt, pvaIn, pvaOut)); } // Get mnemonic content from editor. SnapshotPoint caretPosition = View.WpfView.Caret.Position.BufferPosition; ITextSnapshotLine line = View.WpfView.Caret.Position.BufferPosition.GetContainingLine(); string lineText = line.GetText(); if (caretPosition.Position != line.End || lineText.Length < 3) { return(VSConstants.S_OK); } string mnemonic = lineText.TrimStart(); string indent = new string(' ', lineText.Length - mnemonic.Length); string snippet = string.Empty; int caretOffset; if (!MnemonicParser.TryParse(mnemonic, indent, out snippet, out caretOffset)) { return(VSConstants.S_OK); } // Insert generated snippet into the current editor window int startPosition = line.End.Position - mnemonic.Length; Span targetPosition = new Span(startPosition, mnemonic.Length); View.CurrentBuffer.Replace(targetPosition, snippet); // Close all intellisense windows _completionBroker.DismissAllSessions(View.WpfView); // Move caret to the position where user can start typing new member name caretPosition = new SnapshotPoint( View.CurrentBuffer.CurrentSnapshot, caretPosition.Position + caretOffset); View.WpfView.Caret.MoveTo(caretPosition); return(VSConstants.S_OK); }
/// <summary> /// Initialization of the package; this method is called right after the package is sited, so this /// is the place where you can put all the initialization code that rely on services provided by /// Visual Studio. /// </summary> /// <param name="token">Cancellation token that can signal abort.</param> /// <param name="progress">The progress indicator.</param> protected override async System.Threading.Tasks.Task InitializeAsync( CancellationToken token, IProgress <ServiceProgressData> progress) { Instance = this; if (Directory.Exists(Options.ExtensionsDir)) { _engine = new EngineWrapper(Options.ExtensionsDir); } else { _engine = new EngineWrapper(null); } try { if (File.Exists(Options.MnemonicsConfiguration)) { MnemonicParser.MergeConfiguration(Options.MnemonicsConfiguration); } } catch { await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(token); ShowCriticalError( $"Failed to load mnemonics configuration from {Options.MnemonicsConfiguration}"); } SortCssPropertiesCommand.Initialize(this); await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(token); Options = GetDialogPage(typeof(Options)) as Options; if (Options.WriteDebugMessages) { var pane = GetOutputPane(VSConstants.OutputWindowPaneGuid.DebugPane_guid, Vsix.Name); Tracer.Initialize(pane); } }