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 80f61c9..939f999 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,13 +1,11 @@ -/********************************************************************** - 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; @@ -20,14 +18,16 @@ 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.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 net.sourceforge.phpdt.internal.compiler.util.Util; import org.eclipse.core.resources.IFile; public class Parser //extends PHPParserSuperclass @@ -70,12 +70,15 @@ public class Parser //extends PHPParserSuperclass //private boolean phpMode; protected int modifiers; protected int modifiersSourceStart; +// 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; @@ -89,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; @@ -99,7 +103,7 @@ public class Parser //extends PHPParserSuperclass * * @param s * @param sess - * Description of Parameter + * Description of Parameter * @see */ public Parser(IFile fileToParse) { @@ -112,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; @@ -122,14 +127,9 @@ public class Parser //extends PHPParserSuperclass this.initializeScanner(); } public void initializeScanner() { - this.scanner = new Scanner( - false /*comment*/, - false /*whitespace*/, - this.options.getSeverity(CompilerOptions.NonExternalizedString) != ProblemSeverities.Ignore /*nls*/, - false, - false, - this.options.taskTags/*taskTags*/, - this.options.taskPriorites/*taskPriorities*/); + this.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 @@ -143,9 +143,9 @@ 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(); @@ -157,32 +157,24 @@ 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 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); } /** @@ -211,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; } @@ -233,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; @@ -265,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."); @@ -300,8 +302,7 @@ 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(); @@ -319,10 +320,10 @@ public class Parser //extends PHPParserSuperclass } } } while (true); - + endParse(0); } - + protected CompilationUnitDeclaration endParse(int act) { this.lastAct = act; @@ -348,14 +349,15 @@ public class Parser //extends PHPParserSuperclass } 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]); + 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) { @@ -549,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; } @@ -606,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(); @@ -776,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(); @@ -865,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; @@ -921,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); @@ -960,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(); } @@ -1097,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 { @@ -1122,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: @@ -1141,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; } } @@ -1160,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(); @@ -1245,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."); } @@ -1281,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); @@ -1292,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) { @@ -1321,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."); @@ -1341,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()); @@ -1401,18 +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) { - FieldDeclaration fieldDeclaration = new FieldDeclaration(null, scanner - .getCurrentIdentifierSource(), scanner - .getCurrentTokenStartPosition(), scanner - .getCurrentTokenEndPosition()); + 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(); @@ -1447,12 +1447,8 @@ public class Parser //extends PHPParserSuperclass typeDecl.methods = new AbstractMethodDeclaration[]{methodDecl}; } else { AbstractMethodDeclaration[] newMethods; - System - .arraycopy( - typeDecl.methods, - 0, - newMethods = new AbstractMethodDeclaration[typeDecl.methods.length + 1], - 1, 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; } @@ -1466,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; @@ -1479,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(); @@ -1490,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."); @@ -1499,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'."); } } @@ -1523,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(); @@ -1591,7 +1588,7 @@ public class Parser //extends PHPParserSuperclass expr(); //constant(); if (token == TokenNameCOLON || token == TokenNameSEMICOLON) { getNextToken(); - if (token == TokenNamecase || token == TokenNamedefault) { + if (token == TokenNamecase || token == TokenNamedefault) { // empty case statement ? continue; } @@ -1611,20 +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(); - if (token==TokenNameRBRACE) { + if (token == TokenNameRBRACE) { // empty default case break; } - statementList(); + if (token != TokenNamecase) { + statementList(); + } } else { - throwSyntaxError("':' character after 'default' expected."); + throwSyntaxError("':' character expected after 'default'."); } } } while (token == TokenNamecase || token == TokenNamedefault); @@ -2035,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 { @@ -2053,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 { @@ -2071,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 { @@ -2082,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 : @@ -2106,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 : @@ -2173,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(); @@ -2204,8 +2198,7 @@ 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; @@ -2215,8 +2208,7 @@ public class Parser //extends PHPParserSuperclass getNextToken(); break; } else { - throwSyntaxError("Error in expression (found token '" - + scanner.toStringAction(token) + "')."); + throwSyntaxError("Error in expression (found token '" + scanner.toStringAction(token) + "')."); } } return; @@ -2474,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 @@ -2496,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; iTokenNameKEYWORD) { + if (token == TokenNameIdentifier || token > TokenNameKEYWORD) { getNextToken(); if (token == TokenNameLBRACKET) { getNextToken(); @@ -3095,6 +3142,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 ')' @@ -3124,13 +3173,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 ')' @@ -3147,13 +3211,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; } } @@ -3189,10 +3267,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 : @@ -3476,6 +3554,7 @@ public class Parser //extends PHPParserSuperclass 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 @@ -3484,8 +3563,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; @@ -3503,8 +3581,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 @@ -3525,8 +3602,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 @@ -3535,123 +3611,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; @@ -3692,12 +3734,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 @@ -3707,96 +3773,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 @@ -3806,70 +3856,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); @@ -3910,8 +3918,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 @@ -3929,8 +3936,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; } @@ -3939,14 +3945,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; @@ -3993,4 +3998,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