[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[elpa] externals/phpinspect ad12203a91 003/126: Add more parts of phpns
From: |
ELPA Syncer |
Subject: |
[elpa] externals/phpinspect ad12203a91 003/126: Add more parts of phpns that were apparently still required |
Date: |
Sat, 12 Aug 2023 00:58:35 -0400 (EDT) |
branch: externals/phpinspect
commit ad12203a91c1c6fc5c79de28e39a99cb402cd573
Author: Hugo Thunnissen <hugo@hugot.nl>
Commit: Hugo Thunnissen <hugo@hugot.nl>
Add more parts of phpns that were apparently still required
---
phpinspect-index.bash | 124 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 122 insertions(+), 2 deletions(-)
diff --git a/phpinspect-index.bash b/phpinspect-index.bash
index 2b55f13367..3dfe796094 100755
--- a/phpinspect-index.bash
+++ b/phpinspect-index.bash
@@ -167,6 +167,15 @@ execute() {
echo "$(fixMissingUseStatements "$file")" > "$file"
fi
;;
+ ns | namespace)
+ checkCache
+ declare file="$1"
+
+ # Try the index, if that doesn't work, attempt to extract the
namespace from the file itself.
+ if ! grep "(?<=$file:).*" "$NAMESPACE_FILE_PATHS"; then
+ grep -Po '(?<=^namespace[[:blank:]])[A-Za-z_\\]+' "$file"
+ fi
+ ;;
cns | classes-in-namespace)
handleArguments classes-in-namespace "$@" || return $?
checkCache
@@ -183,7 +192,7 @@ execute() {
grep -Po "^.*(?=:${CONFIG[$CLASS_PATH]//\\/\\\\}$)" "$FILE_PATHS"
;;
*)
- printf 'Command "%s" is not a valid phpns command.\n' "$command"
>&2
+ printf 'Command "%s" is not a valid subcommand.\n' "$command" >&2
exit 1
;;
esac
@@ -191,7 +200,7 @@ execute() {
# shellcheck disable=SC2034
fixMissingUseStatements() {
- declare check_uses='false' check_needs='false' file="$1"
+ declare check_uses='false' check_needs='false' file="$1" namespace="$2"
declare -A uses=() needs=() namespace=()
declare -a classes=()
@@ -634,6 +643,7 @@ fillIndex() {
[[ -n $NAMESPACES ]] || return 1
[[ -n $USES ]] || return 1
[[ -n $USES_LOOKUP ]] || return 1
+ [[ -n $USES_LOOKUP_OWN ]] || return 1
[[ -n $FILE_PATHS ]] || return 1
[[ -n $NAMESPACE_FILE_PATHS ]] || return 1
[[ -n $INDEXED ]] || return 1
@@ -723,4 +733,114 @@ checkCache() {
fi
}
+##
+# Find use statements and needed classes in a file.
+
+findUsesAndNeeds() {
+ declare -p needs &>>/dev/null || return 1
+ declare -p uses &>>/dev/null || return 1
+ # shellcheck disable=SC2154
+ declare -p namespace &>>/dev/null || return 1
+
+ while read -r line; do
+ [[ $line == namespace* ]] && check_uses='true'
+ if [[ $line == ?(@(abstract|final) )@(class|interface|trait)* ]]; then
+ check_uses='false'
+ check_needs='true'
+
+ read -ra line_array <<<"$line"
+ set -- "${line_array[@]}"
+ while shift && [[ "$1" != @(extends|implements) ]]; do :; done;
+ while shift && [[ -n $1 ]]; do
+ [[ $1 == 'implements' ]] && shift
+ [[ $1 == \\* ]] || _set_needed_if_not_used "$1"
+ done
+ fi
+
+ if $check_uses; then
+ if [[ $line == use* ]]; then
+ declare class_name="${line##*\\}"
+ [[ $class_name == *as* ]] && class_name="${class_name##*as }"
+ debug "Class name: $class_name"
+ class_name="${class_name%%[^a-zA-Z]*}"
+ uses["$class_name"]='used'
+ fi
+ fi
+
+ if $check_needs; then
+ if [[ $line == *function*([[:space:]])*([[:alnum:]_])\(* ]]; then
+ _check_function_needs "$line"
+ continue
+ fi
+ _check_needs "$line"
+ fi
+ done
+}
+
+_check_function_needs() {
+ # Strip everything up until function name and argument declaration.
+ declare line="${1#*function}" function_declaration="${1#*function}"
+
+ # Collect the entire argument declaration
+ while [[ $line != *'{'* ]] && read -r line; do
+ function_declaration="$function_declaration $line"
+ done
+
+ declare -a words=()
+ read -ra words <<<"$function_declaration"
+ for i in "${!words[@]}"; do
+ if [[ "${words[$i]}" =~ ^'$'[a-zA-Z_]+ ]]; then
+ declare prev_word="${words[$((i-1))]}"
+ if [[ $prev_word =~ ^([^\(]*\()?([A-Za-z]+)$ ]]; then
+ declare class_name="${BASH_REMATCH[2]}"
+ debugf 'Found parameter type "%s" for function "%s"\n'
"$class_name" "$function_declaration"
+ _set_needed_if_not_used "$class_name"
+ fi
+ fi
+ done
+ if [[ "$function_declaration" =~ \):[[:space:]]+([a-zA-Z]+) ]]; then
+ declare class_name="${BASH_REMATCH[1]}"
+ debugf 'Found return type "%s" for function "%s"\n' "$class_name"
"$function_declaration"
+ _set_needed_if_not_used "$class_name"
+ fi
+}
+
+_check_needs() {
+ declare line="$1" match=''
+ if _line_matches "$line"; then
+ declare class_name="${match//[^a-zA-Z]/}"
+
+ debugf 'Extracted type "%s" from line "%s". Entire match: "%s"\n'
"$class_name" "$line" "${BASH_REMATCH[0]}"
+ _set_needed_if_not_used "$class_name"
+
+ line="${line/"${BASH_REMATCH[0]/}"}"
+ _check_needs "$line"
+ fi
+}
+
+# shellcheck disable=SC2049
+_line_matches() {
+ if [[ $line =~ 'new'[[:space:]]+([^\\][A-Za-z]+)\( ]] \
+ || [[ $line =~ 'instanceof'[[:space:]]+([A-Za-z]+) ]] \
+ || [[ $line =~ catch[[:space:]]*\(([A-Za-z]+) ]] \
+ || [[ $line =~ \*[[:blank:]]*@([A-Z][a-zA-Z]*) ]]; then
+ match="${BASH_REMATCH[1]}"
+ return $?
+ elif [[ $line =~ @(var|param|return|throws)[[:space:]]+([A-Za-z]+) ]] \
+ || [[ $line =~ (^|[\(\[\{[:blank:]])([A-Za-z]+)'::' ]]; then
+ match="${BASH_REMATCH[2]}"
+ return $?
+ fi
+ return 1
+}
+
+_set_needed_if_not_used() {
+ declare class_name="$1"
+ if [[ -z ${uses["$class_name"]} ]] \
+ && [[ -z ${namespace["$class_name"]} ]] \
+ && [[ "$class_name" !=
@(static|self|string|int|float|array|object|bool|mixed|parent|void) ]]; then
+ needs["$class_name"]='needed'
+ fi
+}
+
execute "$@"
- [elpa] branch externals/phpinspect created (now 3175d9a6ac), ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 681f13d4de 001/126: Initial commit: Move out of personal dotfile repository., ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect ad12203a91 003/126: Add more parts of phpns that were apparently still required,
ELPA Syncer <=
- [elpa] externals/phpinspect d6c63ef6f4 004/126: Truncate "uses_own" index file before filling the index, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect bbc37bea32 007/126: Update README code format and to use setq-local, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect f7c2a49b25 008/126: Remove dependency on php-project.el, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 098146bfc5 014/126: Add resolvecontext structure and optimze type resolving process, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect e07e1ed9e6 033/126: WIP: Split code up into separate files, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 6b8db3a318 028/126: Test and fix eldoc function for static methods, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 4c2b3dd601 019/126: Only attempt to return the inside class name when it is non-nil, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect a2ce841555 038/126: WIP: Make index thread block/wakeup when queue is empty/populated, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 56eaa3b36d 046/126: Replace index-thread with more generic and encapsulated worker type, ELPA Syncer, 2023/08/12
- [elpa] externals/phpinspect 0c0c1ca381 059/126: Add test for phpinspect-get-pattern-type-in-block, ELPA Syncer, 2023/08/12