From 80631930a6ca7b64d96a89de61c8b63f302161a8 Mon Sep 17 00:00:00 2001 From: nsfisis Date: Tue, 4 Aug 2026 05:09:04 +0900 Subject: feat(plugin): generate proxy stubs for the package and repository graph Emit the eleven stubs a subscriber plugin's object-graph calls reach (BasePackage through RootPackage, the installed-repository hierarchy, RepositoryManager, InstallationManager). The generator learns the member kinds these classes need: builtin interfaces contribute no closure entries, public static properties are materialized, public instance properties forward through __get/__set, __toString forwards like a plain method, __clone throws (proxy clone semantics are still an open design question), and a subclass stub may add interfaces to its inherited surface. Co-Authored-By: Claude Fable 5 --- .../stubs/Composer/Repository/ArrayRepository.php | 99 ++++++++++++++++++++++ .../Composer/Repository/FilesystemRepository.php | 34 ++++++++ .../Repository/InstalledArrayRepository.php | 14 +++ .../Repository/InstalledFilesystemRepository.php | 14 +++ .../Composer/Repository/RepositoryManager.php | 89 +++++++++++++++++++ .../Repository/WritableArrayRepository.php | 41 +++++++++ 6 files changed, 291 insertions(+) create mode 100644 crates/shirabe-php-rpc/php/stubs/Composer/Repository/ArrayRepository.php create mode 100644 crates/shirabe-php-rpc/php/stubs/Composer/Repository/FilesystemRepository.php create mode 100644 crates/shirabe-php-rpc/php/stubs/Composer/Repository/InstalledArrayRepository.php create mode 100644 crates/shirabe-php-rpc/php/stubs/Composer/Repository/InstalledFilesystemRepository.php create mode 100644 crates/shirabe-php-rpc/php/stubs/Composer/Repository/RepositoryManager.php create mode 100644 crates/shirabe-php-rpc/php/stubs/Composer/Repository/WritableArrayRepository.php (limited to 'crates/shirabe-php-rpc/php/stubs/Composer/Repository') diff --git a/crates/shirabe-php-rpc/php/stubs/Composer/Repository/ArrayRepository.php b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/ArrayRepository.php new file mode 100644 index 00000000..33454fa2 --- /dev/null +++ b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/ArrayRepository.php @@ -0,0 +1,99 @@ +__rhandle = $rhandle; + $this->__epoch = $epoch; + } + + public function __destruct() + { + \ShirabeRustObjectRegistry::release($this->__rhandle); + } + + public function __shirabeRustHandleDescriptor(): array + { + return [ + '__rhandle' => $this->__rhandle, + '__class' => static::class, + '__epoch' => $this->__epoch, + ]; + } + + public function hasPackage(PackageInterface $package) + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'hasPackage', [$package]); + } + + public function findPackage(string $name, $constraint) + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'findPackage', [$name, $constraint]); + } + + public function findPackages(string $name, $constraint = null) + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'findPackages', [$name, $constraint]); + } + + public function getPackages() + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getPackages', []); + } + + public function loadPackages(array $packageNameMap, array $acceptableStabilities, array $stabilityFlags, array $alreadyLoaded = []) + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'loadPackages', [$packageNameMap, $acceptableStabilities, $stabilityFlags, $alreadyLoaded]); + } + + public function search(string $query, int $mode = 0, ?string $type = null) + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'search', [$query, $mode, $type]); + } + + public function getProviders(string $packageName) + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getProviders', [$packageName]); + } + + public function getRepoName() + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getRepoName', []); + } + + public function addPackage(PackageInterface $package) + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'addPackage', [$package]); + } + + public function removePackage(PackageInterface $package) + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'removePackage', [$package]); + } + + public function count(): int + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'count', []); + } +} diff --git a/crates/shirabe-php-rpc/php/stubs/Composer/Repository/FilesystemRepository.php b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/FilesystemRepository.php new file mode 100644 index 00000000..00e42ac6 --- /dev/null +++ b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/FilesystemRepository.php @@ -0,0 +1,34 @@ + -? \s*+ \d++ (?:\.\d++)? ) + (? true | false | null ) + (? (?&string) (?: \s*+ \. \s*+ (?&string))*+ ) + (? (?: " (?:[^"\\$]*+ | \\ ["\\0] )* " | ' (?:[^'\\]*+ | \\ ['\\] )* ' ) ) + (? array\( \s*+ (?: (?:(?&number)|(?&strings)) \s*+ => \s*+ (?: (?:__DIR__ \s*+ \. \s*+)? (?&strings) | (?&value) ) \s*+, \s*+ )*+ \s*+ \) ) + (? (?: (?&number) | (?&boolean) | (?&strings) | (?&array) ) ) +) +^<\?php\s++return\s++(?&array)\s*+;$}ix +REGEX; + if (is_string($installedVersionsData) && Preg::isMatch($pattern, trim($installedVersionsData))) { + \Composer\InstalledVersions::reload(eval('?>'.Preg::replace('{=>\s*+__DIR__\s*+\.\s*+([\'"])}', '=> '.var_export(dirname($path), true).' . $1', $installedVersionsData))); + + return true; + } + + return false; + } +} diff --git a/crates/shirabe-php-rpc/php/stubs/Composer/Repository/InstalledArrayRepository.php b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/InstalledArrayRepository.php new file mode 100644 index 00000000..6cee4b45 --- /dev/null +++ b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/InstalledArrayRepository.php @@ -0,0 +1,14 @@ +__rhandle, 'isFresh', []); + } +} diff --git a/crates/shirabe-php-rpc/php/stubs/Composer/Repository/InstalledFilesystemRepository.php b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/InstalledFilesystemRepository.php new file mode 100644 index 00000000..f4fb9e2b --- /dev/null +++ b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/InstalledFilesystemRepository.php @@ -0,0 +1,14 @@ +__rhandle, 'isFresh', []); + } +} diff --git a/crates/shirabe-php-rpc/php/stubs/Composer/Repository/RepositoryManager.php b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/RepositoryManager.php new file mode 100644 index 00000000..252bab4d --- /dev/null +++ b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/RepositoryManager.php @@ -0,0 +1,89 @@ +__rhandle = $rhandle; + $this->__epoch = $epoch; + } + + public function __destruct() + { + \ShirabeRustObjectRegistry::release($this->__rhandle); + } + + public function __shirabeRustHandleDescriptor(): array + { + return [ + '__rhandle' => $this->__rhandle, + '__class' => static::class, + '__epoch' => $this->__epoch, + ]; + } + + public function findPackage(string $name, $constraint): ?PackageInterface + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'findPackage', [$name, $constraint]); + } + + public function findPackages(string $name, $constraint): array + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'findPackages', [$name, $constraint]); + } + + public function addRepository(RepositoryInterface $repository): void + { + \ShirabeRpcRuntime::callRust($this->__rhandle, 'addRepository', [$repository]); + } + + public function prependRepository(RepositoryInterface $repository): void + { + \ShirabeRpcRuntime::callRust($this->__rhandle, 'prependRepository', [$repository]); + } + + public function createRepository(string $type, array $config, ?string $name = null): RepositoryInterface + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'createRepository', [$type, $config, $name]); + } + + public function setRepositoryClass(string $type, $class): void + { + \ShirabeRpcRuntime::callRust($this->__rhandle, 'setRepositoryClass', [$type, $class]); + } + + public function getRepositories(): array + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getRepositories', []); + } + + public function setLocalRepository(InstalledRepositoryInterface $repository): void + { + \ShirabeRpcRuntime::callRust($this->__rhandle, 'setLocalRepository', [$repository]); + } + + public function getLocalRepository(): InstalledRepositoryInterface + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getLocalRepository', []); + } +} diff --git a/crates/shirabe-php-rpc/php/stubs/Composer/Repository/WritableArrayRepository.php b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/WritableArrayRepository.php new file mode 100644 index 00000000..8f2b8377 --- /dev/null +++ b/crates/shirabe-php-rpc/php/stubs/Composer/Repository/WritableArrayRepository.php @@ -0,0 +1,41 @@ +__rhandle, 'write', [$devMode, $installationManager]); + } + + public function getCanonicalPackages() + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getCanonicalPackages', []); + } + + public function reload() + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'reload', []); + } + + public function setDevPackageNames(array $devPackageNames) + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'setDevPackageNames', [$devPackageNames]); + } + + public function getDevPackageNames() + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getDevPackageNames', []); + } + + public function getDevMode() + { + return \ShirabeRpcRuntime::callRust($this->__rhandle, 'getDevMode', []); + } +} -- cgit v1.3.1