Register new file extensions for the php-editor:
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpeclipse / phpeditor / php / PHPPartitionScanner.java
index 69bc1d5..62687dd 100644 (file)
@@ -8,7 +8,7 @@
  Contributors:
  Igor Malinin - initial contribution
 
- $Id: PHPPartitionScanner.java,v 1.26 2005-05-05 14:06:38 axelcl Exp $
+ $Id: PHPPartitionScanner.java,v 1.30 2005-09-30 18:10:36 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;
@@ -27,19 +26,13 @@ import org.eclipse.jface.text.rules.IToken;
 import org.eclipse.jface.text.rules.Token;
 
 /**
- * 
- * 
+ *
+ *
  * @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;
@@ -47,7 +40,7 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
 
   private IDocument document;
 
-  private int begin;
+//  private int begin;
 
   private int end;
 
@@ -57,7 +50,7 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
 
   private int position;
 
-  private int state;
+//  private int state;
 
   private Map tokens = new HashMap();
 
@@ -76,35 +69,23 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
 
     switch (read()) {
     case ICharacterScanner.EOF:
-      state = STATE_DEFAULT;
+//      state = STATE_DEFAULT;
       return getToken(null);
 
     case '<':
       switch (read()) {
       case ICharacterScanner.EOF:
-        state = STATE_DEFAULT;
+//        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);
       }
 
@@ -114,13 +95,13 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
     loop: while (true) {
       switch (read()) {
       case ICharacterScanner.EOF:
-        state = STATE_DEFAULT;
+//        state = STATE_DEFAULT;
         return getToken(null);
 
       case '<':
         switch (read()) {
         case ICharacterScanner.EOF:
-          state = STATE_DEFAULT;
+//          state = STATE_DEFAULT;
           return getToken(null);
 
         case '?':
@@ -136,7 +117,7 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
 
         unread();
 
-        state = STATE_DEFAULT;
+//        state = STATE_DEFAULT;
         return getToken(null);
       }
     }
@@ -147,19 +128,19 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
     while (true) {
       switch (ch) {
       case ICharacterScanner.EOF:
-        state = STATE_DEFAULT;
+//        state = STATE_DEFAULT;
         return getToken(token);
       case '"': // double quoted string
         // read until end of double quoted string
         if (!readUntilEscapedDQ()) {
-          state = STATE_DEFAULT;
+//          state = STATE_DEFAULT;
           return getToken(token);
         }
         break;
       case '\'': // single quoted string
         // read until end of single quoted string
         if (!readUntilEscapedSQ()) {
-          state = STATE_DEFAULT;
+//          state = STATE_DEFAULT;
           return getToken(token);
         }
         break;
@@ -170,11 +151,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;
@@ -182,18 +169,23 @@ 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();
         switch (ch) {
         case ICharacterScanner.EOF:
         case '>':
-          state = STATE_DEFAULT;
+//          state = STATE_DEFAULT;
           return getToken(token);
 
         case '?':
           continue;
+        default:
+          continue;
         }
       }
 
@@ -201,51 +193,6 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
     }
   }
 
-  //   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;
 
@@ -253,6 +200,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;
     }
@@ -281,14 +236,17 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
 
   private boolean readUntilEscapedDQ() {
     // search last double quoted character
-    if (position >= end) {
-      return false;
-    }
     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;
@@ -299,17 +257,20 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
     }
     return false;
   }
-  
+
   private boolean readUntilEscapedSQ() {
     // search last single quoted character
-    if (position >= end) {
-      return false;
-    }
-    try {  
+    try {
       char ch;
       while (true) {
-        ch = document.getChar(position++); 
+        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;
@@ -321,39 +282,42 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
     return false;
   }
 
-  private void readSingleLine() {
-    if (position >= end) {
-      return;
-    }
+  private boolean readSingleLine() {
     try {
-      while (document.getChar(position++) != '\n') {
-
-      }
+      do {
+        if (position >= end) {
+          return false;
+        }
+      } while (document.getChar(position++) != '\n');
+      return true;
     } catch (BadLocationException e) {
       --position;
-      return;
     }
+    return false;
   }
 
-  private void readMultiLineComment() {
-    if (position >= end) {
-      return;
-    }
+  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() {
@@ -382,7 +346,7 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
    */
   public void setRange(IDocument document, int offset, int length) {
     this.document = document;
-    this.begin = offset;
+//    this.begin = offset;
     this.end = offset + length;
 
     this.offset = offset;
@@ -394,14 +358,14 @@ public class PHPPartitionScanner implements IPartitionTokenScanner {
    * @see org.eclipse.jface.text.rules.IPartitionTokenScanner
    */
   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;
-    //         }
-    // }
+//    state = STATE_DEFAULT;
+    if (partitionOffset > -1) {
+      int delta = offset - partitionOffset;
+      if (delta > 0) {
+        setRange(document, partitionOffset, length + delta);
+        return;
+      }
+    }
     setRange(document, partitionOffset, length);
   }