X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java index ab95c81..aec5e9f 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Parser.java @@ -1,28 +1,34 @@ -/********************************************************************** - Copyright (c) 2002 Klaus Hartlage - www.eclipseproject.de - All rights reserved. This program and the accompanying material - are made available under the terms of the Common Public License v1.0 - which accompanies this distribution, and is available at - http://www.eclipse.org/legal/cpl-v10.html - - Contributors: - Klaus Hartlage - www.eclipseproject.de - **********************************************************************/ +/******************************************************************************* + * Copyright (c) 2002 Klaus Hartlage - www.eclipseproject.de All rights + * reserved. This program and the accompanying material are made available under + * the terms of the Common Public License v1.0 which accompanies this + * distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html + * + * Contributors: Klaus Hartlage - www.eclipseproject.de + ******************************************************************************/ package net.sourceforge.phpdt.internal.compiler.parser; import java.util.ArrayList; + import net.sourceforge.phpdt.core.compiler.CharOperation; import net.sourceforge.phpdt.core.compiler.ITerminalSymbols; import net.sourceforge.phpdt.core.compiler.InvalidInputException; +import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions; import net.sourceforge.phpdt.internal.compiler.impl.ReferenceContext; import net.sourceforge.phpdt.internal.compiler.lookup.CompilerModifiers; import net.sourceforge.phpdt.internal.compiler.lookup.TypeConstants; import net.sourceforge.phpdt.internal.compiler.problem.ProblemReporter; +import net.sourceforge.phpdt.internal.compiler.problem.ProblemSeverities; +import net.sourceforge.phpdt.internal.compiler.util.Util; +import net.sourceforge.phpeclipse.builder.IdentifierIndexManager; import net.sourceforge.phpeclipse.internal.compiler.ast.AbstractMethodDeclaration; -import net.sourceforge.phpeclipse.internal.compiler.ast.AstNode; +import net.sourceforge.phpeclipse.internal.compiler.ast.ASTNode; import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration; +import net.sourceforge.phpeclipse.internal.compiler.ast.FieldDeclaration; +import net.sourceforge.phpeclipse.internal.compiler.ast.ImportReference; import net.sourceforge.phpeclipse.internal.compiler.ast.MethodDeclaration; import net.sourceforge.phpeclipse.internal.compiler.ast.SingleTypeReference; import net.sourceforge.phpeclipse.internal.compiler.ast.TypeDeclaration; + import org.eclipse.core.resources.IFile; public class Parser //extends PHPParserSuperclass implements ITerminalSymbols, CompilerModifiers, ParserBasicInformation { @@ -64,10 +70,15 @@ public class Parser //extends PHPParserSuperclass //private boolean phpMode; protected int modifiers; protected int modifiersSourceStart; - protected Parser() { +// protected IdentifierIndexManager indexManager; + + protected Parser(ProblemReporter problemReporter) { + this.problemReporter = problemReporter; + this.options = problemReporter.options; this.currentPHPString = 0; // PHPParserSuperclass.fileToParse = fileToParse; this.phpList = null; +// this.indexManager = null; this.str = ""; this.token = TokenNameEOF; // this.chIndx = 0; @@ -81,6 +92,7 @@ public class Parser //extends PHPParserSuperclass this.currentPHPString = 0; // PHPParserSuperclass.fileToParse = fileToParse; this.phpList = null; +// this.indexManager = null; this.str = ""; this.token = TokenNameEOF; this.phpEnd = false; @@ -91,7 +103,7 @@ public class Parser //extends PHPParserSuperclass * * @param s * @param sess - * Description of Parameter + * Description of Parameter * @see */ public Parser(IFile fileToParse) { @@ -104,6 +116,7 @@ public class Parser //extends PHPParserSuperclass this.currentPHPString = 0; // PHPParserSuperclass.fileToParse = fileToParse; this.phpList = null; + this.includesList = null; this.str = ""; this.token = TokenNameEOF; // this.chIndx = 0; @@ -114,7 +127,9 @@ public class Parser //extends PHPParserSuperclass this.initializeScanner(); } public void initializeScanner() { - this.scanner = new Scanner(false, false, false, false); + 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 */); } /** * Create marker for the parse error @@ -128,46 +143,38 @@ public class Parser //extends PHPParserSuperclass * columns to the Error * * @param error - * the error message + * the error message * @throws SyntaxError - * the error raised + * the error raised */ private void throwSyntaxError(String error) { int problemStartPosition = scanner.getCurrentTokenStartPosition(); int problemEndPosition = scanner.getCurrentTokenEndPosition(); - throwSyntaxError(error, problemStartPosition, problemEndPosition+1); + throwSyntaxError(error, problemStartPosition, problemEndPosition + 1); } /** * This method will throw the SyntaxError. It will add the good lines and * columns to the Error * * @param error - * the error message + * the error message * @throws SyntaxError - * the error raised + * the error raised */ // private void throwSyntaxError(String error, int startRow) { // throw new SyntaxError(startRow, 0, " ", error); // } - private void throwSyntaxError(String error, int problemStartPosition, - int problemEndPosition) { - problemReporter - .phpParsingError(new String[]{error}, problemStartPosition, - problemEndPosition, referenceContext, - compilationUnit.compilationResult); + private void throwSyntaxError(String error, int problemStartPosition, int problemEndPosition) { + problemReporter.phpParsingError(new String[]{error}, problemStartPosition, problemEndPosition, referenceContext, + compilationUnit.compilationResult); throw new SyntaxError(1, 0, " ", error); } - private void reportSyntaxError(String error, int problemStartPosition, - int problemEndPosition) { - problemReporter - .phpParsingError(new String[]{error}, problemStartPosition, - problemEndPosition, referenceContext, - compilationUnit.compilationResult); - } - private void reportSyntaxWarning(String error, int problemStartPosition, - int problemEndPosition) { - problemReporter.phpParsingWarning(new String[]{error}, - problemStartPosition, problemEndPosition, referenceContext, + private void reportSyntaxError(String error, int problemStartPosition, int problemEndPosition) { + problemReporter.phpParsingError(new String[]{error}, problemStartPosition, problemEndPosition, referenceContext, + compilationUnit.compilationResult); + } + private void reportSyntaxWarning(String error, int problemStartPosition, int problemEndPosition) { + problemReporter.phpParsingWarning(new String[]{error}, problemStartPosition, problemEndPosition, referenceContext, compilationUnit.compilationResult); } /** @@ -196,12 +203,18 @@ public class Parser //extends PHPParserSuperclass if (Scanner.DEBUG) { int currentEndPosition = scanner.getCurrentTokenEndPosition(); int currentStartPosition = scanner.getCurrentTokenStartPosition(); - System.out - .print(currentStartPosition + "," + currentEndPosition + ": "); + System.out.print(currentStartPosition + "," + currentEndPosition + ": "); System.out.println(scanner.toStringAction(token)); } } catch (InvalidInputException e) { token = TokenNameERROR; + String detailedMessage = e.getMessage(); + + if (detailedMessage==Scanner.UNTERMINATED_STRING) { + throwSyntaxError("Unterminated string."); + } else if (detailedMessage==Scanner.UNTERMINATED_COMMENT) { + throwSyntaxError("Unterminated commment."); + } } return; } @@ -218,8 +231,13 @@ public class Parser //extends PHPParserSuperclass scanner.setPHPMode(false); } protected void initialize(boolean phpMode) { + initialize(phpMode, null); + } + protected void initialize(boolean phpMode, IdentifierIndexManager indexManager) { compilationUnit = null; referenceContext = null; + includesList = new ArrayList(); +// this.indexManager = indexManager; this.str = ""; this.token = TokenNameEOF; // this.chIndx = 0; @@ -250,8 +268,7 @@ public class Parser //extends PHPParserSuperclass } if (token != TokenNameEOF) { if (token == TokenNameERROR) { - throwSyntaxError("Scanner error (Found unknown token: " - + scanner.toStringAction(token) + ")"); + throwSyntaxError("Scanner error (Found unknown token: " + scanner.toStringAction(token) + ")"); } if (token == TokenNameRPAREN) { throwSyntaxError("Too many closing ')'; end-of-file not reached."); @@ -273,7 +290,7 @@ public class Parser //extends PHPParserSuperclass } throwSyntaxError("End-of-file not reached."); } - return; + break; } catch (SyntaxError sytaxErr1) { // setMarker(sytaxErr1.getMessage(), sytaxErr1.getLine(), // ERROR); @@ -285,14 +302,13 @@ public class Parser //extends PHPParserSuperclass // try to find keywords 'class' or 'function' // to parse the rest of the string while (token != TokenNameEOF && token != TokenNameERROR) { - if (token == TokenNameabstract || token == TokenNamefinal - || token == TokenNameclass || token == TokenNamefunction) { + if (token == TokenNameabstract || token == TokenNamefinal || token == TokenNameclass || token == TokenNamefunction) { break; } getNextToken(); } if (token == TokenNameEOF || token == TokenNameERROR) { - return; + break; } } catch (SyntaxError sytaxErr2) { // setMarker(sytaxErr2.getMessage(), sytaxErr2.getLine(), @@ -300,10 +316,49 @@ public class Parser //extends PHPParserSuperclass // setMarker(sytaxErr2.getMessage(), // scanner.getCurrentTokenStartPosition(), // scanner.getCurrentTokenEndPosition(), ERROR); - return; + break; } } } while (true); + + endParse(0); + } + + protected CompilationUnitDeclaration endParse(int act) { + + this.lastAct = act; + + if (currentElement != null) { + currentElement.topElement().updateParseTree(); + if (VERBOSE_RECOVERY) { + System.out.print(Util.bind("parser.syntaxRecovery")); //$NON-NLS-1$ + System.out.println("--------------------------"); //$NON-NLS-1$ + System.out.println(compilationUnit); + System.out.println("----------------------------------"); //$NON-NLS-1$ + } + } else { + if (diet & VERBOSE_RECOVERY) { + System.out.print(Util.bind("parser.regularParse")); //$NON-NLS-1$ + System.out.println("--------------------------"); //$NON-NLS-1$ + System.out.println(compilationUnit); + System.out.println("----------------------------------"); //$NON-NLS-1$ + } + } + if (scanner.recordLineSeparator) { + compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds(); + } + if (scanner.taskTags != null) { + for (int i = 0; i < scanner.foundTaskCount; i++) { + problemReporter().task(new String(scanner.foundTaskTags[i]), new String(scanner.foundTaskMessages[i]), + scanner.foundTaskPriorities[i] == null ? null : new String(scanner.foundTaskPriorities[i]), + scanner.foundTaskPositions[i][0], scanner.foundTaskPositions[i][1]); + } + } + compilationUnit.imports = new ImportReference[includesList.size()]; + for (int i = 0; i < includesList.size(); i++) { + compilationUnit.imports[i] = (ImportReference) includesList.get(i); + } + return compilationUnit; } // public PHPOutlineInfo parseInfo(Object parent, String s) { // PHPOutlineInfo outlineInfo = new PHPOutlineInfo(parent); @@ -496,11 +551,9 @@ public class Parser //extends PHPParserSuperclass private void statementList() { do { statement(TokenNameEOF); - if ((token == TokenNameRBRACE) || (token == TokenNamecase) - || (token == TokenNamedefault) || (token == TokenNameelse) - || (token == TokenNameelseif) || (token == TokenNameendif) - || (token == TokenNameendfor) || (token == TokenNameendforeach) - || (token == TokenNameendwhile) || (token == TokenNameendswitch) + if ((token == TokenNameRBRACE) || (token == TokenNamecase) || (token == TokenNamedefault) || (token == TokenNameelse) + || (token == TokenNameelseif) || (token == TokenNameendif) || (token == TokenNameendfor) + || (token == TokenNameendforeach) || (token == TokenNameendwhile) || (token == TokenNameendswitch) || (token == TokenNameEOF) || (token == TokenNameERROR)) { return; } @@ -553,7 +606,8 @@ public class Parser //extends PHPParserSuperclass // concatenationExpression(); // } // return; - // } else if (token == TokenNamerequire || token == TokenNamerequire_once) + // } else if (token == TokenNamerequire || token == + // TokenNamerequire_once) // { // getNextToken(); // //constant(); @@ -660,16 +714,16 @@ public class Parser //extends PHPParserSuperclass getNextToken(); if (token == TokenNameLBRACE) { getNextToken(); + if (token != TokenNameRBRACE) { + statementList(); + } + if (token == TokenNameRBRACE) { + getNextToken(); + } else { + throwSyntaxError("'}' expected after 'do' keyword."); + } } else { - throwSyntaxError("'{' expected after 'do' keyword."); - } - if (token != TokenNameRBRACE) { - statementList(); - } - if (token == TokenNameRBRACE) { - getNextToken(); - } else { - throwSyntaxError("'}' expected after 'do' keyword."); + statement(TokenNameEOF); } if (token == TokenNamewhile) { getNextToken(); @@ -723,8 +777,7 @@ public class Parser //extends PHPParserSuperclass } foreachStatement(); return; - } else if (token == TokenNamecontinue || token == TokenNamebreak - || token == TokenNamereturn) { + } else if (token == TokenNamecontinue || token == TokenNamebreak || token == TokenNamereturn) { getNextToken(); if (token != TokenNameSEMICOLON) { expr(); @@ -812,10 +865,9 @@ public class Parser //extends PHPParserSuperclass } return; } else if (token == TokenNamefunction) { - MethodDeclaration methodDecl = new MethodDeclaration( - this.compilationUnit.compilationResult); - methodDecl.declarationSourceStart = scanner - .getCurrentTokenStartPosition(); + MethodDeclaration methodDecl = new MethodDeclaration(this.compilationUnit.compilationResult); + methodDecl.declarationSourceStart = scanner.getCurrentTokenStartPosition(); + methodDecl.modifiers = AccDefault; getNextToken(); functionDefinition(methodDecl); return; @@ -850,9 +902,11 @@ public class Parser //extends PHPParserSuperclass throwSyntaxError("'{' expected in 'catch' statement."); } getNextToken(); - statementList(); if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected in 'catch' statement."); + statementList(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected in 'catch' statement."); + } } getNextToken(); additional_catches(); @@ -866,11 +920,11 @@ public class Parser //extends PHPParserSuperclass throwSyntaxError("';' expected after 'throw' exxpression."); } return; - } else if (token == TokenNamefinal || token == TokenNameabstract - || token == TokenNameclass || token == TokenNameinterface) { - TypeDeclaration typeDecl = new TypeDeclaration( - this.compilationUnit.compilationResult); + } else if (token == TokenNamefinal || token == TokenNameabstract || token == TokenNameclass || token == TokenNameinterface) { + TypeDeclaration typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult); typeDecl.declarationSourceStart = scanner.getCurrentTokenStartPosition(); + typeDecl.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); + typeDecl.name = new char[]{' '}; // default super class typeDecl.superclass = new SingleTypeReference(TypeConstants.OBJECT, 0); compilationUnit.types.add(typeDecl); @@ -905,8 +959,7 @@ public class Parser //extends PHPParserSuperclass return; } else { if (token != TokenNameINLINE_HTML && token != TokenNameEOF) { - throwSyntaxError("';' expected after expression (Found token: " - + scanner.toStringAction(token) + ")"); + throwSyntaxError("';' expected after expression (Found token: " + scanner.toStringAction(token) + ")"); } getNextToken(); } @@ -1042,23 +1095,21 @@ public class Parser //extends PHPParserSuperclass checkAndSetModifiers(AccInterface); getNextToken(); typeDecl.modifiers = this.modifiers; + typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); + typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); if (token == TokenNameIdentifier || token > TokenNameKEYWORD) { - typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); - typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); typeDecl.name = scanner.getCurrentIdentifierSource(); if (token > TokenNameKEYWORD) { - throwSyntaxError("Don't use a keyword for interface declaration [" - + scanner.toStringAction(token) + "].", typeDecl.sourceStart, - typeDecl.sourceEnd); + problemReporter.phpKeywordWarning(new String[]{scanner.toStringAction(token)}, scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), + referenceContext, compilationUnit.compilationResult); +// throwSyntaxError("Don't use a keyword for interface declaration [" + scanner.toStringAction(token) + "].", +// typeDecl.sourceStart, typeDecl.sourceEnd); } getNextToken(); interface_extends_list(); } else { - typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); - typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); typeDecl.name = new char[]{' '}; - throwSyntaxError("Interface name expected after keyword 'interface'.", - typeDecl.sourceStart, typeDecl.sourceEnd); + throwSyntaxError("Interface name expected after keyword 'interface'.", typeDecl.sourceStart, typeDecl.sourceEnd); return; } } else { @@ -1067,16 +1118,17 @@ public class Parser //extends PHPParserSuperclass // '{' class_statement_list'}' class_entry_type(); typeDecl.modifiers = this.modifiers; + typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); + typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); //identifier //identifier 'extends' identifier if (token == TokenNameIdentifier || token > TokenNameKEYWORD) { - typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); - typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); typeDecl.name = scanner.getCurrentIdentifierSource(); if (token > TokenNameKEYWORD) { - throwSyntaxError("Don't use a keyword for class declaration [" - + scanner.toStringAction(token) + "].", typeDecl.sourceStart, - typeDecl.sourceEnd); + problemReporter.phpKeywordWarning(new String[]{scanner.toStringAction(token)}, scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), + referenceContext, compilationUnit.compilationResult); +// throwSyntaxError("Don't use a keyword for class declaration [" + scanner.toStringAction(token) + "].", +// typeDecl.sourceStart, typeDecl.sourceEnd); } getNextToken(); // extends_from: @@ -1086,18 +1138,16 @@ public class Parser //extends PHPParserSuperclass interface_extends_list(); // getNextToken(); // if (token != TokenNameIdentifier) { - // throwSyntaxError("Class name expected after keyword 'extends'.", + // throwSyntaxError("Class name expected after keyword + // 'extends'.", // scanner.getCurrentTokenStartPosition(), scanner // .getCurrentTokenEndPosition()); // } } implements_list(); } else { - typeDecl.sourceStart = scanner.getCurrentTokenStartPosition(); - typeDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); typeDecl.name = new char[]{' '}; - throwSyntaxError("Class name expected after keyword 'class'.", - typeDecl.sourceStart, typeDecl.sourceEnd); + throwSyntaxError("Class name expected after keyword 'class'.", typeDecl.sourceStart, typeDecl.sourceEnd); return; } } @@ -1105,7 +1155,12 @@ public class Parser //extends PHPParserSuperclass if (token == TokenNameLBRACE) { getNextToken(); if (token != TokenNameRBRACE) { - class_statement_list(); + ArrayList list = new ArrayList(); + class_statement_list(list); + typeDecl.fields = new FieldDeclaration[list.size()]; + for (int i = 0; i < list.size(); i++) { + typeDecl.fields[i] = (FieldDeclaration) list.get(i); + } } if (token == TokenNameRBRACE) { typeDecl.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); @@ -1190,32 +1245,31 @@ public class Parser //extends PHPParserSuperclass // throwSyntaxError("'{' expected at start of class body."); // } // } - private void class_statement_list() { + private void class_statement_list(ArrayList list) { do { - class_statement(); - } while (token == TokenNamepublic || token == TokenNameprotected - || token == TokenNameprivate || token == TokenNamestatic - || token == TokenNameabstract || token == TokenNamefinal - || token == TokenNamefunction || token == TokenNamevar + class_statement(list); + } while (token == TokenNamepublic || token == TokenNameprotected || token == TokenNameprivate || token == TokenNamestatic + || token == TokenNameabstract || token == TokenNamefinal || token == TokenNamefunction || token == TokenNamevar || token == TokenNameconst); } - private void class_statement() { + private void class_statement(ArrayList list) { // class_statement: // variable_modifiers class_variable_declaration ';' // | class_constant_declaration ';' // | method_modifiers T_FUNCTION is_reference T_STRING // '(' parameter_list ')' method_body initializeModifiers(); + int declarationSourceStart = scanner.getCurrentTokenStartPosition(); + if (token == TokenNamevar) { checkAndSetModifiers(AccPublic); - problemReporter.phpVarDeprecatedWarning(scanner - .getCurrentTokenStartPosition(), - scanner.getCurrentTokenEndPosition(), referenceContext, - compilationUnit.compilationResult); + problemReporter.phpVarDeprecatedWarning(scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), + referenceContext, compilationUnit.compilationResult); getNextToken(); - class_variable_declaration(); + class_variable_declaration(declarationSourceStart, list); } else if (token == TokenNameconst) { - class_constant_declaration(); + checkAndSetModifiers(AccFinal|AccPublic); + class_constant_declaration(declarationSourceStart, list); if (token != TokenNameSEMICOLON) { throwSyntaxError("';' expected after class const declaration."); } @@ -1226,10 +1280,8 @@ public class Parser //extends PHPParserSuperclass if (!hasModifiers) { checkAndSetModifiers(AccPublic); } - MethodDeclaration methodDecl = new MethodDeclaration( - this.compilationUnit.compilationResult); - methodDecl.declarationSourceStart = scanner - .getCurrentTokenStartPosition(); + MethodDeclaration methodDecl = new MethodDeclaration(this.compilationUnit.compilationResult); + methodDecl.declarationSourceStart = scanner.getCurrentTokenStartPosition(); methodDecl.modifiers = this.modifiers; getNextToken(); functionDefinition(methodDecl); @@ -1237,24 +1289,11 @@ public class Parser //extends PHPParserSuperclass if (!hasModifiers) { throwSyntaxError("'public' 'private' or 'protected' modifier expected for field declarations."); } - class_variable_declaration(); + class_variable_declaration(declarationSourceStart, list); } } - // if (token == TokenNamefunction) { - // MethodDeclaration methodDecl = new MethodDeclaration( - // this.compilationUnit.compilationResult); - // methodDecl.declarationSourceStart = scanner - // .getCurrentTokenStartPosition(); - // getNextToken(); - // functionDefinition(methodDecl); - // } else if (token == TokenNamevar) { - // getNextToken(); - // classProperty(); - // } else { - // throwSyntaxError("'function' or 'var' expected."); - // } } - private void class_constant_declaration() { + private void class_constant_declaration(int declarationSourceStart, ArrayList list) { // class_constant_declaration ',' T_STRING '=' static_scalar // | T_CONST T_STRING '=' static_scalar if (token != TokenNameconst) { @@ -1266,6 +1305,14 @@ public class Parser //extends PHPParserSuperclass if (token != TokenNameIdentifier) { throwSyntaxError("Identifier expected in class const declaration."); } + FieldDeclaration fieldDeclaration = new FieldDeclaration(scanner.getCurrentIdentifierSource(), scanner + .getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition()); + fieldDeclaration.modifiers = this.modifiers; + fieldDeclaration.declarationSourceStart = declarationSourceStart; + fieldDeclaration.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); + fieldDeclaration.modifiersSourceStart = declarationSourceStart; + // fieldDeclaration.type + list.add(fieldDeclaration); getNextToken(); if (token != TokenNameEQUAL) { throwSyntaxError("'=' expected in class const declaration."); @@ -1286,7 +1333,8 @@ public class Parser //extends PHPParserSuperclass // if (token == TokenNamevar) { // checkAndSetModifiers(AccPublic); // reportSyntaxError( - // "Keyword 'var' is deprecated. Please use 'public' 'private' or 'protected' + // "Keyword 'var' is deprecated. Please use 'public' 'private' or + // 'protected' // modifier for field declarations.", // scanner.getCurrentTokenStartPosition(), scanner // .getCurrentTokenEndPosition()); @@ -1346,14 +1394,25 @@ public class Parser //extends PHPParserSuperclass } return foundToken; } - private void class_variable_declaration() { + private void class_variable_declaration(int declarationSourceStart, ArrayList list) { // class_variable_declaration: // class_variable_declaration ',' T_VARIABLE // | class_variable_declaration ',' T_VARIABLE '=' static_scalar // | T_VARIABLE // | T_VARIABLE '=' static_scalar + char[] classVariable; do { if (token == TokenNameVariable) { + classVariable = scanner.getCurrentIdentifierSource(); + // indexManager.addIdentifierInformation('v', classVariable, buf, -1, -1); + FieldDeclaration fieldDeclaration = new FieldDeclaration(classVariable, scanner + .getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition()); + fieldDeclaration.modifiers = this.modifiers; + fieldDeclaration.declarationSourceStart = declarationSourceStart; + fieldDeclaration.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); + fieldDeclaration.modifiersSourceStart = declarationSourceStart; + // fieldDeclaration.type + list.add(fieldDeclaration); getNextToken(); if (token == TokenNameEQUAL) { getNextToken(); @@ -1381,19 +1440,15 @@ public class Parser //extends PHPParserSuperclass if (astPtr == 0) { compilationUnit.types.add(methodDecl); } else { - AstNode node = astStack[astPtr]; + ASTNode node = astStack[astPtr]; if (node instanceof TypeDeclaration) { TypeDeclaration typeDecl = ((TypeDeclaration) node); if (typeDecl.methods == null) { typeDecl.methods = new AbstractMethodDeclaration[]{methodDecl}; } else { AbstractMethodDeclaration[] newMethods; - System - .arraycopy( - typeDecl.methods, - 0, - newMethods = new AbstractMethodDeclaration[typeDecl.methods.length + 1], - 1, typeDecl.methods.length); + System.arraycopy(typeDecl.methods, 0, newMethods = new AbstractMethodDeclaration[typeDecl.methods.length + 1], 1, + typeDecl.methods.length); newMethods[0] = methodDecl; typeDecl.methods = newMethods; } @@ -1407,8 +1462,7 @@ public class Parser //extends PHPParserSuperclass functionDeclarator(methodDecl); if (token == TokenNameSEMICOLON) { if (!isAbstract) { - throwSyntaxError("Body declaration expected for method: " - + new String(methodDecl.selector)); + throwSyntaxError("Body declaration expected for method: " + new String(methodDecl.selector)); } getNextToken(); return; @@ -1420,10 +1474,16 @@ public class Parser //extends PHPParserSuperclass if (token == TokenNameAND) { getNextToken(); } - if (token == TokenNameIdentifier) { - methodDecl.sourceStart = scanner.getCurrentTokenStartPosition(); - methodDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); + methodDecl.sourceStart = scanner.getCurrentTokenStartPosition(); + methodDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); + if (Scanner.isIdentifierOrKeyword(token)) { methodDecl.selector = scanner.getCurrentIdentifierSource(); + if (token > TokenNameKEYWORD) { + problemReporter.phpKeywordWarning(new String[]{scanner.toStringAction(token)}, scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition(), + referenceContext, compilationUnit.compilationResult); +// reportSyntaxWarning("Don't use keyword for function declaration [" + scanner.toStringAction(token) + "].", +// scanner.getCurrentTokenStartPosition(), scanner.getCurrentTokenEndPosition()); + } getNextToken(); if (token == TokenNameLPAREN) { getNextToken(); @@ -1431,7 +1491,7 @@ public class Parser //extends PHPParserSuperclass throwSyntaxError("'(' expected in function declaration."); } if (token != TokenNameRPAREN) { - parameter_list(); + parameter_list(); } if (token != TokenNameRPAREN) { throwSyntaxError("')' expected in function declaration."); @@ -1440,10 +1500,7 @@ public class Parser //extends PHPParserSuperclass getNextToken(); } } else { - if (token > TokenNameKEYWORD) { - throwSyntaxError("Don't use keyword for function declaration [" + token - + "]."); - } + methodDecl.selector = "".toCharArray(); throwSyntaxError("Function name expected after keyword 'function'."); } } @@ -1464,8 +1521,7 @@ public class Parser //extends PHPParserSuperclass // static_scalar // | non_empty_parameter_list ',' optional_class_type T_VARIABLE '=' // static_scalar - if (token == TokenNameIdentifier || token == TokenNameVariable - || token == TokenNameAND) { + if (token == TokenNameIdentifier || token == TokenNameVariable || token == TokenNameAND) { while (true) { if (token == TokenNameIdentifier) { getNextToken(); @@ -1532,10 +1588,8 @@ public class Parser //extends PHPParserSuperclass expr(); //constant(); if (token == TokenNameCOLON || token == TokenNameSEMICOLON) { getNextToken(); - if (token == TokenNamecase || token == TokenNamedefault) { // empty - // case - // statement - // ? + if (token == TokenNamecase || token == TokenNamedefault) { + // empty case statement ? continue; } statementList(); @@ -1554,16 +1608,21 @@ public class Parser //extends PHPParserSuperclass // statementList(); // } else { - throwSyntaxError("':' character after 'case' constant expected (Found token: " - + scanner.toStringAction(token) + ")"); + throwSyntaxError("':' character expected after 'case' constant (Found token: " + scanner.toStringAction(token) + ")"); } } else { // TokenNamedefault getNextToken(); if (token == TokenNameCOLON) { getNextToken(); - statementList(); + if (token == TokenNameRBRACE) { + // empty default case + break; + } + if (token != TokenNamecase) { + statementList(); + } } else { - throwSyntaxError("':' character after 'default' expected."); + throwSyntaxError("':' character expected after 'default'."); } } } while (token == TokenNamecase || token == TokenNamedefault); @@ -1974,8 +2033,7 @@ public class Parser //extends PHPParserSuperclass } else { encaps_list(); if (token != TokenNameEncapsedString0) { - throwSyntaxError("\'`\' expected at end of string" - + "(Found token: " + scanner.toStringAction(token) + " )"); + throwSyntaxError("\'`\' expected at end of string" + "(Found token: " + scanner.toStringAction(token) + " )"); } } } finally { @@ -1992,8 +2050,7 @@ public class Parser //extends PHPParserSuperclass } else { encaps_list(); if (token != TokenNameEncapsedString1) { - throwSyntaxError("\'\'\' expected at end of string" - + "(Found token: " + scanner.toStringAction(token) + " )"); + throwSyntaxError("\'\'\' expected at end of string" + "(Found token: " + scanner.toStringAction(token) + " )"); } } } finally { @@ -2010,8 +2067,7 @@ public class Parser //extends PHPParserSuperclass } else { encaps_list(); if (token != TokenNameEncapsedString2) { - throwSyntaxError("'\"' expected at end of string" - + "(Found token: " + scanner.toStringAction(token) + " )"); + throwSyntaxError("'\"' expected at end of string" + "(Found token: " + scanner.toStringAction(token) + " )"); } } } finally { @@ -2021,8 +2077,8 @@ public class Parser //extends PHPParserSuperclass break; case TokenNameIntegerLiteral : case TokenNameDoubleLiteral : - case TokenNameStringLiteral : - case TokenNameStringConstant : + case TokenNameStringDoubleQuote : + case TokenNameStringSingleQuote : case TokenNameStringInterpolated : case TokenNameFILE : case TokenNameLINE : @@ -2045,13 +2101,11 @@ public class Parser //extends PHPParserSuperclass } array_pair_list(); if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after keyword 'array'" - + "(Found token: " + scanner.toStringAction(token) + ")"); + throwSyntaxError("')' expected after keyword 'array'" + "(Found token: " + scanner.toStringAction(token) + ")"); } getNextToken(); } else { - throwSyntaxError("'(' expected after keyword 'array'" - + "(Found token: " + scanner.toStringAction(token) + ")"); + throwSyntaxError("'(' expected after keyword 'array'" + "(Found token: " + scanner.toStringAction(token) + ")"); } break; case TokenNamelist : @@ -2112,7 +2166,8 @@ public class Parser //extends PHPParserSuperclass if (token == TokenNameAND) { getNextToken(); if (token == TokenNamenew) { - // | variable '=' '&' T_NEW class_name_reference ctor_arguments + // | variable '=' '&' T_NEW class_name_reference + // ctor_arguments getNextToken(); class_name_reference(); ctor_arguments(); @@ -2143,15 +2198,18 @@ public class Parser //extends PHPParserSuperclass break; default : if (!only_variable) { - throwSyntaxError("Variable expression not allowed (found token '" - + scanner.toStringAction(token) + "')."); + throwSyntaxError("Variable expression not allowed (found token '" + scanner.toStringAction(token) + "')."); } } break; default : if (token != TokenNameINLINE_HTML) { - throwSyntaxError("Error in expression (found token '" - + scanner.toStringAction(token) + "')."); + if (token > TokenNameKEYWORD) { + getNextToken(); + break; + } else { + throwSyntaxError("Error in expression (found token '" + scanner.toStringAction(token) + "')."); + } } return; } @@ -2408,14 +2466,23 @@ public class Parser //extends PHPParserSuperclass //| class_constant '(' function_call_parameter_list ')' //| static_member '(' function_call_parameter_list ')' //| variable_without_objects '(' function_call_parameter_list ')' + char[] defineName = null; + char[] ident = null; + int startPos=0; + int endPos=0; if (Scanner.TRACE) { System.out.println("TRACE: function_call()"); } if (token == TokenNameIdentifier) { + ident = scanner.getCurrentIdentifierSource(); + defineName = ident; + startPos = scanner.getCurrentTokenStartPosition(); + endPos = scanner.getCurrentTokenEndPosition(); getNextToken(); switch (token) { case TokenNamePAAMAYIM_NEKUDOTAYIM : // static member: + defineName = null; getNextToken(); if (token == TokenNameIdentifier) { // class _constant @@ -2430,6 +2497,45 @@ public class Parser //extends PHPParserSuperclass variable_without_objects(); } if (token != TokenNameLPAREN) { + if (defineName!=null) { + // does this identifier contain only uppercase characters? + if (defineName.length==3) { + if (defineName[0]=='d' && + defineName[1]=='i' && + defineName[2]=='e' ) { + defineName=null; + } + } else if (defineName.length==4) { + if (defineName[0]=='t' && + defineName[1]=='r' && + defineName[2]=='u' && + defineName[3]=='e' ) { + defineName=null; + } else if (defineName[0]=='n' && + defineName[1]=='u' && + defineName[2]=='l' && + defineName[3]=='l' ) { + defineName=null; + } + } else if (defineName.length==5) { + if (defineName[0]=='f' && + defineName[1]=='a' && + defineName[2]=='l' && + defineName[3]=='s' && + defineName[4]=='e' ) { + defineName=null; + } + } + if (defineName!=null) { + for (int i=0; i TokenNameKEYWORD) { getNextToken(); if (token == TokenNameLBRACKET) { getNextToken(); @@ -2979,16 +3092,29 @@ public class Parser //extends PHPParserSuperclass // } else { expr(); if (token != TokenNameRBRACKET) { - throwSyntaxError("']' expected after '{$'."); + throwSyntaxError("']' expected."); } getNextToken(); // } } else if (token == TokenNameMINUS_GREATER) { getNextToken(); - if (token != TokenNameIdentifier) { - throwSyntaxError("String token expected."); + if (token != TokenNameIdentifier && + token != TokenNameVariable) { + throwSyntaxError("String or Variable token expected."); } getNextToken(); + if (token == TokenNameLBRACKET) { + getNextToken(); + // if (token == TokenNameRBRACKET) { + // getNextToken(); + // } else { + expr(); + if (token != TokenNameRBRACKET) { + throwSyntaxError("']' expected after '${'."); + } + getNextToken(); + // } + } } // if (token != TokenNameRBRACE) { // throwSyntaxError("'}' expected after '{$'."); @@ -3029,6 +3155,8 @@ public class Parser //extends PHPParserSuperclass } } private void internal_functions_in_yacc() { + int start = 0; + ImportReference impt = null; switch (token) { case TokenNameisset : // T_ISSET '(' isset_variables ')' @@ -3058,13 +3186,28 @@ public class Parser //extends PHPParserSuperclass break; case TokenNameinclude : //T_INCLUDE expr + start = scanner.getCurrentTokenStartPosition(); getNextToken(); expr(); + + impt = new ImportReference(scanner.getCurrentTokenSource(start), start, scanner.getCurrentTokenEndPosition(), false); + impt.declarationSourceEnd = impt.sourceEnd; + impt.declarationEnd = impt.declarationSourceEnd; + //endPosition is just before the ; + impt.declarationSourceStart = start; + includesList.add(impt); break; case TokenNameinclude_once : // T_INCLUDE_ONCE expr + start = scanner.getCurrentTokenStartPosition(); getNextToken(); expr(); + impt = new ImportReference(scanner.getCurrentTokenSource(start), start, scanner.getCurrentTokenEndPosition(), false); + impt.declarationSourceEnd = impt.sourceEnd; + impt.declarationEnd = impt.declarationSourceEnd; + //endPosition is just before the ; + impt.declarationSourceStart = start; + includesList.add(impt); break; case TokenNameeval : // T_EVAL '(' expr ')' @@ -3081,13 +3224,27 @@ public class Parser //extends PHPParserSuperclass break; case TokenNamerequire : //T_REQUIRE expr + start = scanner.getCurrentTokenStartPosition(); getNextToken(); expr(); + impt = new ImportReference(scanner.getCurrentTokenSource(start), start, scanner.getCurrentTokenEndPosition(), false); + impt.declarationSourceEnd = impt.sourceEnd; + impt.declarationEnd = impt.declarationSourceEnd; + //endPosition is just before the ; + impt.declarationSourceStart = start; + includesList.add(impt); break; case TokenNamerequire_once : // T_REQUIRE_ONCE expr + start = scanner.getCurrentTokenStartPosition(); getNextToken(); expr(); + impt = new ImportReference(scanner.getCurrentTokenSource(start), start, scanner.getCurrentTokenEndPosition(), false); + impt.declarationSourceEnd = impt.sourceEnd; + impt.declarationEnd = impt.declarationSourceEnd; + //endPosition is just before the ; + impt.declarationSourceStart = start; + includesList.add(impt); break; } } @@ -3123,10 +3280,10 @@ public class Parser //extends PHPParserSuperclass case TokenNameDoubleLiteral : getNextToken(); return true; - case TokenNameStringLiteral : + case TokenNameStringDoubleQuote : getNextToken(); return true; - case TokenNameStringConstant : + case TokenNameStringSingleQuote : getNextToken(); return true; case TokenNameStringInterpolated : @@ -3400,15 +3557,17 @@ public class Parser //extends PHPParserSuperclass //ast stack final static int AstStackIncrement = 100; protected int astPtr; - protected AstNode[] astStack = new AstNode[AstStackIncrement]; + protected ASTNode[] astStack = new ASTNode[AstStackIncrement]; protected int astLengthPtr; protected int[] astLengthStack; - AstNode[] noAstNodes = new AstNode[AstStackIncrement]; + ASTNode[] noAstNodes = new ASTNode[AstStackIncrement]; public CompilationUnitDeclaration compilationUnit; /* * the result from parse() */ protected ReferenceContext referenceContext; protected ProblemReporter problemReporter; + protected CompilerOptions options; + private ArrayList includesList; // protected CompilationResult compilationResult; /** * Returns this parser's problem reporter initialized with its reference @@ -3417,8 +3576,7 @@ public class Parser //extends PHPParserSuperclass */ public ProblemReporter problemReporter() { if (scanner.recordLineSeparator) { - compilationUnit.compilationResult.lineSeparatorPositions = scanner - .getLineEnds(); + compilationUnit.compilationResult.lineSeparatorPositions = scanner.getLineEnds(); } problemReporter.referenceContext = referenceContext; return problemReporter; @@ -3436,8 +3594,7 @@ public class Parser //extends PHPParserSuperclass int[] depths = {0, 0, 0}; int[][] leftPositions = new int[][]{new int[10], new int[10], new int[10]}; int[][] leftDepths = new int[][]{new int[10], new int[10], new int[10]}; - int[][] rightPositions = new int[][]{new int[10], new int[10], - new int[10]}; + int[][] rightPositions = new int[][]{new int[10], new int[10], new int[10]}; int[][] rightDepths = new int[][]{new int[10], new int[10], new int[10]}; scanner.currentPosition = scanner.initialPosition; //starting // point @@ -3458,8 +3615,7 @@ public class Parser //extends PHPParserSuperclass // (source[scanner.currentPosition] == 'u')) { // isWhiteSpace = scanner.jumpOverUnicodeWhiteSpace(); // } else { - if (scanner.recordLineSeparator - && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) { + if (scanner.recordLineSeparator && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) { if (scanner.lineEnds[scanner.linePtr] < scanner.startPosition) { // only record line positions we have not // recorded yet @@ -3468,123 +3624,89 @@ public class Parser //extends PHPParserSuperclass } isWhiteSpace = CharOperation.isWhitespace(scanner.currentCharacter); // } - } while (isWhiteSpace - && (scanner.currentPosition < scanner.eofPosition)); + } while (isWhiteSpace && (scanner.currentPosition < scanner.eofPosition)); // -------consume token until } is found--------- switch (scanner.currentCharacter) { - case '{' : - { - int index = leftCount[CurlyBracket]++; - if (index == leftPositions[CurlyBracket].length) { - System.arraycopy(leftPositions[CurlyBracket], 0, - (leftPositions[CurlyBracket] = new int[index * 2]), 0, - index); - System - .arraycopy(leftDepths[CurlyBracket], 0, - (leftDepths[CurlyBracket] = new int[index * 2]), 0, - index); - } - leftPositions[CurlyBracket][index] = scanner.startPosition; - leftDepths[CurlyBracket][index] = depths[CurlyBracket]++; + case '{' : { + int index = leftCount[CurlyBracket]++; + if (index == leftPositions[CurlyBracket].length) { + System.arraycopy(leftPositions[CurlyBracket], 0, (leftPositions[CurlyBracket] = new int[index * 2]), 0, index); + System.arraycopy(leftDepths[CurlyBracket], 0, (leftDepths[CurlyBracket] = new int[index * 2]), 0, index); } + leftPositions[CurlyBracket][index] = scanner.startPosition; + leftDepths[CurlyBracket][index] = depths[CurlyBracket]++; + } break; - case '}' : - { - int index = rightCount[CurlyBracket]++; - if (index == rightPositions[CurlyBracket].length) { - System.arraycopy(rightPositions[CurlyBracket], 0, - (rightPositions[CurlyBracket] = new int[index * 2]), 0, - index); - System.arraycopy(rightDepths[CurlyBracket], 0, - (rightDepths[CurlyBracket] = new int[index * 2]), 0, - index); - } - rightPositions[CurlyBracket][index] = scanner.startPosition; - rightDepths[CurlyBracket][index] = --depths[CurlyBracket]; + case '}' : { + int index = rightCount[CurlyBracket]++; + if (index == rightPositions[CurlyBracket].length) { + System.arraycopy(rightPositions[CurlyBracket], 0, (rightPositions[CurlyBracket] = new int[index * 2]), 0, index); + System.arraycopy(rightDepths[CurlyBracket], 0, (rightDepths[CurlyBracket] = new int[index * 2]), 0, index); } + rightPositions[CurlyBracket][index] = scanner.startPosition; + rightDepths[CurlyBracket][index] = --depths[CurlyBracket]; + } break; - case '(' : - { - int index = leftCount[RoundBracket]++; - if (index == leftPositions[RoundBracket].length) { - System.arraycopy(leftPositions[RoundBracket], 0, - (leftPositions[RoundBracket] = new int[index * 2]), 0, - index); - System - .arraycopy(leftDepths[RoundBracket], 0, - (leftDepths[RoundBracket] = new int[index * 2]), 0, - index); - } - leftPositions[RoundBracket][index] = scanner.startPosition; - leftDepths[RoundBracket][index] = depths[RoundBracket]++; + case '(' : { + int index = leftCount[RoundBracket]++; + if (index == leftPositions[RoundBracket].length) { + System.arraycopy(leftPositions[RoundBracket], 0, (leftPositions[RoundBracket] = new int[index * 2]), 0, index); + System.arraycopy(leftDepths[RoundBracket], 0, (leftDepths[RoundBracket] = new int[index * 2]), 0, index); } + leftPositions[RoundBracket][index] = scanner.startPosition; + leftDepths[RoundBracket][index] = depths[RoundBracket]++; + } break; - case ')' : - { - int index = rightCount[RoundBracket]++; - if (index == rightPositions[RoundBracket].length) { - System.arraycopy(rightPositions[RoundBracket], 0, - (rightPositions[RoundBracket] = new int[index * 2]), 0, - index); - System.arraycopy(rightDepths[RoundBracket], 0, - (rightDepths[RoundBracket] = new int[index * 2]), 0, - index); - } - rightPositions[RoundBracket][index] = scanner.startPosition; - rightDepths[RoundBracket][index] = --depths[RoundBracket]; + case ')' : { + int index = rightCount[RoundBracket]++; + if (index == rightPositions[RoundBracket].length) { + System.arraycopy(rightPositions[RoundBracket], 0, (rightPositions[RoundBracket] = new int[index * 2]), 0, index); + System.arraycopy(rightDepths[RoundBracket], 0, (rightDepths[RoundBracket] = new int[index * 2]), 0, index); } + rightPositions[RoundBracket][index] = scanner.startPosition; + rightDepths[RoundBracket][index] = --depths[RoundBracket]; + } break; - case '[' : - { - int index = leftCount[SquareBracket]++; - if (index == leftPositions[SquareBracket].length) { - System.arraycopy(leftPositions[SquareBracket], 0, - (leftPositions[SquareBracket] = new int[index * 2]), 0, - index); - System.arraycopy(leftDepths[SquareBracket], 0, - (leftDepths[SquareBracket] = new int[index * 2]), 0, - index); - } - leftPositions[SquareBracket][index] = scanner.startPosition; - leftDepths[SquareBracket][index] = depths[SquareBracket]++; + case '[' : { + int index = leftCount[SquareBracket]++; + if (index == leftPositions[SquareBracket].length) { + System.arraycopy(leftPositions[SquareBracket], 0, (leftPositions[SquareBracket] = new int[index * 2]), 0, index); + System.arraycopy(leftDepths[SquareBracket], 0, (leftDepths[SquareBracket] = new int[index * 2]), 0, index); } + leftPositions[SquareBracket][index] = scanner.startPosition; + leftDepths[SquareBracket][index] = depths[SquareBracket]++; + } break; - case ']' : - { - int index = rightCount[SquareBracket]++; - if (index == rightPositions[SquareBracket].length) { - System.arraycopy(rightPositions[SquareBracket], 0, - (rightPositions[SquareBracket] = new int[index * 2]), 0, - index); - System.arraycopy(rightDepths[SquareBracket], 0, - (rightDepths[SquareBracket] = new int[index * 2]), 0, - index); - } - rightPositions[SquareBracket][index] = scanner.startPosition; - rightDepths[SquareBracket][index] = --depths[SquareBracket]; + case ']' : { + int index = rightCount[SquareBracket]++; + if (index == rightPositions[SquareBracket].length) { + System.arraycopy(rightPositions[SquareBracket], 0, (rightPositions[SquareBracket] = new int[index * 2]), 0, index); + System.arraycopy(rightDepths[SquareBracket], 0, (rightDepths[SquareBracket] = new int[index * 2]), 0, index); } + rightPositions[SquareBracket][index] = scanner.startPosition; + rightDepths[SquareBracket][index] = --depths[SquareBracket]; + } break; - case '\'' : - { - if (scanner.getNextChar('\\')) { - scanner.scanEscapeCharacter(); - } else { // consume next character - scanner.unicodeAsBackSlash = false; - // if (((scanner.currentCharacter = - // source[scanner.currentPosition++]) == - // '\\') && - // (source[scanner.currentPosition] == - // 'u')) { - // scanner.getNextUnicodeChar(); - // } else { - if (scanner.withoutUnicodePtr != 0) { - scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter; - } - // } + case '\'' : { + if (scanner.getNextChar('\\')) { + scanner.scanEscapeCharacter(); + } else { // consume next character + scanner.unicodeAsBackSlash = false; + // if (((scanner.currentCharacter = + // source[scanner.currentPosition++]) == + // '\\') && + // (source[scanner.currentPosition] == + // 'u')) { + // scanner.getNextUnicodeChar(); + // } else { + if (scanner.withoutUnicodePtr != 0) { + scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter; } - scanner.getNextChar('\''); - break; + // } } + scanner.getNextChar('\''); + break; + } case '"' : // consume next character scanner.unicodeAsBackSlash = false; @@ -3625,12 +3747,36 @@ public class Parser //extends PHPParserSuperclass // } } break; - case '/' : - { - int test; - if ((test = scanner.getNextChar('/', '*')) == 0) { //line - // comment + case '/' : { + int test; + if ((test = scanner.getNextChar('/', '*')) == 0) { //line + // comment + //get the next char + if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') + && (source[scanner.currentPosition] == 'u')) { + //-------------unicode traitement + // ------------ + int c1 = 0, c2 = 0, c3 = 0, c4 = 0; + scanner.currentPosition++; + while (source[scanner.currentPosition] == 'u') { + scanner.currentPosition++; + } + if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c1 < 0 + || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c2 < 0 + || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c3 < 0 + || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c4 < 0) { //error + // don't + // care of the + // value + scanner.currentCharacter = 'A'; + } //something different from \n and \r + else { + scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); + } + } + while (scanner.currentCharacter != '\r' && scanner.currentCharacter != '\n') { //get the next char + scanner.startPosition = scanner.currentPosition; if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { //-------------unicode traitement @@ -3640,96 +3786,80 @@ public class Parser //extends PHPParserSuperclass while (source[scanner.currentPosition] == 'u') { scanner.currentPosition++; } - if ((c1 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c1 < 0 - || (c2 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c2 < 0 - || (c3 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c3 < 0 - || (c4 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c4 < 0) { //error don't + if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c1 < 0 + || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c2 < 0 + || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c3 < 0 + || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c4 < 0) { //error + // don't // care of the // value scanner.currentCharacter = 'A'; - } //something different from \n and \r + } //something different from \n + // and \r else { scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); } } - while (scanner.currentCharacter != '\r' - && scanner.currentCharacter != '\n') { - //get the next char - scanner.startPosition = scanner.currentPosition; - if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') - && (source[scanner.currentPosition] == 'u')) { - //-------------unicode traitement - // ------------ - int c1 = 0, c2 = 0, c3 = 0, c4 = 0; - scanner.currentPosition++; - while (source[scanner.currentPosition] == 'u') { - scanner.currentPosition++; - } - if ((c1 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c1 < 0 - || (c2 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c2 < 0 - || (c3 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c3 < 0 - || (c4 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c4 < 0) { //error don't - // care of the - // value - scanner.currentCharacter = 'A'; - } //something different from \n - // and \r - else { - scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); - } - } - } - if (scanner.recordLineSeparator - && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) { - if (scanner.lineEnds[scanner.linePtr] < scanner.startPosition) { - // only record line positions we - // have not recorded yet - scanner.pushLineSeparator(); - if (this.scanner.taskTags != null) { - this.scanner.checkTaskTag(this.scanner - .getCurrentTokenStartPosition(), this.scanner - .getCurrentTokenEndPosition()); - } + } + if (scanner.recordLineSeparator && ((scanner.currentCharacter == '\r') || (scanner.currentCharacter == '\n'))) { + if (scanner.lineEnds[scanner.linePtr] < scanner.startPosition) { + // only record line positions we + // have not recorded yet + scanner.pushLineSeparator(); + if (this.scanner.taskTags != null) { + this.scanner.checkTaskTag(this.scanner.getCurrentTokenStartPosition(), this.scanner + .getCurrentTokenEndPosition()); } } - break; } - if (test > 0) { //traditional and annotation - // comment - boolean star = false; - // consume next character - scanner.unicodeAsBackSlash = false; - // if (((scanner.currentCharacter = - // source[scanner.currentPosition++]) == - // '\\') && - // (source[scanner.currentPosition] == - // 'u')) { - // scanner.getNextUnicodeChar(); - // } else { - if (scanner.withoutUnicodePtr != 0) { - scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter; + break; + } + if (test > 0) { //traditional and annotation + // comment + boolean star = false; + // consume next character + scanner.unicodeAsBackSlash = false; + // if (((scanner.currentCharacter = + // source[scanner.currentPosition++]) == + // '\\') && + // (source[scanner.currentPosition] == + // 'u')) { + // scanner.getNextUnicodeChar(); + // } else { + if (scanner.withoutUnicodePtr != 0) { + scanner.withoutUnicodeBuffer[++scanner.withoutUnicodePtr] = scanner.currentCharacter; + } + // } + if (scanner.currentCharacter == '*') { + star = true; + } + //get the next char + if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') + && (source[scanner.currentPosition] == 'u')) { + //-------------unicode traitement + // ------------ + int c1 = 0, c2 = 0, c3 = 0, c4 = 0; + scanner.currentPosition++; + while (source[scanner.currentPosition] == 'u') { + scanner.currentPosition++; } - // } - if (scanner.currentCharacter == '*') { - star = true; + if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c1 < 0 + || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c2 < 0 + || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c3 < 0 + || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c4 < 0) { //error + // don't + // care of the + // value + scanner.currentCharacter = 'A'; + } //something different from * and / + else { + scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); } - //get the next char + } + //loop until end of comment */ + while ((scanner.currentCharacter != '/') || (!star)) { + star = scanner.currentCharacter == '*'; + //get next char if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') && (source[scanner.currentPosition] == 'u')) { //-------------unicode traitement @@ -3739,70 +3869,28 @@ public class Parser //extends PHPParserSuperclass while (source[scanner.currentPosition] == 'u') { scanner.currentPosition++; } - if ((c1 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c1 < 0 - || (c2 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c2 < 0 - || (c3 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c3 < 0 - || (c4 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c4 < 0) { //error don't + if ((c1 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c1 < 0 + || (c2 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c2 < 0 + || (c3 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c3 < 0 + || (c4 = Character.getNumericValue(source[scanner.currentPosition++])) > 15 || c4 < 0) { //error + // don't // care of the // value scanner.currentCharacter = 'A'; - } //something different from * and / + } //something different from * and + // / else { scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); } } - //loop until end of comment */ - while ((scanner.currentCharacter != '/') || (!star)) { - star = scanner.currentCharacter == '*'; - //get next char - if (((scanner.currentCharacter = source[scanner.currentPosition++]) == '\\') - && (source[scanner.currentPosition] == 'u')) { - //-------------unicode traitement - // ------------ - int c1 = 0, c2 = 0, c3 = 0, c4 = 0; - scanner.currentPosition++; - while (source[scanner.currentPosition] == 'u') { - scanner.currentPosition++; - } - if ((c1 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c1 < 0 - || (c2 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c2 < 0 - || (c3 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c3 < 0 - || (c4 = Character - .getNumericValue(source[scanner.currentPosition++])) > 15 - || c4 < 0) { //error don't - // care of the - // value - scanner.currentCharacter = 'A'; - } //something different from * and - // / - else { - scanner.currentCharacter = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4); - } - } - } - if (this.scanner.taskTags != null) { - this.scanner.checkTaskTag(this.scanner - .getCurrentTokenStartPosition(), this.scanner - .getCurrentTokenEndPosition()); - } - break; + } + if (this.scanner.taskTags != null) { + this.scanner.checkTaskTag(this.scanner.getCurrentTokenStartPosition(), this.scanner.getCurrentTokenEndPosition()); } break; } + break; + } default : if (Scanner.isPHPIdentifierStart(scanner.currentCharacter)) { scanner.scanIdentifierOrKeyword(false); @@ -3843,8 +3931,7 @@ public class Parser //extends PHPParserSuperclass } } if (end < 0) { // did not find a good closing match - problemReporter.unmatchedBracket(start, referenceContext, - compilationUnit.compilationResult); + problemReporter.unmatchedBracket(start, referenceContext, compilationUnit.compilationResult); return true; } // check if even number of opening/closing other brackets @@ -3862,8 +3949,7 @@ public class Parser //extends PHPParserSuperclass balance--; } if (balance != 0) { - problemReporter.unmatchedBracket(start, referenceContext, - compilationUnit.compilationResult); //bracket + problemReporter.unmatchedBracket(start, referenceContext, compilationUnit.compilationResult); //bracket // anomaly return true; } @@ -3872,14 +3958,13 @@ public class Parser //extends PHPParserSuperclass // too many opening brackets ? for (int i = rightCount[kind]; i < leftCount[kind]; i++) { anomaliesDetected = true; - problemReporter.unmatchedBracket(leftPositions[kind][leftCount[kind] - - i - 1], referenceContext, compilationUnit.compilationResult); + problemReporter.unmatchedBracket(leftPositions[kind][leftCount[kind] - i - 1], referenceContext, + compilationUnit.compilationResult); } // too many closing brackets ? for (int i = leftCount[kind]; i < rightCount[kind]; i++) { anomaliesDetected = true; - problemReporter.unmatchedBracket(rightPositions[kind][i], - referenceContext, compilationUnit.compilationResult); + problemReporter.unmatchedBracket(rightPositions[kind][i], referenceContext, compilationUnit.compilationResult); } if (anomaliesDetected) return true; @@ -3902,7 +3987,7 @@ public class Parser //extends PHPParserSuperclass astLengthStack[astLengthPtr] = pos; } } - protected void pushOnAstStack(AstNode node) { + protected void pushOnAstStack(ASTNode node) { /* * add a new obj on top of the ast stack */ @@ -3910,8 +3995,8 @@ public class Parser //extends PHPParserSuperclass astStack[++astPtr] = node; } catch (IndexOutOfBoundsException e) { int oldStackLength = astStack.length; - AstNode[] oldStack = astStack; - astStack = new AstNode[oldStackLength + AstStackIncrement]; + ASTNode[] oldStack = astStack; + astStack = new ASTNode[oldStackLength + AstStackIncrement]; System.arraycopy(oldStack, 0, astStack, 0, oldStackLength); astPtr = oldStackLength; astStack[astPtr] = node; @@ -3926,4 +4011,11 @@ public class Parser //extends PHPParserSuperclass astLengthStack[astLengthPtr] = 1; } } + + protected void resetModifiers() { + this.modifiers = AccDefault; + this.modifiersSourceStart = -1; // <-- see comment into + // modifiersFlag(int) + this.scanner.commentPtr = -1; + } } \ No newline at end of file