package net.sourceforge.phpdt.internal.corext.phpdoc; 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) { 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(); } } catch (IOException e) { // TODO: smell 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) { 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); // 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; } }