X-Git-Url: http://secure.phpeclipse.com
diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/phpdoc/PHPDocUtil.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/phpdoc/PHPDocUtil.java
index 71db7ae..426a5e9 100644
--- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/phpdoc/PHPDocUtil.java
+++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/corext/phpdoc/PHPDocUtil.java
@@ -1,84 +1,181 @@
package net.sourceforge.phpdt.internal.corext.phpdoc;
-import java.io.FileReader;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.UnsupportedEncodingException;
+import net.sourceforge.phpeclipse.PHPeclipsePlugin;
import net.sourceforge.phpeclipse.builder.PHPIdentifierLocation;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.Path;
+
/**
* Utility class for static PHPdoc helper mehods
*/
public class PHPDocUtil {
- /**
- * Generate a PHPDoc hover text if possible
- *
- * @param hoverInfoBuffer
- * @param filename
- * @param location
- */
- public static void appendPHPDoc(StringBuffer hoverInfoBuffer, String filename, PHPIdentifierLocation location) {
- FileReader phpFileReader;
- hoverInfoBuffer.append(location.toString());
- hoverInfoBuffer.append(" - \n");
- try {
- hoverInfoBuffer.append( getUsage(filename, location) );
- hoverInfoBuffer.append('\n');
+ /**
+ * Generate a PHPDoc hover text if possible
+ *
+ * @param hoverInfoBuffer
+ * @param filename
+ * @param location
+ */
+ public static void appendPHPDoc(StringBuffer hoverInfoBuffer,
+ String filename, PHPIdentifierLocation location) {
+ hoverInfoBuffer.append(location.toString());
+ hoverInfoBuffer.append(" - ");
+ try {
+ hoverInfoBuffer.append(getUsage(filename, location));
+ hoverInfoBuffer.append("
");
+
+ // read the phpdoc for the function
+ if (location.getPHPDocOffset() >= 0) {
+ InputStreamReader phpFileReader = createReader(filename);
+ if (phpFileReader == null)
+ return;
+ char[] phpDocDeclarationCharArray = new char[location
+ .getPHPDocLength()];
+ phpFileReader.skip(location.getPHPDocOffset());
+ phpFileReader.read(phpDocDeclarationCharArray, 0, location
+ .getPHPDocLength());
+ PHPDocCharArrayCommentReader phpdocConverter = new PHPDocCharArrayCommentReader(
+ phpDocDeclarationCharArray);
+ hoverInfoBuffer.append(phpdocConverter.getString());
+ phpFileReader.close();
+ }
- // read the phpdoc for the function
- if (location.getPHPDocOffset() >= 0) {
- phpFileReader = new FileReader(filename);
- char[] phpDocDeclarationCharArray = new char[location.getPHPDocLength()];
- phpFileReader.skip(location.getPHPDocOffset());
- phpFileReader.read(phpDocDeclarationCharArray, 0, location.getPHPDocLength());
- PHPDocCharArrayCommentReader phpdocConverter = new PHPDocCharArrayCommentReader(phpDocDeclarationCharArray);
- hoverInfoBuffer.append(phpdocConverter.getString());
- hoverInfoBuffer.append('\n');
- phpFileReader.close();
- }
+ } catch (IOException e) {
+ // TODO: smell
+ return;
+ }
+ }
- } catch (IOException e) {
- return;
- }
- }
+ static String getEncoding(String filename) {
+ String encoding = null;
+ IFile file = PHPeclipsePlugin.getWorkspace().getRoot()
+ .getFileForLocation(new Path(filename));
+ if (file != null) {
+ try {
+ encoding = file.getCharset();
+ } catch (CoreException e) {
+ // TODO: should log the fact that we could not get the encoding?
+ }
+ }
+ return encoding;
+ }
- public static String getUsage(String filename, PHPIdentifierLocation location) {
- FileReader phpFileReader;
- String usage = location.getUsage();
- if (usage!=null) {
- return usage;
- }
- usage = "";
- try {
-
- phpFileReader = new FileReader(filename);
- // read the function declaration
- if (location.getOffset() >= 0 && (location.isMethod() || location.isConstructor() || location.isFunction() || location.isDefine())) {
- char[] functionDeclarationCharArray = new char[256];
- int offset = location.getOffset();
- phpFileReader.skip(offset);
- int length = phpFileReader.read(functionDeclarationCharArray, 0, 256);
- if (length == -1) {
- length = 256;
- }
- for (int i = 0; i < length; i++) {
- if (functionDeclarationCharArray[i] == ')') {
- length = i + 1;
- break;
- }
- if (functionDeclarationCharArray[i] == '{' || functionDeclarationCharArray[i] == '}') {
- length = i;
- break;
- }
- }
+ public static String getUsage(String filename,
+ PHPIdentifierLocation location) {
+ String usage = location.getUsage();
+ if (usage != null) {
+ return usage;
+ }
+ usage = "";
+ try {
+
+ InputStreamReader phpFileReader = createReader(filename);
+ if (phpFileReader == null)
+ return "";
+ // read the function declaration
+ if (location.getOffset() >= 0
+ && (location.isMethod() || location.isConstructor()
+ || location.isFunction() || location.isDefine())) {
+ char[] functionDeclarationCharArray = new char[256];
+ int offset = location.getOffset();
+ phpFileReader.skip(offset);
+ int length = phpFileReader.read(functionDeclarationCharArray,
+ 0, 256);
+ if (length == -1) {
+ length = 256;
+ }
+ if (location.isDefine()) {
+ length = getClosingParenthesis(functionDeclarationCharArray);
+ if (length < 0)
+ return "";
+ } else {
+ for (int i = 0; i < length; i++) {
+ if (functionDeclarationCharArray[i] == ')') {
+ length = i + 1;
+ break;
+ }
+ if (functionDeclarationCharArray[i] == '{'
+ || functionDeclarationCharArray[i] == '}') {
+ length = i;
+ break;
+ }
+ }
+ }
usage = new String(functionDeclarationCharArray, 0, length);
- }
- phpFileReader.close();
- } catch (IOException e) {
- // do nothing
- }
- // cache the usage string:
- location.setUsage(usage);
- return usage;
- }
+ // cache the usage string:
+ location.setUsage(usage);
+ }
+ phpFileReader.close();
+
+ } catch (IOException e) {
+ // do nothing
+ }
+ return usage;
+ }
+
+ private static InputStreamReader createReader(String filename) {
+ IFile file = PHPeclipsePlugin.getWorkspace().getRoot()
+ .getFileForLocation(new Path(filename));
+ if (file != null) {
+ try {
+ return new InputStreamReader(new FileInputStream(file
+ .getLocation().toString()), file.getCharset());
+ } catch (UnsupportedEncodingException e) {
+ // do nothing
+ } catch (FileNotFoundException e) {
+ // do nothing
+ } catch (CoreException e) {
+ // do nothing
+ }
+ }
+ return null;
+ }
+
+ private static int getClosingParenthesis(char[] buffer) {
+ int p = 0;
+ boolean dq = false;
+ boolean sq = false;
+
+ for (int i = 0; i < buffer.length; i++) {
+ if (buffer[i] == '\\') {
+ i++;
+ continue;
+ }
+ if (dq) {
+ dq = (buffer[i] != '"');
+ continue;
+ }
+ if (sq) {
+ sq = (buffer[i] != '\'');
+ continue;
+ }
+ switch (buffer[i]) {
+ case '(':
+ p++;
+ break;
+ case ')':
+ p--;
+ if (p < 0)
+ return i;
+ break;
+ case '"':
+ dq = true;
+ break;
+ case '\'':
+ sq = true;
+ break;
+ }
+ }
+ return -1;
+ }
+
}