improved php parser
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / PHPParserAction.java
1 package net.sourceforge.phpeclipse.phpeditor;
2
3 /**********************************************************************
4 Copyright (c) 2000, 2002 IBM Corp. and others.
5 All rights reserved. This program and the accompanying materials
6 are made available under the terms of the Common Public License v1.0
7 which accompanies this distribution, and is available at
8 http://www.eclipse.org/legal/cpl-v10.html
9
10 Contributors:
11     IBM Corporation - Initial implementation
12     Klaus Hartlage - www.eclipseproject.de
13 **********************************************************************/
14
15 import java.io.IOException;
16 import java.io.InputStream;
17 import java.util.ArrayList;
18 import java.util.Collections;
19 import java.util.Hashtable;
20 import java.util.List;
21
22 import org.eclipse.core.resources.IFile;
23 import org.eclipse.core.resources.IMarker;
24 import org.eclipse.core.runtime.CoreException;
25 import org.eclipse.jface.text.BadLocationException;
26 import org.eclipse.jface.text.IRegion;
27 import org.eclipse.jface.text.Position;
28 import org.eclipse.ui.IEditorInput;
29 import org.eclipse.ui.IFileEditorInput;
30 import org.eclipse.ui.texteditor.ITextEditor;
31 import org.eclipse.ui.texteditor.MarkerUtilities;
32 import org.eclipse.ui.texteditor.TextEditorAction;
33
34 /**
35  * Class that defines the action for parsing the current PHP file
36  */
37 public class PHPParserAction extends TextEditorAction {
38
39   //    public static final String EXE = "exe"; //$NON-NLS-1$
40   //    public static final String WINEXE = "winexe"; //$NON-NLS-1$
41   //    public static final String LIBRARY = "library"; //$NON-NLS-1$
42   //    public static final String MODULE = "module"; //$NON-NLS-1$
43
44  // private static final String ERROR = "error"; //$NON-NLS-1$
45  // private static final String WARNING = "warning"; //$NON-NLS-1$
46
47   private static PHPParserAction instance = new PHPParserAction();
48
49   protected IFile fileToParse;
50   protected List fVariables = new ArrayList(100);
51
52   /**
53    * Constructs and updates the action.
54    */
55   private PHPParserAction() {
56     super(PHPEditorMessages.getResourceBundle(), "ParserAction.", null); //$NON-NLS-1$
57     update();
58   }
59
60   public static PHPParserAction getInstance() {
61     return instance;
62   }
63
64   /**
65    * Code called when the action is fired.
66    */
67   public void run() {
68     try {
69       fileToParse = getPHPFile();
70       if (fileToParse == null) {
71         // should never happen
72         System.err.println("Error : no file in the editor");
73         // should throw an exception
74         return;
75       }
76       // first delete all the previous markers
77       fileToParse.deleteMarkers(IMarker.PROBLEM, false, 0);
78       //IDocument document = getTextEditor().getDocumentProvider().getDocument(null);
79       //String text = document.get();
80
81       //  String text = 
82       // parse(document);
83       try {
84         InputStream iStream = fileToParse.getContents();
85         //        int c = iStream.read();
86         parse(iStream);
87         iStream.close();
88       } catch (IOException e) {
89       }
90
91       //      String message = "Test error";
92       //      int lineNumber = 1;
93       //
94       //      // create marker for the error
95       //
96       //      setMarker(message, lineNumber, fileToParse);
97     } catch (CoreException e) {
98     }
99
100   }
101
102   /**
103    * Finds the file that's currently opened in the PHP Text Editor
104    */
105   protected IFile getPHPFile() {
106     ITextEditor editor = getTextEditor();
107
108     IEditorInput editorInput = null;
109     if (editor != null) {
110       editorInput = editor.getEditorInput();
111     }
112
113     if (editorInput instanceof IFileEditorInput)
114       return ((IFileEditorInput) editorInput).getFile();
115
116     // if nothing was found, which should never happen
117     return null;
118   }
119
120   /**
121    * Create marker for the parse error
122    */
123 //  protected void setMarker(String message, int lineNumber) throws CoreException {
124 //
125 //    Hashtable attributes = new Hashtable();
126 //    MarkerUtilities.setMessage(attributes, message);
127 //    if (message.startsWith(ERROR))
128 //      attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_ERROR));
129 //    else if (message.startsWith(WARNING))
130 //      attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_WARNING));
131 //    else
132 //      attributes.put(IMarker.SEVERITY, new Integer(IMarker.SEVERITY_INFO));
133 //    MarkerUtilities.setLineNumber(attributes, lineNumber);
134 //    MarkerUtilities.createMarker(fileToParse, attributes, IMarker.PROBLEM);
135 //  }
136
137   //  private String getIdentifier(InputStream iStream, int c) {
138   //    //    int i = 0;
139   //    // char c;
140   //    //  int textLength = text.length();
141   //    StringBuffer identifier = new StringBuffer();
142   //    identifier.append((char) c);
143   //    try {
144   //      while ((c = iStream.read()) != (-1)) {
145   //        if (Character.isJavaIdentifierPart((char) c)) {
146   //          identifier.append((char) c);
147   //          //        } else if ((i == 0) && (c == '$')) {
148   //          //          identifier.append((char)c);
149   //        } else {
150   //          return identifier.toString();
151   //        }
152   //        //        i++;
153   //      }
154   //    } catch (IOException e) {
155   //    }
156   //    return identifier.toString();
157   //  }
158
159   protected void parse(InputStream iStream) {
160
161     StringBuffer buf = new StringBuffer();
162     int c0;
163     try {
164       while ((c0 = iStream.read()) != (-1)) {
165         buf.append((char) c0);
166       }
167     } catch (IOException e) {
168       return;
169     }
170     String input = buf.toString();
171     
172       PHPParser parser = new PHPParser(fileToParse);
173       parser.htmlParse(input);
174   }
175 }