{"id":18397300,"url":"https://github.com/php-ffi/ide-helper-generator","last_synced_at":"2025-04-07T04:33:09.517Z","repository":{"id":187542051,"uuid":"676694195","full_name":"php-ffi/ide-helper-generator","owner":"php-ffi","description":"IDE autocomplete generator","archived":false,"fork":false,"pushed_at":"2024-05-06T20:44:19.000Z","size":86,"stargazers_count":5,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-22T13:37:31.585Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/php-ffi.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-08-09T19:42:26.000Z","updated_at":"2025-03-11T16:56:38.000Z","dependencies_parsed_at":"2023-08-11T01:36:43.934Z","dependency_job_id":"b0cb29aa-afce-4243-8d80-35f45552e38b","html_url":"https://github.com/php-ffi/ide-helper-generator","commit_stats":null,"previous_names":["php-ffi/ide-helper-generator"],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/php-ffi%2Fide-helper-generator","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/php-ffi%2Fide-helper-generator/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/php-ffi%2Fide-helper-generator/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/php-ffi%2Fide-helper-generator/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/php-ffi","download_url":"https://codeload.github.com/php-ffi/ide-helper-generator/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247595360,"owners_count":20963939,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-06T02:16:39.268Z","updated_at":"2025-04-07T04:33:04.505Z","avatar_url":"https://github.com/php-ffi.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# FFI IDE Helper Generator\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://packagist.org/packages/ffi/ide-helper-generator\"\u003e\u003cimg src=\"https://poser.pugx.org/ffi/ide-helper-generator/require/php?style=for-the-badge\" alt=\"PHP 8.1+\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/ffi/ide-helper-generator\"\u003e\u003cimg src=\"https://poser.pugx.org/ffi/ide-helper-generator/version?style=for-the-badge\" alt=\"Latest Stable Version\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/ffi/ide-helper-generator\"\u003e\u003cimg src=\"https://poser.pugx.org/ffi/ide-helper-generator/v/unstable?style=for-the-badge\" alt=\"Latest Unstable Version\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://packagist.org/packages/ffi/ide-helper-generator\"\u003e\u003cimg src=\"https://poser.pugx.org/ffi/ide-helper-generator/downloads?style=for-the-badge\" alt=\"Total Downloads\"\u003e\u003c/a\u003e\n    \u003ca href=\"https://raw.githubusercontent.com/php-ffi/ide-helper-generator/master/LICENSE.md\"\u003e\u003cimg src=\"https://poser.pugx.org/ffi/ide-helper-generator/license?style=for-the-badge\" alt=\"License MIT\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"https://github.com/php-ffi/ide-helper-generator/actions\"\u003e\u003cimg src=\"https://github.com/php-ffi/ide-helper-generator/workflows/build/badge.svg\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n## Requirements\n\n- PHP ^8.1\n- [castxml](https://github.com/CastXML/CastXML) ([binaries](https://github.com/CastXML/CastXMLSuperbuild/releases))\n\n## Installation\n\nLibrary is available as composer repository and can be installed using the \nfollowing command in a root of your project as dev-dependency.\n\n```sh\n$ composer require ffi/ide-helper-generator --dev\n```\n\n## Usage\n\n### Generate Metadata\n\nBefore generating the helper, the headers must be parsed to build the metadata\ndata. To do this, `castxml` will be used, which in turn uses the original\ncompiler (like `clang`) to build the AST.\n\n```php\nuse FFI\\Generator\\Metadata\\CastXMLGenerator;\n\n(new CastXMLGenerator(\n    binary: 'castxml', // path to binary (optional)\n    temp: 'storage', // path to temp directory (optional)\n))\n    -\u003egenerate('/path/to/headers.h')\n    -\u003esave('/path/to/metadata.xml')\n;\n```\n\nYou can also to optimize this step by adding a file existence check:\n\n```php\nif (!is_file('/path/to/metadata.xml')) {\n    // Generate metadata: (new CastXMLGenerator())-\u003e...\n}\n```\n\n### Analyze Metadata\n\nAfter the metadata is generated, it should be parsed and an abstract syntax tree\nbuilt in memory.\n\n```php\nuse FFI\\Generator\\Metadata\\CastXMLParser;\n\n$ast = (new CastXMLParser())\n    -\u003eparse('/path/to/metadata.xml')\n;\n```\n\n### Building IDE Helper\n\n```php\nuse FFI\\Generator\\PhpStormMetadataGenerator;\nuse FFI\\Generator\\SimpleNamingStrategy;\n\n$generator = new PhpStormMetadataGenerator(\n    argumentSetPrefix: 'ffi_', // Optional prefix for all argument sets to be registered\n                               // in metadata files.\n                               \n    ignoreDirectories: ['/usr'], // Optional list of directories with headers whose types\n                                 // should be excluded from the generated code.\n                                 \n    naming: new SimpleNamingStrategy(\n        entrypoint: 'FFI\\\\Generated\\\\EntrypointInterface',  // The name of the main FFI class\n                                                            // for which methods for autocomplete\n                                                            // will be generated.\n                                                            \n        externalNamespace: 'FFI\\\\Generated', // Namespace for all public types (e.g. enums) that\n                                             // can be used in PHP code.\n                                             \n        internalNamespace: 'PHPSTORM_META', // Namespace for all generated types which should not\n                                            // be included in the PHP code and will only be used\n                                            // for autocomplete.\n    ),\n);\n\n// Pass AST into generator\n$result = $generator-\u003egenerate($ast);\n\n// Write result code into stdout\necho $result;\n\nfile_put_contents(__DIR__ . '/.phpstorm.meta.php', (string)$result);\n```\n\nYou can also override some naming methods:\n\n```php\nuse FFI\\Generator\\PhpStormMetadataGenerator;\nuse FFI\\Generator\\SimpleNamingStrategy;\n\n$generator = new PhpStormMetadataGenerator(\n    naming: new class extends SimpleNamingStrategy \n    {\n        // Each enum value will be converted to CamelCase\n        // instead of UPPER_SNAKE_CASE (by default)\n        protected function getEnumValueName(string $name): string\n        {\n            return $this-\u003etoCamelCase($name);\n        }\n    }\n);\n```\n\n## Example\n\nBelow is the simplest complex code example:\n\n```php\nuse FFI\\Generator\\Metadata\\CastXMLGenerator;\nuse FFI\\Generator\\Metadata\\CastXMLParser;\nuse FFI\\Generator\\PhpStormMetadataGenerator;\nuse FFI\\Generator\\SimpleNamingStrategy;\n\nconst INPUT_HEADERS = __DIR__ . '/path/to/headers.h';\nconst OUTPUT_FILE = __DIR__ . '/path/to/.phpstorm.meta.php';\n\nfwrite(STDOUT, \" - [1/3] Generating metadata files\\n\");\nif (!is_file(INPUT_HEADERS . '.xml')) {\n    (new CastXMLGenerator())\n        -\u003egenerate(INPUT_HEADERS)\n        -\u003esave(INPUT_HEADERS . '.xml')\n    ;\n}\n\nfwrite(STDOUT, \" - [2/3] Building AST\\n\");\n$ast = (new CastXMLParser())\n    -\u003eparse(INPUT_HEADERS . '.xml')\n;\n\nfwrite(STDOUT, \" - [3/3] Generating IDE helper\\n\");\n$result = (new PhpStormMetadataGenerator())\n    -\u003egenerate($ast)\n;\n\nfwrite(STDOUT, \" - DONE!\\n\");\nfile_put_contents(OUTPUT_FILE, (string)$result);\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphp-ffi%2Fide-helper-generator","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphp-ffi%2Fide-helper-generator","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphp-ffi%2Fide-helper-generator/lists"}