ImportTransformer   A
last analyzed

Complexity

Total Complexity 3

Size/Duplication

Total Lines 12
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
c 2
b 0
f 0
dl 0
loc 12
rs 10
wmc 3

2 Methods

Rating   Name   Duplication   Size   Complexity  
A visit_ImportFrom() 0 5 2
A visit_Module() 0 4 1
1
import ast
2
3
4
def add_imports(node):
5
    """Provide context of imports Module"""
6
    return ImportTransformer().visit(node)
7
8
9
def is_void_function(fun):
10
    finder = ReturnFinder()
11
    finder.visit(fun)
12
    return not finder.returns
13
14
15
class ReturnFinder(ast.NodeVisitor):
16
    returns = False
17
18
    def visit_Return(self, node):
19
        self.returns = True
20
21
22
class FunctionTransformer(ast.NodeTransformer):
23
    """Tracks defined functions in scope"""
24
    def visit_Module(self, node):
25
        node.defined_functions = []
26
        self.generic_visit(node)
27
        return node
28
29
    def visit_FunctionDef(self, node):
30
        node.defined_functions = []
31
        node.scopes[-2].defined_functions.append(node)
32
        self.generic_visit(node)
33
        return node
34
35
    def visit_ImportFrom(self, node):
36
        for name in node.names:
37
            node.scopes[-1].defined_functions.append(name)
38
        return node
39
40
41
class CalledWithTransformer(ast.NodeTransformer):
42
    """
43
    Tracks whether variables or functions get
44
    used as arguments of other functions
45
    """
46
    def visit_Assign(self, node):
47
        for target in node.targets:
48
            target.called_with = []
49
        return node
50
51
    def visit_FunctionDef(self, node):
52
        node.called_with = []
53
        self.generic_visit(node)
54
        return node
55
56
    def visit_Call(self, node):
57
        for arg in node.args:
58
            if isinstance(arg, ast.Name):
59
                var = node.scopes.find(arg.id)
60
                var.called_with.append(node)
61
        self.generic_visit(node)
62
        return node
63
64
65
class AttributeCallTransformer(ast.NodeTransformer):
66
    """Tracks attribute function calls on variables"""
67
    def visit_Assign(self, node):
68
        for target in node.targets:
69
            target.calls = []
70
        return node
71
72
    def visit_Call(self, node):
73
        if isinstance(node.func, ast.Attribute):
74
            var = node.scopes.find(node.func.value.id)
75
            var.calls.append(node)
76
        return node
77
78
79
class ImportTransformer(ast.NodeTransformer):
80
    """Adds imports to scope block"""
81
    def visit_ImportFrom(self, node):
82
        for name in node.names:
83
            name.imported_from = node
84
            name.scopes[-1].imports.append(name)
85
        return node
86
87
    def visit_Module(self, node):
88
        node.imports = []
89
        self.generic_visit(node)
90
        return node
91