Completed
Push — master ( 69f641...8fff44 )
by Richard
05:35
created

IndexDB::_interface()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 14
Code Lines 10

Duplication

Lines 14
Ratio 100 %

Code Coverage

Tests 12
CRAP Score 1

Importance

Changes 0
Metric Value
dl 14
loc 14
ccs 12
cts 12
cp 1
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 10
nc 1
nop 4
crap 1
1
<?php
2
/******************************************************************************
3
 * An implementation of dicto (scg.unibe.ch/dicto) in and for PHP.
4
 * 
5
 * Copyright (c) 2016 Richard Klees <[email protected]>
6
 *
7
 * This software is licensed under The MIT License. You should have received 
8
 * a copy of the license along with the code.
9
 */
10
11
namespace Lechimp\Dicto\Graph;
12
13
use Lechimp\Dicto\Indexer\Insert;
14
use Lechimp\Dicto\Analysis\Index;
15
16
/**
17
 * A database for the indexer based on graph.
18
 */
19
class IndexDB extends Graph implements Insert, Index {
20
    /**
21
     * @var array<string,Node>
22
     */
23
    protected $globals = [];
24
25
    /**
26
     * @var array<string,Node>
27
     */
28
    protected $language_constructs = []; 
29
30
    /**
31
     * @inheritdocs
32
     */
33 45
    public function _file($path, $source) {
34 45
        assert('is_string($path)');
35 45
        assert('is_string($source)');
36
37 45
        return $this->create_node
38 45
            ( "file"
39 45
            ,   [ "path" => $path
40 45
                , "source" => explode("\n", $source)
41 45
                ]
42 45
            );
43
    }
44
45
    /**
46
     * @inheritdocs
47
     */
48 38 View Code Duplication
    public function _class($name, $file, $start_line, $end_line) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
49 38
        assert('is_string($name)');
50 38
        assert('$file->type() == "file"');
51 38
        assert('is_int($start_line)');
52 38
        assert('is_int($end_line)');
53
54 38
        $class = $this->create_node
55 38
            ( "class"
56 38
            ,   [ "name" => $name
57 38
                ]
58 38
            );
59 38
        $this->add_definition($class, $file, $start_line, $end_line);
60 38
        return $class;
61
    }
62
63
    /**
64
     * @inheritdocs
65
     */
66 2 View Code Duplication
    public function _interface($name, $file, $start_line, $end_line) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
67 2
        assert('is_string($name)');
68 2
        assert('$file->type() == "file"');
69 2
        assert('is_int($start_line)');
70 2
        assert('is_int($end_line)');
71
72 2
        $interface = $this->create_node
73 2
            ( "interface"
74 2
            ,   [ "name" => $name
75 2
                ]
76 2
            );
77 2
        $this->add_definition($interface, $file, $start_line, $end_line);
78 2
        return $interface;
79
    }
80
81
    /**
82
     * @inheritdocs
83
     */
84 31
    public function _method($name, $class, $file, $start_line, $end_line) {
85 31
        assert('is_string($name)');
86 31
        assert('in_array($class->type(), ["class", "interface"])');
87 31
        assert('$file->type() == "file"');
88 31
        assert('is_int($start_line)');
89 31
        assert('is_int($end_line)');
90
91 31
        $method = $this->create_node
92 31
            ( "method"
93 31
            ,   [ "name" => $name
94 31
                ]
95 31
            );
96 31
        $this->add_definition($method, $file, $start_line, $end_line);
97 31
        $this->add_relation($method, "contained in", [], $class);
98 31
        $this->add_relation($class, "contains", [], $method);
99
100 31
        return $method;
101
    }
102
103
    /**
104
     * @inheritdocs
105
     */
106 5 View Code Duplication
    public function _function($name, $file, $start_line, $end_line) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
107 5
        assert('is_string($name)');
108 5
        assert('$file->type() == "file"');
109 5
        assert('is_int($start_line)');
110 5
        assert('is_int($end_line)');
111
112 5
        $function = $this->create_node
113 5
            ( "function"
114 5
            ,   [ "name" => $name
115 5
                ]
116 5
            );
117 5
        $this->add_definition($function, $file, $start_line, $end_line);
118
119 5
        return $function;
120
    }
121
122
    /**
123
     * @inheritdocs
124
     */
125 11 View Code Duplication
    public function _global($name) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
126 11
        assert('is_string($name)');
127
128 11
        if (array_key_exists($name, $this->globals)) {
129 1
            return $this->globals[$name];
130
        }
131
132 11
        $global = $this->create_node("global", ["name" => $name]);
133 11
        $this->globals[$name] = $global;
134
135 11
        return $global;
136
    }
137
138
    /**
139
     * @inheritdocs
140
     */
141 6 View Code Duplication
    public function _language_construct($name) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
142 6
        assert('is_string($name)');
143
144 6
        if (array_key_exists($name, $this->language_constructs)) {
145 1
            return $this->language_constructs[$name];
146
        }
147
148 6
        $language_construct = $this->create_node("language construct", ["name" => $name]);
149 6
        $this->language_constructs[$name] = $language_construct;
150
151 6
        return $language_construct;
152
    }
153
154
    /**
155
     * @inheritdocs
156
     */
157 5 View Code Duplication
    public function _method_reference($name, $file, $line) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
158 5
        assert('is_string($name)');
159 5
        assert('$file->type() == "file"');
160 5
        assert('is_int($line)');
161
162 5
        $method = $this->create_node("method reference", ["name" => $name]);
163 5
        $this->add_relation($method, "referenced at", ["line" => $line], $file);
164
165 5
        return $method;
166
    }
167
168
    /**
169
     * @inheritdocs
170
     */
171 9 View Code Duplication
    public function _function_reference($name, $file, $line) {
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
172 9
        assert('is_string($name)');
173 9
        assert('$file->type() == "file"');
174 9
        assert('is_int($line)');
175
176 9
        $function = $this->create_node("function reference", ["name" => $name]);
177 9
        $this->add_relation($function, "referenced at", ["line" => $line], $file);
178
179 9
        return $function;
180
    }
181
182
    /**
183
     * @inheritdocs
184
     */
185 15
    public function _relation($left_entity, $relation, $right_entity, $file, $line) {
186 15
        assert('$left_entity instanceof \\Lechimp\\Dicto\\Graph\\Node');
187 15
        assert('$right_entity instanceof \\Lechimp\\Dicto\\Graph\\Node');
188 15
        assert('is_string($relation)');
189
190 15
        $props = [];
191 15
        if ($file !== null) {
192 15
            assert('$file->type() == "file"');
193 15
            $props["file"] = $file;
194 15
        }
195 15
        if ($line !== null) {
196 15
            assert('is_int($line)');
197 15
            $props["line"] = $line;
198 15
        }
199
200 15
        $this->add_relation($left_entity, $relation, $props, $right_entity);
201 15
    }
202
203
    // Helper
204
205 42
    protected function add_definition(Node $n, Node $file, $start_line, $end_line) {
206 42
        $this->add_relation
207 42
            ( $n
208 42
            , "defined in"
209 42
            ,   [ "start_line" => $start_line
210 42
                , "end_line" => $end_line
211 42
                ]
212 42
            , $file
213 42
            );
214 42
    }
215
}
216