コード例 #1
0
        public void Match_TestPatternsPhp_MatchedAllDefault()
        {
            var path          = Path.Combine(TestUtility.TestsDataPath, "Patterns.php");
            var sourceCodeRep = new FileCodeRepository(path);

            var            workflow                   = new Workflow(sourceCodeRep, Global.PatternsRepository);
            WorkflowResult workflowResult             = workflow.Process();
            IEnumerable <MatchResultDto> matchResults = workflowResult.MatchResults
                                                        .ToDto()
                                                        .OrderBy(r => r.PatternKey);
            IEnumerable <PatternDto> patternDtos = Global.PatternsRepository.GetAll()
                                                   .Where(patternDto => patternDto.Languages.Contains("Php"));

            foreach (PatternDto dto in patternDtos)
            {
                Assert.Greater(matchResults.Count(p => p.PatternKey == dto.Key), 0, dto.Description);
            }
            Assert.AreEqual(1, matchResults.Count(r =>
                                                  r.MatchedCode.Contains("Configure") &&
                                                  r.MatchedCode.Contains("write") &&
                                                  r.MatchedCode.Contains("3")));
            Assert.AreEqual(0, matchResults.Count(r =>
                                                  r.MatchedCode.Contains("Configure") &&
                                                  r.MatchedCode.Contains("write") &&
                                                  r.MatchedCode.Contains("50")));
        }
コード例 #2
0
        public static SourceCodeRepository CreateSourceCodeRepository(string path, string tempDir)
        {
            SourceCodeRepository sourceCodeRepository;

            if (string.IsNullOrWhiteSpace(path))
            {
                sourceCodeRepository = DummyCodeRepository.Instance;
            }
            else if (Directory.Exists(path))
            {
                sourceCodeRepository = new DirectoryCodeRepository(path);
            }
            else if (File.Exists(path))
            {
                string extensions = Path.GetExtension(path);
                if (extensions.EqualsIgnoreCase(".zip"))
                {
                    sourceCodeRepository = new ZipCachingRepository(path)
                    {
                        ExtractPath = tempDir
                    };
                }
                else
                {
                    sourceCodeRepository          = new FileCodeRepository(path);
                    sourceCodeRepository.LoadJson = extensions.EqualsIgnoreCase(".json");
                }
            }
            else
            {
                string url            = path;
                string projectName    = null;
                string urlWithoutHttp = TextUtils.HttpRegex.Replace(url, "");

                if (!url.EndsWith(".zip", StringComparison.OrdinalIgnoreCase))
                {
                    if (urlWithoutHttp.StartsWith("github.com", StringComparison.OrdinalIgnoreCase))
                    {
                        url = url + "/archive/master.zip";
                    }
                }

                if (urlWithoutHttp.StartsWith("github.com", StringComparison.OrdinalIgnoreCase))
                {
                    projectName = urlWithoutHttp.Split('/').ElementAtOrDefault(2);
                }

                var zipAtUrlCachedCodeRepository = new ZipAtUrlCachingRepository(url, projectName)
                {
                    DownloadPath = tempDir
                };
                sourceCodeRepository = zipAtUrlCachedCodeRepository;
            }

            return(sourceCodeRepository);
        }
コード例 #3
0
        static void Main(string[] args)
        {
            var fileRepository     = new FileCodeRepository("code.php");
            var patternsRepostiory = new FilePatternsRepository("patterns.json");

            var workflow = new Workflow(fileRepository, patternsRepostiory);

            workflow.IsIncludeIntermediateResult = true;

            WorkflowResult result = workflow.Process();

            var lineTokenDict = new Dictionary <int, List <string> >();

            foreach (var matchingResult in result.MatchingResults)
            {
                var       matchedNode = matchingResult.Nodes.Last();
                UstNode[] descendants = matchedNode.GetAllDescendants();

                foreach (UstNode descendant in descendants)
                {
                    string text = null;
                    if (descendant.NodeType == NodeType.InvocationExpression)
                    {
                        text = "Method invocation: " + ((InvocationExpression)descendant).Target;
                    }
                    else if (descendant.NodeType == NodeType.IndexerDeclaration)
                    {
                        text = "Arrays with user input: " + ((IndexerExpression)descendant).Target;
                    }
                    else if (descendant.NodeType == NodeType.CastExpression)
                    {
                        text = "Cast to type: " + ((CastExpression)descendant).Type;
                    }

                    if (!string.IsNullOrEmpty(text))
                    {
                        SourceCodeFile     sourceCodeFile     = result.SourceCodeFiles.Single(file => file.FullPath == descendant.FileNode.FileName.Text);
                        LineColumnTextSpan lineColumnTextSpan = sourceCodeFile.GetLineColumnTextSpan(descendant.TextSpan);
                        List <string>      strs;
                        if (!lineTokenDict.TryGetValue(lineColumnTextSpan.BeginLine, out strs))
                        {
                            strs = new List <string>();
                            lineTokenDict[lineColumnTextSpan.BeginLine] = strs;
                        }
                        strs.Add(text);
                    }
                }
            }

            foreach (var item in lineTokenDict)
            {
                Console.WriteLine(String.Format("{0}: {1}", item.Key, string.Join(", ", item.Value)));
            }

            Console.ReadLine();
        }
コード例 #4
0
        public void Match_TestPatternsAspx_MatchedExpected()
        {
            var path          = Path.Combine(TestHelper.TestsDataPath, "Patterns.aspx");
            var sourceCodeRep = new FileCodeRepository(path);
            var workflow      = new Workflow(sourceCodeRep, Language.CSharp, patternsRepository);

            MatchingResultDto[] matchingResults = workflow.Process().MatchingResults.ToDto(workflow.SourceCodeRepository);

            Assert.IsTrue(matchingResults[0].MatchedCode.Contains("Password"));
            Assert.IsTrue(matchingResults[1].MatchedCode.Contains("try"));
        }
コード例 #5
0
        public void Match_TestPatternsAspx_MatchedExpected()
        {
            var path          = Path.Combine(TestUtility.TestsDataPath, "Patterns.aspx");
            var sourceCodeRep = new FileCodeRepository(path);
            var workflow      = new Workflow(sourceCodeRep, Global.PatternsRepository);
            IEnumerable <MatchResultDto> matchResults = workflow.Process().MatchResults.ToDto();

            Assert.IsTrue(matchResults.ElementAt(0).MatchedCode.Contains("Password"));
            Assert.IsTrue(matchResults.ElementAt(1).MatchedCode.Contains("Random"));
            Assert.IsTrue(matchResults.ElementAt(2).MatchedCode.Contains("try"));
        }
コード例 #6
0
        public void Match_HardcodedPasswordAspx_WithoutException()
        {
            var hardcodedPassRepository = new DslPatternRepository("<[(?i)password]> = <[\"\\w*\"]>", LanguageFlags.CSharp);
            var sourceCodeRep           = new FileCodeRepository(Path.Combine(TestHelper.TestsDataPath, "HardcodedPassword.aspx"));
            var workflow = new Workflow(sourceCodeRep, Language.CSharp, hardcodedPassRepository);

            MatchingResultDto[] matchingResults = workflow.Process().MatchingResults.ToDto(workflow.SourceCodeRepository);

            Assert.IsTrue(matchingResults[0].MatchedCode.Contains("password = \"hardcoded\""));
            Assert.IsTrue(matchingResults[1].MatchedCode.Contains("PASSWORD = \"hardcoded\""));
        }
コード例 #7
0
        public void FileCodeRepository_TestPath_CorrectPathsAndNames()
        {
            string fullName                = Path.Combine(TestUtility.TestsDataPath, "Test Project", "1.cs");
            var    fileCodeRepository      = new FileCodeRepository(fullName);
            IEnumerable <string> fileNames = fileCodeRepository.GetFileNames();

            CodeFile sourceCode = fileCodeRepository.ReadFile(fileNames.Single());

            Assert.AreEqual("1.cs", sourceCode.Name);
            Assert.AreEqual("", sourceCode.RelativePath);
            Assert.AreEqual(Path.GetDirectoryName(fullName), sourceCode.RootPath);
            Assert.AreEqual(fullName, sourceCode.FullName);
        }
コード例 #8
0
        public void Match_HardcodedPasswordAspx_WithoutException()
        {
            var hardcodedPassRepository = new DslPatternRepository("<[(?i)password]> = <[\"\\w*\"]>", "CSharp");
            var sourceCodeRep           = new FileCodeRepository(Path.Combine(TestUtility.TestsDataPath, "HardcodedPassword.aspx"));
            var workflow = new Workflow(sourceCodeRep, hardcodedPassRepository);
            IEnumerable <MatchResultDto> matchResults = workflow.Process().MatchResults.ToDto();

            string match = matchResults.ElementAt(0).MatchedCode;

            Assert.IsTrue(match.Contains("password") && match.Contains("hardcoded"));

            match = matchResults.ElementAt(1).MatchedCode;
            Assert.IsTrue(match.Contains("PASSWORD") && match.Contains("hardcoded"));
        }
コード例 #9
0
        public void Match_TestPatternsCSharp_MatchedAllDefault()
        {
            var path          = Path.Combine(TestUtility.TestsDataPath, "Patterns.cs");
            var sourceCodeRep = new FileCodeRepository(path);

            var workflow = new Workflow(sourceCodeRep, Global.PatternsRepository);
            IEnumerable <MatchResultDto> matchResults = workflow.Process().MatchResults.ToDto();
            var patternDtos = Global.PatternsRepository.GetAll()
                              .Where(patternDto => patternDto.Languages.Contains("CSharp")).ToArray();

            foreach (PatternDto dto in patternDtos)
            {
                Assert.Greater(matchResults.Count(p => p.PatternKey == dto.Key), 0, dto.Description);
            }
        }
コード例 #10
0
        public void Match_TestPatternsCSharp_MatchedAllDefault()
        {
            var path          = Path.Combine(TestHelper.TestsDataPath, "Patterns.cs");
            var sourceCodeRep = new FileCodeRepository(path);

            var workflow = new Workflow(sourceCodeRep, Language.CSharp, patternsRepository);

            MatchingResultDto[] matchingResults = workflow.Process().MatchingResults.ToDto(workflow.SourceCodeRepository);
            var patternDtos = patternsRepository.GetAll()
                              .Where(patternDto => patternDto.Languages.Is(LanguageFlags.CSharp)).ToArray();

            foreach (var dto in patternDtos)
            {
                Assert.Greater(matchingResults.Count(p => p.PatternKey == dto.Key), 0, dto.Description);
            }
        }
コード例 #11
0
ファイル: UstRenderTests.cs プロジェクト: Yikez978/PT.PM
        public void Render_Ust_PngGraph(string fileName)
        {
            var codeRepository = new FileCodeRepository(Path.Combine(TestHelper.TestsDataPath, fileName));

            var language = (Language)LanguageExt.GetLanguageFromFileName(fileName);
            var workflow = new Workflow(codeRepository, language);

            workflow.Stage = Stage.Convert;
            WorkflowResult workflowResult = workflow.Process();

            var astSerializer = new UstDotRenderer();
            var dotString     = astSerializer.Render(workflowResult.Usts.First().Root);

            fileName = fileName.Replace(".txt", "") + ".ust";
            TestHelper.RenderGraphvizGraph(TestHelper.CombineWithOutputDir(fileName), dotString);
        }
コード例 #12
0
        public void Match_TestPatternsJava_MatchedAllDefault()
        {
            var path          = Path.Combine(TestUtility.TestsDataPath, "Patterns.java");
            var sourceCodeRep = new FileCodeRepository(path);

            var            workflow                   = new Workflow(sourceCodeRep, Global.PatternsRepository);
            WorkflowResult workflowResult             = workflow.Process();
            IEnumerable <MatchResultDto> matchResults = workflowResult.MatchResults
                                                        .ToDto()
                                                        .OrderBy(r => r.PatternKey);
            IEnumerable <PatternDto> patternDtos = Global.PatternsRepository.GetAll()
                                                   .Where(patternDto => patternDto.Languages.Contains("Java")).ToArray();

            foreach (PatternDto dto in patternDtos)
            {
                Assert.Greater(matchResults.Count(p => p.PatternKey == dto.Key), 0, dto.Description);
            }

            var improperValidationEmptyMethodPartial = patternDtos.Single(dto => dto.Description.StartsWith("ImproperValidationEmptyMethodPartial"));

            Assert.AreEqual(1, matchResults.Count(r => r.PatternKey == improperValidationEmptyMethodPartial.Key));

            var improperValidationEmptyMethodFull = patternDtos.Single(dto => dto.Description.StartsWith("ImproperValidationEmptyMethodFull"));

            Assert.AreEqual(3, matchResults.Count(r => r.PatternKey == improperValidationEmptyMethodFull.Key));

            var missingReceiverPermission = patternDtos.Single(dto => dto.Description.StartsWith("MissingReceiverPermission"));

            Assert.AreEqual(1, matchResults.Count(r => r.PatternKey == missingReceiverPermission.Key));

            var missingBroadcasterPermission = patternDtos.Single(dto => dto.Description.StartsWith("MissingBroadcasterPermission"));

            Assert.AreEqual(1, matchResults.Count(r => r.PatternKey == missingBroadcasterPermission.Key));

            var cookieNotSentOverSslDto     = patternDtos.Single(dto => dto.Description.StartsWith("CookieNotSentOverSSL"));
            var cookieNotSentOverSslResults =
                matchResults.Where(r => r.PatternKey == cookieNotSentOverSslDto.Key).ToArray();

            Assert.AreEqual(1, cookieNotSentOverSslResults.Count(r => r.MatchedCode.Contains("emailCookieExistsSimple")));
            Assert.AreEqual(1, cookieNotSentOverSslResults.Count(r => r.MatchedCode.Contains("emailCookieExistsComplex")));
            Assert.AreEqual(1, cookieNotSentOverSslResults.Count(r => r.MatchedCode.Contains("emailCookieExistsAnotherVarName")));

            var useOfNullPointerException = patternDtos.Single(dto => dto.Description.StartsWith("Use of NullPointerException"));

            Assert.AreEqual(1, matchResults.Count(r => r.PatternKey == useOfNullPointerException.Key));
        }
コード例 #13
0
ファイル: SqlMatchingTests.cs プロジェクト: smartfish/PT.PM
        private void Match_TestPatternsSql_MatchedAllDefault(Language language, string patternsFileName)
        {
            var path          = Path.Combine(TestUtility.TestsDataPath, patternsFileName.NormDirSeparator());
            var sourceCodeRep = new FileCodeRepository(path);

            var            workflow                   = new Workflow(sourceCodeRep, Global.PatternsRepository);
            WorkflowResult workflowResult             = workflow.Process();
            IEnumerable <MatchResultDto> matchResults = workflowResult.MatchResults
                                                        .ToDto()
                                                        .OrderBy(r => r.PatternKey);
            IEnumerable <PatternDto> patternDtos = Global.PatternsRepository.GetAll()
                                                   .Where(patternDto => patternDto.Languages.Contains(language.Key));

            foreach (var dto in patternDtos)
            {
                Assert.Greater(matchResults.Count(p => p.PatternKey == dto.Key), 0, dto.Description);
            }
        }
コード例 #14
0
ファイル: SqlMatchingTests.cs プロジェクト: Yikez978/PT.PM
        private void Match_TestPatternsSql_MatchedAllDefault(Language language, string patternsFileName)
        {
            var path          = Path.Combine(TestHelper.TestsDataPath, patternsFileName.NormDirSeparator());
            var sourceCodeRep = new FileCodeRepository(path);

            var            workflow       = new Workflow(sourceCodeRep, language, patternsRepository);
            WorkflowResult workflowResult = workflow.Process();

            MatchingResultDto[] matchingResults = workflowResult.MatchingResults
                                                  .ToDto(workflow.SourceCodeRepository)
                                                  .OrderBy(r => r.PatternKey).ToArray();
            var patternDtos = patternsRepository.GetAll()
                              .Where(patternDto => patternDto.Languages.Is(language)).ToArray();

            foreach (var dto in patternDtos)
            {
                Assert.Greater(matchingResults.Count(p => p.PatternKey == dto.Key), 0, dto.Description);
            }
        }
コード例 #15
0
        public void Match_TestPatternsPhp_MatchedAllDefault()
        {
            var path          = Path.Combine(TestHelper.TestsDataPath, "Patterns.php");
            var sourceCodeRep = new FileCodeRepository(path);

            var            workflow       = new Workflow(sourceCodeRep, Language.Php, patternsRepository);
            WorkflowResult workflowResult = workflow.Process();

            MatchingResultDto[] matchingResults = workflowResult.MatchingResults
                                                  .ToDto(workflow.SourceCodeRepository)
                                                  .OrderBy(r => r.PatternKey)
                                                  .ToArray();
            PatternDto[] patternDtos = patternsRepository.GetAll()
                                       .Where(patternDto => patternDto.Languages.Is(LanguageFlags.Php)).ToArray();
            foreach (var dto in patternDtos)
            {
                Assert.Greater(matchingResults.Count(p => p.PatternKey == dto.Key), 0, dto.Description);
            }
            Assert.AreEqual(1, matchingResults.Count(r => r.MatchedCode.Contains("Configure::write") && r.MatchedCode.Contains("3")));
            Assert.AreEqual(0, matchingResults.Count(r => r.MatchedCode.Contains("Configure::write") && r.MatchedCode.Contains("50")));
        }
コード例 #16
0
ファイル: JavaMatchingTests.cs プロジェクト: Yikez978/PT.PM
        public void Match_TestPatternsJava_MatchedAllDefault()
        {
            var path          = Path.Combine(TestHelper.TestsDataPath, "Patterns.java");
            var sourceCodeRep = new FileCodeRepository(path);

            var            workflow       = new Workflow(sourceCodeRep, Language.Java, patternsRepository);
            WorkflowResult workflowResult = workflow.Process();

            MatchingResultDto[] matchingResults = workflowResult.MatchingResults.ToDto(workflow.SourceCodeRepository)
                                                  .OrderBy(r => r.PatternKey)
                                                  .ToArray();
            var patternDtos = patternsRepository.GetAll()
                              .Where(patternDto => patternDto.Languages.Is(LanguageFlags.Java)).ToArray();

            foreach (var dto in patternDtos)
            {
                Assert.Greater(matchingResults.Count(p => p.PatternKey == dto.Key), 0, dto.Description);
            }

            var missingReceiverPermission = patternDtos.Single(dto => dto.Description.StartsWith("MissingReceiverPermission"));

            Assert.AreEqual(1, matchingResults.Count(r => r.PatternKey == missingReceiverPermission.Key));

            var missingBroadcasterPermission = patternDtos.Single(dto => dto.Description.StartsWith("MissingBroadcasterPermission"));

            Assert.AreEqual(1, matchingResults.Count(r => r.PatternKey == missingBroadcasterPermission.Key));

            var cookieNotSentOverSslDto     = patternDtos.Single(dto => dto.Description.StartsWith("CookieNotSentOverSSL"));
            var cookieNotSentOverSslResults =
                matchingResults.Where(r => r.PatternKey == cookieNotSentOverSslDto.Key).ToArray();

            Assert.AreEqual(0, cookieNotSentOverSslResults.Count(r => r.MatchedCode.Contains("emailCookieNotExistsSimple")));
            Assert.AreEqual(0, cookieNotSentOverSslResults.Count(r => r.MatchedCode.Contains("emailCookieNotExistsComplex")));

            Assert.AreEqual(1, cookieNotSentOverSslResults.Count(r => r.MatchedCode.Contains("emailCookieExistsTwoPatterns1")));
            Assert.AreEqual(1, cookieNotSentOverSslResults.Count(r => r.MatchedCode.Contains("emailCookieExistsSimple")));
            Assert.AreEqual(1, cookieNotSentOverSslResults.Count(r => r.MatchedCode.Contains("emailCookieExistsComplex")));
            Assert.AreEqual(1, cookieNotSentOverSslResults.Count(r => r.MatchedCode.Contains("emailCookieExistsAnotherVarName")));
        }
コード例 #17
0
        private static void CheckJsonSerialization(string inputFileName, bool linearTextSpans = false,
                                                   bool includeTextSpans = true, bool indented = true, bool includeCode               = false,
                                                   bool checkStrict      = false, bool strict  = true, bool checkPatternSerialization = false)
        {
            string path = Path.Combine(TestUtility.TestsDataPath, inputFileName);

            // Serialization
            string[] files = File.Exists(path)
                           ? new string[] { path }
                           : Directory.GetFiles(path);
            var codeRepository = new FileCodeRepository(files);

            var workflow = new Workflow(codeRepository)
            {
                DumpStages = new HashSet <Stage>()
                {
                    Stage.Ust
                },
                DumpDir             = TestUtility.TestsOutputPath,
                IncludeCodeInDump   = includeCode,
                IndentedDump        = indented,
                StrictJson          = strict,
                DumpWithTextSpans   = includeTextSpans,
                LineColumnTextSpans = !linearTextSpans,
                Stage          = Stage.Ust,
                IsDumpPatterns = checkPatternSerialization
            };
            WorkflowResult result = workflow.Process();

            CodeFile preprocessedFile = result.SourceCodeFiles.FirstOrDefault(f => f.Name == "preprocessed.php");
            CodeFile originFile       = result.SourceCodeFiles.FirstOrDefault(f => f.Name == "origin.php");

            LineColumnTextSpan lcPreprocessedTextSpan = new LineColumnTextSpan(4, 1, 4, 3);
            LineColumnTextSpan lcOriginTextSpan       = new LineColumnTextSpan(3, 1, 3, 3, originFile);

            var jsonFiles = new List <string>();

            foreach (string file in files)
            {
                string shortFileName = Path.GetFileName(file) + ".ust.json";
                string jsonFile      = Path.Combine(TestUtility.TestsOutputPath, shortFileName);

                if (file.Contains("preprocessed.php") || checkStrict)
                {
                    string json = File.ReadAllText(jsonFile);
                    if (file.Contains("preprocessed.php"))
                    {
                        string preprocessedTextSpanString, originTextSpanString;

                        if (linearTextSpans)
                        {
                            preprocessedTextSpanString = preprocessedFile.GetTextSpan(lcPreprocessedTextSpan).ToString();
                            originTextSpanString       = originFile.GetTextSpan(lcOriginTextSpan).ToString();
                        }
                        else
                        {
                            preprocessedTextSpanString = lcPreprocessedTextSpan.ToString();
                            originTextSpanString       = lcOriginTextSpan.ToString();
                        }

                        json = json.Replace($"\"{preprocessedTextSpanString}\"", $"[ \"{lcPreprocessedTextSpan}\", \"{originTextSpanString}\" ]");
                    }

                    if (checkStrict)
                    {
                        json = json.Replace("\"Kind\": \"IntLiteral\"", "\"Kind\": \"IntLiteral\", \"ExcessProperty\": \"value\"");
                    }

                    File.WriteAllText(jsonFile, json);
                }

                jsonFiles.Add(jsonFile);
            }

            // Deserialization
            var logger            = new LoggerMessageCounter();
            var newCodeRepository = new FileCodeRepository(jsonFiles)
            {
                LoadJson = true
            };

            var newPatternsRepository = checkPatternSerialization
                ? new JsonPatternsRepository(File.ReadAllText(Path.Combine(TestUtility.TestsOutputPath, "patterns.json")))
                : inputFileName == "MultiTextSpan"
                ? (IPatternsRepository) new DslPatternRepository("a", "php")
                : new DefaultPatternRepository();
            var newWorkflow = new Workflow(newCodeRepository, newPatternsRepository)
            {
                StartStage          = Stage.Ust,
                IndentedDump        = indented,
                StrictJson          = strict,
                DumpWithTextSpans   = includeTextSpans,
                LineColumnTextSpans = !linearTextSpans,
                Logger = logger,
            };
            WorkflowResult newResult = newWorkflow.Process();

            if (checkStrict && strict)
            {
                Assert.IsTrue(logger.ErrorsString.Contains("ExcessProperty"));
            }
            else
            {
                Assert.AreEqual(0, logger.ErrorCount, logger.ErrorsString);
                Assert.GreaterOrEqual(newResult.MatchResults.Count, 1);

                if (includeTextSpans)
                {
                    if (inputFileName == "MultiTextSpan")
                    {
                        var matchResult = (MatchResult)newResult.MatchResults[1];
                        Assert.AreEqual(2, matchResult.TextSpans.Length);

                        LineColumnTextSpan actualOriginTextSpan = originFile.GetLineColumnTextSpan(matchResult.TextSpans[1]);
                        Assert.AreEqual(lcOriginTextSpan, actualOriginTextSpan);

                        LineColumnTextSpan actualPreprocessedTextSpan = preprocessedFile.GetLineColumnTextSpan(matchResult.TextSpans[0]);
                        Assert.AreEqual(lcPreprocessedTextSpan, actualPreprocessedTextSpan);
                    }
                    else
                    {
                        var match = (MatchResult)newResult.MatchResults.FirstOrDefault();
                        Assert.AreEqual(new LineColumnTextSpan(2, 1, 3, 25), result.SourceCodeFiles.First().GetLineColumnTextSpan(match.TextSpan));
                    }
                }
            }
        }
コード例 #18
0
        static void Main(string[] args)
        {
            Thread.CurrentThread.CurrentCulture   = CultureInfo.InvariantCulture;
            Thread.CurrentThread.CurrentUICulture = CultureInfo.InvariantCulture;
            var parser = new FluentCommandLineParser();

            string fileName                = "";
            string escapedPatterns         = "";
            int    threadCount             = 1;
            string languagesString         = "";
            Stage  stage                   = Stage.Match;
            int    maxStackSize            = 0;
            int    maxTimespan             = 0;
            int    memoryConsumptionMb     = 300;
            string logsDir                 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PT.PM", "Logs");
            bool   logErrors               = false;
            bool   logDebugs               = false;
            bool   showVersion             = true;
            bool   isDumpUst               = false;
            bool   isIndentedUst           = false;
            bool   isIncludeTextSpansInUst = true;
            bool   isPreprocess            = true;

            parser.Setup <string>('f', "files").Callback(f => fileName            = f.NormDirSeparator());
            parser.Setup <string>('l', "languages").Callback(l => languagesString = l);
            parser.Setup <string>('p', "patterns").Callback(p =>
                                                            escapedPatterns = p.EndsWith(".json", StringComparison.OrdinalIgnoreCase)
                    ? p.NormDirSeparator()
                    : p.Replace('\\', '/')
                                                            );
            parser.Setup <int>('t', "threads").Callback(t => threadCount                    = t);
            parser.Setup <Stage>('s', "stage").Callback(s => stage                          = s);
            parser.Setup <int>("max-stack-size").Callback(mss => maxStackSize               = mss);
            parser.Setup <int>("max-timespan").Callback(mt => maxTimespan                   = mt);
            parser.Setup <int>('m', "memory").Callback(m => memoryConsumptionMb             = m);
            parser.Setup <string>("logs-dir").Callback(lp => logsDir                        = lp.NormDirSeparator());
            parser.Setup <bool>("log-errors").Callback(le => logErrors                      = le);
            parser.Setup <bool>("log-debugs").Callback(ld => logDebugs                      = ld);
            parser.Setup <bool>('v', "version").Callback(v => showVersion                   = v);
            parser.Setup <bool>("dump-ust").Callback(param => isDumpUst                     = param);
            parser.Setup <bool>("indented-ust").Callback(param => isIndentedUst             = param);
            parser.Setup <bool>("text-spans-ust").Callback(param => isIncludeTextSpansInUst = param);
            parser.Setup <bool>("preprocess-ust").Callback(param => isPreprocess            = param);

            ILogger logger = new ConsoleLogger();
            string  commandLineArguments = "Command line arguments" + (args.Length > 0
                ? ": " + string.Join(" ", args)
                : " are not defined.");

            var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString();
            var argsWithUsualSlashes = args.Select(arg => arg.Replace('/', '\\')).ToArray(); // TODO: bug in FluentCommandLineParser.
            var parsingResult        = parser.Parse(argsWithUsualSlashes);

            if (!parsingResult.HasErrors)
            {
                if (isDumpUst)
                {
                    stage  = Stage.Convert;
                    logger = new DummyLogger();
                }

                try
                {
                    if (showVersion)
                    {
                        logger.LogInfo($"PT.PM version: {version}");
                    }

                    var abstractLogger = logger as AbstractLogger;
                    if (abstractLogger != null)
                    {
                        abstractLogger.LogsDir     = logsDir;
                        abstractLogger.IsLogErrors = logErrors;
                        abstractLogger.IsLogDebugs = logDebugs;
                        abstractLogger.LogInfo(commandLineArguments);
                    }

                    if (string.IsNullOrEmpty(fileName) && string.IsNullOrEmpty(escapedPatterns))
                    {
                        throw new ArgumentException("at least --files or --patterns parameter required");
                    }

                    if (string.IsNullOrEmpty(fileName))
                    {
                        stage = Stage.Patterns;
                    }

                    LanguageFlags         languages = LanguageExt.ParseLanguages(languagesString);
                    ISourceCodeRepository sourceCodeRepository;
                    if (Directory.Exists(fileName))
                    {
                        sourceCodeRepository = new FilesAggregatorCodeRepository(fileName, LanguageExt.GetExtensions(languages));
                    }
                    else
                    {
                        sourceCodeRepository = new FileCodeRepository(fileName);
                    }
                    logger.SourceCodeRepository = sourceCodeRepository;

                    IPatternsRepository patternsRepository;
                    if (string.IsNullOrEmpty(escapedPatterns))
                    {
                        patternsRepository = new DefaultPatternRepository();
                    }
                    else if (escapedPatterns.EndsWith(".json"))
                    {
                        patternsRepository = new FilePatternsRepository(escapedPatterns);
                    }
                    else
                    {
                        var patterns = StringCompressorEscaper.UnescapeDecompress(escapedPatterns);
                        patternsRepository = new JsonPatternsRepository(patterns);
                    }

                    var workflow = new Workflow(sourceCodeRepository, languages, patternsRepository, stage)
                    {
                        Logger                 = logger,
                        ThreadCount            = threadCount,
                        MaxStackSize           = maxStackSize,
                        MaxTimespan            = maxTimespan,
                        MemoryConsumptionMb    = memoryConsumptionMb,
                        IsIncludePreprocessing = isPreprocess
                    };
                    var            stopwatch      = Stopwatch.StartNew();
                    WorkflowResult workflowResult = workflow.Process();
                    stopwatch.Stop();

                    if (isDumpUst)
                    {
                        DumpUst(isIndentedUst, isIncludeTextSpansInUst, workflowResult);
                    }

                    if (stage != Stage.Patterns)
                    {
                        logger.LogInfo("Scan completed.");
                        if (stage == Stage.Match)
                        {
                            logger.LogInfo($"{"Matches count: ",-22} {workflowResult.MatchingResults.Count()}");
                        }
                    }
                    else
                    {
                        logger.LogInfo("Patterns checked.");
                    }
                    logger.LogInfo($"{"Errors count: ",-22} {workflowResult.ErrorCount}");
                    var workflowLoggerHelper = new WorkflowLoggerHelper(logger, workflowResult);
                    workflowLoggerHelper.LogStatistics();
                    logger.LogInfo($"{"Time elapsed:",-22} {stopwatch.Elapsed}");
                }
                catch (Exception ex)
                {
                    if (logger != null)
                    {
                        var abstractLogger = logger as AbstractLogger;
                        if (abstractLogger != null)
                        {
                            abstractLogger.IsLogErrors = true;
                        }
                        logger.LogError(ex);
                    }
                }
                finally
                {
                    var disposableLogger = logger as IDisposable;
                    if (disposableLogger != null)
                    {
                        disposableLogger.Dispose();
                    }
                }
            }
            else
            {
                Console.WriteLine($"PT.PM version: {version}");
                Console.WriteLine(commandLineArguments);
                Console.WriteLine("Command line arguments processing error: " + parsingResult.ErrorText);
            }
        }