Fixed outline wrong order of methods bug
[phpeclipse.git] / net.sourceforge.phpeclipse / src / net / sourceforge / phpdt / internal / compiler / parser / Parser.java
index fb2c252..b1d21e0 100644 (file)
@@ -50,7 +50,7 @@ public class Parser //extends PHPParserSuperclass
     implements ITerminalSymbols, CompilerModifiers, ParserBasicInformation {
   //internal data for the automat
   protected final static int StackIncrement = 255;
-
   protected int stateStackTop;
 
   protected int[] stack = new int[StackIncrement];
@@ -167,7 +167,9 @@ public class Parser //extends PHPParserSuperclass
   public void initializeScanner() {
     this.scanner = new Scanner(false /* comment */, false /* whitespace */, this.options
         .getSeverity(CompilerOptions.NonExternalizedString) != ProblemSeverities.Ignore /* nls */, false, false,
-        this.options.taskTags/* taskTags */, this.options.taskPriorites/* taskPriorities */);
+        this.options.taskTags/* taskTags */, 
+        this.options.taskPriorites/* taskPriorities */,
+        true/*isTaskCaseSensitive*/);
   }
 
   /**
@@ -208,6 +210,12 @@ public class Parser //extends PHPParserSuperclass
     throw new SyntaxError(1, 0, " ", error);
   }
 
+  private void reportSyntaxError(String error) {
+    int problemStartPosition = scanner.getCurrentTokenStartPosition();
+    int problemEndPosition = scanner.getCurrentTokenEndPosition();
+    reportSyntaxError(error, problemStartPosition, problemEndPosition + 1);
+  }
+  
   private void reportSyntaxError(String error, int problemStartPosition, int problemEndPosition) {
     problemReporter.phpParsingError(new String[] { error }, problemStartPosition, problemEndPosition, referenceContext,
         compilationUnit.compilationResult);
@@ -1160,7 +1168,7 @@ public class Parser //extends PHPParserSuperclass
           //              typeDecl.sourceStart, typeDecl.sourceEnd);
         }
         getNextToken();
-        interface_extends_list();
+        interface_extends_list(typeDecl);
       } else {
         typeDecl.name = new char[] { ' ' };
         throwSyntaxError("Interface name expected after keyword 'interface'.", typeDecl.sourceStart, typeDecl.sourceEnd);
@@ -1189,7 +1197,7 @@ public class Parser //extends PHPParserSuperclass
         //             /* empty */
         //     | T_EXTENDS fully_qualified_class_name
         if (token == TokenNameextends) {
-          interface_extends_list();
+          interface_extends_list(typeDecl);
           //          getNextToken();
           //          if (token != TokenNameIdentifier) {
           //            throwSyntaxError("Class name expected after keyword
@@ -1198,7 +1206,7 @@ public class Parser //extends PHPParserSuperclass
           //                    .getCurrentTokenEndPosition());
           //          }
         }
-        implements_list();
+        implements_list(typeDecl);
       } else {
         typeDecl.name = new char[] { ' ' };
         throwSyntaxError("Class name expected after keyword 'class'.", typeDecl.sourceStart, typeDecl.sourceEnd);
@@ -1252,7 +1260,21 @@ public class Parser //extends PHPParserSuperclass
     }
   }
 
-  private void interface_extends_list() {
+  private void class_extends(TypeDeclaration typeDecl) {
+    // /* empty */
+    // | T_EXTENDS interface_list
+    if (token == TokenNameextends) {
+      getNextToken();
+
+      if (token == TokenNameIdentifier) {
+        getNextToken();
+      } else {
+        throwSyntaxError("Class name expected after keyword 'extends'.");
+      }
+    }
+  } 
+  
+  private void interface_extends_list(TypeDeclaration typeDecl) {
     // /* empty */
     // | T_EXTENDS interface_list
     if (token == TokenNameextends) {
@@ -1261,11 +1283,11 @@ public class Parser //extends PHPParserSuperclass
     }
   }
 
-  private void implements_list() {
+  private void implements_list(TypeDeclaration typeDecl) {
     // /* empty */
     // | T_IMPLEMENTS interface_list
     if (token == TokenNameimplements) {
-      getNextToken();
+      getNextToken(); 
       interface_list();
     }
   }
@@ -1511,9 +1533,10 @@ public class Parser //extends PHPParserSuperclass
           typeDecl.methods = new AbstractMethodDeclaration[] { methodDecl };
         } else {
           AbstractMethodDeclaration[] newMethods;
-          System.arraycopy(typeDecl.methods, 0, newMethods = new AbstractMethodDeclaration[typeDecl.methods.length + 1], 1,
+          System.arraycopy(typeDecl.methods, 0, 
+              newMethods = new AbstractMethodDeclaration[typeDecl.methods.length + 1], 0,
               typeDecl.methods.length);
-          newMethods[0] = methodDecl;
+          newMethods[typeDecl.methods.length] = methodDecl;
           typeDecl.methods = newMethods;
         }
         if ((typeDecl.modifiers & AccAbstract) == AccAbstract) {
@@ -1682,7 +1705,7 @@ public class Parser //extends PHPParserSuperclass
         }
       } else { // TokenNamedefault
         getNextToken();
-        if (token == TokenNameCOLON) {
+        if (token == TokenNameCOLON || token == TokenNameSEMICOLON) {
           getNextToken();
           if (token == TokenNameRBRACE) {
             // empty default case
@@ -3406,7 +3429,11 @@ public class Parser //extends PHPParserSuperclass
               problemReporter.phpIncludeNotExistWarning(args, literal.sourceStart, literal.sourceEnd, referenceContext,
                   compilationUnit.compilationResult);
             } else {
-              impt.setFile( project.getFile(path) );
+              try {
+                impt.setFile( PHPFileUtil.createFile(path, project) );
+              } catch (Exception e) {
+                // the file is outside of the workspace
+              }
             }
           }
         }