Contributors:
Igor Malinin - initial contribution
- $Id: PHPPartitionScanner.java,v 1.25 2004-09-02 18:32:34 jsurfer Exp $
+ $Id: PHPPartitionScanner.java,v 1.29 2005-05-15 23:24:41 axelcl Exp $
**********************************************************************/
package net.sourceforge.phpeclipse.phpeditor.php;
import net.sourceforge.phpeclipse.ui.text.rules.AbstractPartitioner;
-import org.eclipse.core.internal.indexing.AbstractPagePolicy;
import org.eclipse.jface.text.Assert;
import org.eclipse.jface.text.BadLocationException;
import org.eclipse.jface.text.IDocument;
* @author Igor Malinin
*/
public class PHPPartitionScanner implements IPartitionTokenScanner {
- // public static final String JSP_DIRECTIVE = "__jsp_directive";
- // public static final String JSP_COMMENT = "__jsp_comment";
- //// public static final String JSP_TAG = "__jsp_tag";
- // public static final String JSP_DECLARATION = "__jsp_declaration";
public static final String PHP_SCRIPTING_AREA = "__php_scripting_area ";
- // public static final String JSP_EXPRESSION = "__jsp_expression";
-
public static final int STATE_DEFAULT = 0;
// public static final int STATE_TAG = 1;
state = STATE_DEFAULT;
return getToken(null);
- case '?': // <%SCRIPLET <%@DIRECTIVE <%!DECLARATION <%=EXPRESSION <%--COMMENT
- int ch = read();
- // if (Character.isWhitespace((char)ch)) {
- // return nextJSPToken(PHP_SCRIPTING_AREA);
- // }
- switch (ch) {
- case ICharacterScanner.EOF:
- state = STATE_DEFAULT;
- return getToken(PHP_SCRIPTING_AREA);
-
- // case '-': // <%- <%--COMMENT
- // switch (read()) {
- // case ICharacterScanner.EOF:
- // case '-': // <%--
- // return nextCommentToken();
- // }
- //
- // break;
- }
-
+ case '?': // <?
+// int ch = read();
+//
+// switch (ch) {
+// case ICharacterScanner.EOF:
+// state = STATE_DEFAULT;
+// return getToken(PHP_SCRIPTING_AREA);
+// }
return scanUntilPHPEndToken(PHP_SCRIPTING_AREA);
}
return getToken(token);
case '"': // double quoted string
// read until end of double quoted string
- readUntilEscaped('"');
+ if (!readUntilEscapedDQ()) {
+ state = STATE_DEFAULT;
+ return getToken(token);
+ }
break;
case '\'': // single quoted string
// read until end of single quoted string
- readUntilEscaped('\'');
+ if (!readUntilEscapedSQ()) {
+ state = STATE_DEFAULT;
+ return getToken(token);
+ }
break;
case '/': // comment start?
ch = read();
break;
case '/':
// read until end of line
- readSingleLine();
+ if (!readSingleLine()) {
+ state = STATE_DEFAULT;
+ return getToken(token);
+ }
break;
case '*':
// read until end of comment
- readMultiLineComment();
+ if (!readMultiLineComment()) {
+ state = STATE_DEFAULT;
+ return getToken(token);
+ }
break;
default:
continue;
break;
case '#': // line comment
// read until end of line
- readSingleLine();
+ if (!readSingleLine()) {
+ state = STATE_DEFAULT;
+ return getToken(token);
+ }
break;
case '?':
ch = read();
case '?':
continue;
+ default:
+ continue;
}
}
}
}
- // private IToken nextCommentToken() {
- // int ch = read();
- // loop: while (true) {
- // switch (ch) {
- // case ICharacterScanner.EOF:
- // break loop;
- //
- // case '-': // - --%>
- // ch = read();
- // switch (ch) {
- // case ICharacterScanner.EOF:
- // break loop;
- //
- // case '-': // -- --%>
- // ch = read();
- // switch (ch) {
- // case ICharacterScanner.EOF:
- // break loop;
- //
- // case '%': // --% --%>
- // ch = read();
- // switch (ch) {
- // case ICharacterScanner.EOF:
- // case '>':
- // break loop;
- // }
- //
- // continue loop;
- //
- // case '-': // --- ---%>
- // unread();
- // continue loop;
- // }
- //
- // ch = read();
- // continue loop;
- // }
- // }
- //
- // ch = read();
- // }
- //
- // return getToken(JSP_COMMENT);
- // }
-
private IToken getToken(String type) {
length = position - offset;
return Token.EOF;
}
+// if (length<0) {
+// try {
+// System.out.println("Length<0:"+document.get(offset,5)+""+length);
+// } catch (BadLocationException e) {
+// e.printStackTrace();
+// }
+// }
+
if (type == null) {
return Token.UNDEFINED;
}
}
}
- private void readUntilEscaped(char ch) {
- if (position >= end) {
- return;
- }
+ private boolean readUntilEscapedDQ() {
+ // search last double quoted character
try {
+ char ch;
while (true) {
- if (document.getChar(position++) == ch) {
- if (position < 2 || document.getChar(position - 2) != '\\') {
- break;
+ if (position >= end) {
+ return false;
+ }
+ ch = document.getChar(position++);
+ if (ch == '\\') {
+ if (position >= end) {
+ return false;
}
+ ch = document.getChar(position++); // ignore escaped character
+ } else if (ch == '"') {
+ return true;
}
}
} catch (BadLocationException e) {
--position;
- return;
}
+ return false;
}
-
- private void readSingleLine() {
- if (position >= end) {
- return;
- }
- try {
- while (document.getChar(position++) != '\n') {
-
+
+ private boolean readUntilEscapedSQ() {
+ // search last single quoted character
+ try {
+ char ch;
+ while (true) {
+ if (position >= end) {
+ return false;
+ }
+ ch = document.getChar(position++);
+ if (ch == '\\') {
+ if (position >= end) {
+ return false;
+ }
+ ch = document.getChar(position++); // ignore escaped character
+ } else if (ch == '\'') {
+ return true;
+ }
}
} catch (BadLocationException e) {
--position;
- return;
}
+ return false;
}
- private void readMultiLineComment() {
- if (position >= end) {
- return;
+ private boolean readSingleLine() {
+ try {
+ do {
+ if (position >= end) {
+ return false;
+ }
+ } while (document.getChar(position++) != '\n');
+ return true;
+ } catch (BadLocationException e) {
+ --position;
}
+ return false;
+ }
+
+ private boolean readMultiLineComment() {
try {
char ch;
while (true) {
+ if (position >= end) {
+ return false;
+ }
ch = document.getChar(position++);
if (ch == '*') {
+ if (position >= end) {
+ return false;
+ }
if (document.getChar(position) == '/') {
position++;
- break;
+ return true;
}
}
}
} catch (BadLocationException e) {
--position;
- return;
}
+ return false;
}
private void unread() {
*/
public void setPartialRange(IDocument document, int offset, int length, String contentType, int partitionOffset) {
state = STATE_DEFAULT;
- // if (partitionOffset > -1) {
- // int delta= offset - partitionOffset;
- // if (delta > 0) {
- // this.setRange(document, partitionOffset, length + delta);
- // return;
- // }
- // }
+ if (partitionOffset > -1) {
+ int delta = offset - partitionOffset;
+ if (delta > 0) {
+ setRange(document, partitionOffset, length + delta);
+ return;
+ }
+ }
setRange(document, partitionOffset, length);
}