コード例 #1
0
        public static MatchingResultDto[] GetMatchings(string code, string pattern, LanguageFlags analyzedLanguages,
                                                       LanguageFlags?patternLanguages = null)
        {
            var sourceCodeRep = new MemoryCodeRepository(code);
            var patternsRep   = new MemoryPatternsRepository();
            var workflow      = new Workflow(sourceCodeRep, analyzedLanguages, patternsRep)
            {
                Logger = new LoggerMessageCounter()
            };

            var processor   = new DslProcessor();
            var patternNode = (PatternNode)processor.Deserialize(pattern, patternLanguages ?? LanguageExt.AllPatternLanguages);
            var p           = new Pattern
            {
                Data      = patternNode,
                DebugInfo = pattern
            };
            var patternsConverter = new PatternConverter(
                new JsonUstNodeSerializer(typeof(UstNode), typeof(PatternVarDef)));

            patternsRep.Add(patternsConverter.ConvertBack(new List <Pattern>()
            {
                p
            }));
            WorkflowResult workflowResult = workflow.Process();

            MatchingResultDto[] matchingResults = workflowResult.MatchingResults.ToDto(workflow.SourceCodeRepository)
                                                  .OrderBy(r => r.PatternKey)
                                                  .ToArray();

            return(matchingResults);
        }
コード例 #2
0
 public void Init()
 {
     patternsConverter = new PatternConverter(
         new JsonUstNodeSerializer(typeof(UstNode), typeof(PatternVarDef)));
     patternsRep   = new MemoryPatternsRepository();
     sourceCodeRep = new MemoryCodeRepository(
         "<?php \n" +
         "test_call_0();\n" +
         "test_call_1(a);\n" +
         "test_call_2(a, e);\n" +
         "test_call_3(c, d, a);\n" +
         "test_call_4(c, d, a, e);\n" +
         "\n" +
         "$password = a;\n" +
         "call_with_password_param(1, $password, 2);\n" +
         "\n" +
         "$password2 = \"1234\";\n" +
         "if ($password2->Length > 0) { }\n" +
         "test_call_5(1, $password2, 2);"
         );
     workflow = new Workflow(sourceCodeRep, Language.Php, patternsRep)
     {
         Logger = new LoggerMessageCounter()
     };
 }
コード例 #3
0
        public void Init()
        {
            patternsConverter  = new PatternConverter();
            patternsRepository = new MemoryPatternsRepository();
            sourceCodeRep      = new MemoryCodeRepository(
                "<?php \n" +
                "test_call_0();\n" +
                "test_call_1(a);\n" +
                "test_call_2(a, e);\n" +
                "test_call_3(c, d, a);\n" +
                "test_call_4(c, d, a, e);\n" +
                "\n" +
                "$password = a;\n" +
                "call_with_password_param(1, $password, 2);\n" +
                "\n" +
                "$password2 = \"1234\";\n" +
                "if ($password2->Length > 0) { }\n" +
                "test_call_5(1, $password2, 2);\n" +
                "$concat = \"111\" .\n" +
                "   \"222222222\"   .  \n" +
                "  \"333\";",

                "samples.php"
                );
            workflow = new Workflow(sourceCodeRep, patternsRepository)
            {
                Logger = new LoggerMessageCounter()
            };
        }
コード例 #4
0
        public void Simplify_PhpCodeWithConstants_ConstantsFolded()
        {
            var sourceCodeRep = new MemoryCodeRepository(
                "<?php\r\n" +
                "echo 'Hello ' . 'World' . '!';\r\n" +
                "echo 60 * 60 * 24;\r\n" +
                "echo 6 + 6 * 6;\r\n" +
                "$a = -3;\r\n" +
                "$b = -3.1;",

                "constants.php"
                );
            var logger   = new LoggerMessageCounter();
            var workflow = new Workflow(sourceCodeRep, stage: Stage.Ust)
            {
                IsSimplifyUst = true,
                Logger        = logger
            };

            workflow.Process();

            Assert.IsTrue(logger.ContainsDebugMessagePart("Hello World!"));
            Assert.IsTrue(logger.ContainsDebugMessagePart("86400"));
            Assert.IsTrue(logger.ContainsDebugMessagePart("42"));
            Assert.IsTrue(logger.ContainsDebugMessagePart("-3"));
            Assert.IsTrue(logger.ContainsDebugMessagePart("-3.1"));
        }
コード例 #5
0
        public void Convert_JavaArrayInitialization()
        {
            var sourceCodeRep = new MemoryCodeRepository(
                "class ArrayInitialization {\r\n" +
                "public void init() {\r\n" +
                "int[] arr1 = new int[] { 1, 2, 3 };\r\n" +
                "int[][] arr2 = new int[1][2];\r\n" +
                "int[][] arr3 = new int[1][];\r\n" +
                "}\r\n" +
                "}",

                "ArrayInitialization.java"
                );

            var workflow = new Workflow(sourceCodeRep, stage: Stage.Ust)
            {
                IsSimplifyUst = false
            };
            var workflowResult = workflow.Process();
            var ust            = workflowResult.Usts.First();
            var intType        = new TypeToken("int");

            var arrayData = new List <Tuple <List <Expression>, List <Expression> > >();

            // new int[] { 1, 2, 3 };
            arrayData.Add(new Tuple <List <Expression>, List <Expression> >(
                              Enumerable.Range(1, 3).Select(num => new IntLiteral(num)).ToList <Expression>(),
                              new List <Expression> {
                new IntLiteral(0)
            }
                              ));
            // new int[1][2];
            arrayData.Add(new Tuple <List <Expression>, List <Expression> >(
                              null,
                              new List <Expression> {
                new IntLiteral(1), new IntLiteral(2)
            }
                              ));
            // new int[1][];
            arrayData.Add(new Tuple <List <Expression>, List <Expression> >(
                              null,
                              new List <Expression> {
                new IntLiteral(1), new IntLiteral(0)
            }
                              ));

            for (var i = 0; i < arrayData.Count; i++)
            {
                var data = arrayData[i];
                var arrayCreationExpression = new ArrayCreationExpression
                {
                    Type         = intType,
                    Initializers = data.Item1,
                    Sizes        = data.Item2
                };
                bool exist = ust.AnyDescendant(node => node.Equals(arrayCreationExpression));
                Assert.IsTrue(exist, "Test failed on " + i + " iteration.");
            }
        }
コード例 #6
0
ファイル: LanguageTests.cs プロジェクト: smartfish/PT.PM
        public void IgnoreFileDueToAnalyzedLanguages()
        {
            var sourceCodeRepository = new MemoryCodeRepository("");

            sourceCodeRepository.Languages = new HashSet <Language> {
                PlSql.Language, TSql.Language
            };
            Assert.IsTrue(sourceCodeRepository.IsFileIgnored(Path.Combine(TestUtility.TestsDataPath, "Patterns.php"), true));
        }
コード例 #7
0
        public void Preprocess_CodeWithConstants_ConstantsFolded()
        {
            var sourceCodeRep = new MemoryCodeRepository(
                "<?php\r\n" +
                "echo 'Hello ' . 'World' . '!';\r\n" +
                "echo 60 * 60 * 24;\r\n" +
                "echo 6 + 6 * 6;"
                );
            var logger   = new LoggerMessageCounter();
            var workflow = new Workflow(sourceCodeRep, Language.Php, stage: Stage.Preprocess);

            workflow.IsIncludePreprocessing = true;
            workflow.Logger = logger;
            workflow.Process();

            Assert.IsTrue(logger.ContainsDebugMessagePart("Hello World!"));
            Assert.IsTrue(logger.ContainsDebugMessagePart("86400"));
            Assert.IsTrue(logger.ContainsDebugMessagePart("42"));
        }
コード例 #8
0
        public void Convert_Char_StringLiteralWithoutQuotes()
        {
            var sourceCodeRep = new MemoryCodeRepository(
                @"class foo {
                    bar() {
                        obj.f1 = 'a';
                        obj.f2 = ""'b'"";
                    }
                }",

                "StringLiteralWithoutQuotes.java"
                );

            var workflow       = new Workflow(sourceCodeRep, stage: Stage.Ust);
            var workflowResult = workflow.Process();
            var ust            = workflowResult.Usts.First();

            Assert.IsTrue(ust.AnyDescendant(ustNode =>
                                            ustNode is StringLiteral stringLiteral && stringLiteral.Text == "a"));
        }
コード例 #9
0
        public void Simplify_JavaCodeWithConstantCharArray_ArrayFolded()
        {
            var sourceCodeRep = new MemoryCodeRepository(
                "class Wrapper {\r\n" +
                "  public void init() {\r\n" +
                "    char[] array = { 'n', 'o', 'n', 'e' };\r\n" +
                "  }\r\n" +
                "}",

                "constantCharArray.java"
                );

            var workflow = new Workflow(sourceCodeRep, stage: Stage.Ust)
            {
                IsSimplifyUst = true
            };
            var ust = workflow.Process().Usts.First();

            Assert.IsTrue(ust.AnyDescendant(
                              node => node is StringLiteral str && str.Text == "none"));
        }
コード例 #10
0
        public static MatchResultDto[] GetMatches(string code, string pattern,
                                                  IEnumerable <Language> analyzedLanguages,
                                                  IEnumerable <Language> patternLanguages = null)
        {
            var sourceCodeRep = new MemoryCodeRepository(code)
            {
                Languages = new HashSet <Language>(analyzedLanguages)
            };
            var patternsRep = new MemoryPatternsRepository();
            var workflow    = new Workflow(sourceCodeRep, patternsRep)
            {
                Logger = new LoggerMessageCounter()
            };

            var         processor   = new DslProcessor();
            PatternRoot patternNode = processor.Deserialize(new CodeFile(pattern)
            {
                IsPattern = true
            });

            patternNode.Languages = new HashSet <Language>(patternLanguages ?? LanguageUtils.PatternLanguages.Values);
            patternNode.DebugInfo = pattern;
            var patternsConverter = new PatternConverter();

            patternsRep.Add(patternsConverter.ConvertBack(new List <PatternRoot>()
            {
                patternNode
            }));
            WorkflowResult workflowResult = workflow.Process();

            MatchResultDto[] matchResults = workflowResult.MatchResults.ToDto()
                                            .OrderBy(r => r.PatternKey)
                                            .ToArray();

            return(matchResults);
        }
コード例 #11
0
ファイル: MainWindowViewModel.cs プロジェクト: Yikez978/PT.PM
        internal void UpdateMatchings()
        {
            sourceCodeLogger.Clear();

            var sourceCodeRep = new MemoryCodeRepository(sourceCodeTextBox.Text);
            IPatternsRepository patternRepository;

            if (!string.IsNullOrEmpty(ServiceLocator.PatternViewModel.Value))
            {
                patternRepository = new DslPatternRepository(ServiceLocator.PatternViewModel.Value, ServiceLocator.PatternViewModel.Languages);
            }
            else
            {
                patternRepository = new MemoryPatternsRepository();
            }
            var workflow = new Workflow(sourceCodeRep, SelectedLanguage, patternRepository, stage: Stage);

            workflow.IsIncludeIntermediateResult = true;
            workflow.Logger = sourceCodeLogger;
            WorkflowResult workflowResult = workflow.Process();

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

            if (IsDeveloperMode)
            {
                AntlrParseTree antlrParseTree = workflowResult.ParseTrees.FirstOrDefault() as AntlrParseTree;
                if (antlrParseTree != null && antlrParseTree.SyntaxTree != null)
                {
                    Antlr4.Runtime.Parser antlrParser = (workflow.ParserConverterSets[antlrParseTree.SourceLanguage].Parser as AntlrParser).Parser;
                    string tokensString = AntlrHelper.GetTokensString(antlrParseTree.Tokens, antlrParser.Vocabulary, onlyDefaultChannel: true);
                    string treeString   = antlrParseTree.SyntaxTree.ToStringTreeIndented(antlrParser);

                    Tokens    = tokensString;
                    ParseTree = treeString;
                    File.WriteAllText(Path.Combine(ServiceLocator.TempDirectory, "Tokens.txt"), Tokens);
                    File.WriteAllText(Path.Combine(ServiceLocator.TempDirectory, "Tree.txt"), ParseTree);
                }
                if (Stage >= Stage.Convert && workflowResult.Usts.FirstOrDefault() != null)
                {
                    UstJson = jsonSerializer.Serialize(workflowResult.Usts.FirstOrDefault().Root);
                    File.WriteAllText(Path.Combine(ServiceLocator.TempDirectory, "UST.json"), UstJson);
                }
            }

            MatchingResultText = "MATCHINGS";
            if (matchingResults.Count() > 0)
            {
                MatchingResultText += " (" + matchingResults.Count() + ")";
            }

            if (sourceCodeLogger.ErrorCount == 0)
            {
                SourceCodeErrorsIsVisible = false;
                SourceCodeErrorsText      = "ERRORS";
            }
            else
            {
                SourceCodeErrorsIsVisible = true;
                SourceCodeErrorsText      = $"ERRORS ({sourceCodeLogger.ErrorCount})";
            }

            Dispatcher.UIThread.InvokeAsync(() =>
            {
                MatchingResults.Clear();
                foreach (var matchingResult in matchingResults)
                {
                    MatchingResults.Add(new MathingResultDtoWrapper(matchingResult));
                }
                this.RaisePropertyChanged(nameof(Tokens));
                this.RaisePropertyChanged(nameof(ParseTree));
                this.RaisePropertyChanged(nameof(UstJson));
                this.RaisePropertyChanged(nameof(MatchingResultText));
                this.RaisePropertyChanged(nameof(SourceCodeErrorsIsVisible));
                this.RaisePropertyChanged(nameof(SourceCodeErrorsText));
            });
        }