おまたせしました。NetBeansでも、たぶんPhpStromでも動作する(だろう)、クラスの関数名補完コードです。
(追記:PhpStromでも快適に補完されます。試用期間が切れる前に確かめられてよかった。)
正確に言えば、補完をさせるためのコードを生成するFuelPHPのタスクプログラムです。
インストールされたFuelPHPのソースプログラムフォルダーを探し、以下の形式で定義します。
class クラス名 extends 名前空間\クラス名 {};
抽象クラスと、インターフェイスも同様の形式で定義します。
名前空間を利用していないクラスに対しては生成しません。
一応、インストールしたての、まっさらな環境で生成したコードも一応貼りますが、パッケージの導入などで、各自の環境が異なりますから、自分の環境で生成することをお勧めします。
生成したコードは、IDEのソースフォルダーの管理下であれば、どこにあっても、認識されるでしょう。生成の都合上、oilと同じ場所においておくのが管理が楽だとは思います。NetBeansに関しては、nbprojectフォルダーが大域インクルードパスですので、その中に入れても、認識されます。
NetBeansにおいて、編集中のコードが名前空間の中にあるときは、クラス名だけを入力しても、その後補完されません。なぜならNetBeansは名前空間を意識して補完候補を絞っており、クラス名だけ入れても候補を絞れないと考えるからです。(本来、トップレベルで定義されている名前を候補としてあげるのが正しいと思えるのですが、それは開発者の考えですからしょうがないですね。)
また、名前空間の中であっても先頭に\を付けてあげれば、候補を出してくれそうなものですが、こちらはバグがあるそうで(NetBeans7.1)、候補が表示されません。今回の件にかかわらず、クラス名を名前空間で就職しても、関数などが補完候補に上がりません。これは、既に開発版では修正されているそうです。
一時的にnamespace文をコメントにしてしまうのが、お手軽な対応方法です。
では、生成プログラム本体です。app/tasksの下にccc.phpで作成してください。
1 <?php
2
3 namespace Fuel\Tasks;
4
5 /**
6 *
7 * Code Completion Code Generator
8 *
9 */
10 class Ccc
11 {
12
13 private static $without_dirs;
14 private static $generated_code = array();
15 private static $dup_class = array();
16
17 public static function run()
18 {
19 // keep without-genereted directory names
20 if (\Cli::option('without', false) or \Cli::option('WITHOUT', false))
21 {
22 self::$without_dirs = explode('+', \Cli::option('without'));
23 }
24 else
25 {
26 self::$without_dirs = false;
27 }
28
29 // other command line handling to generate
30 if (\Cli::option('all', false) or \Cli::option('ALL', false))
31 {
32 $dir = \File::read_dir(COREPATH, 0, 'php');
33 self::generate_redefine($dir, '', COREPATH);
34 $dir = \File::read_dir(APPPATH, 0, 'php');
35 self::generate_redefine($dir, '', APPPATH);
36 $dir = \File::read_dir(PKGPATH, 0, 'php');
37 self::generate_redefine($dir, '', PKGPATH);
38 }
39 else
40 {
41 if (\Cli::option('core', false) or \Cli::option('CORE', false))
42 {
43 $dir = \File::read_dir(COREPATH, 0, 'php');
44 self::generate_redefine($dir, '', COREPATH);
45 }
46 elseif (\Cli::option('app', false) or \Cli::option('APP', false))
47 {
48 $dir = \File::read_dir(APPPATH, 0, 'php');
49 self::generate_redefine($dir, '', APPPATH);
50 }
51 elseif (\Cli::option('packages', false) or \Cli::option('PACKAGES', false))
52 {
53 $dir = \File::read_dir(PKGPATH, 0, 'php');
54 self::generate_redefine($dir, '', PKGPATH);
55 }
56 else
57 {
58 echo PHP_EOL.'usage: [php] oil [-all] [-core] [-app] [-packages] [-without=directory_name[+directory_name]...] [-help]'.PHP_EOL;
59 echo 'Code Completion Code Generator for FuelPHP'.PHP_EOL.PHP_EOL;
60 echo 'php at head of commnad line needed if you use oil in cmd.exe on windows normaly.'.PHP_EOL;
61 echo '-all : Generate from app, core and packages directory.'.PHP_EOL;
62 echo '-app : Generate from app directory.'.PHP_EOL;
63 echo '-core : Generate from core directory.'.PHP_EOL;
64 echo '-help : Display this help and exit.'.PHP_EOL;
65 echo '-packages : Generate from core packages.'.PHP_EOL;
66 echo '-without : + seperated directory name where no generated code.'.PHP_EOL.PHP_EOL;
67 echo 'This task output result into standard output.'.PHP_EOL;
68 echo 'So after you checked output code, redirect to your output PHP file. Do like :'.PHP_EOL;
69 echo 'php oil r ccc -all -without=tasks+migrations+vendor+tests+oil+orm+parser > CodeCompetionCode.php'.PHP_EOL;
70 echo 'And put the file on anywhere your source code folder.'.PHP_EOL.PHP_EOL;
71 echo 'Caution:'.PHP_EOL;
72 echo 'This generated code work on no namespace used on your code in IDE editor.'.PHP_EOL;
73 echo 'Because this just redefine every short class name as general(top) level of namespace.'.PHP_EOL;
74 echo 'So never work at a code like a task and/or a package, that used namespace.(Or your code used namespace. ;) )'.PHP_EOL;
75 echo 'If you want to work code completion on code used namespace, it is the better way switch comment off for the namespace statement during you edit it.';
76 exit(0);
77 }
78 }
79
80 ksort(self::$generated_code);
81 ksort(self::$dup_class);
82
83 echo '<?php'.PHP_EOL;
84 if (!empty(self::$dup_class))
85 {
86 echo '// Duplicated classes from here'.PHP_EOL;
87 echo implode("\n", self::$dup_class);
88 echo PHP_EOL.'// Duplicated classes to here'.PHP_EOL;
89 }
90 echo implode("\n", self::$generated_code);
91 }
92
93 private static function generate_redefine($ary, $path, $base)
94 {
95 foreach ($ary as $key => $val)
96 {
97 if (is_array($val))
98 {
99
100 if ((self::$without_dirs and !in_array(trim($key, '/\\'), self::$without_dirs)) or !self::$without_dirs)
101 {
102 self::generate_redefine($val, $path.$key, $base);
103 }
104 }
105 else
106 {
107 // read php code
108 try
109 {
110 $buff = explode("\n", \File::read($base.$path.$val, true));
111 }
112 catch (\Fuel\Core\InvalidPathException $e)
113 {
114 die('Failed to read file : '.$path.$val);
115 }
116
117 $namespace = '';
118
119 foreach ($buff as $i)
120 {
121 // get namespace
122 if (preg_match('/^[ \\t]*namespace[ \\t]+(.+?)[ \\t]*;/', $i, $matched) === 1)
123 {
124 $namespace = $matched[1];
125 }
126 // get abstract class
127 elseif ($namespace != '' and preg_match('/^[ \\t]*abstract[ \\t]+class[ \\t]+(\\w+)/', $i, $matched) === 1)
128 {
129 self::reg_classname($matched[1],
130 "abstract class\t".$matched[1].' extends '.$namespace.'\\'.$matched[1].'{};');
131 }
132 // get interface
133 elseif ($namespace != '' and preg_match('/^[ \\t]*interface[ \\t]+(\\w+)/', $i, $matched) === 1)
134 {
135 self::reg_classname($matched[1],
136 "interface\t\t".$matched[1].' extends '.$namespace.'\\'.$matched[1].'{};');
137 }
138 // get class
139 elseif ($namespace != '' and preg_match('/^[ \\t]*class[ \\t]+(\\w+)/', $i, $matched))
140 {
141 self::reg_classname($matched[1],
142 "class\t\t\t".$matched[1].' extends '.$namespace.'\\'.$matched[1].'{};');
143 }
144 }
145 }
146 }
147 }
148
149 private static function reg_classname($key, $str)
150 {
151 if (key_exists($key, self::$generated_code))
152 {
153 self::$dup_class[$key] = $str;
154 }
155 else
156 {
157 self::$generated_code[$key] = $str;
158 }
159 }
160
161 }
実行方法は、ウィンドウズならコマンドライン、linuxであれば、端末を開きシェルから実行します。FuelPHPのoilコマンドから実行します。
引数なしか、php oil r ccc -help で英文のヘルプがでます。(英文です:D)
-app app下、つまり自分で開発するときに利用するディレクトリーで生成します。
-core core下、つまりFuelPHPの本体ディレクトリーに対し生成します。
-packages FuelPHPのパッケージ下に対して、生成します。
-all 上記3箇所全てに対して、実行します。
更に、ディレクトリー単位で実行させないオプションも用意しました。
-without=dir1+dir2+dir3... 指定された名前のフォルダー下のコードに対しては、生成しません。
実用的には、以下の方法が簡単です。
php oil r ccc -all -without=tasks+migrations+vendor+tests+oil+orm+parser
これで、出力を確認し、問題がなければ、リダイレクトで、phpファイルを作ります。
php oil r ccc -all -without=tasks+migrations+vendor+tests+oil+orm+parser > CCC.php
クラス名が多いですので、without無しで実行すると、クラス名のダブりが出てしまいます。その場合は、ご自身で生成結果を修正してください。多分、どちらかは不必要です。(そこまでは自動に判断できません。)なお、3つ以上のダブりがあっても、ダブりとして保存しておくのは一つです。4つあれば、普通に表示されるクラスが一つ、ダブりとして表示されるクラスが1つ、残りの2つは消えてしまいます。
コードを正規表現を利用し加工しているだけです。コードの内容をパースしているわけではありません。それでも、必要十分な補完をしてくれるコードを生成してくれるでしょう。
oilが実行できない方のためにFuelPHP1.1、インストール時の状態で実行したコードを貼りつけておきます。
<php
class Agent extends Fuel\Core\Agent{};
class Arr extends Fuel\Core\Arr{};
class Asset extends Fuel\Core\Asset{};
class AttachmentNotFoundException extends Email\AttachmentNotFoundException{};
class Auth extends Auth\Auth{};
class AuthException extends Auth\AuthException{};
abstract class Auth_Acl_Driver extends Auth\Auth_Acl_Driver{};
class Auth_Acl_SimpleAcl extends Auth\Auth_Acl_SimpleAcl{};
abstract class Auth_Driver extends Auth\Auth_Driver{};
abstract class Auth_Group_Driver extends Auth\Auth_Group_Driver{};
class Auth_Group_SimpleGroup extends Auth\Auth_Group_SimpleGroup{};
abstract class Auth_Login_Driver extends Auth\Auth_Login_Driver{};
class Auth_Login_SimpleAuth extends Auth\Auth_Login_SimpleAuth{};
class Autoloader extends Fuel\Core\Autoloader{};
class Cache extends Fuel\Core\Cache{};
class CacheExpiredException extends Fuel\Core\CacheExpiredException{};
class CacheNotFoundException extends Fuel\Core\CacheNotFoundException{};
interface Cache_Handler_Driver extends Fuel\Core\Cache_Handler_Driver{};
class Cache_Handler_Json extends Fuel\Core\Cache_Handler_Json{};
class Cache_Handler_Serialized extends Fuel\Core\Cache_Handler_Serialized{};
class Cache_Handler_String extends Fuel\Core\Cache_Handler_String{};
class Cache_Storage_Apc extends Fuel\Core\Cache_Storage_Apc{};
abstract class Cache_Storage_Driver extends Fuel\Core\Cache_Storage_Driver{};
class Cache_Storage_File extends Fuel\Core\Cache_Storage_File{};
class Cache_Storage_Memcached extends Fuel\Core\Cache_Storage_Memcached{};
class Cache_Storage_Redis extends Fuel\Core\Cache_Storage_Redis{};
class Cli extends Fuel\Core\Cli{};
class Config extends Fuel\Core\Config{};
class ConfigException extends Fuel\Core\ConfigException{};
abstract class Config_File extends Fuel\Core\Config_File{};
class Config_Ini extends Fuel\Core\Config_Ini{};
interface Config_Interface extends Fuel\Core\Config_Interface{};
class Config_Json extends Fuel\Core\Config_Json{};
class Config_Php extends Fuel\Core\Config_Php{};
class Config_Yml extends Fuel\Core\Config_Yml{};
abstract class Controller extends Fuel\Core\Controller{};
abstract class Controller_Rest extends Fuel\Core\Controller_Rest{};
abstract class Controller_Template extends Fuel\Core\Controller_Template{};
class Cookie extends Fuel\Core\Cookie{};
class Crypt extends Fuel\Core\Crypt{};
class DB extends Fuel\Core\DB{};
class DBUtil extends Fuel\Core\DBUtil{};
abstract class Database_Connection extends Fuel\Core\Database_Connection{};
class Database_Exception extends Fuel\Core\Database_Exception{};
class Database_Expression extends Fuel\Core\Database_Expression{};
class Database_MySQL_Connection extends Fuel\Core\Database_MySQL_Connection{};
class Database_MySQL_Result extends Fuel\Core\Database_MySQL_Result{};
class Database_MySQLi_Connection extends Fuel\Core\Database_MySQLi_Connection{};
class Database_MySQLi_Result extends Fuel\Core\Database_MySQLi_Result{};
class Database_PDO_Connection extends Fuel\Core\Database_PDO_Connection{};
class Database_Query extends Fuel\Core\Database_Query{};
abstract class Database_Query_Builder extends Fuel\Core\Database_Query_Builder{};
class Database_Query_Builder_Delete extends Fuel\Core\Database_Query_Builder_Delete{};
class Database_Query_Builder_Insert extends Fuel\Core\Database_Query_Builder_Insert{};
class Database_Query_Builder_Join extends Fuel\Core\Database_Query_Builder_Join{};
class Database_Query_Builder_Select extends Fuel\Core\Database_Query_Builder_Select{};
class Database_Query_Builder_Update extends Fuel\Core\Database_Query_Builder_Update{};
abstract class Database_Query_Builder_Where extends Fuel\Core\Database_Query_Builder_Where{};
abstract class Database_Result extends Fuel\Core\Database_Result{};
class Database_Result_Cached extends Fuel\Core\Database_Result_Cached{};
class Database_Transaction extends Fuel\Core\Database_Transaction{};
class Date extends Fuel\Core\Date{};
class Debug extends Fuel\Core\Debug{};
class Email extends Email\Email{};
class EmailSendingFailedException extends Email\EmailSendingFailedException{};
class EmailValidationFailedException extends Email\EmailValidationFailedException{};
abstract class Email_Driver extends Email\Email_Driver{};
class Email_Driver_Mail extends Email\Email_Driver_Mail{};
class Email_Driver_Sendmail extends Email\Email_Driver_Sendmail{};
class Email_Driver_Smtp extends Email\Email_Driver_Smtp{};
class Error extends Fuel\Core\Error{};
class Event extends Fuel\Core\Event{};
class Fieldset extends Fuel\Core\Fieldset{};
class Fieldset_Field extends Fuel\Core\Fieldset_Field{};
class File extends Fuel\Core\File{};
class FileAccessException extends Fuel\Core\FileAccessException{};
class File_Area extends Fuel\Core\File_Area{};
class File_Handler_Directory extends Fuel\Core\File_Handler_Directory{};
class File_Handler_File extends Fuel\Core\File_Handler_File{};
class Finder extends Fuel\Core\Finder{};
class Form extends Fuel\Core\Form{};
class Format extends Fuel\Core\Format{};
class Ftp extends Fuel\Core\Ftp{};
class FtpConnectionException extends Fuel\Core\FtpConnectionException{};
class FtpFileAccessException extends Fuel\Core\FtpFileAccessException{};
class Fuel extends Fuel\Core\Fuel{};
class FuelException extends Fuel\Core\FuelException{};
class Fuel_Exception extends Fuel\Core\Fuel_Exception{};
class Html extends Fuel\Core\Html{};
abstract class HttpException extends Fuel\Core\HttpException{};
class HttpNotFoundException extends Fuel\Core\HttpNotFoundException{};
class HttpServerErrorException extends Fuel\Core\HttpServerErrorException{};
class Image extends Fuel\Core\Image{};
abstract class Image_Driver extends Fuel\Core\Image_Driver{};
class Image_Gd extends Fuel\Core\Image_Gd{};
class Image_Imagemagick extends Fuel\Core\Image_Imagemagick{};
class Image_Imagick extends Fuel\Core\Image_Imagick{};
class Inflector extends Fuel\Core\Inflector{};
class Input extends Fuel\Core\Input{};
class InvalidAttachmentsException extends Email\InvalidAttachmentsException{};
class InvalidEmailStringEncoding extends Email\InvalidEmailStringEncoding{};
class InvalidPathException extends Fuel\Core\InvalidPathException{};
class Lang extends Fuel\Core\Lang{};
class Log extends Fuel\Core\Log{};
class Markdown extends Fuel\Core\Markdown{};
class Migrate extends Fuel\Core\Migrate{};
class Model extends Fuel\Core\Model{};
class Model_Crud extends Fuel\Core\Model_Crud{};
class Mongo_Db extends Fuel\Core\Mongo_Db{};
class Mongo_DbException extends Fuel\Core\Mongo_DbException{};
class Num extends Fuel\Core\Num{};
class OutsideAreaException extends Fuel\Core\OutsideAreaException{};
class Package extends Fuel\Core\Package{};
class PackageNotFoundException extends Fuel\Core\PackageNotFoundException{};
class Pagination extends Fuel\Core\Pagination{};
class Profiler extends Fuel\Core\Profiler{};
class Redis extends Fuel\Core\Redis{};
class RedisException extends Fuel\Core\RedisException{};
class Request extends Fuel\Core\Request{};
class Request404Exception extends Fuel\Core\Request404Exception{};
class RequestException extends Fuel\Core\RequestException{};
class Request_Curl extends Fuel\Core\Request_Curl{};
abstract class Request_Driver extends Fuel\Core\Request_Driver{};
class Request_Soap extends Fuel\Core\Request_Soap{};
class Response extends Fuel\Core\Response{};
class Route extends Fuel\Core\Route{};
class Router extends Fuel\Core\Router{};
class Security extends Fuel\Core\Security{};
class SendmailConnectionException extends Email\SendmailConnectionException{};
class SendmailFailedException extends Email\SendmailFailedException{};
class Session extends Fuel\Core\Session{};
class Session_Cookie extends Fuel\Core\Session_Cookie{};
class Session_Db extends Fuel\Core\Session_Db{};
abstract class Session_Driver extends Fuel\Core\Session_Driver{};
class Session_Exception extends Fuel\Core\Session_Exception{};
class Session_File extends Fuel\Core\Session_File{};
class Session_Memcached extends Fuel\Core\Session_Memcached{};
class Session_Redis extends Fuel\Core\Session_Redis{};
class SimpleUserUpdateException extends Auth\SimpleUserUpdateException{};
class SimpleUserWrongPassword extends Auth\SimpleUserWrongPassword{};
class SmtpAuthenticationFailedException extends Email\SmtpAuthenticationFailedException{};
class SmtpCommandFailureException extends Email\SmtpCommandFailureException{};
class SmtpConnectionException extends Email\SmtpConnectionException{};
class Str extends Fuel\Core\Str{};
class TestCase extends Fuel\Core\TestCase{};
class Theme extends Fuel\Core\Theme{};
class ThemeException extends Fuel\Core\ThemeException{};
class Unzip extends Fuel\Core\Unzip{};
class Upload extends Fuel\Core\Upload{};
class Uri extends Fuel\Core\Uri{};
class Validation extends Fuel\Core\Validation{};
class Validation_Error extends Fuel\Core\Validation_Error{};
class View extends Fuel\Core\View{};
abstract class ViewModel extends Fuel\Core\ViewModel{};
| Yiiは公式ガイドが翻訳済みです< 前 | 次 >FuelPHP、関数名補完 on NetBeans |
|---|
| < 前 | 次 > |
|---|