some refactoring in the code analysis
[phpeclipse.git] / net.sourceforge.phpeclipse / src / test / PHPParser.jj
index 3156846..daf63e2 100644 (file)
@@ -47,13 +47,9 @@ import net.sourceforge.phpdt.internal.compiler.parser.PHPOutlineInfo;
  * given with JavaCC. You can get JavaCC at http://www.webgain.com
  * You can test the parser with the PHPParserTestCase2.java
  * @author Matthieu Casanova
- * @version $Reference: 1.0$
  */
 public final class PHPParser extends PHPParserSuperclass {
 
-  /** The file that is parsed. */
-  private static IFile fileToParse;
-
   /** The current segment. */
   private static OutlineableWithChildren currentSegment;
 
@@ -84,8 +80,10 @@ public final class PHPParser extends PHPParserSuperclass {
   /** The cursor in expression stack. */
   private static int nodePtr;
 
+  private static final boolean PARSER_DEBUG = false;
+
   public final void setFileToParse(final IFile fileToParse) {
-    this.fileToParse = fileToParse;
+    PHPParser.fileToParse = fileToParse;
   }
 
   public PHPParser() {
@@ -93,7 +91,7 @@ public final class PHPParser extends PHPParserSuperclass {
 
   public PHPParser(final IFile fileToParse) {
     this(new StringReader(""));
-    this.fileToParse = fileToParse;
+    PHPParser.fileToParse = fileToParse;
   }
 
   /**
@@ -151,6 +149,10 @@ public final class PHPParser extends PHPParserSuperclass {
    * @param e the ParseException
    */
   private static void processParseException(final ParseException e) {
+    if (PARSER_DEBUG) {
+      e.printStackTrace();
+      return;
+    }
     if (errorMessage == null) {
       PHPeclipsePlugin.log(e);
       errorMessage = "this exception wasn't handled by the parser please tell us how to reproduce it";
@@ -744,12 +746,14 @@ void ClassBodyDeclaration(final ClassDeclaration classDeclaration) :
   final FieldDeclaration field;
 }
 {
-  method = MethodDeclaration() {classDeclaration.addMethod(method);}
+  method = MethodDeclaration() {method.analyzeCode();
+                                classDeclaration.addMethod(method);}
 | field = FieldDeclaration()   {classDeclaration.addField(field);}
 }
 
 /**
  * A class field declaration : it's var VariableDeclarator() (, VariableDeclarator())*;.
+ * it is only used by ClassBodyDeclaration()
  */
 FieldDeclaration FieldDeclaration() :
 {
@@ -759,10 +763,11 @@ FieldDeclaration FieldDeclaration() :
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  <VAR> variableDeclaration = VariableDeclarator()
+  <VAR> variableDeclaration = VariableDeclaratorNoSuffix()
   {arrayList.add(variableDeclaration);
    outlineInfo.addVariable(new String(variableDeclaration.name));}
-  ( <COMMA> variableDeclaration = VariableDeclarator()
+  (
+    <COMMA> variableDeclaration = VariableDeclaratorNoSuffix()
       {arrayList.add(variableDeclaration);
        outlineInfo.addVariable(new String(variableDeclaration.name));}
   )*
@@ -784,6 +789,44 @@ FieldDeclaration FieldDeclaration() :
                                currentSegment);}
 }
 
+/**
+ * a strict variable declarator : there cannot be a suffix here.
+ */
+VariableDeclaration VariableDeclaratorNoSuffix() :
+{
+  final Token varName;
+  Expression initializer = null;
+  final int pos = SimpleCharStream.getPosition();
+}
+{
+  varName = <DOLLAR_ID>
+  [
+    <ASSIGN>
+    try {
+      initializer = VariableInitializer()
+    } catch (ParseException e) {
+      errorMessage = "Literal expression expected in variable initializer";
+      errorLevel   = ERROR;
+      errorStart = SimpleCharStream.getPosition() - e.currentToken.next.image.length() + 1;
+      errorEnd   = SimpleCharStream.getPosition() + 1;
+      processParseException(e);
+    }
+  ]
+  {
+  if (initializer == null) {
+    return new VariableDeclaration(currentSegment,
+                                   varName.image.substring(1).toCharArray(),
+                                   pos,
+                                   SimpleCharStream.getPosition());
+  }
+  return new VariableDeclaration(currentSegment,
+                                 varName.image.substring(1).toCharArray(),
+                                 initializer,
+                                 VariableDeclaration.EQUAL,
+                                 pos);
+  }
+}
+
 VariableDeclaration VariableDeclarator() :
 {
   final String varName;
@@ -814,6 +857,7 @@ VariableDeclaration VariableDeclarator() :
     return new VariableDeclaration(currentSegment,
                                     varName.toCharArray(),
                                     initializer,
+                                    VariableDeclaration.EQUAL,
                                     pos);
   }
 }
@@ -824,23 +868,24 @@ VariableDeclaration VariableDeclarator() :
  */
 String VariableDeclaratorId() :
 {
-  final String expr;
+  final String var;
   Expression expression = null;
   final int pos = SimpleCharStream.getPosition();
   ConstantIdentifier ex;
 }
 {
   try {
-    expr = Variable()
-    ( LOOKAHEAD(2)
-      {ex = new ConstantIdentifier(expr.toCharArray(),
+    var = Variable()
+    (
+      LOOKAHEAD(2)
+      {ex = new ConstantIdentifier(var.toCharArray(),
                                    pos,
                                    SimpleCharStream.getPosition());}
       expression = VariableSuffix(ex)
     )*
     {
      if (expression == null) {
-       return expr;
+       return var;
      }
      return expression.toStringExpression();
     }
@@ -958,8 +1003,9 @@ final Expression expr,expr2;
 }
 {
   expr = Expression()
-  [<ARRAYASSIGN> expr2 = Expression()
-  {return new ArrayVariableDeclaration(expr,expr2);}
+  [
+    <ARRAYASSIGN> expr2 = Expression()
+    {return new ArrayVariableDeclaration(expr,expr2);}
   ]
   {return new ArrayVariableDeclaration(expr,SimpleCharStream.getPosition());}
 }
@@ -970,13 +1016,17 @@ ArrayVariableDeclaration[] ArrayInitializer() :
   final ArrayList list = new ArrayList();
 }
 {
-  <LPAREN> [ expr = ArrayVariable()
-            {list.add(expr);}
-            ( LOOKAHEAD(2) <COMMA> expr = ArrayVariable()
-            {list.add(expr);}
-            )*
-           ]
-           [<COMMA> {list.add(null);}]
+  <LPAREN>
+    [
+      expr = ArrayVariable()
+      {list.add(expr);}
+      ( LOOKAHEAD(2) <COMMA> expr = ArrayVariable()
+      {list.add(expr);}
+      )*
+    ]
+    [
+      <COMMA> {list.add(null);}
+    ]
   <RPAREN>
   {
   final ArrayVariableDeclaration[] vars = new ArrayVariableDeclaration[list.size()];
@@ -1040,12 +1090,13 @@ MethodDeclaration MethodDeclarator() :
     processParseException(e);
   }
   formalParameters = FormalParameters()
-  {return new MethodDeclaration(currentSegment,
-                                identifierChar,
-                                formalParameters,
-                                reference != null,
-                                pos,
-                                SimpleCharStream.getPosition());}
+  {MethodDeclaration method =  new MethodDeclaration(currentSegment,
+                                                     identifierChar,
+                                                     formalParameters,
+                                                     reference != null,
+                                                     pos,
+                                                     SimpleCharStream.getPosition());
+   return method;}
 }
 
 /**
@@ -1067,13 +1118,14 @@ Hashtable FormalParameters() :
     errorEnd   = SimpleCharStream.getPosition() + 1;
     processParseException(e);
   }
-            [ var = FormalParameter()
-              {parameters.put(new String(var.name),var);}
-              (
-                <COMMA> var = FormalParameter()
-                {parameters.put(new String(var.name),var);}
-              )*
-            ]
+  [
+    var = FormalParameter()
+    {parameters.put(new String(var.name),var);}
+    (
+      <COMMA> var = FormalParameter()
+      {parameters.put(new String(var.name),var);}
+    )*
+  ]
   try {
     <RPAREN>
   } catch (ParseException e) {
@@ -1096,7 +1148,7 @@ VariableDeclaration FormalParameter() :
   Token token = null;
 }
 {
-  [token = <BIT_AND>] variableDeclaration = VariableDeclarator()
+  [token = <BIT_AND>] variableDeclaration = VariableDeclaratorNoSuffix()
   {
     if (token != null) {
       variableDeclaration.setReference(true);
@@ -1131,33 +1183,10 @@ Expression Expression() :
 {
   final Expression expr;
   Expression initializer = null;
-  int assignOperator = -1;
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  LOOKAHEAD(1)
-  expr = ConditionalExpression()
-  [ assignOperator = AssignmentOperator()
-    try {
-      initializer = Expression()
-    } catch (ParseException e) {
-      if (errorMessage != null) {
-        throw e;
-      }
-      errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected";
-      errorLevel   = ERROR;
-      errorEnd   = SimpleCharStream.getPosition();
-      throw e;
-    }
-  ]
-  {
-    if (assignOperator == -1) return expr;
-    return new VarAssignation(expr,
-                               initializer,
-                               assignOperator,
-                               pos,
-                               SimpleCharStream.getPosition());
-  return expr;}
+  expr = ConditionalExpression() {return expr;}
 | expr = ExpressionWBang()       {return expr;}
 }
 
@@ -1173,11 +1202,44 @@ Expression ExpressionWBang() :
 
 Expression ExpressionNoBang() :
 {
-  final Expression expr;
+  Expression expr = null;
+  int assignOperator = -1;
+  String var;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  expr = PrintExpression()       {return expr;}
-| expr = ListExpression()        {return expr;}
+  expr = PrintExpression()   {return expr;}
+| expr = ListExpression()    {return expr;}
+|
+  var = VariableDeclaratorId()
+  [
+    assignOperator = AssignmentOperator()
+    try {
+      expr = Expression()
+    } catch (ParseException e) {
+      if (errorMessage != null) {
+        throw e;
+      }
+      errorMessage = "unexpected token : '"+ e.currentToken.next.image +"', expression expected";
+      errorLevel   = ERROR;
+      errorEnd   = SimpleCharStream.getPosition();
+      throw e;
+    }
+  ]
+  {
+    if (assignOperator == -1) {
+      return new VariableDeclaration(currentSegment,
+                                     var.toCharArray(),
+                                     pos,
+                                     SimpleCharStream.getPosition());
+    }
+    return new VariableDeclaration(currentSegment,
+                                   var.toCharArray(),
+                                   expr,
+                                   assignOperator,
+                                   pos);
+    }
+  {return expr;}
 }
 
 /**
@@ -1187,19 +1249,19 @@ Expression ExpressionNoBang() :
 int AssignmentOperator() :
 {}
 {
-  <ASSIGN>             {return VarAssignation.EQUAL;}
-| <STARASSIGN>         {return VarAssignation.STAR_EQUAL;}
-| <SLASHASSIGN>        {return VarAssignation.SLASH_EQUAL;}
-| <REMASSIGN>          {return VarAssignation.REM_EQUAL;}
-| <PLUSASSIGN>         {return VarAssignation.PLUS_EQUAL;}
-| <MINUSASSIGN>        {return VarAssignation.MINUS_EQUAL;}
-| <LSHIFTASSIGN>       {return VarAssignation.LSHIFT_EQUAL;}
-| <RSIGNEDSHIFTASSIGN> {return VarAssignation.RSIGNEDSHIFT_EQUAL;}
-| <ANDASSIGN>          {return VarAssignation.AND_EQUAL;}
-| <XORASSIGN>          {return VarAssignation.XOR_EQUAL;}
-| <ORASSIGN>           {return VarAssignation.OR_EQUAL;}
-| <DOTASSIGN>          {return VarAssignation.DOT_EQUAL;}
-| <TILDEEQUAL>         {return VarAssignation.TILDE_EQUAL;}
+  <ASSIGN>             {return VariableDeclaration.EQUAL;}
+| <STARASSIGN>         {return VariableDeclaration.STAR_EQUAL;}
+| <SLASHASSIGN>        {return VariableDeclaration.SLASH_EQUAL;}
+| <REMASSIGN>          {return VariableDeclaration.REM_EQUAL;}
+| <PLUSASSIGN>         {return VariableDeclaration.PLUS_EQUAL;}
+| <MINUSASSIGN>        {return VariableDeclaration.MINUS_EQUAL;}
+| <LSHIFTASSIGN>       {return VariableDeclaration.LSHIFT_EQUAL;}
+| <RSIGNEDSHIFTASSIGN> {return VariableDeclaration.RSIGNEDSHIFT_EQUAL;}
+| <ANDASSIGN>          {return VariableDeclaration.AND_EQUAL;}
+| <XORASSIGN>          {return VariableDeclaration.XOR_EQUAL;}
+| <ORASSIGN>           {return VariableDeclaration.OR_EQUAL;}
+| <DOTASSIGN>          {return VariableDeclaration.DOT_EQUAL;}
+| <TILDEEQUAL>         {return VariableDeclaration.TILDE_EQUAL;}
 }
 
 Expression ConditionalExpression() :
@@ -1229,7 +1291,8 @@ Expression ConditionalOrExpression() :
     (
         <OR_OR> {operator = OperatorIds.OR_OR;}
       | <_ORL>  {operator = OperatorIds.ORL;}
-    ) expr2 = ConditionalAndExpression()
+    )
+    expr2 = ConditionalAndExpression()
     {
       expr = new BinaryExpression(expr,expr2,operator);
     }
@@ -1297,6 +1360,7 @@ Expression AndExpression() :
 {
   expr = EqualityExpression()
   (
+    LOOKAHEAD(1)
     <BIT_AND> expr2 = EqualityExpression()
     {expr = new BinaryExpression(expr,expr2,OperatorIds.AND);}
   )*
@@ -1379,6 +1443,7 @@ Expression AdditiveExpression() :
 {
   expr = MultiplicativeExpression()
   (
+  LOOKAHEAD(1)
    ( <PLUS>  {operator = OperatorIds.PLUS;}
    | <MINUS> {operator = OperatorIds.MINUS;} )
    expr2 = MultiplicativeExpression()
@@ -1450,9 +1515,12 @@ Expression UnaryExpressionNoPrefix() :
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  (  <PLUS>  {operator = OperatorIds.PLUS;}
-   | <MINUS> {operator = OperatorIds.MINUS;})
-   expr = UnaryExpression()
+  (
+      <PLUS>  {operator = OperatorIds.PLUS;}
+    |
+      <MINUS> {operator = OperatorIds.MINUS;}
+  )
+  expr = UnaryExpression()
   {return new PrefixedUnaryExpression(expr,operator,pos);}
 |
   expr = PreIncDecExpression()
@@ -1470,9 +1538,12 @@ final int operator;
   final int pos = SimpleCharStream.getPosition();
 }
 {
-  (  <PLUS_PLUS> {operator = OperatorIds.PLUS_PLUS;}
-   | <MINUS_MINUS> {operator = OperatorIds.MINUS_MINUS;})
-   expr = PrimaryExpression()
+  (
+      <PLUS_PLUS>   {operator = OperatorIds.PLUS_PLUS;}
+    |
+      <MINUS_MINUS> {operator = OperatorIds.MINUS_MINUS;}
+  )
+  expr = PrimaryExpression()
   {return new PrefixedUnaryExpression(expr,operator,pos);}
 }
 
@@ -1484,7 +1555,6 @@ Expression UnaryExpressionNotPlusMinus() :
 {
   LOOKAHEAD( <LPAREN> (Type() | <ARRAY>) <RPAREN> )
   expr = CastExpression()         {return expr;}
-| <BANG> expr = UnaryExpression() {return new PrefixedUnaryExpression(expr,OperatorIds.NOT,pos);}
 | expr = PostfixExpression()      {return expr;}
 | expr = Literal()                {return expr;}
 | <LPAREN> expr = Expression()
@@ -1508,8 +1578,11 @@ final int pos = SimpleCharStream.getPosition();
 }
 {
   <LPAREN>
-  (type = Type()
-  | <ARRAY> {type = new ConstantIdentifier(Types.ARRAY,pos,SimpleCharStream.getPosition());})
+  (
+      type = Type()
+    |
+      <ARRAY> {type = new ConstantIdentifier(Types.ARRAY,pos,SimpleCharStream.getPosition());}
+  )
   <RPAREN> expr = UnaryExpression()
   {return new CastExpression(type,expr,pos,SimpleCharStream.getPosition());}
 }
@@ -1522,8 +1595,11 @@ Expression PostfixExpression() :
 }
 {
   expr = PrimaryExpression()
-  [ <PLUS_PLUS> {operator = OperatorIds.PLUS_PLUS;}
-  | <MINUS_MINUS> {operator = OperatorIds.MINUS_MINUS;}]
+  [
+      <PLUS_PLUS>   {operator = OperatorIds.PLUS_PLUS;}
+    |
+      <MINUS_MINUS> {operator = OperatorIds.MINUS_MINUS;}
+  ]
   {
     if (operator == -1) {
       return expr;
@@ -1535,37 +1611,26 @@ Expression PostfixExpression() :
 Expression PrimaryExpression() :
 {
   Expression expr;
+  int assignOperator = -1;
+  final Token identifier;
+  final String var;
+  final int pos = SimpleCharStream.getPosition();
 }
 {
-  expr = PrimaryPrefix()
-  (
-  LOOKAHEAD(PrimarySuffix())
-  expr = PrimarySuffix(expr)
-  )*
+  identifier = <IDENTIFIER>
+  {expr = new ConstantIdentifier(token.image.toCharArray(),
+                                 pos,
+                                 SimpleCharStream.getPosition());}
+  (expr = PrimarySuffix(expr))*
   {return expr;}
 |
   expr = ArrayDeclarator()
   {return expr;}
-}
-
-Expression PrimaryPrefix() :
-{
-  final Expression expr;
-  final Token token;
-  final String var;
-  final int pos = SimpleCharStream.getPosition();
-}
-{
-  token = <IDENTIFIER>           {return new ConstantIdentifier(token.image.toCharArray(),
-                                                                pos,
-                                                                SimpleCharStream.getPosition());}
-| <NEW> expr = ClassIdentifier() {return new PrefixedUnaryExpression(expr,
-                                                                     OperatorIds.NEW,
-                                                                     pos);}
-| var = VariableDeclaratorId()  {return new VariableDeclaration(currentSegment,
-                                                                var.toCharArray(),
-                                                                pos,
-                                                                SimpleCharStream.getPosition());}
+|
+  <NEW> expr = ClassIdentifier()
+  {expr = new PrefixedUnaryExpression(expr,OperatorIds.NEW,pos);}
+  [expr = Arguments(expr)]
+  {return expr;}
 }
 
 AbstractSuffixExpression PrimarySuffix(final Expression prefix) :
@@ -1578,8 +1643,8 @@ AbstractSuffixExpression PrimarySuffix(final Expression prefix) :
 | suffix = VariableSuffix(prefix) {return suffix;}
 | <STATICCLASSACCESS> expr = ClassIdentifier()
   {suffix = new ClassAccess(prefix,
-                          expr,
-                          ClassAccess.STATIC);
+                            expr,
+                            ClassAccess.STATIC);
    return suffix;}
 }
 
@@ -1762,11 +1827,11 @@ Statement StatementNoBreak() :
     }
   }
   {return statement;}
-| LOOKAHEAD(2)
+| LOOKAHEAD(1)
   statement = LabeledStatement() {return statement;}
 | statement = Block()            {return statement;}
 | statement = EmptyStatement()   {return statement;}
-| statement = StatementExpression()
+/*| statement = StatementExpression()
   try {
     <SEMICOLON>
   } catch (ParseException e) {
@@ -1776,7 +1841,7 @@ Statement StatementNoBreak() :
     errorEnd     = SimpleCharStream.getPosition() + 1;
     throw e;
   }
-  {return statement;}
+  {return statement;}      */
 | statement = SwitchStatement()         {return statement;}
 | statement = IfStatement()             {return statement;}
 | statement = WhileStatement()          {return statement;}
@@ -2163,6 +2228,7 @@ Statement BlockStatement() :
 | statement = ClassDeclaration()  {return statement;}
 | statement = MethodDeclaration() {if (phpDocument == currentSegment) pushOnAstNodes(statement);
                                    currentSegment.add((MethodDeclaration) statement);
+                                   ((MethodDeclaration) statement).analyzeCode();
                                    return statement;}
 }
 
@@ -2177,6 +2243,7 @@ Statement BlockStatementNoBreak() :
   statement = StatementNoBreak()  {return statement;}
 | statement = ClassDeclaration()  {return statement;}
 | statement = MethodDeclaration() {currentSegment.add((MethodDeclaration) statement);
+                                   ((MethodDeclaration) statement).analyzeCode();
                                    return statement;}
 }
 
@@ -2213,6 +2280,7 @@ VariableDeclaration LocalVariableDeclarator() :
     return new VariableDeclaration(currentSegment,
                                     varName.toCharArray(),
                                     initializer,
+                                    VariableDeclaration.EQUAL,
                                     pos);
   }
 }
@@ -2242,8 +2310,6 @@ Expression StatementExpression() :
   | <MINUS_MINUS> {return new PostfixedUnaryExpression(expr,
                                                 OperatorIds.MINUS_MINUS,
                                                 SimpleCharStream.getPosition());}
-  | operator = AssignmentOperator() expr2 = Expression()
-    {return new BinaryExpression(expr,expr2,operator);}
   ]
   {return expr;}
 }