Eclipse で CodeIgniter のコード補完を行わせる冴えたやり方

以前の記事 Eclipse で CodeIgniter 2.0 のコード補完 ですが、Eclipse(PDT) をバージョンアップしたためか、動作しなくなっていました。

コード補完できるコードを生成するコントローラを変更し、別の方法でやってみました。

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Eclipse extends CI_Controller {

	function __construct()
	{
		parent::__construct();
	}

	function index()
	{
		$lines = array();

		// libraries
		$_ci_varmap = array('loader' => 'load', 'unit_test' => 'unit', 'user_agent' => 'agent');
		$_skip = array(
						'codeigniter',
						'common',
						'controller',
						'driver',
						'exceptions',
						'hooks',
						'model',
						'profiler',
						'router');
		
		$libraries = array_merge(glob(BASEPATH . 'core/*.php'), glob(BASEPATH . 'libraries/*.php'));
		
		foreach ($libraries as $filename) {
			$class = basename($filename, '.php');
			$class_var = strtolower($class);
			if (in_array($class_var, $_skip)) {
				continue;
			}
			$class_name = 'CI_' . $class;
			$class_var = ( ! isset($_ci_varmap[$class_var])) ? $class_var : $_ci_varmap[$class_var];
			
			$lines[] = "/**\n" .
						"* @var $class_name\n" .
						"*/\n" .
						"var $$class_var;\n";
		}

		// database
		$lines[] = "/**\n" .
					"* @var CI_DB_active_record\n" .
					"*/\n" .
					"var \$db;\n";

		// models
		foreach (glob(APPPATH . 'models/*.php') as $filename) {
			$class = ucfirst(basename($filename, '.php'));
			$class_var = $class;
			$class_name = $class;
			
			$lines[] = "/**\n" .
						"* @var $class_name\n" .
						"*/\n" .
						"var $$class_var;\n";
		}
		
		sort($lines);
		
		echo 'Put the codes below in system/core/Controller.php, Model.php' . "\n";
		echo '<pre>' ."\n";
		echo '// for Eclipse auto completion' . "\n";
		foreach ($lines as $line)
		{
			echo $line;
		}
		echo '</pre>' ."\n";
	}
}

/* End of file eclipse.php */
/* Location: ./application/controllers/eclipse.php */

これを実行すると、CI_Controller および CI_Model クラスに追加するコードが出力されます。

CodeIgniter 2.0 では CLI からの実行も可能です。

$ php index.php eclipse

とすると、以下のように出力されます。

Put the codes below in system/core/Controller.php, Model.php
<pre>
// for Eclipse auto completion
/**
* @var CI_Benchmark
*/
var $benchmark;
/**
* @var CI_Calendar
*/
var $calendar;
/**
* @var CI_Cart
*/
var $cart;
/**
* @var CI_Config
*/
var $config;
/**
* @var CI_DB_active_record
*/
var $db;
/**
* @var CI_Email
*/
var $email;
/**
* @var CI_Encrypt
*/
var $encrypt;
/**
* @var CI_Form_validation
*/
var $form_validation;
/**
* @var CI_Ftp
*/
var $ftp;
/**
* @var CI_Image_lib
*/
var $image_lib;
/**
* @var CI_Input
*/
var $input;
/**
* @var CI_Javascript
*/
var $javascript;
/**
* @var CI_Lang
*/
var $lang;
/**
* @var CI_Loader
*/
var $load;
/**
* @var CI_Log
*/
var $log;
/**
* @var CI_Output
*/
var $output;
/**
* @var CI_Pagination
*/
var $pagination;
/**
* @var CI_Parser
*/
var $parser;
/**
* @var CI_Security
*/
var $security;
/**
* @var CI_Session
*/
var $session;
/**
* @var CI_Sha1
*/
var $sha1;
/**
* @var CI_Table
*/
var $table;
/**
* @var CI_Trackback
*/
var $trackback;
/**
* @var CI_Typography
*/
var $typography;
/**
* @var CI_URI
*/
var $uri;
/**
* @var CI_Unit_test
*/
var $unit;
/**
* @var CI_Upload
*/
var $upload;
/**
* @var CI_User_agent
*/
var $agent;
/**
* @var CI_Utf8
*/
var $utf8;
/**
* @var CI_Xmlrpc
*/
var $xmlrpc;
/**
* @var CI_Xmlrpcs
*/
var $xmlrpcs;
/**
* @var CI_Zip
*/
var $zip;
</pre>

このコードを CI_Controller クラスと CI_Model クラスの定義の中に追加します。

現在の CodeIgniter Reactor の tip だと、以下のようになります。要するに、各クラスのプロパティとそれに対してのコメントを記述するわけです。

--- a/system/core/Controller.php	Wed Apr 20 16:03:04 2011 -0500
+++ b/system/core/Controller.php	Thu Apr 21 13:52:35 2011 +0900
@@ -28,6 +28,135 @@
  * @link		http://codeigniter.com/user_guide/general/controllers.html
  */
 class CI_Controller {
+// for Eclipse auto completion
+/**
+* @var CI_Benchmark
+*/
+var $benchmark;
+/**
+* @var CI_Calendar
+*/
+var $calendar;
+/**
+* @var CI_Cart
+*/
+var $cart;
+/**
+* @var CI_Config
+*/
+var $config;
+/**
+* @var CI_DB_active_record
+*/
+var $db;
+/**
+* @var CI_Email
+*/
+var $email;
+/**
+* @var CI_Encrypt
+*/
+var $encrypt;
+/**
+* @var CI_Form_validation
+*/
+var $form_validation;
+/**
+* @var CI_Ftp
+*/
+var $ftp;
+/**
+* @var CI_Image_lib
+*/
+var $image_lib;
+/**
+* @var CI_Input
+*/
+var $input;
+/**
+* @var CI_Javascript
+*/
+var $javascript;
+/**
+* @var CI_Lang
+*/
+var $lang;
+/**
+* @var CI_Loader
+*/
+var $load;
+/**
+* @var CI_Log
+*/
+var $log;
+/**
+* @var CI_Output
+*/
+var $output;
+/**
+* @var CI_Pagination
+*/
+var $pagination;
+/**
+* @var CI_Parser
+*/
+var $parser;
+/**
+* @var CI_Security
+*/
+var $security;
+/**
+* @var CI_Session
+*/
+var $session;
+/**
+* @var CI_Sha1
+*/
+var $sha1;
+/**
+* @var CI_Table
+*/
+var $table;
+/**
+* @var CI_Trackback
+*/
+var $trackback;
+/**
+* @var CI_Typography
+*/
+var $typography;
+/**
+* @var CI_URI
+*/
+var $uri;
+/**
+* @var CI_Unit_test
+*/
+var $unit;
+/**
+* @var CI_Upload
+*/
+var $upload;
+/**
+* @var CI_User_agent
+*/
+var $agent;
+/**
+* @var CI_Utf8
+*/
+var $utf8;
+/**
+* @var CI_Xmlrpc
+*/
+var $xmlrpc;
+/**
+* @var CI_Xmlrpcs
+*/
+var $xmlrpcs;
+/**
+* @var CI_Zip
+*/
+var $zip;
 
 	private static $instance;
--- a/system/core/Model.php	Wed Apr 20 16:03:04 2011 -0500
+++ b/system/core/Model.php	Thu Apr 21 13:52:35 2011 +0900
@@ -25,6 +25,135 @@
  * @link		http://codeigniter.com/user_guide/libraries/config.html
  */
 class CI_Model {
+// for Eclipse auto completion
+/**
+* @var CI_Benchmark
+*/
+var $benchmark;
+/**
+* @var CI_Calendar
+*/
+var $calendar;
+/**
+* @var CI_Cart
+*/
+var $cart;
+/**
+* @var CI_Config
+*/
+var $config;
+/**
+* @var CI_DB_active_record
+*/
+var $db;
+/**
+* @var CI_Email
+*/
+var $email;
+/**
+* @var CI_Encrypt
+*/
+var $encrypt;
+/**
+* @var CI_Form_validation
+*/
+var $form_validation;
+/**
+* @var CI_Ftp
+*/
+var $ftp;
+/**
+* @var CI_Image_lib
+*/
+var $image_lib;
+/**
+* @var CI_Input
+*/
+var $input;
+/**
+* @var CI_Javascript
+*/
+var $javascript;
+/**
+* @var CI_Lang
+*/
+var $lang;
+/**
+* @var CI_Loader
+*/
+var $load;
+/**
+* @var CI_Log
+*/
+var $log;
+/**
+* @var CI_Output
+*/
+var $output;
+/**
+* @var CI_Pagination
+*/
+var $pagination;
+/**
+* @var CI_Parser
+*/
+var $parser;
+/**
+* @var CI_Security
+*/
+var $security;
+/**
+* @var CI_Session
+*/
+var $session;
+/**
+* @var CI_Sha1
+*/
+var $sha1;
+/**
+* @var CI_Table
+*/
+var $table;
+/**
+* @var CI_Trackback
+*/
+var $trackback;
+/**
+* @var CI_Typography
+*/
+var $typography;
+/**
+* @var CI_URI
+*/
+var $uri;
+/**
+* @var CI_Unit_test
+*/
+var $unit;
+/**
+* @var CI_Upload
+*/
+var $upload;
+/**
+* @var CI_User_agent
+*/
+var $agent;
+/**
+* @var CI_Utf8
+*/
+var $utf8;
+/**
+* @var CI_Xmlrpc
+*/
+var $xmlrpc;
+/**
+* @var CI_Xmlrpcs
+*/
+var $xmlrpcs;
+/**
+* @var CI_Zip
+*/
+var $zip;
 
 	/**
 	 * Constructor

これで、準備完了です。

以下のように補完されます。


実際のプロジェクトへの摘要

このままだと、CI_Controller クラスと CI_Model クラスに余計なプロパティが追加されたままになり嫌です。

それを避けるためには、このコードを追加したベースとなるプロジェクトを別に用意して、実際のプロジェクトでは、EclipsePHP Include Path でそのベースとなるプロジェクトを追加します。これで、実際のプロジェクトのコアクラスを一切変更せずに、コード補完が可能です。