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); }
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() }; }
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() }; }
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")); }
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."); } }
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)); }
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")); }
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")); }
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")); }
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); }
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)); }); }