X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/test/PHPParser.jj b/net.sourceforge.phpeclipse/src/test/PHPParser.jj index 823b11e..d3b3e59 100644 --- a/net.sourceforge.phpeclipse/src/test/PHPParser.jj +++ b/net.sourceforge.phpeclipse/src/test/PHPParser.jj @@ -83,6 +83,12 @@ public final class PHPParser extends PHPParserSuperclass { private static AstNode[] nodes; /** The cursor in expression stack. */ private static int nodePtr; + private static VariableDeclaration[] variableDeclarationStack; + private static int variableDeclarationPtr; + private static Statement[] statementStack; + private static int statementPtr; + private static ElseIf[] elseIfStack; + private static int elseIfPtr; public final void setFileToParse(final IFile fileToParse) { this.fileToParse = fileToParse; @@ -101,7 +107,11 @@ public final class PHPParser extends PHPParserSuperclass { */ private static final void init() { nodes = new AstNode[AstStackIncrement]; + statementStack = new Statement[AstStackIncrement]; + elseIfStack = new ElseIf[AstStackIncrement]; nodePtr = -1; + statementPtr = -1; + elseIfPtr = -1; htmlStart = 0; } @@ -122,6 +132,45 @@ public final class PHPParser extends PHPParserSuperclass { } } + private static final void pushOnVariableDeclarationStack(VariableDeclaration var) { + try { + variableDeclarationStack[++variableDeclarationPtr] = var; + } catch (IndexOutOfBoundsException e) { + int oldStackLength = variableDeclarationStack.length; + VariableDeclaration[] oldStack = variableDeclarationStack; + variableDeclarationStack = new VariableDeclaration[oldStackLength + AstStackIncrement]; + System.arraycopy(oldStack, 0, variableDeclarationStack, 0, oldStackLength); + variableDeclarationPtr = oldStackLength; + variableDeclarationStack[variableDeclarationPtr] = var; + } + } + + private static final void pushOnStatementStack(Statement statement) { + try { + statementStack[++statementPtr] = statement; + } catch (IndexOutOfBoundsException e) { + int oldStackLength = statementStack.length; + Statement[] oldStack = statementStack; + statementStack = new Statement[oldStackLength + AstStackIncrement]; + System.arraycopy(oldStack, 0, statementStack, 0, oldStackLength); + statementPtr = oldStackLength; + statementStack[statementPtr] = statement; + } + } + + private static final void pushOnElseIfStack(ElseIf elseIf) { + try { + elseIfStack[++elseIfPtr] = elseIf; + } catch (IndexOutOfBoundsException e) { + int oldStackLength = elseIfStack.length; + ElseIf[] oldStack = elseIfStack; + elseIfStack = new ElseIf[oldStackLength + AstStackIncrement]; + System.arraycopy(oldStack, 0, elseIfStack, 0, oldStackLength); + elseIfPtr = oldStackLength; + elseIfStack[elseIfPtr] = elseIf; + } + } + public static final void phpParserTester(final String strEval) throws CoreException, ParseException { PHPParserTokenManager.SwitchTo(PHPParserTokenManager.PHPPARSING); final StringReader stream = new StringReader(strEval); @@ -168,7 +217,9 @@ public final class PHPParser extends PHPParserSuperclass { init(); try { parse(); - //PHPeclipsePlugin.log(1,phpDocument.toString()); + phpDocument = new PHPDocument(null); + phpDocument.nodes = nodes; + PHPeclipsePlugin.log(1,phpDocument.toString()); } catch (ParseException e) { processParseException(e); } @@ -757,12 +808,12 @@ ClassDeclaration ClassDeclaration() : if (superclassName == null) { classDeclaration = new ClassDeclaration(currentSegment, className.image.toCharArray(), - superclassName.image.toCharArray(), pos, 0); } else { classDeclaration = new ClassDeclaration(currentSegment, className.image.toCharArray(), + superclassName.image.toCharArray(), pos, 0); } @@ -819,22 +870,23 @@ void ClassBodyDeclaration(ClassDeclaration classDeclaration) : FieldDeclaration FieldDeclaration() : { VariableDeclaration variableDeclaration; + variableDeclarationPtr = 0; + variableDeclarationStack = new VariableDeclaration[AstStackIncrement]; + VariableDeclaration[] list; + final int pos = SimpleCharStream.getPosition(); } { variableDeclaration = VariableDeclarator() { + pushOnVariableDeclarationStack(variableDeclaration); outlineInfo.addVariable(new String(variableDeclaration.name)); - if (currentSegment != null) { - currentSegment.add(variableDeclaration); - } + currentSegment.add(variableDeclaration); } ( variableDeclaration = VariableDeclarator() - { - if (currentSegment != null) { - currentSegment.add(variableDeclaration); - } - } + {pushOnVariableDeclarationStack(variableDeclaration); + outlineInfo.addVariable(new String(variableDeclaration.name)); + currentSegment.add(variableDeclaration);} )* try { @@ -845,6 +897,12 @@ FieldDeclaration FieldDeclaration() : errorEnd = jj_input_stream.getPosition() + 1; throw e; } + + {list = new VariableDeclaration[variableDeclarationPtr]; + System.arraycopy(variableDeclarationStack,0,list,0,variableDeclarationPtr); + return new FieldDeclaration(list, + pos, + SimpleCharStream.getPosition());} } VariableDeclaration VariableDeclarator() : @@ -867,10 +925,18 @@ VariableDeclaration VariableDeclarator() : throw e; } ] - {return new VariableDeclaration(currentSegment, + { + if (initializer == null) { + return new VariableDeclaration(currentSegment, varName.toCharArray(), - initializer, - pos);} + pos, + jj_input_stream.getPosition()); + } + return new VariableDeclaration(currentSegment, + varName.toCharArray(), + initializer, + pos); + } } /** @@ -1020,7 +1086,10 @@ ArrayVariableDeclaration[] ArrayInitializer() : ] [ {list.add(null);}] - {return (ArrayVariableDeclaration[]) list.toArray();} + { + ArrayVariableDeclaration[] vars = new ArrayVariableDeclaration[list.size()]; + list.toArray(vars); + return vars;} } /** @@ -1750,16 +1819,17 @@ ArgumentDeclaration[] args = null; ArgumentDeclaration[] ArgumentList() : { -Expression expr; +ArgumentDeclaration arg; final ArrayList list = new ArrayList(); +ArgumentDeclaration argument; } { - expr = Expression() - {list.add(expr);} + arg = argumentDeclaration() + {list.add(arg);} ( try { - expr = Expression() - {list.add(expr);} + arg = argumentDeclaration() + {list.add(arg);} } catch (ParseException e) { errorMessage = "unexpected token : '"+ e.currentToken.next.image +"'. An expression expected after a comma in argument list"; errorLevel = ERROR; @@ -1768,9 +1838,46 @@ final ArrayList list = new ArrayList(); throw e; } )* - {return (ArgumentDeclaration[]) list.toArray();} + { + ArgumentDeclaration[] args = new ArgumentDeclaration[list.size()]; + list.toArray(args); + return args;} } +ArgumentDeclaration argumentDeclaration() : +{ + boolean reference = false; + String varName; + Expression initializer = null; + final int pos = SimpleCharStream.getPosition(); +} +{ + [ {reference = true;}] + varName = VariableDeclaratorId() + [ + + try { + initializer = VariableInitializer() + } catch (ParseException e) { + errorMessage = "Literal expression expected in variable initializer"; + errorLevel = ERROR; + errorStart = jj_input_stream.getPosition() - e.currentToken.next.image.length() + 1; + errorEnd = jj_input_stream.getPosition() + 1; + throw e; + } + ] + { + if (initializer == null) { + return new ArgumentDeclaration(varName.toCharArray(), + reference, + pos); + } + return new ArgumentDeclaration(varName.toCharArray(), + reference, + initializer, + pos); + } +} /** * A Statement without break. */ @@ -1967,8 +2074,18 @@ ListExpression ListExpression() : throw e; } [ expression = Expression() - {return new ListExpression((String[]) list.toArray(),expression,pos,SimpleCharStream.getPosition());}] - {return new ListExpression((String[]) list.toArray(),null,pos,SimpleCharStream.getPosition());} + { + String[] strings = new String[list.size()]; + list.toArray(strings); + return new ListExpression(strings, + expression, + pos, + SimpleCharStream.getPosition());} + ] + { + String[] strings = new String[list.size()]; + list.toArray(strings); + return new ListExpression(strings,pos,SimpleCharStream.getPosition());} } /** @@ -1990,7 +2107,10 @@ EchoStatement EchoStatement() : )* try { - {return new EchoStatement((Expression[]) expressions.toArray(),pos);} + { + Expression[] exprs = new Expression[expressions.size()]; + expressions.toArray(exprs); + return new EchoStatement(exprs,pos);} } catch (ParseException e) { if (e.currentToken.next.kind != 4) { errorMessage = "';' expected after 'echo' statement"; @@ -2019,10 +2139,13 @@ GlobalStatement GlobalStatement() : )* try { - {global = new GlobalStatement(currentSegment, - (String[]) vars.toArray(), - pos, - SimpleCharStream.getPosition()); + { + String[] strings = new String[vars.size()]; + vars.toArray(strings); + global = new GlobalStatement(currentSegment, + strings, + pos, + SimpleCharStream.getPosition()); currentSegment.add(global); return global;} } catch (ParseException e) { @@ -2045,7 +2168,10 @@ StaticStatement StaticStatement() : ( expr = VariableDeclarator() {vars.add(new String(expr.name));})* try { - {return new StaticStatement((String[])vars.toArray(), + { + String[] strings = new String[vars.size()]; + vars.toArray(strings); + return new StaticStatement(strings, pos, SimpleCharStream.getPosition());} } catch (ParseException e) { @@ -2078,6 +2204,10 @@ LabeledStatement LabeledStatement() : Block Block() : { final int pos = SimpleCharStream.getPosition(); + Statement[] statements; + Statement statement; + final int startingPtr = statementPtr; + final int length; } { try { @@ -2089,7 +2219,8 @@ Block Block() : errorEnd = jj_input_stream.getPosition() + 1; throw e; } - ( BlockStatement() | htmlBlock())* + ( statement = BlockStatement() {pushOnStatementStack(statement);} + | statement = htmlBlock() {pushOnStatementStack(statement);})* try { } catch (ParseException e) { @@ -2099,6 +2230,12 @@ Block Block() : errorEnd = jj_input_stream.getPosition() + 1; throw e; } + { + length = statementPtr-startingPtr+1; + statements = new Statement[length]; + System.arraycopy(variableDeclarationStack,startingPtr+1,statements,0,length); + statementPtr = startingPtr; + return new Block(statements,pos,SimpleCharStream.getPosition());} } Statement BlockStatement() : @@ -2133,18 +2270,32 @@ VariableDeclaration[] LocalVariableDeclaration() : var = LocalVariableDeclarator() {list.add(var);} ( var = LocalVariableDeclarator() {list.add(var);})* - {return (VariableDeclaration[]) list.toArray();} + { + VariableDeclaration[] vars = new VariableDeclaration[list.size()]; + list.toArray(vars); + return vars;} } VariableDeclaration LocalVariableDeclarator() : { final String varName; - Expression init = null; + Expression initializer = null; final int pos = SimpleCharStream.getPosition(); } { - varName = VariableDeclaratorId() [ init = Expression() ] - {return new VariableDeclaration(varName.toCharArray(),init,pos);} + varName = VariableDeclaratorId() [ initializer = Expression() ] + { + if (initializer == null) { + return new VariableDeclaration(currentSegment, + varName.toCharArray(), + pos, + jj_input_stream.getPosition()); + } + return new VariableDeclaration(currentSegment, + varName.toCharArray(), + initializer, + pos); + } } EmptyStatement EmptyStatement() : @@ -2226,7 +2377,10 @@ AbstractCase[] switchStatementBrace() : ( cas = switchLabel0() {cases.add(cas);})* try { - {return (AbstractCase[]) cases.toArray();} + { + AbstractCase[] abcase = new AbstractCase[cases.size()]; + cases.toArray(abcase); + return abcase;} } catch (ParseException e) { errorMessage = "'}' expected"; errorLevel = ERROR; @@ -2269,7 +2423,10 @@ AbstractCase[] switchStatementColon(final int start, final int end) : } try { - {return (AbstractCase[]) cases.toArray();} + { + AbstractCase[] abcase = new AbstractCase[cases.size()]; + cases.toArray(abcase); + return abcase;} } catch (ParseException e) { errorMessage = "';' expected after 'endswitch' keyword"; errorLevel = ERROR; @@ -2291,10 +2448,13 @@ AbstractCase switchLabel0() : ( statement = BlockStatementNoBreak() {stmts.add(statement);} | statement = htmlBlock() {stmts.add(statement);})* [ statement = BreakStatement() {stmts.add(statement);}] - {if (expr == null) {//it's a default - return new DefaultCase((Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition()); + { + Statement[] stmtsArray = new Statement[stmts.size()]; + stmts.toArray(stmtsArray); + if (expr == null) {//it's a default + return new DefaultCase(stmtsArray,pos,SimpleCharStream.getPosition()); } - return new Case(expr,(Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());} + return new Case(expr,stmtsArray,pos,SimpleCharStream.getPosition());} } /** @@ -2405,17 +2565,23 @@ Expression Condition(final String keyword) : IfStatement IfStatement0(Expression condition, final int start,final int end) : { Statement statement; + Statement stmt; + final Statement[] statementsArray; ElseIf elseifStatement; Else elseStatement = null; - ArrayList stmts = new ArrayList(); - ArrayList elseifs = new ArrayList(); + ArrayList stmts; + final ArrayList elseIfList = new ArrayList(); + ElseIf[] elseIfs; int pos = SimpleCharStream.getPosition(); + int endStatements; } { + {stmts = new ArrayList();} ( statement = Statement() {stmts.add(statement);} | statement = htmlBlock() {stmts.add(statement);})* - (elseifStatement = ElseIfStatementColon() {elseifs.add(elseifStatement);})* + {endStatements = SimpleCharStream.getPosition();} + (elseifStatement = ElseIfStatementColon() {elseIfList.add(elseifStatement);})* [elseStatement = ElseStatementColon()] {try { @@ -2439,11 +2605,6 @@ IfStatement IfStatement0(Expression condition, final int start,final int end) : } try { - {return new IfStatement(condition, - (ElseIf[]) elseifs.toArray(), - elseStatement, - pos, - SimpleCharStream.getPosition());} } catch (ParseException e) { errorMessage = "';' expected after 'endif' keyword"; errorLevel = ERROR; @@ -2451,10 +2612,31 @@ IfStatement IfStatement0(Expression condition, final int start,final int end) : errorEnd = jj_input_stream.getPosition() + 1; throw e; } + { + elseIfs = new ElseIf[elseIfList.size()]; + elseIfList.toArray(elseIfs); + if (stmts.size() == 1) { + return new IfStatement(condition, + (Statement) stmts.get(0), + elseIfs, + elseStatement, + pos, + SimpleCharStream.getPosition()); + } else { + statementsArray = new Statement[stmts.size()]; + stmts.toArray(statementsArray); + return new IfStatement(condition, + new Block(statementsArray,pos,endStatements), + elseIfs, + elseStatement, + pos, + SimpleCharStream.getPosition()); + } + } + | - (statement = Statement() | statement = htmlBlock()) - {stmts.add(statement);} - ( LOOKAHEAD(1) elseifStatement = ElseIfStatement() {elseifs.add(elseifStatement);})* + (stmt = Statement() | stmt = htmlBlock()) + ( LOOKAHEAD(1) elseifStatement = ElseIfStatement() {elseIfList.add(elseifStatement);})* [ LOOKAHEAD(1) try { @@ -2472,11 +2654,15 @@ IfStatement IfStatement0(Expression condition, final int start,final int end) : throw e; } ] - {return new IfStatement(condition, - (ElseIf[]) elseifs.toArray(), - elseStatement, - pos, - SimpleCharStream.getPosition());} + { + elseIfs = new ElseIf[elseIfList.size()]; + elseIfList.toArray(elseIfs); + return new IfStatement(condition, + stmt, + elseIfs, + elseStatement, + pos, + SimpleCharStream.getPosition());} } ElseIf ElseIfStatementColon() : @@ -2490,7 +2676,10 @@ ElseIf ElseIfStatementColon() : condition = Condition("elseif") ( statement = Statement() {list.add(statement);} | statement = htmlBlock() {list.add(statement);})* - {return new ElseIf(condition,(Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());} + { + Statement[] stmtsArray = new Statement[list.size()]; + list.toArray(stmtsArray); + return new ElseIf(condition,stmtsArray ,pos,SimpleCharStream.getPosition());} } Else ElseStatementColon() : @@ -2502,7 +2691,10 @@ Else ElseStatementColon() : { ( statement = Statement() {list.add(statement);} | statement = htmlBlock() {list.add(statement);})* - {return new Else((Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());} + { + Statement[] stmtsArray = new Statement[list.size()]; + list.toArray(stmtsArray); + return new Else(stmtsArray,pos,SimpleCharStream.getPosition());} } ElseIf ElseIfStatement() : @@ -2514,7 +2706,10 @@ ElseIf ElseIfStatement() : } { condition = Condition("elseif") statement = Statement() {list.add(statement);/*todo:do better*/} - {return new ElseIf(condition,(Statement[]) list.toArray(),pos,SimpleCharStream.getPosition());} + { + Statement[] stmtsArray = new Statement[list.size()]; + list.toArray(stmtsArray); + return new ElseIf(condition,stmtsArray,pos,SimpleCharStream.getPosition());} } WhileStatement WhileStatement() : @@ -2559,7 +2754,10 @@ Statement WhileStatement0(final int start, final int end) : } try { - {return new Block((Statement[]) stmts.toArray(),pos,SimpleCharStream.getPosition());} + { + Statement[] stmtsArray = new Statement[stmts.size()]; + stmts.toArray(stmtsArray); + return new Block(stmtsArray,pos,SimpleCharStream.getPosition());} } catch (ParseException e) { errorMessage = "';' expected after 'endwhile' keyword"; errorLevel = ERROR; @@ -2721,7 +2919,10 @@ final int startBlock, endBlock; } try { - {return new ForStatement(initializations,condition,increments,new Block((Statement[])list.toArray(),startBlock,endBlock),pos,SimpleCharStream.getPosition());} + { + Statement[] stmtsArray = new Statement[list.size()]; + list.toArray(stmtsArray); + return new ForStatement(initializations,condition,increments,new Block(stmtsArray,startBlock,endBlock),pos,SimpleCharStream.getPosition());} } catch (ParseException e) { errorMessage = "';' expected after 'endfor' keyword"; errorLevel = ERROR; @@ -2753,7 +2954,10 @@ Statement[] StatementExpressionList() : { expr = StatementExpression() {list.add(expr);} ( StatementExpression() {list.add(expr);})* - {return (Statement[]) list.toArray();} + { + Statement[] stmtsArray = new Statement[list.size()]; + list.toArray(stmtsArray); + return stmtsArray;} } Continue ContinueStatement() :