示例#1
0
 public GenerateTypeOptionsResult GetGenerateTypeOptions(
     string className,
     GenerateTypeDialogOptions generateTypeDialogOptions,
     Document document,
     INotificationService notificationService,
     IProjectManagementService projectManagementService,
     ISyntaxFactsService syntaxFactsService)
 {
     // Storing the actual values
     ClassName = className;
     GenerateTypeDialogOptions = generateTypeDialogOptions;
     if (DefaultNamespace == null)
     {
         DefaultNamespace = projectManagementService.GetDefaultNamespace(Project, Project?.Solution.Workspace);
     }
     return(new GenerateTypeOptionsResult(
                accessibility: Accessibility,
                typeKind: TypeKind,
                typeName: TypeName,
                project: Project,
                isNewFile: IsNewFile,
                newFileName: NewFileName,
                folders: Folders,
                fullFilePath: FullFilePath,
                existingDocument: ExistingDocument,
                areFoldersValidIdentifiers: AreFoldersValidIdentifiers,
                defaultNamespace: DefaultNamespace,
                isCancelled: IsCancelled));
 }
示例#2
0
        internal GenerateTypeDialog(string className, GenerateTypeDialogOptions generateTypeDialogOptions, Document document, INotificationService notificationService, IProjectManagementService projectManagementService, ISyntaxFactsService syntaxFactsService)
        {
            this.generateTypeDialogOptions = generateTypeDialogOptions;
            this.projectManagementService  = projectManagementService;
            this.syntaxFactsService        = syntaxFactsService;
            this.document = document;
            Build();

            PopulateAccessibilty();
            PopulateTypeKinds();

            entryName.Text = className;
            FileName       = className + ".cs";

            PopulateProjectList();

            comboboxProject.SelectionChanged += delegate {
                PopulateDocumentList();
            };
            comboboxProject.SelectedIndex = 0;

            comboboxExistingFile.SelectionChanged += delegate {
                SelectedDocument = (Document)comboboxExistingFile.SelectedItem;
            };
            PopulateDocumentList();

            radiobuttonToExistingFile.Active = true;
        }
            public GenerateTypeOptionsResult GetGenerateTypeOptions(
                string typeName,
                GenerateTypeDialogOptions generateTypeDialogOptions,
                Document document,
                INotificationService notificationService,
                IProjectManagementService projectManagementService,
                ISyntaxFactsService syntaxFactsService
                )
            {
                var viewModel = new GenerateTypeDialogViewModel(
                    document,
                    notificationService,
                    projectManagementService,
                    syntaxFactsService,
                    generateTypeDialogOptions,
                    typeName,
                    document.Project.Language == LanguageNames.CSharp ? ".cs" : ".vb",
                    _isNewFile,
                    _accessSelectString,
                    _typeKindSelectString
                    );

                var dialog = new GenerateTypeDialog(viewModel);
                var result = dialog.ShowModal();

                if (result.HasValue && result.Value)
                {
                    // Retain choice
                    _isNewFile            = viewModel.IsNewFile;
                    _accessSelectString   = viewModel.SelectedAccessibilityString;
                    _typeKindSelectString = viewModel.SelectedTypeKindString;

                    var defaultNamespace = projectManagementService.GetDefaultNamespace(
                        viewModel.SelectedProject,
                        viewModel.SelectedProject?.Solution.Workspace
                        );

                    return(new GenerateTypeOptionsResult(
                               accessibility: viewModel.SelectedAccessibility,
                               typeKind: viewModel.SelectedTypeKind,
                               typeName: viewModel.TypeName,
                               project: viewModel.SelectedProject,
                               isNewFile: viewModel.IsNewFile,
                               newFileName: viewModel.FileName.Trim(),
                               folders: viewModel.Folders,
                               fullFilePath: viewModel.FullFilePath,
                               existingDocument: viewModel.SelectedDocument,
                               defaultNamespace: defaultNamespace,
                               areFoldersValidIdentifiers: viewModel.AreFoldersValidIdentifiers
                               ));
                }
                else
                {
                    return(GenerateTypeOptionsResult.Cancelled);
                }
            }
示例#4
0
        internal GenerateTypeDialogViewModel(
            Document document,
            INotificationService notificationService,
            IProjectManagementService projectManagementService,
            ISyntaxFactsService syntaxFactsService,
            IGeneratedCodeRecognitionService generatedCodeService,
            GenerateTypeDialogOptions generateTypeDialogOptions,
            string typeName,
            string fileExtension,
            bool isNewFile,
            string accessSelectString,
            string typeKindSelectString)
        {
            _generateTypeDialogOptions = generateTypeDialogOptions;

            InitialSetup(document.Project.Language);
            var dependencyGraph = document.Project.Solution.GetProjectDependencyGraph();

            // Initialize the dependencies
            var projectListing = new List <ProjectSelectItem>();

            // Populate the project list
            // Add the current project
            projectListing.Add(new ProjectSelectItem(document.Project));

            // Add the rest of the projects
            // Adding dependency graph to avoid cyclic dependency
            projectListing.AddRange(document.Project.Solution.Projects
                                    .Where(p => p != document.Project && !dependencyGraph.GetProjectsThatThisProjectTransitivelyDependsOn(p.Id).Contains(document.Project.Id))
                                    .Select(p => new ProjectSelectItem(p)));

            this.ProjectList = projectListing;

            const string attributeSuffix = "Attribute";

            _typeName     = generateTypeDialogOptions.IsAttribute && !typeName.EndsWith(attributeSuffix, StringComparison.Ordinal) ? typeName + attributeSuffix : typeName;
            this.FileName = typeName + fileExtension;

            _document             = document;
            this.SelectedProject  = document.Project;
            this.SelectedDocument = document;
            _notificationService  = notificationService;
            _generatedCodeService = generatedCodeService;

            this.AccessList = document.Project.Language == LanguageNames.CSharp ?
                              _csharpAccessList :
                              _visualBasicAccessList;
            this.AccessSelectIndex = this.AccessList.Contains(accessSelectString) ?
                                     this.AccessList.IndexOf(accessSelectString) : 0;
            this.IsAccessListEnabled = true;

            this.KindList = document.Project.Language == LanguageNames.CSharp ?
                            _csharpTypeKindList :
                            _visualBasicTypeKindList;
            this.KindSelectIndex = this.KindList.Contains(typeKindSelectString) ?
                                   this.KindList.IndexOf(typeKindSelectString) : 0;

            this.ProjectSelectIndex  = 0;
            this.DocumentSelectIndex = 0;

            _isNewFile = isNewFile;

            _syntaxFactsService = syntaxFactsService;

            _projectManagementService = projectManagementService;
            if (projectManagementService != null)
            {
                this.ProjectFolders = _projectManagementService.GetFolders(this.SelectedProject.Id, this.SelectedProject.Solution.Workspace);
            }
            else
            {
                this.ProjectFolders = SpecializedCollections.EmptyList <string>();
            }
        }
        internal async Task TestWithMockedGenerateTypeDialog(
            string initial,
            string languageName,
            string typeName,
            string expected                        = null,
            bool isLine                            = true,
            bool isMissing                         = false,
            Accessibility accessibility            = Accessibility.NotApplicable,
            TypeKind typeKind                      = TypeKind.Class,
            string projectName                     = null,
            bool isNewFile                         = false,
            string existingFilename                = null,
            IList <string> newFileFolderContainers = null,
            string fullFilePath                    = null,
            string newFileName                     = null,
            string assertClassName                 = null,
            bool checkIfUsingsIncluded             = false,
            bool checkIfUsingsNotIncluded          = false,
            string expectedTextWithUsings          = null,
            string defaultNamespace                = "",
            bool areFoldersValidIdentifiers        = true,
            GenerateTypeDialogOptions assertGenerateTypeDialogOptions = null,
            IList <TypeKindOptions> assertTypeKindPresent             = null,
            IList <TypeKindOptions> assertTypeKindAbsent = null,
            bool isCancelled = false)
        {
            using (var testState = await GenerateTypeTestState.CreateAsync(initial, isLine, projectName, typeName, existingFilename, languageName))
            {
                // Initialize the viewModel values
                testState.TestGenerateTypeOptionsService.SetGenerateTypeOptions(
                    accessibility: accessibility,
                    typeKind: typeKind,
                    typeName: testState.TypeName,
                    project: testState.ProjectToBeModified,
                    isNewFile: isNewFile,
                    newFileName: newFileName,
                    folders: newFileFolderContainers,
                    fullFilePath: fullFilePath,
                    existingDocument: testState.ExistingDocument,
                    areFoldersValidIdentifiers: areFoldersValidIdentifiers,
                    isCancelled: isCancelled);

                testState.TestProjectManagementService.SetDefaultNamespace(
                    defaultNamespace: defaultNamespace);

                var diagnosticsAndFixes = await GetDiagnosticAndFixesAsync(testState.Workspace, null);

                var generateTypeDiagFixes = diagnosticsAndFixes.SingleOrDefault(df => GenerateTypeTestState.FixIds.Contains(df.Item1.Id));

                if (isMissing)
                {
                    Assert.Null(generateTypeDiagFixes);
                    return;
                }

                var fixes = generateTypeDiagFixes.Item2.Fixes;
                Assert.NotNull(fixes);

                var fixActions = MassageActions(fixes.Select(f => f.Action).ToList());
                Assert.NotNull(fixActions);

                // Since the dialog option is always fed as the last CodeAction
                var index  = fixActions.Count() - 1;
                var action = fixActions.ElementAt(index);

                Assert.Equal(action.Title, FeaturesResources.GenerateNewType);
                var operations = await action.GetOperationsAsync(CancellationToken.None);

                Tuple <Solution, Solution> oldSolutionAndNewSolution = null;

                if (!isNewFile)
                {
                    oldSolutionAndNewSolution = await TestOperationsAsync(
                        testState.Workspace, expected, operations,
                        conflictSpans : null, renameSpans : null, warningSpans : null,
                        compareTokens : false, expectedChangedDocumentId : testState.ExistingDocument.Id);
                }
                else
                {
                    oldSolutionAndNewSolution = await TestAddDocument(
                        testState.Workspace,
                        expected,
                        operations,
                        projectName != null,
                        testState.ProjectToBeModified.Id,
                        newFileFolderContainers,
                        newFileName,
                        compareTokens : false);
                }

                if (checkIfUsingsIncluded)
                {
                    Assert.NotNull(expectedTextWithUsings);
                    await TestOperationsAsync(testState.Workspace, expectedTextWithUsings, operations,
                                              conflictSpans : null, renameSpans : null, warningSpans : null, compareTokens : false,
                                              expectedChangedDocumentId : testState.InvocationDocument.Id);
                }

                if (checkIfUsingsNotIncluded)
                {
                    var oldSolution        = oldSolutionAndNewSolution.Item1;
                    var newSolution        = oldSolutionAndNewSolution.Item2;
                    var changedDocumentIds = SolutionUtilities.GetChangedDocuments(oldSolution, newSolution);

                    Assert.False(changedDocumentIds.Contains(testState.InvocationDocument.Id));
                }

                // Added into a different project than the triggering project
                if (projectName != null)
                {
                    var appliedChanges   = ApplyOperationsAndGetSolution(testState.Workspace, operations);
                    var newSolution      = appliedChanges.Item2;
                    var triggeredProject = newSolution.GetProject(testState.TriggeredProject.Id);

                    // Make sure the Project reference is present
                    Assert.True(triggeredProject.ProjectReferences.Any(pr => pr.ProjectId == testState.ProjectToBeModified.Id));
                }

                // Assert Option Calculation
                if (assertClassName != null)
                {
                    Assert.True(assertClassName == testState.TestGenerateTypeOptionsService.ClassName);
                }

                if (assertGenerateTypeDialogOptions != null || assertTypeKindPresent != null || assertTypeKindAbsent != null)
                {
                    var generateTypeDialogOptions = testState.TestGenerateTypeOptionsService.GenerateTypeDialogOptions;

                    if (assertGenerateTypeDialogOptions != null)
                    {
                        Assert.True(assertGenerateTypeDialogOptions.IsPublicOnlyAccessibility == generateTypeDialogOptions.IsPublicOnlyAccessibility);
                        Assert.True(assertGenerateTypeDialogOptions.TypeKindOptions == generateTypeDialogOptions.TypeKindOptions);
                        Assert.True(assertGenerateTypeDialogOptions.IsAttribute == generateTypeDialogOptions.IsAttribute);
                    }

                    if (assertTypeKindPresent != null)
                    {
                        foreach (var typeKindPresentEach in assertTypeKindPresent)
                        {
                            Assert.True((typeKindPresentEach & generateTypeDialogOptions.TypeKindOptions) != 0);
                        }
                    }

                    if (assertTypeKindAbsent != null)
                    {
                        foreach (var typeKindPresentEach in assertTypeKindAbsent)
                        {
                            Assert.True((typeKindPresentEach & generateTypeDialogOptions.TypeKindOptions) == 0);
                        }
                    }
                }
            }
        }
        GenerateTypeOptionsResult IGenerateTypeOptionsService.GetGenerateTypeOptions(string className, GenerateTypeDialogOptions generateTypeDialogOptions, Document document, INotificationService notificationService, IProjectManagementService projectManagementService, ISyntaxFactsService syntaxFactsService)
        {
            var dialog = new GenerateTypeDialog(className, generateTypeDialogOptions, document, notificationService, projectManagementService, syntaxFactsService);

            try {
                bool performChange = dialog.Run() == Xwt.Command.Ok;
                if (!performChange)
                {
                    return(GenerateTypeOptionsResult.Cancelled);
                }

                return(dialog.GenerateTypeOptionsResult);
            } catch (Exception ex) {
                LoggingService.LogError("Error while signature changing.", ex);
                return(GenerateTypeOptionsResult.Cancelled);
            } finally {
                dialog.Dispose();
            }
        }