예제 #1
0
        public static ClangTidyPredefinedChecksOptionsView GetClangTidyPredefinedChecksOptionsView()
        {
            ClangTidyPredefinedChecksOptionsView clangTidyPredefinedChecksOptionsView = new ClangTidyPredefinedChecksOptionsView();

            clangTidyPredefinedChecksOptionsView.LoadSettingsFromStorage();
            return(clangTidyPredefinedChecksOptionsView);
        }
예제 #2
0
        protected void RunScript(string aCommandName, ClangTidyOptionsView mTidyOptions = null,
                                 ClangTidyPredefinedChecksOptionsView mTidyChecks       = null, ClangTidyCustomChecksOptionsView mTidyCustomChecks = null, ClangFormatOptionsView aClangFormatView = null)
        {
            try
            {
                mCompileTidyScriptBuilder = new ClangCompileTidyScript();
                mCompileTidyScriptBuilder.ConstructParameters(mGeneralOptions, mTidyOptions, mTidyChecks,
                                                              mTidyCustomChecks, aClangFormatView, DTEObj, VsEdition, VsVersion);

                string solutionPath = DTEObj.Solution.FullName;

                mOutputManager = new OutputManager(DTEObj);
                InitPowerShell();
                ClearWindows();
                mOutputManager.AddMessage($"\n{OutputWindowConstants.kStart} {aCommandName}\n");

                StatusBarHandler.Status(aCommandName + " started...", 1, vsStatusAnimation.vsStatusAnimationBuild, 1);

                foreach (var item in mItemsCollector.GetItems)
                {
                    var script = mCompileTidyScriptBuilder.GetScript(item, solutionPath);
                    if (!mCommandsController.Running)
                    {
                        break;
                    }

                    mOutputManager.Hierarchy = AutomationUtil.GetItemHierarchy(ServiceProvider, item);
                    var process = mPowerShell.Invoke(script, mRunningProcesses);

                    if (mOutputManager.MissingLlvm)
                    {
                        mOutputManager.AddMessage(ErrorParserConstants.kMissingLlvmMessage);
                        break;
                    }
                }
                if (!mOutputManager.EmptyBuffer)
                {
                    mOutputManager.AddMessage(String.Join("\n", mOutputManager.Buffer));
                }
                if (!mOutputManager.MissingLlvm)
                {
                    mOutputManager.Show();
                    mOutputManager.AddMessage($"\n{OutputWindowConstants.kDone} {aCommandName}\n");
                }
                if (mOutputManager.HasErrors)
                {
                    ErrorManager.Instance.AddErrors(mOutputManager.Errors);
                }
            }
            catch (Exception)
            {
                mOutputManager.Show();
                mOutputManager.AddMessage($"\n{OutputWindowConstants.kDone} {aCommandName}\n");
            }
            finally
            {
                StatusBarHandler.Status(aCommandName + " finished", 0, vsStatusAnimation.vsStatusAnimationBuild, 0);
            }
        }
예제 #3
0
        private string GetTidyParameters(ClangTidyOptionsView aTidyOptions, ClangTidyPredefinedChecksOptionsView aTidyChecks, ClangTidyCustomChecksOptionsView aTidyCustomChecks)
        {
            string parameters = string.Empty;

            if (0 == string.Compare(ComboBoxConstants.kTidyFile, ClangTidyUseChecksFromConvertor.ToString(aTidyOptions.UseChecksFrom)))
            {
                parameters   = ScriptConstants.kTidyFile;
                mUseTidyFile = true;
            }
            else if (0 == string.Compare(ComboBoxConstants.kCustomChecks, ClangTidyUseChecksFromConvertor.ToString(aTidyOptions.UseChecksFrom)))
            {
                if (false == string.IsNullOrWhiteSpace(aTidyCustomChecks.TidyChecks))
                {
                    parameters = $",{aTidyCustomChecks.TidyChecks.Replace(';', ',')}";
                }
            }
            else if (0 == string.Compare(ComboBoxConstants.kPredefinedChecks, ClangTidyUseChecksFromConvertor.ToString(aTidyOptions.UseChecksFrom)))
            {
                foreach (PropertyInfo prop in aTidyChecks.GetType().GetProperties())
                {
                    object[] propAttrs          = prop.GetCustomAttributes(false);
                    object   clangCheckAttr     = propAttrs.FirstOrDefault(attr => typeof(ClangCheckAttribute) == attr.GetType());
                    object   displayNameAttrObj = propAttrs.FirstOrDefault(attr => typeof(DisplayNameAttribute) == attr.GetType());

                    if (null == clangCheckAttr || null == displayNameAttrObj)
                    {
                        continue;
                    }

                    DisplayNameAttribute displayNameAttr = (DisplayNameAttribute)displayNameAttrObj;
                    var value = prop.GetValue(aTidyChecks, null);
                    if (Boolean.TrueString != value.ToString())
                    {
                        continue;
                    }
                    parameters = $"{parameters},{displayNameAttr.DisplayName}";
                }
            }

            if (string.Empty != parameters)
            {
                parameters = string.Format("{0} ''{1}{2}''",
                                           (true == aTidyOptions.Fix ? ScriptConstants.kTidyFix : ScriptConstants.kTidy),
                                           (mUseTidyFile ? "" : "-*"),
                                           parameters);
            }

            if (null != aTidyOptions.HeaderFilter && false == string.IsNullOrWhiteSpace(aTidyOptions.HeaderFilter.HeaderFilters))
            {
                parameters = string.Format("{0} {1} ''{2}''",
                                           parameters, ScriptConstants.kHeaderFilter,
                                           true == string.IsNullOrWhiteSpace(ClangTidyHeaderFiltersConvertor.ScriptEncode(aTidyOptions.HeaderFilter.HeaderFilters)) ?
                                           aTidyOptions.HeaderFilter.HeaderFilters : ClangTidyHeaderFiltersConvertor.ScriptEncode(aTidyOptions.HeaderFilter.HeaderFilters));
            }

            return(parameters);
        }
예제 #4
0
        public ClangTidyPredefinedChecksOptionsUserControl(ClangTidyPredefinedChecksOptionsView clangTidyChecksOptions)
        {
            InitializeComponent();

            wpfPropGrid.SelectedObject = clangTidyChecksOptions;

            Loaded += delegate
            {
                UIElementsActivator.Activate(HwndSource.FromVisual(this) as HwndSource);
            };
        }
        public async Task ClangTidyPredefinedChecksOptionsView_NotNullAsync()
        {
            //Arrange
            await UnitTestUtility.LoadPackageAsync();

            //Act
            ClangTidyPredefinedChecksOptionsView tidyPredefinedChecks = SettingsProvider.TidyPredefinedChecks;

            //Assert
            Assert.NotNull(tidyPredefinedChecks);
        }
예제 #6
0
 /// <summary>
 /// Instance constructor
 /// </summary>
 public GenericScriptBuilder(ClangGeneralOptionsView aGeneralOptions, ClangTidyOptionsView aTidyOptions, ClangTidyPredefinedChecksOptionsView aTidyChecks,
                             ClangTidyCustomChecksOptionsView aTidyCustomChecks, ClangFormatOptionsView aClangFormatView, string aVsEdition, string aVsVersion, bool aTidyFixFlag = false)
 {
     mGeneralOptions         = aGeneralOptions;
     mTidyOptions            = aTidyOptions;
     mTidyChecks             = aTidyChecks;
     mTidyCustomChecks       = aTidyCustomChecks;
     mClangFormatView        = aClangFormatView;
     mVsEdition              = aVsEdition;
     mVsVersion              = aVsVersion;
     mTidyFixFlag            = aTidyFixFlag;
     mUseClangTidyConfigFile = false;
 }
        public async Task PredefinedChecks_ChangeValue_CompareViewToFileAsync()
        {
            await UnitTestUtility.LoadPackageAsync();

            SettingsTestUtility.ResetClangTidyPredefinedChecksOptionsView();
            ClangTidyPredefinedChecksOptionsView tidyPredefinedChecksOptionsView = SettingsProvider.TidyPredefinedChecks;

            tidyPredefinedChecksOptionsView.AbseilDurationDivision = true;
            SettingsTestUtility.SaveClangTidyPredefinedChecksOptionsView(tidyPredefinedChecksOptionsView);
            ClangTidyPredefinedChecksOptionsView tidyCustomCheckesFromFile = SettingsTestUtility.GetClangTidyPredefinedChecksOptionsView();

            Assert.Equal(tidyPredefinedChecksOptionsView.AbseilDurationDivision, tidyCustomCheckesFromFile.AbseilDurationDivision);
        }
예제 #8
0
        /// <summary>
        /// Initializes a new instance of the <see cref="TidyCommand"/> class.
        /// Adds our command handlers for menu (commands must exist in the command table file)
        /// </summary>
        /// <param name="package">Owner package, not null.</param>

        private TidyCommand(OleMenuCommandService aCommandService, CommandsController aCommandsController,
                            ErrorWindowController aErrorWindow, OutputWindowController aOutputWindow, AsyncPackage aPackage, Guid aGuid, int aId)
            : base(aCommandsController, aErrorWindow, aOutputWindow, aPackage, aGuid, aId)
        {
            mTidyOptions      = (ClangTidyOptionsView)AsyncPackage.GetDialogPage(typeof(ClangTidyOptionsView));
            mTidyChecks       = (ClangTidyPredefinedChecksOptionsView)AsyncPackage.GetDialogPage(typeof(ClangTidyPredefinedChecksOptionsView));
            mTidyCustomChecks = (ClangTidyCustomChecksOptionsView)AsyncPackage.GetDialogPage(typeof(ClangTidyCustomChecksOptionsView));
            mClangFormatView  = (ClangFormatOptionsView)AsyncPackage.GetDialogPage(typeof(ClangFormatOptionsView));

            if (null != aCommandService)
            {
                var menuCommandID = new CommandID(CommandSet, Id);
                var menuCommand   = new OleMenuCommand(RunClangTidy, menuCommandID);
                menuCommand.BeforeQueryStatus += mCommandsController.OnBeforeClangCommand;
                menuCommand.Enabled            = true;
                aCommandService.AddCommand(menuCommand);
            }
        }
예제 #9
0
        private string GetPredefinedChecks(ClangTidyPredefinedChecksOptionsView predefinedChecksSettings)
        {
            StringBuilder predefinedChecks = new StringBuilder();

            PropertyInfo[] properties = predefinedChecksSettings.GetType().GetProperties();

            foreach (var item in properties)
            {
                var  attribute = item.GetCustomAttribute(typeof(DisplayNameAttribute)) as DisplayNameAttribute;
                bool?value     = item.GetValue(predefinedChecksSettings) as bool?;

                if (value != null && value == true && attribute != null)
                {
                    predefinedChecks.Append(attribute.DisplayName + ",");
                }
            }

            return(predefinedChecks.ToString().TrimEnd(','));
        }
예제 #10
0
        /// <summary>
        /// Initializes a new instance of the <see cref="TidyCommand"/> class.
        /// Adds our command handlers for menu (commands must exist in the command table file)
        /// </summary>
        /// <param name="package">Owner package, not null.</param>

        public TidyCommand(Package aPackage, Guid aGuid, int aId, CommandsController aCommandsController)
            : base(aCommandsController, aPackage, aGuid, aId)
        {
            mTidyOptions      = (ClangTidyOptionsView)Package.GetDialogPage(typeof(ClangTidyOptionsView));
            mTidyChecks       = (ClangTidyPredefinedChecksOptionsView)Package.GetDialogPage(typeof(ClangTidyPredefinedChecksOptionsView));
            mTidyCustomChecks = (ClangTidyCustomChecksOptionsView)Package.GetDialogPage(typeof(ClangTidyCustomChecksOptionsView));
            mClangFormatView  = (ClangFormatOptionsView)Package.GetDialogPage(typeof(ClangFormatOptionsView));

            mFileOpener = new FileOpener(DTEObj);

            if (ServiceProvider.GetService(typeof(IMenuCommandService)) is OleMenuCommandService commandService)
            {
                var menuCommandID = new CommandID(CommandSet, Id);
                var menuCommand   = new OleMenuCommand(this.RunClangTidy, menuCommandID);
                menuCommand.BeforeQueryStatus += mCommandsController.QueryCommandHandler;
                menuCommand.Enabled            = true;
                commandService.AddCommand(menuCommand);
            }
        }
예제 #11
0
        public void ConstructParameters(ClangGeneralOptionsView aGeneralOptions, ClangTidyOptionsView aTidyOptions, ClangTidyPredefinedChecksOptionsView aTidyChecks,
                                        ClangTidyCustomChecksOptionsView aTidyCustomChecks, ClangFormatOptionsView aClangFormatView, DTE2 aDTEObj, string aVsEdition, string aVsVersion)
        {
            mParameters = GetGeneralParameters(aGeneralOptions);
            mParameters = null != aTidyOptions ?
                          $"{mParameters} {GetTidyParameters(aTidyOptions, aTidyChecks, aTidyCustomChecks)}" : $"{mParameters} {ScriptConstants.kParallel}";

            if (null != aClangFormatView && null != aTidyOptions && true == aTidyOptions.Fix && true == aTidyOptions.FormatAfterTidy)
            {
                mParameters = $"{mParameters} {ScriptConstants.kClangFormatStyle} {aClangFormatView.Style}";
            }

            mParameters = $"{mParameters} {ScriptConstants.kVsVersion} {aVsVersion} {ScriptConstants.kVsEdition} {aVsEdition}";
        }
예제 #12
0
 /// <summary>
 /// Instance constructor
 /// </summary>
 public ClangTidyModeParametersFactory(ClangTidyCustomChecksOptionsView aTidyCustomChecks, ClangTidyPredefinedChecksOptionsView aTidyChecks)
 {
     mTidyCustomChecks = aTidyCustomChecks;
     mTidyChecks       = aTidyChecks;
 }
예제 #13
0
 public static void SaveClangTidyPredefinedChecksOptionsView(ClangTidyPredefinedChecksOptionsView clangTidyPredefinedChecksOptionsView)
 {
     clangTidyPredefinedChecksOptionsView.SaveSettingsToStorage();
 }
예제 #14
0
        protected void RunScript(string aCommandName, ClangTidyOptionsView mTidyOptions = null, ClangTidyPredefinedChecksOptionsView mTidyChecks = null,
                                 ClangTidyCustomChecksOptionsView mTidyCustomChecks     = null, ClangFormatOptionsView aClangFormatView = null, bool aTidyFixFlag = false)
        {
            try
            {
                var dte = VsServiceProvider.GetService(typeof(DTE)) as DTE2;
                dte.Solution.SaveAs(dte.Solution.FullName);

                IBuilder <string> runModeScriptBuilder = new RunModeScriptBuilder();
                runModeScriptBuilder.Build();
                var runModeParameters = runModeScriptBuilder.GetResult();

                IBuilder <string> genericScriptBuilder = new GenericScriptBuilder(mGeneralOptions, mTidyOptions, mTidyChecks,
                                                                                  mTidyCustomChecks, aClangFormatView, VsEdition, VsVersion, aTidyFixFlag);
                genericScriptBuilder.Build();
                var genericParameters = genericScriptBuilder.GetResult();

                string solutionPath = dte.Solution.FullName;

                InitPowerShell();
                ClearWindows();
                mOutputWindow.Write($"\n{OutputWindowConstants.kStart} {aCommandName}\n");

                StatusBarHandler.Status(aCommandName + " started...", 1, vsStatusAnimation.vsStatusAnimationBuild, 1);

                VsServiceProvider.TryGetService(typeof(SVsSolution), out object vsSolutionService);
                var vsSolution = vsSolutionService as IVsSolution;

                foreach (var item in mItemsCollector.GetItems)
                {
                    if (!mCommandsController.Running)
                    {
                        break;
                    }

                    IBuilder <string> itemRelatedScriptBuilder = new ItemRelatedScriptBuilder(item);
                    itemRelatedScriptBuilder.Build();
                    var itemRelatedParameters = itemRelatedScriptBuilder.GetResult();

                    // From the first parameter is removed the last character which is mandatory "'"
                    // and added to the end of the string to close the script
                    var script = $"{runModeParameters.Remove(runModeParameters.Length - 1)} {itemRelatedParameters} {genericParameters}'";

                    if (null != vsSolution)
                    {
                        mOutputWindow.Hierarchy = AutomationUtil.GetItemHierarchy(vsSolution as IVsSolution, item);
                    }

                    var process = mPowerShell.Invoke(script, mRunningProcesses);

                    if (mOutputWindow.MissingLlvm)
                    {
                        mOutputWindow.Write(ErrorParserConstants.kMissingLlvmMessage);
                        break;
                    }
                }

                if (!mOutputWindow.MissingLlvm)
                {
                    mOutputWindow.Show();
                    mOutputWindow.Write($"\n{OutputWindowConstants.kDone} {aCommandName}\n");
                }

                if (mOutputWindow.HasErrors)
                {
                    mErrorWindow.AddErrors(mOutputWindow.Errors);
                }
            }
            catch (Exception)
            {
                mOutputWindow.Show();
                mOutputWindow.Write($"\n{OutputWindowConstants.kDone} {aCommandName}\n");
            }
            finally
            {
                StatusBarHandler.Status(aCommandName + " finished", 0, vsStatusAnimation.vsStatusAnimationBuild, 0);
            }
        }