public State(FileAnalyzer fileAnalyzer, CodeClass codeClass, CodeMethod codeMethod) { this.FileAnalyzer = fileAnalyzer; this.CodeClass = codeClass; this.CodeMethod = codeMethod; this.IsEvil = false; foreach (string scaryMethod in Util.ScaryMethodNames) { if (this.CodeMethod.Code.Contains(scaryMethod)) { this.IsEvil = true; this.ScaryMethodUsed = scaryMethod; break; } } }
private void Analyze(IEnumerable<AstNode> nodes) { foreach (AstNode node in nodes) { string code = node.ToString(); string typeName = node.GetType().Name; if (typeName.CompareTo("TypeDeclaration") == 0) { CodeClass codeClass = new CodeClass(FindNext(node.Children, "Identifier"), code); CodeClasses.Add(codeClass); } else if (typeName.CompareTo("FieldDeclaration") == 0) { CodeField f = new CodeField(FindNext(node.Children, "Identifier"), code); CodeClasses.Last().CodeFields.Add(f); } else if (typeName.CompareTo("MethodDeclaration") == 0) { CodeMethod m = new CodeMethod(FindNext(node.Children, "Identifier"), code); CodeClasses.Last().CodeMethods.Add(m); } else if (typeName.CompareTo("InvocationExpression") == 0) { CodeInvocation i = new CodeInvocation(Util.ParseMethodNameFromInvocation(code), code); if (CodeClasses.Count > 0) { if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeInvocations.Add(i); } else { CodeClasses.Last().CodeInvocations.Add(i); } } } else if (typeName.CompareTo("VariableDeclarationStatement") == 0) { CodeVariableDeclarationStatement s = new CodeVariableDeclarationStatement(FindNext(node.Children, "Identifier"), code); if (CodeClasses.Count > 0) { if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeVariableDeclarationStatements.Add(s); } else { CodeClasses.Last().CodeVariableDeclarationStatements.Add(s); } } } else if (typeName.CompareTo("VariableInitializer") == 0) { CodeVariableInitializer s = new CodeVariableInitializer(FindNext(node.Children, "Identifier"), code); // if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeVariableInitializers.Add(s); } else { CodeClasses.Last().CodeVariableInitializers.Add(s); } } else if (typeName.CompareTo("ParameterDeclaration") == 0) { try { CodeParameterDeclaration p = new CodeParameterDeclaration(FindNext(node.Children, "Identifier"), code); if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeParameterDeclarations.Add(p); } } catch (Exception) // masking this. basically, it's adding a variable to a global namespace but since there aren't any classes defined yet this is problematic. { } } else if (typeName.CompareTo("AssignmentExpression") == 0) { try { CodeAssignmentExpression codeAssignmentExpression = new CodeAssignmentExpression(FindNext(node.Children, "IdentifierExpression"), code); if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeAssignmentExpressions.Add(codeAssignmentExpression); } } catch (Exception) { } } if (node.Children.Count() > 0) { Analyze(node.Children); } } }
private void Analyze(IEnumerable <AstNode> nodes) { foreach (AstNode node in nodes) { string code = node.ToString(); string typeName = node.GetType().Name; if (typeName.CompareTo("TypeDeclaration") == 0) { CodeClass codeClass = new CodeClass(FindNext(node.Children, "Identifier"), code); CodeClasses.Add(codeClass); } else if (typeName.CompareTo("FieldDeclaration") == 0) { CodeField f = new CodeField(FindNext(node.Children, "Identifier"), code); CodeClasses.Last().CodeFields.Add(f); } else if (typeName.CompareTo("MethodDeclaration") == 0) { CodeMethod m = new CodeMethod(FindNext(node.Children, "Identifier"), code); CodeClasses.Last().CodeMethods.Add(m); } else if (typeName.CompareTo("InvocationExpression") == 0) { CodeInvocation i = new CodeInvocation(Util.ParseMethodNameFromInvocation(code), code); if (CodeClasses.Count > 0) { if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeInvocations.Add(i); } else { CodeClasses.Last().CodeInvocations.Add(i); } } } else if (typeName.CompareTo("VariableDeclarationStatement") == 0) { CodeVariableDeclarationStatement s = new CodeVariableDeclarationStatement(FindNext(node.Children, "Identifier"), code); if (CodeClasses.Count > 0) { if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeVariableDeclarationStatements.Add(s); } else { CodeClasses.Last().CodeVariableDeclarationStatements.Add(s); } } } else if (typeName.CompareTo("VariableInitializer") == 0) { CodeVariableInitializer s = new CodeVariableInitializer(FindNext(node.Children, "Identifier"), code); // if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeVariableInitializers.Add(s); } else { CodeClasses.Last().CodeVariableInitializers.Add(s); } } else if (typeName.CompareTo("ParameterDeclaration") == 0) { try { CodeParameterDeclaration p = new CodeParameterDeclaration(FindNext(node.Children, "Identifier"), code); if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeParameterDeclarations.Add(p); } } catch (Exception) // masking this. basically, it's adding a variable to a global namespace but since there aren't any classes defined yet this is problematic. { } } else if (typeName.CompareTo("AssignmentExpression") == 0) { try { CodeAssignmentExpression codeAssignmentExpression = new CodeAssignmentExpression(FindNext(node.Children, "IdentifierExpression"), code); if (CodeClasses.Last().CodeMethods.Count > 0) { CodeClasses.Last().CodeMethods.Last().CodeAssignmentExpressions.Add(codeAssignmentExpression); } } catch (Exception) { } } if (node.Children.Count() > 0) { Analyze(node.Children); } } }