Improved aml scanner for this bug
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPPartitionScanner.java
index 8d0de49..5f1c3a7 100644 (file)
@@ -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() {