Completed
Push — add/connection-ui-build ( ad0bc7...49effe )
by
unknown
14:44 queued 03:33
created

CoreDefinitions   A

Complexity

Total Complexity 20

Size/Duplication

Total Lines 115
Duplicated Lines 13.91 %

Coupling/Cohesion

Components 0
Dependencies 5

Importance

Changes 0
Metric Value
dl 16
loc 115
rs 10
c 0
b 0
f 0
wmc 20
lcom 0
cbo 5

2 Methods

Rating   Name   Duplication   Size   Complexity  
B callback() 16 52 9
B get_declarations() 0 44 11

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php //phpcs:ignore WordPress.Files.FileName.InvalidClassFileName
2
/**
3
 * Function definition finder script.
4
 *
5
 * @package automattic/jetpack-analyzer
6
 */
7
8
namespace Automattic\Jetpack\Analyzer;
9
10
use Composer\Script\Event;
11
12
/**
13
 * This class holds the callback for the WordPress API function definition finder.
14
 */
15
class CoreDefinitions {
16
17
	/**
18
	 * A static method to handle the Composer script call that
19
	 * triggers a WordPress Core code scan for function and method definitions.
20
	 *
21
	 * @param Composer\Script\Event $event a script call event.
0 ignored issues
show
Documentation introduced by
Should the type for parameter $event not be Event?

This check looks for @param annotations where the type inferred by our type inference engine differs from the declared type.

It makes a suggestion as to what type it considers more descriptive.

Most often this is a case of a parameter that can be null in addition to its declared types.

Loading history...
22
	 */
23
	public static function callback( Event $event ) {
24
		$arguments = $event->getArguments();
25
		$scan_path = isset( $arguments[0] ) ? $arguments[0] : null;
26
		$io        = $event->getIO();
27
28
		if ( is_null( $scan_path ) ) {
29
			$io->writeError( 'WordPress Core path is required for this script to work. Pass it as the argument.' );
30
			return;
31
		}
32
33
		$io->write( "Find invocations\n" );
34
35
		try {
36
			$declarations = self::get_declarations( $scan_path );
37
			foreach ( $declarations->get() as $declaration ) {
38
39
				if ( $declaration instanceof Declarations\Function_ ) {
40
41
					$io->write(
42
						$declaration->func_name . ', ' .
43
						$declaration->path . ', ' .
44
						$declaration->line
45
					);
46 View Code Duplication
				} elseif ( $declaration instanceof Declarations\Class_Property ) {
47
48
					$io->write(
49
						$declaration->class_name . '::' . $declaration->prop_name . ', ' .
50
						$declaration->path . ', ' .
51
						$declaration->line
52
					);
53
				} elseif ( $declaration instanceof Declarations\Class_Method ) {
54
55
					$io->write(
56
						$declaration->class_name . '::' . $declaration->method_name . ', ' .
57
						$declaration->path . ', ' .
58
						$declaration->line
59
					);
60 View Code Duplication
				} elseif ( $declaration instanceof Declarations\Class_Const ) {
61
62
					$io->write(
63
						$declaration->class_name . '::' . $declaration->const_name . ', ' .
64
						$declaration->path . ', ' .
65
						$declaration->line
66
					);
67
				}
68
			}
69
		} catch ( Exception $e ) {
0 ignored issues
show
Bug introduced by
The class Automattic\Jetpack\Analyzer\Exception does not exist. Did you forget a USE statement, or did you not list all dependencies?

Scrutinizer analyzes your composer.json/composer.lock file if available to determine the classes, and functions that are defined by your dependencies.

It seems like the listed class was neither found in your dependencies, nor was it found in the analyzed files in your repository. If you are using some other form of dependency management, you might want to disable this analysis.

Loading history...
70
			$io->writeError( 'Exception caught' );
71
			$io->writeError( $e->getMessage() );
72
			return;
73
		}
74
	}
75
76
	/**
77
	 * Returns an object containing found WordPress core declarations in the scan path.
78
	 * Note: the function simply filters out declarations that are of no interest to us,
79
	 * not really performing any further analysis.
80
	 *
81
	 * @param String $scan_path the file path to scan for declarations in.
82
	 * @return \Automattic\Jetpack\Analyzer\Declarations $declarations object.
83
	 * @throws \Exception $exception on an unhandled declaration found.
84
	 */
85
	public static function get_declarations( string $scan_path ) { // phpcs:ignore PHPCompatibility
86
		$core_declarations = new Declarations();
87
		$core_declarations->scan( $scan_path );
88
		$filtered_declarations = new Declarations();
89
90
		foreach ( $core_declarations->get() as $declaration ) {
91
92
			if ( $declaration instanceof Declarations\Class_ ) {
93
94
				// We are not interested in class definitions.
95
				continue;
96
97
			} elseif (
98
				$declaration instanceof Declarations\Class_Property
99
				&& ! $declaration->static
100
			) {
101
102
				// We are not interested in properties of objects if they are not static.
103
				continue;
104
105
			} elseif (
106
				$declaration instanceof Declarations\Class_Method
107
				&& ! $declaration->static
108
			) {
109
110
				// We are not interested in methods of objects if they are not static.
111
				continue;
112
113
			} elseif (
114
				! (
115
					$declaration instanceof Declarations\Function_
116
					|| $declaration instanceof Declarations\Class_Property
117
					|| $declaration instanceof Declarations\Class_Method
118
					|| $declaration instanceof Declarations\Class_Const
119
				)
120
			) {
121
				throw new \Exception( 'Unhandled declaration of type ' . get_class( $declaration ) );
122
			}
123
124
			$filtered_declarations->add( $declaration );
125
		}
126
127
		return $filtered_declarations;
128
	}
129
}
130