public void Invoke(Document activeDocument) { var editorContext = GherkinEditorContext.FromDocument(activeDocument, gherkinLanguageServiceFactory); if (editorContext == null) { return; } GoToDefinition(editorContext); }
public bool IsEnabled(Document activeDocument) { var editorContext = GherkinEditorContext.FromDocument(activeDocument, gherkinLanguageServiceFactory); if (editorContext == null) { return(false); } return(CanGoToDefinition(editorContext)); }
private void Invoke(Document activeDocument) { var editorContext = GherkinEditorContext.FromDocument(activeDocument, gherkinLanguageServiceFactory); if (editorContext == null) { return; } GenerateStepDefinitionSkeleton(editorContext); }
private GherkinStep GetCurrentStep(GherkinEditorContext editorContext) { var fileScope = editorContext.LanguageService.GetFileScope(waitForLatest: true); if (fileScope == null) { return(null); } SnapshotPoint caret = editorContext.TextView.Caret.Position.BufferPosition; IStepBlock block; var step = fileScope.GetStepAtPosition(caret.GetContainingLine().LineNumber, out block); if (step != null && block is IScenarioOutlineBlock) { step = step.GetSubstitutedStep((IScenarioOutlineBlock)block); } return(step); }
public bool GoToDefinition(GherkinEditorContext editorContext) { var step = GetCurrentStep(editorContext); if (step == null) { return(false); } var bindingMatchService = GetBindingMatchService(editorContext.LanguageService); if (bindingMatchService == null) { return(false); } if (!bindingMatchService.Ready) { MessageBox.Show("Step bindings are still being analyzed. Please wait.", "Go to binding"); return(true); } List <BindingMatch> candidatingMatches; StepDefinitionAmbiguityReason ambiguityReason; CultureInfo bindingCulture = editorContext.ProjectScope.SpecFlowConfiguration.BindingCulture ?? step.StepContext.Language; var match = bindingMatchService.GetBestMatch(step, bindingCulture, out ambiguityReason, out candidatingMatches); var binding = match.StepBinding; if (!match.Success) { if (candidatingMatches.Any()) { string bindingsText = string.Join(Environment.NewLine, candidatingMatches.Select(b => b.StepBinding.Method.GetShortDisplayText())); MessageBox.Show("Multiple matching bindings found. Navigating to the first match..." + Environment.NewLine + Environment.NewLine + bindingsText, "Go to binding"); binding = candidatingMatches.First().StepBinding; } else { var language = editorContext.ProjectScope is VsProjectScope?VsProjectScope.GetTargetLanguage(((VsProjectScope)editorContext.ProjectScope).Project) : ProgrammingLanguage.CSharp; var stepDefinitionSkeletonStyle = editorContext.ProjectScope.SpecFlowConfiguration.StepDefinitionSkeletonStyle; string skeleton = stepDefinitionSkeletonProvider.GetStepDefinitionSkeleton(language, step, stepDefinitionSkeletonStyle, bindingCulture); var result = MessageBox.Show("No matching step binding found for this step! Do you want to copy the step binding skeleton to the clipboard?" + Environment.NewLine + Environment.NewLine + skeleton, "Go to binding", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1); if (result == DialogResult.Yes) { Clipboard.SetText(skeleton); } return(true); } } var method = binding.Method; var codeFunction = new VsBindingMethodLocator().FindCodeFunction(((VsProjectScope)editorContext.ProjectScope), method); if (codeFunction != null) { if (!codeFunction.ProjectItem.IsOpen) { codeFunction.ProjectItem.Open(); } var navigatePoint = codeFunction.GetStartPoint(vsCMPart.vsCMPartHeader); navigatePoint.TryToShow(); navigatePoint.Parent.Selection.MoveToPoint(navigatePoint); } return(true); }
public bool CanGoToDefinition(GherkinEditorContext editorContext) { return(GetBindingMatchService(editorContext.LanguageService) != null && GetCurrentStep(editorContext) != null); }
public bool InvokeFromEditor(GherkinEditorContext editorContext, TestRunnerTool?runnerTool) { return(testRunnerEngine.RunFromEditor(editorContext.LanguageService, false, runnerTool)); }
private bool GenerateStepDefinitionSkeleton(GherkinEditorContext editorContext) { var bindingMatchService = GetBindingMatchService(editorContext.LanguageService); if (bindingMatchService == null) { return(false); } var fileScope = editorContext.LanguageService.GetFileScope(waitForLatest: true); if (fileScope == null) { return(false); } var featureTitle = GetFeatureTitle(fileScope); var bindingCulture = editorContext.ProjectScope.SpecFlowConfiguration.BindingCulture ?? fileScope.GherkinDialect.CultureInfo; var steps = GetUnboundSteps(bindingMatchService, fileScope, bindingCulture).ToArray(); if (steps.Length == 0) { MessageBox.Show("All steps are bound!", "Generate step definition skeleton"); return(true); } var specFlowProject = ((VsProjectScope)editorContext.ProjectScope).Project; var defaultLanguage = VsProjectScope.GetTargetLanguage(specFlowProject); var stepDefinitionSkeletonStyle = editorContext.ProjectScope.SpecFlowConfiguration.StepDefinitionSkeletonStyle; using (var skeletonGeneratorForm = new GenerateStepDefinitionSkeletonForm(featureTitle, steps, specFlowProject, stepDefinitionSkeletonStyle, defaultLanguage, dte)) { skeletonGeneratorForm.OnPreview = (form) => { var skeleton = stepDefinitionSkeletonProvider.GetBindingClassSkeleton( defaultLanguage, form.SelectedSteps, "MyNamespace", form.ClassName, form.Style, bindingCulture); MessageBox.Show(skeleton, "Step definition skeleton preview"); }; skeletonGeneratorForm.OnCopy = (form) => { var skeleton = string.Join(Environment.NewLine, form.SelectedSteps.Select(si => stepDefinitionSkeletonProvider.GetStepDefinitionSkeleton( defaultLanguage, si, form.Style, bindingCulture)).Distinct()).Indent(StepDefinitionSkeletonProvider.METHOD_INDENT); Clipboard.SetText(skeleton); return(true); }; skeletonGeneratorForm.OnGenerate = (form, targetPath) => { var project = GetTartgetProject(targetPath, specFlowProject); var language = VsProjectScope.GetTargetLanguage(project); var skeleton = stepDefinitionSkeletonProvider.GetBindingClassSkeleton( language, form.SelectedSteps, CalculateNamespace(targetPath, project), form.ClassName, form.Style, bindingCulture); string folder = Path.GetDirectoryName(targetPath); if (folder != null && !Directory.Exists(folder)) { Directory.CreateDirectory(folder); } File.WriteAllText(targetPath, skeleton, Encoding.UTF8); var projectItem = VsxHelper.FindProjectItemByFilePath(project, targetPath); if (projectItem == null) { projectItem = project.ProjectItems.AddFromFile(targetPath); } if (projectItem != null) { projectItem.Open(); } return(true); }; skeletonGeneratorForm.ShowDialog(); } return(true); }