Example #1
0
        /// <summary>
        /// Validates the specified project items using JSLint.
        /// </summary>
        /// <param name="projectItems">The project items.</param>
        /// <param name="settings">The settings.</param>
        /// <returns>
        /// The total number of JSLint errors found.
        /// </returns>
        public int LintProjectItems(IList <ProjectItem> projectItems, JSLintNetSettings settings)
        {
            if (projectItems.Count < 1)
            {
                return(0);
            }

            var hierarchy  = this.GetHierarchy(projectItems[0].ContainingProject);
            var errors     = 0;
            var files      = 0;
            var errorFiles = 0;
            var exceptions = 0;
            var errorLimit = settings.ErrorLimitOrDefault();
            var filesLimit = settings.FileLimitOrDefault();

            using (var jsLintContext = this.jsLintFactory())
            {
                foreach (var item in projectItems)
                {
                    var fileName = item.Access().FileName;
                    this.errorListProvider.ClearJSLintErrors(fileName);

                    var isOpen = item.Document != null;

                    var result = ExecutionHelper.Try(() =>
                    {
                        string source;
                        if (isOpen)
                        {
                            source = item.Document.Access().Source;
                        }
                        else
                        {
                            source = this.fileSystemWrapper.ReadAllText(fileName, Encoding.UTF8);
                        }

                        return(jsLintContext.Lint(source, settings.Options, settings.GlobalVariables));
                    });

                    if (result.Success)
                    {
                        var data = result.Data;

                        if (data.Warnings.Count > 0)
                        {
                            errors     += data.Warnings.Count;
                            errorFiles += 1;

                            this.errorListProvider.AddJSLintErrors(fileName, data.Warnings, settings.Output, hierarchy);

                            if (errors >= errorLimit)
                            {
                                this.errorListProvider.AddCustomError(CoreResources.ErrorLimitReachedFormat, errors);

                                break;
                            }
                        }
                    }
                    else
                    {
                        var ex = result.Exception;

                        this.errorListProvider.AddCustomError(CoreResources.ProcessingExceptionFormat, fileName, ex.Message);

                        exceptions += 1;

                        if (exceptions >= JSLintNetSettings.ExceptionLimit)
                        {
                            this.errorListProvider.AddCustomError(CoreResources.ExceptionLimitReachedFormat, exceptions);

                            break;
                        }
                    }

                    files += 1;

                    if (files >= filesLimit)
                    {
                        this.errorListProvider.AddCustomError(CoreResources.FileLimitReachedFormat, files);

                        break;
                    }
                }
            }

            var text = GetMessageText(projectItems.Count, errorFiles, errors);

            this.SetStatusBar(text);

            return(errors);
        }
Example #2
0
        /// <summary>
        /// Executes the task.
        /// </summary>
        /// <returns>
        ///   <c>true</c> if the task successfully executed; otherwise, <c>false</c>.
        /// </returns>
        public override bool Execute()
        {
            var settings    = this.LoadSettings();
            var sourceFiles = this.GetSourceFiles(settings);
            var output      = settings.Output.GetValueOrDefault();

            if (sourceFiles.Count > 0)
            {
                var logger        = this.GetLogger(output);
                var errorLimit    = settings.ErrorLimitOrDefault();
                var fileLimit     = settings.FileLimitOrDefault();
                var exceptions    = 0;
                var reportBuilder = new JSLintReportBuilder();

                using (var context = this.jsLintFactory())
                {
                    reportBuilder.SourceDirectory = this.SourceDirectory;
                    reportBuilder.AddSettings(settings.Files);

                    foreach (var file in sourceFiles)
                    {
                        var result = ExecutionHelper.Try(() =>
                        {
                            var source = this.fileSystemWrapper.ReadAllText(file.Absolute, Encoding.UTF8);

                            return(context.Lint(source, settings.Options, settings.GlobalVariables));
                        });

                        if (result.Success)
                        {
                            var data = result.Data;
                            reportBuilder.AddFile(file.Virtual, data);

                            foreach (var error in data.Warnings)
                            {
                                logger(
                                    subcategory: AssemblyInfo.Product,
                                    errorCode: null,
                                    helpKeyword: null,
                                    file: file.Absolute,
                                    lineNumber: error.Line + 1,
                                    columnNumber: error.Column + 1,
                                    endLineNumber: 0,
                                    endColumnNumber: 0,
                                    message: string.Concat(Resources.ErrorTextPrefix, error.Message));
                            }

                            if (reportBuilder.ErrorCount >= errorLimit)
                            {
                                this.Log.LogError(Resources.ErrorLimitReachedFormat, reportBuilder.ErrorCount);

                                break;
                            }
                        }
                        else
                        {
                            this.Log.LogError(
                                Resources.ErrorEncounteredFormat,
                                file.Virtual,
                                Environment.NewLine,
                                result.Exception.Message);

                            exceptions += 1;

                            if (exceptions >= JSLintNetSettings.ExceptionLimit)
                            {
                                this.Log.LogError(Resources.ExceptionLimitReachedFormat, exceptions);

                                break;
                            }
                        }

                        if (reportBuilder.ProcessedFileCount >= fileLimit)
                        {
                            this.Log.LogError(Resources.FileLimitReachedFormat, reportBuilder.ProcessedFileCount);

                            break;
                        }
                    }

                    var reportFile = this.ReportFile;
                    if (!string.IsNullOrEmpty(reportFile))
                    {
                        if (!Path.IsPathRooted(reportFile))
                        {
                            reportFile = Path.Combine(this.SourceDirectory, reportFile);
                        }

                        this.fileSystemWrapper.WriteAllText(reportFile, reportBuilder.ToString(), Encoding.UTF8);
                    }

                    this.ErrorCount         = reportBuilder.ErrorCount;
                    this.ErrorFileCount     = reportBuilder.ErrorFileCount;
                    this.ProcessedFileCount = reportBuilder.ProcessedFileCount;
                }
            }
            else
            {
                this.ErrorCount         = 0;
                this.ErrorFileCount     = 0;
                this.ProcessedFileCount = 0;
            }

            return(output != Output.Error || this.ErrorCount == 0);
        }
Example #3
0
        public int Lint(ConsoleOptions options)
        {
            var sourceDirectory = options.SourceDirectory;
            var settings        = this.settingRepository.Load(options.SettingsFile);
            var ignored         = settings.NormalizeIgnore();
            var sourceFiles     = options.SourceFiles.Where(x => JSLint.CanLint(x) && !IsIgnored(sourceDirectory, x, ignored)).ToArray();
            var errorLimit      = settings.ErrorLimitOrDefault();
            var fileLimit       = settings.FileLimitOrDefault();
            var exceptions      = 0;

            using (var context = this.jsLintFactory.CreateContext())
                using (var reportBuilder = this.jsLintFactory.CreateReportBuilder())
                {
                    reportBuilder.SourceDirectory = sourceDirectory;
                    reportBuilder.AddSettings(settings.Files);

                    foreach (var file in sourceFiles)
                    {
                        var relative = GetRelativePath(sourceDirectory, file);
                        var result   = ExecutionHelper.Try(() =>
                        {
                            var source = this.fileSystemWrapper.ReadAllText(file, Encoding.UTF8);

                            return(context.Lint(source, settings.Options));
                        });

                        if (result.Success)
                        {
                            var data  = result.Data;
                            var count = data.Errors.Count;

                            reportBuilder.AddFile(relative, data);

                            if (count > 0 && options.LogLevel == LogLevel.Verbose)
                            {
                                this.consoleWriter
                                .WriteErrorLine()
                                .WriteErrorLine(Resources.ErrorFileSummaryFormat, relative, count);

                                foreach (var error in data.Errors)
                                {
                                    this.consoleWriter
                                    .WriteErrorLine(4, Resources.ErrorItemFormat, error.Reason, error.Line, error.Character);
                                }
                            }

                            if (reportBuilder.ErrorCount >= errorLimit)
                            {
                                this.consoleWriter
                                .WriteErrorLine()
                                .WriteErrorLine(CoreResources.ErrorLimitReachedFormat, reportBuilder.ErrorCount);

                                break;
                            }
                        }
                        else
                        {
                            var ex = result.Exception;

                            this.consoleWriter
                            .WriteErrorLine()
                            .WriteErrorLine(Resources.ExceptionFileFormat, relative)
                            .WriteErrorLine(ex.Message);

                            exceptions += 1;

                            if (exceptions >= JSLintNetSettings.ExceptionLimit)
                            {
                                this.consoleWriter
                                .WriteErrorLine()
                                .WriteErrorLine(CoreResources.ExceptionLimitReachedFormat, exceptions);

                                break;
                            }
                        }

                        if (reportBuilder.ProcessedFileCount >= fileLimit)
                        {
                            this.consoleWriter
                            .WriteErrorLine()
                            .WriteErrorLine(CoreResources.FileLimitReachedFormat, reportBuilder.ProcessedFileCount);

                            break;
                        }
                    }

                    if (options.LogLevel != LogLevel.Silent)
                    {
                        this.consoleWriter
                        .WriteLine()
                        .WriteLine(Resources.SummarySourceDirectoryFormat, reportBuilder.SourceDirectory)
                        .WriteLine(Resources.SummarySettingsFileFormat, string.Join(", ", reportBuilder.SettingsFiles))
                        .WriteLine(Resources.SummaryProcessedFileCountFormat, reportBuilder.ProcessedFileCount)
                        .WriteLine(Resources.SummaryErrorFileCountFormat, reportBuilder.ErrorFileCount)
                        .WriteLine(Resources.SummaryErrorCountFormat, reportBuilder.ErrorCount);
                    }

                    if (!string.IsNullOrEmpty(options.ReportFile))
                    {
                        this.fileSystemWrapper.WriteAllText(options.ReportFile, reportBuilder.ToString(), Encoding.UTF8);
                    }

                    return(reportBuilder.ErrorCount);
                }
        }