X-Git-Url: http://secure.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPPartitionScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPPartitionScanner.java index 8d0de49..5f1c3a7 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPPartitionScanner.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/php/PHPPartitionScanner.java @@ -8,7 +8,7 @@ Contributors: Igor Malinin - initial contribution - $Id: PHPPartitionScanner.java,v 1.25 2004-09-02 18:32:34 jsurfer Exp $ + $Id: PHPPartitionScanner.java,v 1.28 2005-05-13 20:19:42 axelcl Exp $ **********************************************************************/ package net.sourceforge.phpeclipse.phpeditor.php; @@ -17,7 +17,6 @@ import java.util.Map; 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; @@ -151,11 +150,17 @@ public class PHPPartitionScanner implements IPartitionTokenScanner { 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(); @@ -164,11 +169,17 @@ public class PHPPartitionScanner implements IPartitionTokenScanner { 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; @@ -176,7 +187,10 @@ public class PHPPartitionScanner implements IPartitionTokenScanner { break; case '#': // line comment // read until end of line - readSingleLine(); + if (!readSingleLine()) { + state = STATE_DEFAULT; + return getToken(token); + } break; case '?': ch = read(); @@ -188,6 +202,8 @@ public class PHPPartitionScanner implements IPartitionTokenScanner { case '?': continue; + default: + continue; } } @@ -247,6 +263,14 @@ public class PHPPartitionScanner implements IPartitionTokenScanner { 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; } @@ -273,57 +297,90 @@ public class PHPPartitionScanner implements IPartitionTokenScanner { } } - 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() {