package net.sourceforge.phpeclipse.phpeditor; /********************************************************************** Copyright (c) 2000, 2002 IBM Corp. and others. All rights reserved. This program and the accompanying materials are made available under the terms of the Common Public License v1.0 which accompanies this distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html Contributors: IBM Corporation - Initial implementation Klaus Hartlage - www.eclipseproject.de **********************************************************************/ import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Collections; import java.util.Hashtable; import java.util.List; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.runtime.CoreException; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Position; import org.eclipse.ui.IEditorInput; import org.eclipse.ui.IFileEditorInput; import org.eclipse.ui.texteditor.ITextEditor; import org.eclipse.ui.texteditor.MarkerUtilities; import org.eclipse.ui.texteditor.TextEditorAction; /** * Class that defines the action for parsing the current PHP file */ public class PHPParserAction extends TextEditorAction { // public static final String EXE = "exe"; //$NON-NLS-1$ // public static final String WINEXE = "winexe"; //$NON-NLS-1$ // public static final String LIBRARY = "library"; //$NON-NLS-1$ // public static final String MODULE = "module"; //$NON-NLS-1$ private static final String ERROR = "error"; //$NON-NLS-1$ private static final String WARNING = "warning"; //$NON-NLS-1$ private static PHPParserAction instance = new PHPParserAction(); protected IFile fileToParse; protected List fVariables = new ArrayList(100); /** * Constructs and updates the action. */ private PHPParserAction() { super(PHPEditorMessages.getResourceBundle(), "ParserAction.", null); //$NON-NLS-1$ update(); } public static PHPParserAction getInstance() { return instance; } /** * Code called when the action is fired. */ public void run() { try { fileToParse = getPHPFile(); if (fileToParse == null) { // should never happen System.err.println("Error : no file in the editor"); // should throw an exception return; } // first delete all the previous markers fileToParse.deleteMarkers(IMarker.PROBLEM, false, 0); //IDocument document = getTextEditor().getDocumentProvider().getDocument(null); //String text = document.get(); // String text = // parse(document); try { InputStream iStream = fileToParse.getContents(); // int c = iStream.read(); parse(iStream); iStream.close(); } catch (IOException e) { } // String message = "Test error"; // int lineNumber = 1; // // // create marker for the error // // setMarker(message, lineNumber, fileToParse); } catch (CoreException e) { } } /** * Finds the file that's currently opened in the PHP Text Editor */ protected IFile getPHPFile() { ITextEditor editor = getTextEditor(); IEditorInput editorInput = null; if (editor != null) { editorInput = editor.getEditorInput(); } if (editorInput instanceof IFileEditorInput) return ((IFileEditorInput) editorInput).getFile(); // if nothing was found, which should never happen return null; } /** * Create marker for the parse error */ protected void setMarker(String message, int lineNumber) throws CoreException { Hashtable attributes = new Hashtable(); MarkerUtilities.setMessage(attributes, message); if (message.startsWith(ERROR)) attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR)); else if (message.startsWith(WARNING)) attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_WARNING)); else attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO)); MarkerUtilities.setLineNumber(attributes, lineNumber); MarkerUtilities.createMarker(fileToParse, attributes, IMarker.PROBLEM); } // private String getIdentifier(InputStream iStream, int c) { // // int i = 0; // // char c; // // int textLength = text.length(); // StringBuffer identifier = new StringBuffer(); // identifier.append((char) c); // try { // while ((c = iStream.read()) != (-1)) { // if (Character.isJavaIdentifierPart((char) c)) { // identifier.append((char) c); // // } else if ((i == 0) && (c == '$')) { // // identifier.append((char)c); // } else { // return identifier.toString(); // } // // i++; // } // } catch (IOException e) { // } // return identifier.toString(); // } protected void parse(InputStream iStream) { boolean lineCommentMode = false; boolean multiLineCommentMode = false; boolean stringMode = false; // ArrayList phpList = new ArrayList(); StringBuffer buf = new StringBuffer(); int c0; try { while ((c0 = iStream.read()) != (-1)) { buf.append((char) c0); } } catch (IOException e) { return; } String input = buf.toString(); int lineNumber = 1; int startLineNumber = 1; int startIndex = 0; char ch; char ch2; boolean phpMode = false; boolean phpFound = false; try { int i = 0; while (i < input.length()) { ch = input.charAt(i++); if (ch == '\n') { lineNumber++; } if ( (! phpMode) && ch == '<') { ch2 = input.charAt(i++); if (ch2 == '?') { ch2 = input.charAt(i++); if (Character.isWhitespace(ch2)) { // php start phpMode = true; phpFound = true; startIndex = i; startLineNumber = lineNumber; continue; } else if (ch2 == 'p') { ch2 = input.charAt(i++); if (ch2 == 'h') { ch2 = input.charAt(i++); if (ch2 == 'p') { phpMode = true; phpFound = true; startIndex = i; startLineNumber = lineNumber; continue; } i--; } i--; } else if (ch2 == 'P') { ch2 = input.charAt(i++); if (ch2 == 'H') { ch2 = input.charAt(i++); if (ch2 == 'P') { phpMode = true; phpFound = true; startIndex = i; startLineNumber = lineNumber; continue; } i--; } i--; } i--; } i--; } if (phpMode) { buf.append(ch); if (lineCommentMode && (ch == '\n')) { lineCommentMode = false; // read until end of line } else if ((!stringMode) && (ch == '#')) { // read until end of line lineCommentMode = true; continue; } else if ((!stringMode) && (!multiLineCommentMode) && (ch == '/')) { ch2 = input.charAt(i++); if (ch2 == '/') { lineCommentMode = true; continue; } else if (ch2 == '*') { multiLineCommentMode = true; continue; } else { i--; } } else if (ch == '*' && multiLineCommentMode) { ch2 = input.charAt(i++); if (ch2 == '/') { multiLineCommentMode = false; continue; } else { i--; } } else if (ch == '\\' && stringMode) { ch2 = input.charAt(i++); if (ch2 == '"') { continue; } else { i--; } } else if ((!lineCommentMode) && (!multiLineCommentMode) && (ch == '"')) { if (stringMode) { stringMode = false; } else { stringMode = true; } continue; } if (lineCommentMode || multiLineCommentMode || stringMode) { continue; } if (ch == '?') { ch2 = input.charAt(i++); if (ch2 == '>') { // php end phpMode = false; // phpList.add(input.substring(startIndex, i-2)); try { PHPParser parser = new PHPParser(); parser.start(input.substring(startIndex, i - 2), startLineNumber); } catch (SyntaxError err) { setMarker(err.getMessage(), err.getLine()); } continue; } i--; } } else { } } if (!phpFound) { setMarker("No PHP source code found.", lineNumber); } } catch (CoreException e) { } } }