From: khartlage Date: Thu, 3 Jun 2004 21:37:15 +0000 (+0000) Subject: added class fields to outline X-Git-Url: http://secure.phpeclipse.com?hp=52df73b2356b81760d14dd714e98e3e41924fc9a added class fields to outline --- diff --git a/net.sourceforge.phpeclipse/plugin.xml b/net.sourceforge.phpeclipse/plugin.xml index a872078..1ba0e63 100644 --- a/net.sourceforge.phpeclipse/plugin.xml +++ b/net.sourceforge.phpeclipse/plugin.xml @@ -1,15 +1,16 @@ + - + - + diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/IImportContainer.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/IImportContainer.java new file mode 100644 index 0000000..f7e3095 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/IImportContainer.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package net.sourceforge.phpdt.core; + +/** + * Represents an import container is a child of a Java compilation unit that contains + * all (and only) the import declarations. If a compilation unit has no import + * declarations, no import container will be present. + *

+ * This interface is not intended to be implemented by clients. + *

+ */ +public interface IImportContainer extends IJavaElement, IParent, ISourceReference { +/** + * Returns the first import declaration in this import container with the given name. + * This is a handle-only method. The import declaration may or may not exist. + * + * @param name the given name + * + * @return the first import declaration in this import container with the given name + */ +IImportDeclaration getImport(String name); +} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/IImportDeclaration.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/IImportDeclaration.java new file mode 100644 index 0000000..c8587e9 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/IImportDeclaration.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * 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: + * IBM Corporation - initial API and implementation + * IBM Corporation - added J2SE 1.5 support + *******************************************************************************/ +package net.sourceforge.phpdt.core; + +/** + * Represents an import declaration in Java compilation unit. + *

+ * This interface is not intended to be implemented by clients. + *

+ */ +public interface IImportDeclaration extends IJavaElement, ISourceReference, ISourceManipulation { +/** + * Returns the name that has been imported. + * For an on-demand import, this includes the trailing ".*". + * For example, for the statement "import java.util.*", + * this returns "java.util.*". + * For the statement "import java.util.Hashtable", + * this returns "java.util.Hashtable". + * + * @return the name that has been imported + */ +String getElementName(); +/** + * Returns the modifier flags for this import. The flags can be examined using class + * Flags. Only the static flag is meaningful for import declarations. + * + * @return the modifier flags for this import + * @exception JavaModelException if this element does not exist or if an + * exception occurs while accessing its corresponding resource. + * @see Flags + * @since 3.0 + */ +int getFlags() throws JavaModelException; + +/** + * Returns whether the import is on-demand. An import is on-demand if it ends + * with ".*". + * @return true if the import is on-demand, false otherwise + */ +boolean isOnDemand(); +} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/Signature.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/Signature.java index 97eb0fd..de4c360 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/Signature.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/Signature.java @@ -1391,7 +1391,8 @@ public static String toQualifiedName(String[] segments) { * correct */ public static String toString(String signature) throws IllegalArgumentException { - return new String(toCharArray(signature.toCharArray())); +// return new String(toCharArray(signature.toCharArray())); + return ""; } /** * Converts the given method signature to a readable string. The method signature is expected to diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/ToolFactory.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/ToolFactory.java index e008a21..aea8d2e 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/ToolFactory.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/core/ToolFactory.java @@ -161,4 +161,12 @@ public class ToolFactory { scanner.recordLineSeparator = recordLineSeparator; return scanner; } + + public static Scanner createScanner(boolean tokenizeComments, boolean tokenizeWhiteSpace, boolean recordLineSeparator, boolean phpMode){ + + Scanner scanner = new Scanner(tokenizeComments, tokenizeWhiteSpace, false/*nls*/); + scanner.recordLineSeparator = recordLineSeparator; + scanner.setPHPMode(phpMode); + return scanner; + } } diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ISourceElementRequestor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ISourceElementRequestor.java index dea0622..c929ee1 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ISourceElementRequestor.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/ISourceElementRequestor.java @@ -120,7 +120,7 @@ public interface ISourceElementRequestor { * initializationStart denotes the source start of the expression used for initializing * the field if any (-1 if no initialization). */ - //void exitField(int initializationStart, int declarationEnd, int declarationSourceEnd); + void exitField(int initializationStart, int declarationEnd, int declarationSourceEnd); void exitInitializer(int declarationEnd); void exitInterface(int declarationEnd); void exitMethod(int declarationEnd); diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/SourceElementParser.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/SourceElementParser.java index 2f98945..b66cb71 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/SourceElementParser.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/SourceElementParser.java @@ -12,8 +12,6 @@ package net.sourceforge.phpdt.internal.compiler; import java.util.ArrayList; -import net.sourceforge.phpdt.internal.compiler.CompilationResult; - import net.sourceforge.phpdt.core.compiler.CharOperation; import net.sourceforge.phpdt.core.compiler.IProblem; import net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit; @@ -22,9 +20,9 @@ import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions; import net.sourceforge.phpdt.internal.compiler.impl.ReferenceContext; import net.sourceforge.phpdt.internal.compiler.lookup.BlockScope; import net.sourceforge.phpdt.internal.compiler.lookup.ClassScope; -import net.sourceforge.phpdt.internal.compiler.parser.UnitParser; import net.sourceforge.phpdt.internal.compiler.problem.AbortCompilation; import net.sourceforge.phpdt.internal.compiler.problem.ProblemReporter; +import net.sourceforge.phpdt.internal.core.util.CommentRecorderParser; import net.sourceforge.phpeclipse.internal.compiler.ast.AbstractMethodDeclaration; import net.sourceforge.phpeclipse.internal.compiler.ast.AnonymousLocalTypeDeclaration; import net.sourceforge.phpeclipse.internal.compiler.ast.Argument; @@ -62,7 +60,7 @@ import net.sourceforge.phpeclipse.internal.compiler.ast.TypeReference; * Any (parsing) problem encountered is also provided. */ -public class SourceElementParser extends UnitParser { +public class SourceElementParser extends CommentRecorderParser {//extends UnitParser { ISourceElementRequestor requestor; int fieldCount; @@ -70,7 +68,7 @@ public class SourceElementParser extends UnitParser { int lastFieldEndPosition; ISourceType sourceType; boolean reportReferenceInfo; - char[][] typeNames; + char[][] typeNames; char[][] superTypeNames; int nestedTypeIndex; static final char[] JAVA_LANG_OBJECT = "java.lang.Object".toCharArray(); //$NON-NLS-1$ @@ -815,18 +813,18 @@ public void notifySourceElementRequestor(AbstractMethodDeclaration methodDeclara requestor.exitMethod(methodDeclaration.declarationSourceEnd); } } -///* -//* Update the bodyStart of the corresponding parse node -//*/ -//public void notifySourceElementRequestor(FieldDeclaration fieldDeclaration) { -// -// // range check -// boolean isInRange = -// scanner.initialPosition <= fieldDeclaration.declarationSourceStart -// && scanner.eofPosition >= fieldDeclaration.declarationSourceEnd; -// -// if (fieldDeclaration.isField()) { -// int fieldEndPosition = fieldDeclaration.declarationSourceEnd; +/* +* Update the bodyStart of the corresponding parse node +*/ +public void notifySourceElementRequestor(FieldDeclaration fieldDeclaration) { + + // range check + boolean isInRange = + scanner.initialPosition <= fieldDeclaration.declarationSourceStart + && scanner.eofPosition >= fieldDeclaration.declarationSourceEnd; + + if (fieldDeclaration.isField()) { + int fieldEndPosition = fieldDeclaration.declarationSourceEnd; // if (fieldDeclaration instanceof SourceFieldDeclaration) { // fieldEndPosition = ((SourceFieldDeclaration) fieldDeclaration).fieldEndPosition; // if (fieldEndPosition == 0) { @@ -834,19 +832,19 @@ public void notifySourceElementRequestor(AbstractMethodDeclaration methodDeclara // fieldEndPosition = fieldDeclaration.declarationSourceEnd; // } // } -// if (isInRange) { -// int modifiers = fieldDeclaration.modifiers; -// boolean deprecated = (modifiers & AccDeprecated) != 0; // remember deprecation so as to not lose it below -// requestor.enterField( -// fieldDeclaration.declarationSourceStart, -// deprecated ? (modifiers & AccJustFlag) | AccDeprecated : modifiers & AccJustFlag, -// returnTypeName(fieldDeclaration.type), -// fieldDeclaration.name, -// fieldDeclaration.sourceStart, -// fieldDeclaration.sourceEnd); -// } + if (isInRange) { + int modifiers = fieldDeclaration.modifiers; + boolean deprecated = (modifiers & AccDeprecated) != 0; // remember deprecation so as to not lose it below + requestor.enterField( + fieldDeclaration.declarationSourceStart, + deprecated ? (modifiers & AccJustFlag) | AccDeprecated : modifiers & AccJustFlag, + returnTypeName(fieldDeclaration.type), + fieldDeclaration.name, + fieldDeclaration.sourceStart, + fieldDeclaration.sourceEnd); + } // this.visitIfNeeded(fieldDeclaration); -// if (isInRange){ + if (isInRange){ // requestor.exitField( // // filter out initializations that are not a constant (simple check) // (fieldDeclaration.initialization == null @@ -862,9 +860,14 @@ public void notifySourceElementRequestor(AbstractMethodDeclaration methodDeclara // fieldDeclaration.initialization.sourceStart, // fieldEndPosition, // fieldDeclaration.declarationSourceEnd); -// } -// -// } else { + requestor.exitField( + // filter out initializations that are not a constant (simple check) + -1, + fieldEndPosition, + fieldDeclaration.declarationSourceEnd); + } + + } else { // if (isInRange){ // requestor.enterInitializer( // fieldDeclaration.declarationSourceStart, @@ -874,8 +877,8 @@ public void notifySourceElementRequestor(AbstractMethodDeclaration methodDeclara // if (isInRange){ // requestor.exitInitializer(fieldDeclaration.declarationSourceEnd); // } -// } -//} + } +} //public void notifySourceElementRequestor( // ImportReference importReference, // boolean isPackage) { @@ -1021,7 +1024,7 @@ public void notifySourceElementRequestor(TypeDeclaration typeDeclaration, boolea switch (nextDeclarationType) { case 0 : fieldIndex++; -// notifySourceElementRequestor(nextFieldDeclaration); + notifySourceElementRequestor(nextFieldDeclaration); break; case 1 : methodIndex++; @@ -1297,5 +1300,19 @@ private void visitIfNeeded(AbstractMethodDeclaration method) { // if (compilationUnit == null) return; // super.reportSyntaxError(act, currentKind,stateStackTop); //} - +protected CompilationUnitDeclaration endParse(int act) { +// if (sourceType != null) { +// if (sourceType.isInterface()) { +// consumeInterfaceDeclaration(); +// } else { +// consumeClassDeclaration(); +// } +// } + if (compilationUnit != null) { + CompilationUnitDeclaration result = super.endParse(act); + return result; + } else { + return null; + } +} } diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/env/ISourceImport.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/env/ISourceImport.java new file mode 100644 index 0000000..dd5932b --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/env/ISourceImport.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package net.sourceforge.phpdt.internal.compiler.env; + +public interface ISourceImport { + +/** + * Answer the source end position of the import declaration. + */ + +int getDeclarationSourceEnd(); +/** + * Answer the source start position of the import declaration. + */ + +int getDeclarationSourceStart(); + +/** + * Answer an int whose bits are set according the access constants + * defined by the VM spec. + * Since Java 1.5, static imports can be defined. + */ +int getModifiers(); + +/** + * Answer the name of the import. + * A name is a simple name or a qualified, dot separated name. + * For example, Hashtable or java.util.Hashtable. + */ +char[] getName(); + +/** + * Answer whether the import is on demand or not + * On demand import names have no trailing star + */ +boolean onDemand(); +} 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..d2b5e96 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,3977 +18,4078 @@ 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.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 - implements ITerminalSymbols, CompilerModifiers, ParserBasicInformation { - //internal data for the automat - protected final static int StackIncrement = 255; - protected int stateStackTop; - protected int[] stack = new int[StackIncrement]; - public int firstToken; // handle for multiple parsing goals - public int lastAct; //handle for multiple parsing goals - protected RecoveredElement currentElement; - public static boolean VERBOSE_RECOVERY = false; - protected boolean diet = false; //tells the scanner to jump over some - // parts of the code/expressions like - // method bodies - //scanner token - public Scanner scanner; - private ArrayList phpList; - private int currentPHPString; - private boolean phpEnd; - // private static HashMap keywordMap = null; - private String str; - // current character - // char ch; - // current token - int token; - // row counter for syntax errors: - //int rowCount; - // column counter for syntax errors: - //int columnCount; - //int chIndx; - // - // // current identifier - // String identifier; - Long longNumber; - Double doubleNumber; - private String stringValue; - /** Contains the current expression. */ - // private StringBuffer expression; - //private boolean phpMode; - protected int modifiers; - protected int modifiersSourceStart; - protected Parser(ProblemReporter problemReporter) { - this.problemReporter = problemReporter; - this.options = problemReporter.options; - this.currentPHPString = 0; - // PHPParserSuperclass.fileToParse = fileToParse; - this.phpList = null; - this.str = ""; - this.token = TokenNameEOF; - // this.chIndx = 0; - // this.rowCount = 1; - // this.columnCount = 0; - this.phpEnd = false; - // getNextToken(); - this.initializeScanner(); - } - public void setFileToParse(IFile fileToParse) { - this.currentPHPString = 0; - // PHPParserSuperclass.fileToParse = fileToParse; - this.phpList = null; - this.str = ""; - this.token = TokenNameEOF; - this.phpEnd = false; - this.initializeScanner(); - } - /** - * ClassDeclaration Constructor. - * - * @param s - * @param sess - * Description of Parameter - * @see - */ - public Parser(IFile fileToParse) { - // if (keywordMap == null) { - // keywordMap = new HashMap(); - // for (int i = 0; i < PHP_KEYWORS.length; i++) { - // keywordMap.put(PHP_KEYWORS[i], new Integer(PHP_KEYWORD_TOKEN[i])); - // } - // } - this.currentPHPString = 0; - // PHPParserSuperclass.fileToParse = fileToParse; - this.phpList = null; - this.str = ""; - this.token = TokenNameEOF; - // this.chIndx = 0; - // this.rowCount = 1; - // this.columnCount = 0; - this.phpEnd = false; - // getNextToken(); - 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*/); - } - /** - * Create marker for the parse error - */ - // private void setMarker(String message, int charStart, int charEnd, int - // errorLevel) { - // setMarker(fileToParse, message, charStart, charEnd, errorLevel); - // } - /** - * This method will throw the SyntaxError. It will add the good lines and - * columns to the Error - * - * @param error - * the error message - * @throws SyntaxError - * the error raised - */ - private void throwSyntaxError(String error) { - int problemStartPosition = scanner.getCurrentTokenStartPosition(); - int problemEndPosition = scanner.getCurrentTokenEndPosition(); - 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 - * @throws SyntaxError - * 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); - 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, - compilationUnit.compilationResult); - } - /** - * Method Declaration. - * - * @see - */ - // private void getChar() { - // if (str.length() > chIndx) { - // ch = str.charAt(chIndx++); - // - // return; - // } - // - // chIndx = str.length() + 1; - // ch = ' '; - // // token = TokenNameEOF; - // phpEnd = true; - // } - /** - * gets the next token from input - */ - private void getNextToken() { - try { - token = scanner.getNextToken(); - if (Scanner.DEBUG) { - int currentEndPosition = scanner.getCurrentTokenEndPosition(); - int currentStartPosition = scanner.getCurrentTokenStartPosition(); - System.out - .print(currentStartPosition + "," + currentEndPosition + ": "); - System.out.println(scanner.toStringAction(token)); - } - } catch (InvalidInputException e) { - token = TokenNameERROR; - } - return; - } - public void init(String s) { - this.str = s; - this.token = TokenNameEOF; - // this.chIndx = 0; - // this.rowCount = 1; - // this.columnCount = 0; - this.phpEnd = false; - // this.phpMode = false; - /* scanner initialization */ - scanner.setSource(s.toCharArray()); - scanner.setPHPMode(false); - } - protected void initialize(boolean phpMode) { - compilationUnit = null; - referenceContext = null; - this.str = ""; - this.token = TokenNameEOF; - // this.chIndx = 0; - // this.rowCount = 1; - // this.columnCount = 0; - this.phpEnd = false; - // this.phpMode = phpMode; - scanner.setPHPMode(phpMode); - } - /** - * Parses a string with php tags i.e. '<body> <?php phpinfo() ?> - * </body>' - */ - public void parse(String s) { - init(s); - parse(); - } - /** - * Parses a string with php tags i.e. '<body> <?php phpinfo() ?> - * </body>' - */ - protected void parse() { - getNextToken(); - do { - try { - if (token != TokenNameEOF && token != TokenNameERROR) { - statementList(); - } - if (token != TokenNameEOF) { - if (token == TokenNameERROR) { - throwSyntaxError("Scanner error (Found unknown token: " - + scanner.toStringAction(token) + ")"); - } - if (token == TokenNameRPAREN) { - throwSyntaxError("Too many closing ')'; end-of-file not reached."); - } - if (token == TokenNameRBRACE) { - throwSyntaxError("Too many closing '}'; end-of-file not reached."); - } - if (token == TokenNameRBRACKET) { - throwSyntaxError("Too many closing ']'; end-of-file not reached."); - } - if (token == TokenNameLPAREN) { - throwSyntaxError("Read character '('; end-of-file not reached."); - } - if (token == TokenNameLBRACE) { - throwSyntaxError("Read character '{'; end-of-file not reached."); - } - if (token == TokenNameLBRACKET) { - throwSyntaxError("Read character '['; end-of-file not reached."); - } - throwSyntaxError("End-of-file not reached."); - } - break; - } catch (SyntaxError sytaxErr1) { - // setMarker(sytaxErr1.getMessage(), sytaxErr1.getLine(), - // ERROR); - // setMarker(sytaxErr1.getMessage(), - // scanner.getCurrentTokenStartPosition(), - // scanner.getCurrentTokenEndPosition(), ERROR); - try { - // if an error occured, - // 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) { - break; - } - getNextToken(); - } - if (token == TokenNameEOF || token == TokenNameERROR) { - break; - } - } catch (SyntaxError sytaxErr2) { - // setMarker(sytaxErr2.getMessage(), sytaxErr2.getLine(), - // ERROR); - // setMarker(sytaxErr2.getMessage(), - // scanner.getCurrentTokenStartPosition(), - // scanner.getCurrentTokenEndPosition(), ERROR); - break; - } - } - } while (true); - - endParse(0); - } - - protected CompilationUnitDeclaration endParse(int act) { + implements ITerminalSymbols, CompilerModifiers, ParserBasicInformation { + //internal data for the automat + protected final static int StackIncrement = 255; + protected int stateStackTop; + protected int[] stack = new int[StackIncrement]; + public int firstToken; // handle for multiple parsing goals + public int lastAct; //handle for multiple parsing goals + protected RecoveredElement currentElement; + public static boolean VERBOSE_RECOVERY = false; + protected boolean diet = false; //tells the scanner to jump over some + // parts of the code/expressions like + // method bodies + //scanner token + public Scanner scanner; + private ArrayList phpList; + private int currentPHPString; + private boolean phpEnd; + // private static HashMap keywordMap = null; + private String str; + // current character + // char ch; + // current token + int token; + // row counter for syntax errors: + //int rowCount; + // column counter for syntax errors: + //int columnCount; + //int chIndx; + // + // // current identifier + // String identifier; + Long longNumber; + Double doubleNumber; + private String stringValue; + /** Contains the current expression. */ + // private StringBuffer expression; + //private boolean phpMode; + protected int modifiers; + protected int modifiersSourceStart; + protected Parser(ProblemReporter problemReporter) { + this.problemReporter = problemReporter; + this.options = problemReporter.options; + this.currentPHPString = 0; + // PHPParserSuperclass.fileToParse = fileToParse; + this.phpList = null; + this.str = ""; + this.token = TokenNameEOF; + // this.chIndx = 0; + // this.rowCount = 1; + // this.columnCount = 0; + this.phpEnd = false; + // getNextToken(); + this.initializeScanner(); + } + public void setFileToParse(IFile fileToParse) { + this.currentPHPString = 0; + // PHPParserSuperclass.fileToParse = fileToParse; + this.phpList = null; + this.str = ""; + this.token = TokenNameEOF; + this.phpEnd = false; + this.initializeScanner(); + } + /** + * ClassDeclaration Constructor. + * + * @param s + * @param sess + * Description of Parameter + * @see + */ + public Parser(IFile fileToParse) { + // if (keywordMap == null) { + // keywordMap = new HashMap(); + // for (int i = 0; i < PHP_KEYWORS.length; i++) { + // keywordMap.put(PHP_KEYWORS[i], new Integer(PHP_KEYWORD_TOKEN[i])); + // } + // } + this.currentPHPString = 0; + // PHPParserSuperclass.fileToParse = fileToParse; + this.phpList = null; + this.str = ""; + this.token = TokenNameEOF; + // this.chIndx = 0; + // this.rowCount = 1; + // this.columnCount = 0; + this.phpEnd = false; + // getNextToken(); + 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 */); + } + /** + * Create marker for the parse error + */ + // private void setMarker(String message, int charStart, int charEnd, int + // errorLevel) { + // setMarker(fileToParse, message, charStart, charEnd, errorLevel); + // } + /** + * This method will throw the SyntaxError. It will add the good lines and + * columns to the Error + * + * @param error + * the error message + * @throws SyntaxError + * the error raised + */ + private void throwSyntaxError(String error) { + int problemStartPosition = scanner.getCurrentTokenStartPosition(); + int problemEndPosition = scanner.getCurrentTokenEndPosition(); + 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 + * @throws SyntaxError + * 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); + 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, + compilationUnit.compilationResult); + } + /** + * Method Declaration. + * + * @see + */ + // private void getChar() { + // if (str.length() > chIndx) { + // ch = str.charAt(chIndx++); + // + // return; + // } + // + // chIndx = str.length() + 1; + // ch = ' '; + // // token = TokenNameEOF; + // phpEnd = true; + // } + /** + * gets the next token from input + */ + private void getNextToken() { + try { + token = scanner.getNextToken(); + if (Scanner.DEBUG) { + int currentEndPosition = scanner.getCurrentTokenEndPosition(); + int currentStartPosition = scanner + .getCurrentTokenStartPosition(); + System.out.print(currentStartPosition + "," + + currentEndPosition + ": "); + System.out.println(scanner.toStringAction(token)); + } + } catch (InvalidInputException e) { + token = TokenNameERROR; + } + return; + } + public void init(String s) { + this.str = s; + this.token = TokenNameEOF; + // this.chIndx = 0; + // this.rowCount = 1; + // this.columnCount = 0; + this.phpEnd = false; + // this.phpMode = false; + /* scanner initialization */ + scanner.setSource(s.toCharArray()); + scanner.setPHPMode(false); + } + protected void initialize(boolean phpMode) { + compilationUnit = null; + referenceContext = null; + this.str = ""; + this.token = TokenNameEOF; + // this.chIndx = 0; + // this.rowCount = 1; + // this.columnCount = 0; + this.phpEnd = false; + // this.phpMode = phpMode; + scanner.setPHPMode(phpMode); + } + /** + * Parses a string with php tags i.e. '<body> <?php phpinfo() ?> + * </body>' + */ + public void parse(String s) { + init(s); + parse(); + } + /** + * Parses a string with php tags i.e. '<body> <?php phpinfo() ?> + * </body>' + */ + protected void parse() { + getNextToken(); + do { + try { + if (token != TokenNameEOF && token != TokenNameERROR) { + statementList(); + } + if (token != TokenNameEOF) { + if (token == TokenNameERROR) { + throwSyntaxError("Scanner error (Found unknown token: " + + scanner.toStringAction(token) + ")"); + } + if (token == TokenNameRPAREN) { + throwSyntaxError("Too many closing ')'; end-of-file not reached."); + } + if (token == TokenNameRBRACE) { + throwSyntaxError("Too many closing '}'; end-of-file not reached."); + } + if (token == TokenNameRBRACKET) { + throwSyntaxError("Too many closing ']'; end-of-file not reached."); + } + if (token == TokenNameLPAREN) { + throwSyntaxError("Read character '('; end-of-file not reached."); + } + if (token == TokenNameLBRACE) { + throwSyntaxError("Read character '{'; end-of-file not reached."); + } + if (token == TokenNameLBRACKET) { + throwSyntaxError("Read character '['; end-of-file not reached."); + } + throwSyntaxError("End-of-file not reached."); + } + break; + } catch (SyntaxError sytaxErr1) { + // setMarker(sytaxErr1.getMessage(), sytaxErr1.getLine(), + // ERROR); + // setMarker(sytaxErr1.getMessage(), + // scanner.getCurrentTokenStartPosition(), + // scanner.getCurrentTokenEndPosition(), ERROR); + try { + // if an error occured, + // 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) { + break; + } + getNextToken(); + } + if (token == TokenNameEOF || token == TokenNameERROR) { + break; + } + } catch (SyntaxError sytaxErr2) { + // setMarker(sytaxErr2.getMessage(), sytaxErr2.getLine(), + // ERROR); + // setMarker(sytaxErr2.getMessage(), + // scanner.getCurrentTokenStartPosition(), + // scanner.getCurrentTokenEndPosition(), ERROR); + break; + } + } + } while (true); + + endParse(0); + } + + protected CompilationUnitDeclaration endParse(int act) { + + this.lastAct = 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]); + } + } + return compilationUnit; + } + // public PHPOutlineInfo parseInfo(Object parent, String s) { + // PHPOutlineInfo outlineInfo = new PHPOutlineInfo(parent); + // // Stack stack = new Stack(); + // // stack.push(outlineInfo.getDeclarations()); + // this.str = s; + // this.token = TokenNameEOF; + // // this.chIndx = 0; + // // this.rowCount = 1; + // // this.columnCount = 0; + // this.phpEnd = false; + // this.phpMode = false; + // scanner.setSource(s.toCharArray()); + // scanner.setPHPMode(false); + // + // getNextToken(); + // parseDeclarations(outlineInfo, outlineInfo.getDeclarations(), false); + // + // return outlineInfo; + // } + private boolean isVariable() { + return token == TokenNameVariable; // || token == TokenNamethis; + } + // private void parseDeclarations(PHPOutlineInfo outlineInfo, + // OutlineableWithChildren current, boolean goBack) { + // char[] ident; + // // PHPClassDeclaration current = (PHPClassDeclaration) stack.peek(); + // PHPSegmentWithChildren temp; + // int counter = 0; + // IPreferenceStore store = + // PHPeclipsePlugin.getDefault().getPreferenceStore(); + // try { + // while (token != TokenNameEOF && token != TokenNameERROR) { + // if (token == TokenNameVariable) { + // ident = scanner.getCurrentIdentifierSource(); + // outlineInfo.addVariable(new String(ident)); + // getNextToken(); + // } else if (token == TokenNamevar) { + // getNextToken(); + // if (token == TokenNameVariable + // && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_VAR)) { + // ident = scanner.getCurrentIdentifierSource(); + // //substring(1) added because PHPVarDeclaration doesn't + // // need the $ anymore + // String variableName = new String(ident).substring(1); + // outlineInfo.addVariable(variableName); + // getNextToken(); + // if (token != TokenNameSEMICOLON) { + // getNextToken(); + // ident = scanner.getCurrentTokenSource(); + // if (token > TokenNameKEYWORD) { + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - ident.length, + // scanner.getCurrentTokenStartPosition(), new String(ident))); + // } else { + // switch (token) { + // case TokenNameVariable : + // case TokenNamethis : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameIdentifier : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameDoubleLiteral : + // current.add(new PHPVarDeclaration(current, variableName + // + doubleNumber, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameIntegerLiteral : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameStringInterpolated : + // case TokenNameStringLiteral : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // case TokenNameStringConstant : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length, + // scanner.getCurrentTokenStartPosition(), new String( + // ident))); + // break; + // default : + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - + // // ident.length + // scanner.getCurrentTokenStartPosition())); + // break; + // } + // } + // } else { + // ident = scanner.getCurrentIdentifierSource(); + // current.add(new PHPVarDeclaration(current, variableName, + // // chIndx - ident.length + // scanner.getCurrentTokenStartPosition())); + // } + // } + // } else if (token == TokenNamefunction) { + // getNextToken(); + // if (token == TokenNameAND) { + // getNextToken(); + // } + // if (token == TokenNameIdentifier + // && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_FUNC)) { + // ident = scanner.getCurrentIdentifierSource(); + // outlineInfo.addVariable(new String(ident)); + // temp = new PHPFunctionDeclaration(current, new String(ident), + // // chIndx - ident.length + // scanner.getCurrentTokenStartPosition()); + // current.add(temp); + // getNextToken(); + // parseDeclarations(outlineInfo, temp, true); + // } + // } else if (token == TokenNameclass) { + // getNextToken(); + // if (token == TokenNameIdentifier + // && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_CLASS)) { + // ident = scanner.getCurrentIdentifierSource(); + // outlineInfo.addVariable(new String(ident)); + // temp = new PHPClassDeclaration(current, new String(ident), + // // chIndx - ident.len + // scanner.getCurrentTokenStartPosition()); + // current.add(temp); + // // stack.push(temp); + // getNextToken(); + // //skip tokens for classname, extends and others until + // // we have the opening '{' + // while (token != TokenNameLBRACE && token != TokenNameEOF + // && token != TokenNameERROR) { + // getNextToken(); + // } + // parseDeclarations(outlineInfo, temp, true); + // // stack.pop(); + // } + // } else if ((token == TokenNameLBRACE) + // || (token == TokenNameDOLLAR_LBRACE)) { + // getNextToken(); + // counter++; + // } else if (token == TokenNameRBRACE) { + // getNextToken(); + // --counter; + // if (counter == 0 && goBack) { + // return; + // } + // } else if (token == TokenNamerequire || token == TokenNamerequire_once + // || token == TokenNameinclude || token == TokenNameinclude_once) { + // ident = scanner.getCurrentTokenSource(); + // getNextToken(); + // int startPosition = scanner.getCurrentTokenStartPosition(); + // expr(); + // char[] expr = scanner.getCurrentTokenSource(startPosition); + // outlineInfo.addVariable(new String(ident)); + // current.add(new PHPReqIncDeclaration(current, new String(ident), + // // chIndx - ident.length, + // startPosition, new String(expr))); + // getNextToken(); + // } else { + // getNextToken(); + // } + // } + // } catch (SyntaxError sytaxErr) { + // // try { + // // // setMarker(sytaxErr.getMessage(), sytaxErr.getLine(), ERROR); + // // setMarker(sytaxErr.getMessage(), + // // scanner.getCurrentTokenStartPosition(), + // // scanner.getCurrentTokenEndPosition(), ERROR); + // // } catch (CoreException e) { + // // } + // } + // } + 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) || (token == TokenNameEOF) + || (token == TokenNameERROR)) { + return; + } + } while (true); + } + private void functionBody(MethodDeclaration methodDecl) { + // '{' [statement-list] '}' + if (token == TokenNameLBRACE) { + getNextToken(); + } else { + throwSyntaxError("'{' expected in compound-statement."); + } + if (token != TokenNameRBRACE) { + statementList(); + } + if (token == TokenNameRBRACE) { + methodDecl.declarationSourceEnd = scanner + .getCurrentTokenEndPosition(); + getNextToken(); + } else { + throwSyntaxError("'}' expected in compound-statement."); + } + } + private void statement(int previousToken) { + // if (token > TokenNameKEYWORD && token != TokenNamelist && token != + // TokenNamenew) { + // char[] ident = scanner.getCurrentIdentifierSource(); + // String keyword = new String(ident); + // if (token == TokenNameAT) { + // getNextToken(); + // if (token != TokenNamerequire && token != TokenNamerequire_once + // && token != TokenNameinclude && token != TokenNameinclude_once + // && token != TokenNameIdentifier && token != TokenNameVariable + // && token != TokenNameStringInterpolated) { + // throwSyntaxError("identifier expected after '@'."); + // } + // } + // if (token == TokenNameinclude || token == TokenNameinclude_once) { + // getNextToken(); + // if (token == TokenNameLPAREN) { + // expr(); + // if (token == TokenNameSEMICOLON) { + // getNextToken(); + // } else { + // if (previousToken != TokenNameAT && token != TokenNameStopPHP) { + // throwSyntaxError("';' expected after 'include' or 'include_once'."); + // } + // // getNextToken(); + // } + // } else { + // concatenationExpression(); + // } + // return; + // } else if (token == TokenNamerequire || token == + // TokenNamerequire_once) + // { + // getNextToken(); + // //constant(); + // if (token == TokenNameLPAREN) { + // expr(); + // if (token == TokenNameSEMICOLON) { + // getNextToken(); + // } else { + // if (previousToken != TokenNameAT && token != TokenNameStopPHP) { + // throwSyntaxError("';' expected after 'require' or 'require_once'."); + // } + // // getNextToken(); + // } + // } else { + // concatenationExpression(); + // } + // return; + // } else + if (token == TokenNameif) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'if' keyword."); + } + expr(); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected after 'if' condition."); + } + ifStatement(); + return; + } else if (token == TokenNameswitch) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'switch' keyword."); + } + expr(); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected after 'switch' condition."); + } + switchStatement(); + return; + } else if (token == TokenNamefor) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'for' keyword."); + } + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + expressionList(); + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + throwSyntaxError("';' expected after 'for'."); + } + } + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + expressionList(); + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + throwSyntaxError("';' expected after 'for'."); + } + } + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + expressionList(); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected after 'for'."); + } + } + forStatement(); + return; + } else if (token == TokenNamewhile) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'while' keyword."); + } + expr(); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected after 'while' condition."); + } + whileStatement(); + return; + } else if (token == TokenNamedo) { + getNextToken(); + if (token == TokenNameLBRACE) { + getNextToken(); + if (token != TokenNameRBRACE) { + statementList(); + } + if (token == TokenNameRBRACE) { + getNextToken(); + } else { + throwSyntaxError("'}' expected after 'do' keyword."); + } + } else { + statement(TokenNameEOF); + } + if (token == TokenNamewhile) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'while' keyword."); + } + expr(); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected after 'while' condition."); + } + } else { + throwSyntaxError("'while' expected after 'do' keyword."); + } + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + if (token != TokenNameINLINE_HTML) { + throwSyntaxError("';' expected after do-while statement."); + } + getNextToken(); + } + return; + } else if (token == TokenNameforeach) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'foreach' keyword."); + } + expr(); + if (token == TokenNameas) { + getNextToken(); + } else { + throwSyntaxError("'as' expected after 'foreach' exxpression."); + } + // variable(); + foreach_variable(); + foreach_optional_arg(); + if (token == TokenNameEQUAL_GREATER) { + getNextToken(); + variable(); + } + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected after 'foreach' expression."); + } + foreachStatement(); + return; + } else if (token == TokenNamecontinue || token == TokenNamebreak + || token == TokenNamereturn) { + getNextToken(); + if (token != TokenNameSEMICOLON) { + expr(); + } + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + if (token != TokenNameINLINE_HTML) { + throwSyntaxError("';' expected after 'continue', 'break' or 'return'."); + } + getNextToken(); + } + return; + } else if (token == TokenNameecho) { + getNextToken(); + expressionList(); + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + if (token != TokenNameINLINE_HTML) { + throwSyntaxError("';' expected after 'echo' statement."); + } + getNextToken(); + } + return; + } else if (token == TokenNameINLINE_HTML) { + getNextToken(); + return; + // } else if (token == TokenNameprint) { + // getNextToken(); + // expression(); + // if (token == TokenNameSEMICOLON) { + // getNextToken(); + // } else { + // if (token != TokenNameStopPHP) { + // throwSyntaxError("';' expected after 'print' statement."); + // } + // getNextToken(); + // } + // return; + } else if (token == TokenNameglobal) { + getNextToken(); + global_var_list(); + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + if (token != TokenNameINLINE_HTML) { + throwSyntaxError("';' expected after 'global' statement."); + } + getNextToken(); + } + return; + } else if (token == TokenNamestatic) { + getNextToken(); + static_var_list(); + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + if (token != TokenNameINLINE_HTML) { + throwSyntaxError("';' expected after 'static' statement."); + } + getNextToken(); + } + return; + } else if (token == TokenNameunset) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'unset' statement."); + } + unset_variables(); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected after 'unset' statement."); + } + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + if (token != TokenNameINLINE_HTML) { + throwSyntaxError("';' expected after 'unset' statement."); + } + getNextToken(); + } + return; + } else if (token == TokenNamefunction) { + MethodDeclaration methodDecl = new MethodDeclaration( + this.compilationUnit.compilationResult); + methodDecl.declarationSourceStart = scanner + .getCurrentTokenStartPosition(); + getNextToken(); + functionDefinition(methodDecl); + return; + } else if (token == TokenNametry) { + getNextToken(); + if (token != TokenNameLBRACE) { + throwSyntaxError("'{' expected in 'try' statement."); + } + getNextToken(); + statementList(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected in 'try' statement."); + } + getNextToken(); + return; + } else if (token == TokenNamecatch) { + getNextToken(); + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected in 'catch' statement."); + } + getNextToken(); + fully_qualified_class_name(); + if (token != TokenNameVariable) { + throwSyntaxError("Variable expected in 'catch' statement."); + } + getNextToken(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected in 'catch' statement."); + } + getNextToken(); + if (token != TokenNameLBRACE) { + throwSyntaxError("'{' expected in 'catch' statement."); + } + getNextToken(); + if (token != TokenNameRBRACE) { + statementList(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected in 'catch' statement."); + } + } + getNextToken(); + additional_catches(); + return; + } else if (token == TokenNamethrow) { + getNextToken(); + expr(); + if (token == TokenNameSEMICOLON) { + getNextToken(); + } else { + throwSyntaxError("';' expected after 'throw' exxpression."); + } + return; + } else if (token == TokenNamefinal || token == TokenNameabstract + || token == TokenNameclass || token == TokenNameinterface) { + TypeDeclaration typeDecl = new TypeDeclaration( + this.compilationUnit.compilationResult); + typeDecl.declarationSourceStart = scanner + .getCurrentTokenStartPosition(); + // default super class + typeDecl.superclass = new SingleTypeReference(TypeConstants.OBJECT, + 0); + compilationUnit.types.add(typeDecl); + try { + pushOnAstStack(typeDecl); + unticked_class_declaration_statement(typeDecl); + // classBody(typeDecl); + } finally { + astPtr--; + astLengthPtr--; + } + return; + // } else { + // throwSyntaxError("Unexpected keyword '" + keyword + "'"); + } else if (token == TokenNameLBRACE) { + getNextToken(); + if (token != TokenNameRBRACE) { + statementList(); + } + if (token == TokenNameRBRACE) { + getNextToken(); + return; + } else { + throwSyntaxError("'}' expected."); + } + } else { + if (token != TokenNameSEMICOLON) { + expr(); + } + if (token == TokenNameSEMICOLON) { + getNextToken(); + return; + } else { + if (token != TokenNameINLINE_HTML && token != TokenNameEOF) { + throwSyntaxError("';' expected after expression (Found token: " + + scanner.toStringAction(token) + ")"); + } + getNextToken(); + } + } + } + private void additional_catches() { + while (token == TokenNamecatch) { + getNextToken(); + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected in 'catch' statement."); + } + getNextToken(); + fully_qualified_class_name(); + if (token != TokenNameVariable) { + throwSyntaxError("Variable expected in 'catch' statement."); + } + getNextToken(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected in 'catch' statement."); + } + getNextToken(); + if (token != TokenNameLBRACE) { + throwSyntaxError("'{' expected in 'catch' statement."); + } + getNextToken(); + statementList(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected in 'catch' statement."); + } + getNextToken(); + } + } + private void foreach_variable() { + // w_variable + //| '&' w_variable + if (token == TokenNameAND) { + getNextToken(); + } + w_variable(); + } + private void foreach_optional_arg() { + // /* empty */ + //| T_DOUBLE_ARROW foreach_variable + if (token == TokenNameEQUAL_GREATER) { + getNextToken(); + foreach_variable(); + } + } + private void global_var_list() { + // global_var_list: + // global_var_list ',' global_var + //| global_var + while (true) { + global_var(); + if (token != TokenNameCOMMA) { + break; + } + getNextToken(); + } + } + private void global_var() { + //global_var: + // T_VARIABLE + //| '$' r_variable + //| '$' '{' expr '}' + if (token == TokenNameVariable) { + getNextToken(); + } else if (token == TokenNameDOLLAR) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + expr(); + if (token != TokenNameLPAREN) { + throwSyntaxError("')' expected in global variable."); + } + getNextToken(); + } else { + r_variable(); + } + } + } + private void static_var_list() { + //static_var_list: + // static_var_list ',' T_VARIABLE + //| static_var_list ',' T_VARIABLE '=' static_scalar + //| T_VARIABLE + //| T_VARIABLE '=' static_scalar + while (true) { + if (token == TokenNameVariable) { + getNextToken(); + if (token == TokenNameEQUAL) { + getNextToken(); + static_scalar(); + } + if (token != TokenNameCOMMA) { + break; + } + getNextToken(); + } else { + break; + } + } + } + private void unset_variables() { + // unset_variables: + // unset_variable + // | unset_variables ',' unset_variable + // unset_variable: + // variable + while (true) { + variable(); + if (token != TokenNameCOMMA) { + break; + } + getNextToken(); + } + } + private final void initializeModifiers() { + this.modifiers = 0; + this.modifiersSourceStart = -1; + } + private final void checkAndSetModifiers(int flag) { + this.modifiers |= flag; + if (this.modifiersSourceStart < 0) + this.modifiersSourceStart = this.scanner.startPosition; + } + private void unticked_class_declaration_statement(TypeDeclaration typeDecl) { + initializeModifiers(); + if (token == TokenNameinterface) { + // interface_entry T_STRING + // interface_extends_list + // '{' class_statement_list '}' + checkAndSetModifiers(AccInterface); + getNextToken(); + typeDecl.modifiers = this.modifiers; + 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); + } + 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); + return; + } + } else { + // class_entry_type T_STRING extends_from + // implements_list + // '{' class_statement_list'}' + class_entry_type(); + typeDecl.modifiers = this.modifiers; + //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); + } + getNextToken(); + // extends_from: + // /* empty */ + // | T_EXTENDS fully_qualified_class_name + if (token == TokenNameextends) { + interface_extends_list(); + // getNextToken(); + // if (token != TokenNameIdentifier) { + // 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); + return; + } + } + // '{' class_statement_list '}' + if (token == TokenNameLBRACE) { + getNextToken(); + if (token != TokenNameRBRACE) { + 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(); + getNextToken(); + } else { + throwSyntaxError("'}' expected at end of class body."); + } + } else { + throwSyntaxError("'{' expected at start of class body."); + } + } + private void class_entry_type() { + // T_CLASS + // | T_ABSTRACT T_CLASS + // | T_FINAL T_CLASS + if (token == TokenNameclass) { + getNextToken(); + } else if (token == TokenNameabstract) { + checkAndSetModifiers(AccAbstract); + getNextToken(); + if (token != TokenNameclass) { + throwSyntaxError("Keyword 'class' expected after keyword 'abstract'."); + } + getNextToken(); + } else if (token == TokenNamefinal) { + checkAndSetModifiers(AccFinal); + getNextToken(); + if (token != TokenNameclass) { + throwSyntaxError("Keyword 'class' expected after keyword 'final'."); + } + getNextToken(); + } else { + throwSyntaxError("Keyword 'class' 'final' or 'abstract' expected"); + } + } + private void interface_extends_list() { + // /* empty */ + // | T_EXTENDS interface_list + if (token == TokenNameextends) { + getNextToken(); + interface_list(); + } + } + private void implements_list() { + // /* empty */ + // | T_IMPLEMENTS interface_list + if (token == TokenNameimplements) { + getNextToken(); + interface_list(); + } + } + private void interface_list() { + // interface_list: + // fully_qualified_class_name + //| interface_list ',' fully_qualified_class_name + do { + if (token == TokenNameIdentifier) { + getNextToken(); + } else { + throwSyntaxError("Interface name expected after keyword 'implements'."); + } + if (token != TokenNameCOMMA) { + return; + } + getNextToken(); + } while (true); + } + // private void classBody(TypeDeclaration typeDecl) { + // //'{' [class-element-list] '}' + // if (token == TokenNameLBRACE) { + // getNextToken(); + // if (token != TokenNameRBRACE) { + // class_statement_list(); + // } + // if (token == TokenNameRBRACE) { + // typeDecl.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); + // getNextToken(); + // } else { + // throwSyntaxError("'}' expected at end of class body."); + // } + // } else { + // throwSyntaxError("'{' expected at start of class body."); + // } + // } + private void class_statement_list(ArrayList list) { + do { + 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(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); + getNextToken(); + class_variable_declaration(declarationSourceStart, list); + } else if (token == TokenNameconst) { + class_constant_declaration(); + if (token != TokenNameSEMICOLON) { + throwSyntaxError("';' expected after class const declaration."); + } + getNextToken(); + } else { + boolean hasModifiers = member_modifiers(); + if (token == TokenNamefunction) { + if (!hasModifiers) { + checkAndSetModifiers(AccPublic); + } + MethodDeclaration methodDecl = new MethodDeclaration( + this.compilationUnit.compilationResult); + methodDecl.declarationSourceStart = scanner + .getCurrentTokenStartPosition(); + methodDecl.modifiers = this.modifiers; + getNextToken(); + functionDefinition(methodDecl); + } else { + if (!hasModifiers) { + throwSyntaxError("'public' 'private' or 'protected' modifier expected for field declarations."); + } + 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() { + // class_constant_declaration ',' T_STRING '=' static_scalar + // | T_CONST T_STRING '=' static_scalar + if (token != TokenNameconst) { + throwSyntaxError("'const' keyword expected in class declaration."); + } else { + getNextToken(); + } + while (true) { + if (token != TokenNameIdentifier) { + throwSyntaxError("Identifier expected in class const declaration."); + } + getNextToken(); + if (token != TokenNameEQUAL) { + throwSyntaxError("'=' expected in class const declaration."); + } + getNextToken(); + static_scalar(); + if (token != TokenNameCOMMA) { + break; // while(true)-loop + } + getNextToken(); + } + } + // private void variable_modifiers() { + // // variable_modifiers: + // // non_empty_member_modifiers + // //| T_VAR + // initializeModifiers(); + // if (token == TokenNamevar) { + // checkAndSetModifiers(AccPublic); + // reportSyntaxError( + // "Keyword 'var' is deprecated. Please use 'public' 'private' or + // 'protected' + // modifier for field declarations.", + // scanner.getCurrentTokenStartPosition(), scanner + // .getCurrentTokenEndPosition()); + // getNextToken(); + // } else { + // if (!member_modifiers()) { + // throwSyntaxError("'public' 'private' or 'protected' modifier expected for + // field declarations."); + // } + // } + // } + // private void method_modifiers() { + // //method_modifiers: + // // /* empty */ + // //| non_empty_member_modifiers + // initializeModifiers(); + // if (!member_modifiers()) { + // checkAndSetModifiers(AccPublic); + // } + // } + private boolean member_modifiers() { + // T_PUBLIC + //| T_PROTECTED + //| T_PRIVATE + //| T_STATIC + //| T_ABSTRACT + //| T_FINAL + boolean foundToken = false; + while (true) { + if (token == TokenNamepublic) { + checkAndSetModifiers(AccPublic); + getNextToken(); + foundToken = true; + } else if (token == TokenNameprotected) { + checkAndSetModifiers(AccProtected); + getNextToken(); + foundToken = true; + } else if (token == TokenNameprivate) { + checkAndSetModifiers(AccPrivate); + getNextToken(); + foundToken = true; + } else if (token == TokenNamestatic) { + checkAndSetModifiers(AccStatic); + getNextToken(); + foundToken = true; + } else if (token == TokenNameabstract) { + checkAndSetModifiers(AccAbstract); + getNextToken(); + foundToken = true; + } else if (token == TokenNamefinal) { + checkAndSetModifiers(AccFinal); + getNextToken(); + foundToken = true; + } else { + break; + } + } + return foundToken; + } + 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 + do { + if (token == TokenNameVariable) { + 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) { + getNextToken(); + static_scalar(); + } + } else { + // if (token == TokenNamethis) { + // throwSyntaxError("'$this' not allowed after keyword 'public' + // 'protected' 'private' 'var'."); + // } + throwSyntaxError("Variable expected after keyword 'public' 'protected' 'private' 'var'."); + } + if (token != TokenNameCOMMA) { + break; + } + getNextToken(); + } while (true); + if (token != TokenNameSEMICOLON) { + throwSyntaxError("';' expected after field declaration."); + } + getNextToken(); + } + private void functionDefinition(MethodDeclaration methodDecl) { + boolean isAbstract = false; + if (astPtr == 0) { + compilationUnit.types.add(methodDecl); + } else { + 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); + newMethods[0] = methodDecl; + typeDecl.methods = newMethods; + } + if ((typeDecl.modifiers & AccAbstract) == AccAbstract) { + isAbstract = true; + } else if ((typeDecl.modifiers & AccInterface) == AccInterface) { + isAbstract = true; + } + } + } + functionDeclarator(methodDecl); + if (token == TokenNameSEMICOLON) { + if (!isAbstract) { + throwSyntaxError("Body declaration expected for method: " + + new String(methodDecl.selector)); + } + getNextToken(); + return; + } + functionBody(methodDecl); + } + private void functionDeclarator(MethodDeclaration methodDecl) { + //identifier '(' [parameter-list] ')' + if (token == TokenNameAND) { + getNextToken(); + } + if (token == TokenNameIdentifier) { + methodDecl.sourceStart = scanner.getCurrentTokenStartPosition(); + methodDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); + methodDecl.selector = scanner.getCurrentIdentifierSource(); + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected in function declaration."); + } + if (token != TokenNameRPAREN) { + parameter_list(); + } + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected in function declaration."); + } else { + methodDecl.bodyStart = scanner.getCurrentTokenEndPosition() + 1; + getNextToken(); + } + } else { + if (token > TokenNameKEYWORD) { + throwSyntaxError("Don't use keyword for function declaration [" + + token + "]."); + } + throwSyntaxError("Function name expected after keyword 'function'."); + } + } + // + private void parameter_list() { + // non_empty_parameter_list + // | /* empty */ + non_empty_parameter_list(true); + } + private void non_empty_parameter_list(boolean empty_allowed) { + // optional_class_type T_VARIABLE + // | optional_class_type '&' T_VARIABLE + // | optional_class_type '&' T_VARIABLE '=' static_scalar + // | optional_class_type T_VARIABLE '=' static_scalar + // | non_empty_parameter_list ',' optional_class_type T_VARIABLE + // | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE + // | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE '=' + // static_scalar + // | non_empty_parameter_list ',' optional_class_type T_VARIABLE '=' + // static_scalar + if (token == TokenNameIdentifier || token == TokenNameVariable + || token == TokenNameAND) { + while (true) { + if (token == TokenNameIdentifier) { + getNextToken(); + } + if (token == TokenNameAND) { + getNextToken(); + } + if (token == TokenNameVariable) { + getNextToken(); + if (token == TokenNameEQUAL) { + getNextToken(); + static_scalar(); + } + } else { + throwSyntaxError("Variable expected in parameter list."); + } + if (token != TokenNameCOMMA) { + break; + } + getNextToken(); + } + return; + } + if (!empty_allowed) { + throwSyntaxError("Identifier expected in parameter list."); + } + } + private void optional_class_type() { + // /* empty */ + //| T_STRING + } + private void parameterDeclaration() { + //variable + //variable-reference + if (token == TokenNameAND) { + getNextToken(); + if (isVariable()) { + getNextToken(); + } else { + throwSyntaxError("Variable expected after reference operator '&'."); + } + } + //variable '=' constant + if (token == TokenNameVariable) { + getNextToken(); + if (token == TokenNameEQUAL) { + getNextToken(); + static_scalar(); + } + return; + } + // if (token == TokenNamethis) { + // throwSyntaxError("Reserved word '$this' not allowed in parameter + // declaration."); + // } + } + private void labeledStatementList() { + if (token != TokenNamecase && token != TokenNamedefault) { + throwSyntaxError("'case' or 'default' expected."); + } + do { + if (token == TokenNamecase) { + getNextToken(); + expr(); //constant(); + if (token == TokenNameCOLON || token == TokenNameSEMICOLON) { + getNextToken(); + if (token == TokenNamecase || token == TokenNamedefault) { + // empty case statement ? + continue; + } + statementList(); + } + // else if (token == TokenNameSEMICOLON) { + // setMarker( + // "':' expected after 'case' keyword (Found token: " + + // scanner.toStringAction(token) + ")", + // scanner.getCurrentTokenStartPosition(), + // scanner.getCurrentTokenEndPosition(), + // INFO); + // getNextToken(); + // if (token == TokenNamecase) { // empty case statement ? + // continue; + // } + // statementList(); + // } + else { + throwSyntaxError("':' character after 'case' constant expected (Found token: " + + scanner.toStringAction(token) + ")"); + } + } else { // TokenNamedefault + getNextToken(); + if (token == TokenNameCOLON) { + getNextToken(); + if (token == TokenNameRBRACE) { + // empty default case + break; + } + statementList(); + } else { + throwSyntaxError("':' character after 'default' expected."); + } + } + } while (token == TokenNamecase || token == TokenNamedefault); + } + // public void labeledStatement() { + // if (token == TokenNamecase) { + // getNextToken(); + // constant(); + // if (token == TokenNameDDOT) { + // getNextToken(); + // statement(); + // } else { + // throwSyntaxError("':' character after 'case' constant expected."); + // } + // return; + // } else if (token == TokenNamedefault) { + // getNextToken(); + // if (token == TokenNameDDOT) { + // getNextToken(); + // statement(); + // } else { + // throwSyntaxError("':' character after 'default' expected."); + // } + // return; + // } + // } + // public void expressionStatement() { + // } + // private void inclusionStatement() { + // } + // public void compoundStatement() { + // } + // public void selectionStatement() { + // } + // + // public void iterationStatement() { + // } + // + // public void jumpStatement() { + // } + // + // public void outputStatement() { + // } + // + // public void scopeStatement() { + // } + // + // public void flowStatement() { + // } + // + // public void definitionStatement() { + // } + private void ifStatement() { + // ':' statement-list [elseif-list] [else-colon-statement] 'endif' ';' + if (token == TokenNameCOLON) { + getNextToken(); + if (token != TokenNameendif) { + statementList(); + switch (token) { + case TokenNameelse : + getNextToken(); + if (token == TokenNameCOLON) { + getNextToken(); + if (token != TokenNameendif) { + statementList(); + } + } else { + if (token == TokenNameif) { //'else if' + getNextToken(); + elseifStatementList(); + } else { + throwSyntaxError("':' expected after 'else'."); + } + } + break; + case TokenNameelseif : + getNextToken(); + elseifStatementList(); + break; + } + } + if (token != TokenNameendif) { + throwSyntaxError("'endif' expected."); + } + getNextToken(); + if (token != TokenNameSEMICOLON) { + throwSyntaxError("';' expected after if-statement."); + } + getNextToken(); + } else { + // statement [else-statement] + statement(TokenNameEOF); + if (token == TokenNameelseif) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'elseif' keyword."); + } + expr(); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected after 'elseif' condition."); + } + ifStatement(); + } else if (token == TokenNameelse) { + getNextToken(); + statement(TokenNameEOF); + } + } + } + private void elseifStatementList() { + do { + elseifStatement(); + switch (token) { + case TokenNameelse : + getNextToken(); + if (token == TokenNameCOLON) { + getNextToken(); + if (token != TokenNameendif) { + statementList(); + } + return; + } else { + if (token == TokenNameif) { //'else if' + getNextToken(); + } else { + throwSyntaxError("':' expected after 'else'."); + } + } + break; + case TokenNameelseif : + getNextToken(); + break; + default : + return; + } + } while (true); + } + private void elseifStatement() { + if (token == TokenNameLPAREN) { + getNextToken(); + expr(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected in else-if-statement."); + } + getNextToken(); + if (token != TokenNameCOLON) { + throwSyntaxError("':' expected in else-if-statement."); + } + getNextToken(); + if (token != TokenNameendif) { + statementList(); + } + } + } + private void switchStatement() { + if (token == TokenNameCOLON) { + // ':' [labeled-statement-list] 'endswitch' ';' + getNextToken(); + labeledStatementList(); + if (token != TokenNameendswitch) { + throwSyntaxError("'endswitch' expected."); + } + getNextToken(); + if (token != TokenNameSEMICOLON) { + throwSyntaxError("';' expected after switch-statement."); + } + getNextToken(); + } else { + // '{' [labeled-statement-list] '}' + if (token != TokenNameLBRACE) { + throwSyntaxError("'{' expected in switch statement."); + } + getNextToken(); + if (token != TokenNameRBRACE) { + labeledStatementList(); + } + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected in switch statement."); + } + getNextToken(); + } + } + private void forStatement() { + if (token == TokenNameCOLON) { + getNextToken(); + statementList(); + if (token != TokenNameendfor) { + throwSyntaxError("'endfor' expected."); + } + getNextToken(); + if (token != TokenNameSEMICOLON) { + throwSyntaxError("';' expected after for-statement."); + } + getNextToken(); + } else { + statement(TokenNameEOF); + } + } + private void whileStatement() { + // ':' statement-list 'endwhile' ';' + if (token == TokenNameCOLON) { + getNextToken(); + statementList(); + if (token != TokenNameendwhile) { + throwSyntaxError("'endwhile' expected."); + } + getNextToken(); + if (token != TokenNameSEMICOLON) { + throwSyntaxError("';' expected after while-statement."); + } + getNextToken(); + } else { + statement(TokenNameEOF); + } + } + private void foreachStatement() { + if (token == TokenNameCOLON) { + getNextToken(); + statementList(); + if (token != TokenNameendforeach) { + throwSyntaxError("'endforeach' expected."); + } + getNextToken(); + if (token != TokenNameSEMICOLON) { + throwSyntaxError("';' expected after foreach-statement."); + } + getNextToken(); + } else { + statement(TokenNameEOF); + } + } + // private void exitStatus() { + // if (token == TokenNameLPAREN) { + // getNextToken(); + // } else { + // throwSyntaxError("'(' expected in 'exit-status'."); + // } + // if (token != TokenNameRPAREN) { + // expression(); + // } + // if (token == TokenNameRPAREN) { + // getNextToken(); + // } else { + // throwSyntaxError("')' expected after 'exit-status'."); + // } + // } + private void expressionList() { + do { + expr(); + if (token == TokenNameCOMMA) { + getNextToken(); + } else { + break; + } + } while (true); + } + private void expr() { + // r_variable + // | expr_without_variable + // if (token!=TokenNameEOF) { + if (Scanner.TRACE) { + System.out.println("TRACE: expr()"); + } + expr_without_variable(true); + // } + } + private void expr_without_variable(boolean only_variable) { + // internal_functions_in_yacc + // | T_CLONE expr + // | T_PRINT expr + // | '(' expr ')' + // | '@' expr + // | '+' expr + // | '-' expr + // | '!' expr + // | '~' expr + // | T_INC rw_variable + // | T_DEC rw_variable + // | T_INT_CAST expr + // | T_DOUBLE_CAST expr + // | T_STRING_CAST expr + // | T_ARRAY_CAST expr + // | T_OBJECT_CAST expr + // | T_BOOL_CAST expr + // | T_UNSET_CAST expr + // | T_EXIT exit_expr + // | scalar + // | T_ARRAY '(' array_pair_list ')' + // | '`' encaps_list '`' + // | T_LIST '(' assignment_list ')' '=' expr + // | T_NEW class_name_reference ctor_arguments + // | variable '=' expr + // | variable '=' '&' variable + // | variable '=' '&' T_NEW class_name_reference ctor_arguments + // | variable T_PLUS_EQUAL expr + // | variable T_MINUS_EQUAL expr + // | variable T_MUL_EQUAL expr + // | variable T_DIV_EQUAL expr + // | variable T_CONCAT_EQUAL expr + // | variable T_MOD_EQUAL expr + // | variable T_AND_EQUAL expr + // | variable T_OR_EQUAL expr + // | variable T_XOR_EQUAL expr + // | variable T_SL_EQUAL expr + // | variable T_SR_EQUAL expr + // | rw_variable T_INC + // | rw_variable T_DEC + // | expr T_BOOLEAN_OR expr + // | expr T_BOOLEAN_AND expr + // | expr T_LOGICAL_OR expr + // | expr T_LOGICAL_AND expr + // | expr T_LOGICAL_XOR expr + // | expr '|' expr + // | expr '&' expr + // | expr '^' expr + // | expr '.' expr + // | expr '+' expr + // | expr '-' expr + // | expr '*' expr + // | expr '/' expr + // | expr '%' expr + // | expr T_SL expr + // | expr T_SR expr + // | expr T_IS_IDENTICAL expr + // | expr T_IS_NOT_IDENTICAL expr + // | expr T_IS_EQUAL expr + // | expr T_IS_NOT_EQUAL expr + // | expr '<' expr + // | expr T_IS_SMALLER_OR_EQUAL expr + // | expr '>' expr + // | expr T_IS_GREATER_OR_EQUAL expr + // | expr T_INSTANCEOF class_name_reference + // | expr '?' expr ':' expr + if (Scanner.TRACE) { + System.out.println("TRACE: expr_without_variable() PART 1"); + } + switch (token) { + case TokenNameisset : + case TokenNameempty : + case TokenNameeval : + case TokenNameinclude : + case TokenNameinclude_once : + case TokenNamerequire : + case TokenNamerequire_once : + internal_functions_in_yacc(); + break; + // | '(' expr ')' + case TokenNameLPAREN : + getNextToken(); + expr(); + if (token == TokenNameRPAREN) { + getNextToken(); + } else { + throwSyntaxError("')' expected in expression."); + } + break; + // | T_CLONE expr + // | T_PRINT expr + // | '@' expr + // | '+' expr + // | '-' expr + // | '!' expr + // | '~' expr + // | T_INT_CAST expr + // | T_DOUBLE_CAST expr + // | T_STRING_CAST expr + // | T_ARRAY_CAST expr + // | T_OBJECT_CAST expr + // | T_BOOL_CAST expr + // | T_UNSET_CAST expr + case TokenNameclone : + case TokenNameprint : + case TokenNameAT : + case TokenNamePLUS : + case TokenNameMINUS : + case TokenNameNOT : + case TokenNameTWIDDLE : + case TokenNameintCAST : + case TokenNamedoubleCAST : + case TokenNamestringCAST : + case TokenNamearrayCAST : + case TokenNameobjectCAST : + case TokenNameboolCAST : + case TokenNameunsetCAST : + getNextToken(); + expr(); + break; + case TokenNameexit : + getNextToken(); + exit_expr(); + break; + // scalar: + // T_STRING + //| T_STRING_VARNAME + //| class_constant + //| T_START_HEREDOC encaps_list T_END_HEREDOC + // | '`' encaps_list '`' + // | common_scalar + // | '`' encaps_list '`' + case TokenNameEncapsedString0 : + scanner.encapsedStringStack.push(new Character('`')); + getNextToken(); + try { + if (token == TokenNameEncapsedString0) { + } else { + encaps_list(); + if (token != TokenNameEncapsedString0) { + throwSyntaxError("\'`\' expected at end of string" + + "(Found token: " + + scanner.toStringAction(token) + " )"); + } + } + } finally { + scanner.encapsedStringStack.pop(); + getNextToken(); + } + break; + // | '\'' encaps_list '\'' + case TokenNameEncapsedString1 : + scanner.encapsedStringStack.push(new Character('\'')); + getNextToken(); + try { + if (token == TokenNameEncapsedString1) { + } else { + encaps_list(); + if (token != TokenNameEncapsedString1) { + throwSyntaxError("\'\'\' expected at end of string" + + "(Found token: " + + scanner.toStringAction(token) + " )"); + } + } + } finally { + scanner.encapsedStringStack.pop(); + getNextToken(); + } + break; + //| '"' encaps_list '"' + case TokenNameEncapsedString2 : + scanner.encapsedStringStack.push(new Character('"')); + getNextToken(); + try { + if (token == TokenNameEncapsedString2) { + } else { + encaps_list(); + if (token != TokenNameEncapsedString2) { + throwSyntaxError("'\"' expected at end of string" + + "(Found token: " + + scanner.toStringAction(token) + " )"); + } + } + } finally { + scanner.encapsedStringStack.pop(); + getNextToken(); + } + break; + case TokenNameIntegerLiteral : + case TokenNameDoubleLiteral : + case TokenNameStringLiteral : + case TokenNameStringConstant : + case TokenNameStringInterpolated : + case TokenNameFILE : + case TokenNameLINE : + case TokenNameCLASS_C : + case TokenNameMETHOD_C : + case TokenNameFUNC_C : + common_scalar(); + break; + case TokenNameHEREDOC : + getNextToken(); + break; + case TokenNamearray : + // T_ARRAY '(' array_pair_list ')' + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + if (token == TokenNameRPAREN) { + getNextToken(); + break; + } + array_pair_list(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'array'" + + "(Found token: " + + scanner.toStringAction(token) + ")"); + } + getNextToken(); + } else { + throwSyntaxError("'(' expected after keyword 'array'" + + "(Found token: " + scanner.toStringAction(token) + + ")"); + } + break; + case TokenNamelist : + // | T_LIST '(' assignment_list ')' '=' expr + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + assignment_list(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after 'list' keyword."); + } + getNextToken(); + if (token != TokenNameEQUAL) { + throwSyntaxError("'=' expected after 'list' keyword."); + } + getNextToken(); + expr(); + } else { + throwSyntaxError("'(' expected after 'list' keyword."); + } + break; + case TokenNamenew : + // | T_NEW class_name_reference ctor_arguments + getNextToken(); + class_name_reference(); + ctor_arguments(); + break; + // | T_INC rw_variable + // | T_DEC rw_variable + case TokenNamePLUS_PLUS : + case TokenNameMINUS_MINUS : + getNextToken(); + rw_variable(); + break; + // | variable '=' expr + // | variable '=' '&' variable + // | variable '=' '&' T_NEW class_name_reference ctor_arguments + // | variable T_PLUS_EQUAL expr + // | variable T_MINUS_EQUAL expr + // | variable T_MUL_EQUAL expr + // | variable T_DIV_EQUAL expr + // | variable T_CONCAT_EQUAL expr + // | variable T_MOD_EQUAL expr + // | variable T_AND_EQUAL expr + // | variable T_OR_EQUAL expr + // | variable T_XOR_EQUAL expr + // | variable T_SL_EQUAL expr + // | variable T_SR_EQUAL expr + // | rw_variable T_INC + // | rw_variable T_DEC + case TokenNameIdentifier : + case TokenNameVariable : + case TokenNameDOLLAR : + variable(); + switch (token) { + case TokenNameEQUAL : + getNextToken(); + if (token == TokenNameAND) { + getNextToken(); + if (token == TokenNamenew) { + // | variable '=' '&' T_NEW class_name_reference + // ctor_arguments + getNextToken(); + class_name_reference(); + ctor_arguments(); + } else { + variable(); + } + } else { + expr(); + } + break; + case TokenNamePLUS_EQUAL : + case TokenNameMINUS_EQUAL : + case TokenNameMULTIPLY_EQUAL : + case TokenNameDIVIDE_EQUAL : + case TokenNameDOT_EQUAL : + case TokenNameREMAINDER_EQUAL : + case TokenNameAND_EQUAL : + case TokenNameOR_EQUAL : + case TokenNameXOR_EQUAL : + case TokenNameRIGHT_SHIFT_EQUAL : + case TokenNameLEFT_SHIFT_EQUAL : + getNextToken(); + expr(); + break; + case TokenNamePLUS_PLUS : + case TokenNameMINUS_MINUS : + getNextToken(); + break; + default : + if (!only_variable) { + throwSyntaxError("Variable expression not allowed (found token '" + + scanner.toStringAction(token) + "')."); + } + } + break; + default : + if (token != TokenNameINLINE_HTML) { + if (token > TokenNameKEYWORD) { + getNextToken(); + break; + } else { + throwSyntaxError("Error in expression (found token '" + + scanner.toStringAction(token) + "')."); + } + } + return; + } + if (Scanner.TRACE) { + System.out.println("TRACE: expr_without_variable() PART 2"); + } + // | expr T_BOOLEAN_OR expr + // | expr T_BOOLEAN_AND expr + // | expr T_LOGICAL_OR expr + // | expr T_LOGICAL_AND expr + // | expr T_LOGICAL_XOR expr + // | expr '|' expr + // | expr '&' expr + // | expr '^' expr + // | expr '.' expr + // | expr '+' expr + // | expr '-' expr + // | expr '*' expr + // | expr '/' expr + // | expr '%' expr + // | expr T_SL expr + // | expr T_SR expr + // | expr T_IS_IDENTICAL expr + // | expr T_IS_NOT_IDENTICAL expr + // | expr T_IS_EQUAL expr + // | expr T_IS_NOT_EQUAL expr + // | expr '<' expr + // | expr T_IS_SMALLER_OR_EQUAL expr + // | expr '>' expr + // | expr T_IS_GREATER_OR_EQUAL expr + while (true) { + switch (token) { + case TokenNameOR_OR : + case TokenNameAND_AND : + case TokenNameand : + case TokenNameor : + case TokenNamexor : + case TokenNameAND : + case TokenNameOR : + case TokenNameXOR : + case TokenNameDOT : + case TokenNamePLUS : + case TokenNameMINUS : + case TokenNameMULTIPLY : + case TokenNameDIVIDE : + case TokenNameREMAINDER : + case TokenNameLEFT_SHIFT : + case TokenNameRIGHT_SHIFT : + case TokenNameEQUAL_EQUAL_EQUAL : + case TokenNameNOT_EQUAL_EQUAL : + case TokenNameEQUAL_EQUAL : + case TokenNameNOT_EQUAL : + case TokenNameLESS : + case TokenNameLESS_EQUAL : + case TokenNameGREATER : + case TokenNameGREATER_EQUAL : + getNextToken(); + expr(); + break; + // | expr T_INSTANCEOF class_name_reference + // | expr '?' expr ':' expr + case TokenNameinstanceof : + getNextToken(); + class_name_reference(); + break; + case TokenNameQUESTION : + getNextToken(); + expr(); + if (token == TokenNameCOLON) { + getNextToken(); + expr(); + } + break; + default : + return; + } + } + } + private void class_name_reference() { + // class_name_reference: + // T_STRING + //| dynamic_class_name_reference + if (Scanner.TRACE) { + System.out.println("TRACE: class_name_reference()"); + } + if (token == TokenNameIdentifier) { + getNextToken(); + } else { + dynamic_class_name_reference(); + } + } + private void dynamic_class_name_reference() { + //dynamic_class_name_reference: + // base_variable T_OBJECT_OPERATOR object_property + // dynamic_class_name_variable_properties + //| base_variable + if (Scanner.TRACE) { + System.out.println("TRACE: dynamic_class_name_reference()"); + } + base_variable(); + if (token == TokenNameMINUS_GREATER) { + getNextToken(); + object_property(); + dynamic_class_name_variable_properties(); + } + } + private void dynamic_class_name_variable_properties() { + // dynamic_class_name_variable_properties: + // dynamic_class_name_variable_properties + // dynamic_class_name_variable_property + // | /* empty */ + if (Scanner.TRACE) { + System.out + .println("TRACE: dynamic_class_name_variable_properties()"); + } + while (token == TokenNameMINUS_GREATER) { + dynamic_class_name_variable_property(); + } + } + private void dynamic_class_name_variable_property() { + // dynamic_class_name_variable_property: + // T_OBJECT_OPERATOR object_property + if (Scanner.TRACE) { + System.out.println("TRACE: dynamic_class_name_variable_property()"); + } + if (token == TokenNameMINUS_GREATER) { + getNextToken(); + object_property(); + } + } + private void ctor_arguments() { + // ctor_arguments: + // /* empty */ + //| '(' function_call_parameter_list ')' + if (token == TokenNameLPAREN) { + getNextToken(); + if (token == TokenNameRPAREN) { + getNextToken(); + return; + } + non_empty_function_call_parameter_list(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected in ctor_arguments."); + } + getNextToken(); + } + } + private void assignment_list() { + // assignment_list: + // assignment_list ',' assignment_list_element + //| assignment_list_element + while (true) { + assignment_list_element(); + if (token != TokenNameCOMMA) { + break; + } + getNextToken(); + } + } + private void assignment_list_element() { + //assignment_list_element: + // variable + //| T_LIST '(' assignment_list ')' + //| /* empty */ + if (token == TokenNameVariable || token == TokenNameDOLLAR) { + variable(); + } else { + if (token == TokenNamelist) { + getNextToken(); + if (token == TokenNameLPAREN) { + getNextToken(); + assignment_list(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after 'list' keyword."); + } + getNextToken(); + } else { + throwSyntaxError("'(' expected after 'list' keyword."); + } + } + } + } + private void array_pair_list() { + // array_pair_list: + // /* empty */ + //| non_empty_array_pair_list possible_comma + non_empty_array_pair_list(); + if (token == TokenNameCOMMA) { + getNextToken(); + } + } + private void non_empty_array_pair_list() { + //non_empty_array_pair_list: + // non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr + //| non_empty_array_pair_list ',' expr + //| expr T_DOUBLE_ARROW expr + //| expr + //| non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable + //| non_empty_array_pair_list ',' '&' w_variable + //| expr T_DOUBLE_ARROW '&' w_variable + //| '&' w_variable + while (true) { + if (token == TokenNameAND) { + getNextToken(); + variable(); + } else { + expr(); + if (token == TokenNameAND) { + getNextToken(); + variable(); + } else if (token == TokenNameEQUAL_GREATER) { + getNextToken(); + if (token == TokenNameAND) { + getNextToken(); + variable(); + } else { + expr(); + } + } + } + if (token != TokenNameCOMMA) { + return; + } + getNextToken(); + if (token == TokenNameRPAREN) { + return; + } + } + } + // private void variableList() { + // do { + // variable(); + // if (token == TokenNameCOMMA) { + // getNextToken(); + // } else { + // break; + // } + // } while (true); + // } + private void variable_without_objects() { + // variable_without_objects: + // reference_variable + // | simple_indirect_reference reference_variable + if (Scanner.TRACE) { + System.out.println("TRACE: variable_without_objects()"); + } + while (token == TokenNameDOLLAR) { + getNextToken(); + } + reference_variable(); + } + private void function_call() { + // function_call: + // T_STRING '(' function_call_parameter_list ')' + //| class_constant '(' function_call_parameter_list ')' + //| static_member '(' function_call_parameter_list ')' + //| variable_without_objects '(' function_call_parameter_list ')' + if (Scanner.TRACE) { + System.out.println("TRACE: function_call()"); + } + if (token == TokenNameIdentifier) { + getNextToken(); + switch (token) { + case TokenNamePAAMAYIM_NEKUDOTAYIM : + // static member: + getNextToken(); + if (token == TokenNameIdentifier) { + // class _constant + getNextToken(); + } else { + // static member: + variable_without_objects(); + } + break; + } + } else { + variable_without_objects(); + } + if (token != TokenNameLPAREN) { + // TODO is this ok ? + return; + // throwSyntaxError("'(' expected in function call."); + } + getNextToken(); + if (token == TokenNameRPAREN) { + getNextToken(); + return; + } + non_empty_function_call_parameter_list(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected in function call."); + } + getNextToken(); + } + // private void function_call_parameter_list() { + // function_call_parameter_list: + // non_empty_function_call_parameter_list { $$ = $1; } + // | /* empty */ + // } + private void non_empty_function_call_parameter_list() { + //non_empty_function_call_parameter_list: + // expr_without_variable + // | variable + // | '&' w_variable + // | non_empty_function_call_parameter_list ',' expr_without_variable + // | non_empty_function_call_parameter_list ',' variable + // | non_empty_function_call_parameter_list ',' '&' w_variable + if (Scanner.TRACE) { + System.out + .println("TRACE: non_empty_function_call_parameter_list()"); + } + while (true) { + if (token == TokenNameAND) { + getNextToken(); + w_variable(); + } else { + // if (token == TokenNameIdentifier || token == + // TokenNameVariable + // || token == TokenNameDOLLAR) { + // variable(); + // } else { + expr_without_variable(true); + // } + } + if (token != TokenNameCOMMA) { + break; + } + getNextToken(); + } + } + private void fully_qualified_class_name() { + if (token == TokenNameIdentifier) { + getNextToken(); + } else { + throwSyntaxError("Class name expected."); + } + } + private void static_member() { + // static_member: + // fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM + // variable_without_objects + if (Scanner.TRACE) { + System.out.println("TRACE: static_member()"); + } + fully_qualified_class_name(); + if (token != TokenNamePAAMAYIM_NEKUDOTAYIM) { + throwSyntaxError("'::' expected after class name (static_member)."); + } + getNextToken(); + variable_without_objects(); + } + private void base_variable_with_function_calls() { + // base_variable_with_function_calls: + // base_variable + //| function_call + boolean functionCall = false; + if (Scanner.TRACE) { + System.out.println("TRACE: base_variable_with_function_calls()"); + } + // if (token == TokenNameIdentifier) { + // functionCall = true; + // } else if (token == TokenNameVariable) { + // int tempToken = token; + // int tempPosition = scanner.currentPosition; + // getNextToken(); + // if (token == TokenNameLPAREN) { + // functionCall = true; + // } + // token = tempToken; + // scanner.currentPosition = tempPosition; + // scanner.phpMode = true; + // } + // if (functionCall) { + function_call(); + // } else { + // base_variable(); + // } + } + private void base_variable() { + // base_variable: + // reference_variable + // | simple_indirect_reference reference_variable + // | static_member + if (Scanner.TRACE) { + System.out.println("TRACE: base_variable()"); + } + if (token == TokenNameIdentifier) { + static_member(); + } else { + while (token == TokenNameDOLLAR) { + getNextToken(); + } + reference_variable(); + } + } + // private void simple_indirect_reference() { + // // simple_indirect_reference: + // // '$' + // //| simple_indirect_reference '$' + // } + private void reference_variable() { + // reference_variable: + // reference_variable '[' dim_offset ']' + // | reference_variable '{' expr '}' + // | compound_variable + if (Scanner.TRACE) { + System.out.println("TRACE: reference_variable()"); + } + compound_variable(); + while (true) { + if (token == TokenNameLBRACE) { + getNextToken(); + expr(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected in reference variable."); + } + getNextToken(); + } else if (token == TokenNameLBRACKET) { + getNextToken(); + if (token != TokenNameRBRACKET) { + expr(); + // dim_offset(); + if (token != TokenNameRBRACKET) { + throwSyntaxError("']' expected in reference variable."); + } + } + getNextToken(); + } else { + break; + } + } + } + private void compound_variable() { + // compound_variable: + // T_VARIABLE + // | '$' '{' expr '}' + if (Scanner.TRACE) { + System.out.println("TRACE: compound_variable()"); + } + if (token == TokenNameVariable) { + getNextToken(); + } else { + // because of simple_indirect_reference + while (token == TokenNameDOLLAR) { + getNextToken(); + } + if (token != TokenNameLBRACE) { + throwSyntaxError("'{' expected after compound variable token '$'."); + } + getNextToken(); + expr(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected after compound variable token '$'."); + } + getNextToken(); + } + } + // private void dim_offset() { + // // dim_offset: + // // /* empty */ + // // | expr + // expr(); + // } + private void object_property() { + // object_property: + // object_dim_list + //| variable_without_objects + if (Scanner.TRACE) { + System.out.println("TRACE: object_property()"); + } + if (token == TokenNameVariable || token == TokenNameDOLLAR) { + variable_without_objects(); + } else { + object_dim_list(); + } + } + private void object_dim_list() { + //object_dim_list: + // object_dim_list '[' dim_offset ']' + //| object_dim_list '{' expr '}' + //| variable_name + if (Scanner.TRACE) { + System.out.println("TRACE: object_dim_list()"); + } + variable_name(); + while (true) { + if (token == TokenNameLBRACE) { + getNextToken(); + expr(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected in object_dim_list."); + } + getNextToken(); + } else if (token == TokenNameLBRACKET) { + getNextToken(); + if (token == TokenNameRBRACKET) { + getNextToken(); + continue; + } + expr(); + if (token != TokenNameRBRACKET) { + throwSyntaxError("']' expected in object_dim_list."); + } + getNextToken(); + } else { + break; + } + } + } + private void variable_name() { + //variable_name: + // T_STRING + //| '{' expr '}' + if (Scanner.TRACE) { + System.out.println("TRACE: variable_name()"); + } + if (token == TokenNameIdentifier || token > TokenNameKEYWORD) { + if (token > TokenNameKEYWORD) { + // TODO show a warning "Keyword used as variable" ? + } + getNextToken(); + } else { + if (token != TokenNameLBRACE) { + throwSyntaxError("'{' expected in variable name."); + } + getNextToken(); + expr(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected in variable name."); + } + getNextToken(); + } + } + private void r_variable() { + variable(); + } + private void w_variable() { + variable(); + } + private void rw_variable() { + variable(); + } + private void variable() { + // variable: + // base_variable_with_function_calls T_OBJECT_OPERATOR + // object_property method_or_not variable_properties + // | base_variable_with_function_calls + base_variable_with_function_calls(); + if (token == TokenNameMINUS_GREATER) { + getNextToken(); + object_property(); + method_or_not(); + variable_properties(); + } + // if (token == TokenNameDOLLAR_LBRACE) { + // getNextToken(); + // expr(); + // ; + // if (token != TokenNameRBRACE) { + // throwSyntaxError("'}' expected after indirect variable token '${'."); + // } + // getNextToken(); + // } else { + // if (token == TokenNameVariable) { + // getNextToken(); + // if (token == TokenNameLBRACKET) { + // getNextToken(); + // expr(); + // if (token != TokenNameRBRACKET) { + // throwSyntaxError("']' expected in variable-list."); + // } + // getNextToken(); + // } else if (token == TokenNameEQUAL) { + // getNextToken(); + // static_scalar(); + // } + // } else { + // throwSyntaxError("$-variable expected in variable-list."); + // } + // } + } + private void variable_properties() { + // variable_properties: + // variable_properties variable_property + // | /* empty */ + while (token == TokenNameMINUS_GREATER) { + variable_property(); + } + } + private void variable_property() { + // variable_property: + // T_OBJECT_OPERATOR object_property method_or_not + if (Scanner.TRACE) { + System.out.println("TRACE: variable_property()"); + } + if (token == TokenNameMINUS_GREATER) { + getNextToken(); + object_property(); + method_or_not(); + } else { + throwSyntaxError("'->' expected in variable_property."); + } + } + private void method_or_not() { + // method_or_not: + // '(' function_call_parameter_list ')' + // | /* empty */ + if (Scanner.TRACE) { + System.out.println("TRACE: method_or_not()"); + } + if (token == TokenNameLPAREN) { + getNextToken(); + if (token == TokenNameRPAREN) { + getNextToken(); + return; + } + non_empty_function_call_parameter_list(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected in method_or_not."); + } + getNextToken(); + } + } + private void exit_expr() { + // /* empty */ + // | '(' ')' + // | '(' expr ')' + if (token != TokenNameLPAREN) { + return; + } + getNextToken(); + if (token == TokenNameRPAREN) { + getNextToken(); + return; + } + expr(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'exit'"); + } + getNextToken(); + } + private void encaps_list() { + // encaps_list encaps_var + // | encaps_list T_STRING + // | encaps_list T_NUM_STRING + // | encaps_list T_ENCAPSED_AND_WHITESPACE + // | encaps_list T_CHARACTER + // | encaps_list T_BAD_CHARACTER + // | encaps_list '[' + // | encaps_list ']' + // | encaps_list '{' + // | encaps_list '}' + // | encaps_list T_OBJECT_OPERATOR + // | /* empty */ + while (true) { + switch (token) { + case TokenNameSTRING : + getNextToken(); + break; + case TokenNameLBRACE : + // scanner.encapsedStringStack.pop(); + getNextToken(); + break; + case TokenNameRBRACE : + // scanner.encapsedStringStack.pop(); + getNextToken(); + break; + case TokenNameLBRACKET : + // scanner.encapsedStringStack.pop(); + getNextToken(); + break; + case TokenNameRBRACKET : + // scanner.encapsedStringStack.pop(); + getNextToken(); + break; + case TokenNameMINUS_GREATER : + // scanner.encapsedStringStack.pop(); + getNextToken(); + break; + case TokenNameVariable : + case TokenNameDOLLAR_LBRACE : + case TokenNameCURLY_OPEN : + encaps_var(); + break; + // case TokenNameDOLLAR : + // getNextToken(); + // if (token == TokenNameLBRACE) { + // token = TokenNameDOLLAR_LBRACE; + // encaps_var(); + // } + // break; + default : + char encapsedChar = ((Character) scanner.encapsedStringStack + .peek()).charValue(); + if (encapsedChar == '$') { + scanner.encapsedStringStack.pop(); + encapsedChar = ((Character) scanner.encapsedStringStack + .peek()).charValue(); + switch (encapsedChar) { + case '`' : + if (token == TokenNameEncapsedString0) { + return; + } + token = TokenNameSTRING; + continue; + case '\'' : + if (token == TokenNameEncapsedString1) { + return; + } + token = TokenNameSTRING; + continue; + case '"' : + if (token == TokenNameEncapsedString2) { + return; + } + token = TokenNameSTRING; + continue; + } + } + return; + } + } + } + private void encaps_var() { + // T_VARIABLE + // | T_VARIABLE '[' encaps_var_offset ']' + // | T_VARIABLE T_OBJECT_OPERATOR T_STRING + // | T_DOLLAR_OPEN_CURLY_BRACES expr '}' + // | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' + // | T_CURLY_OPEN variable '}' + switch (token) { + case TokenNameVariable : + getNextToken(); + if (token == TokenNameLBRACKET) { + getNextToken(); + // if (token == TokenNameRBRACKET) { + // getNextToken(); + // } else { + expr(); //encaps_var_offset(); + if (token != TokenNameRBRACKET) { + throwSyntaxError("']' expected after variable."); + } + // scanner.encapsedStringStack.pop(); + getNextToken(); + // } + } else if (token == TokenNameMINUS_GREATER) { + getNextToken(); + if (token != TokenNameIdentifier) { + throwSyntaxError("Identifier expected after '->'."); + } + // scanner.encapsedStringStack.pop(); + getNextToken(); + } + // else { + // // scanner.encapsedStringStack.pop(); + // int tempToken = TokenNameSTRING; + // if (!scanner.encapsedStringStack.isEmpty() + // && (token == TokenNameEncapsedString0 + // || token == TokenNameEncapsedString1 + // || token == TokenNameEncapsedString2 || token == + // TokenNameERROR)) { + // char encapsedChar = ((Character) + // scanner.encapsedStringStack.peek()) + // .charValue(); + // switch (token) { + // case TokenNameEncapsedString0 : + // if (encapsedChar == '`') { + // tempToken = TokenNameEncapsedString0; + // } + // break; + // case TokenNameEncapsedString1 : + // if (encapsedChar == '\'') { + // tempToken = TokenNameEncapsedString1; + // } + // break; + // case TokenNameEncapsedString2 : + // if (encapsedChar == '"') { + // tempToken = TokenNameEncapsedString2; + // } + // break; + // case TokenNameERROR : + // if (scanner.source[scanner.currentPosition - 1] == '\\') { + // scanner.currentPosition--; + // getNextToken(); + // } + // break; + // } + // } + // token = tempToken; + // } + break; + case TokenNameDOLLAR_LBRACE : + getNextToken(); + if (token == TokenNameIdentifier) { + getNextToken(); + if (token == TokenNameLBRACKET) { + getNextToken(); + // if (token == TokenNameRBRACKET) { + // getNextToken(); + // } else { + expr(); + if (token != TokenNameRBRACKET) { + throwSyntaxError("']' expected after '${'."); + } + getNextToken(); + // } + } + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected after '${'."); + } + // scanner.encapsedStringStack.pop(); + getNextToken(); + } else { + expr(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected."); + } + // scanner.encapsedStringStack.pop(); + getNextToken(); + } + break; + case TokenNameCURLY_OPEN : + getNextToken(); + if (token == TokenNameIdentifier || token > TokenNameKEYWORD) { + getNextToken(); + if (token == TokenNameLBRACKET) { + getNextToken(); + // if (token == TokenNameRBRACKET) { + // getNextToken(); + // } else { + expr(); + if (token != TokenNameRBRACKET) { + throwSyntaxError("']' expected after '{$'."); + } + getNextToken(); + // } + } else if (token == TokenNameMINUS_GREATER) { + getNextToken(); + if (token != TokenNameIdentifier) { + throwSyntaxError("String token expected."); + } + getNextToken(); + } + // if (token != TokenNameRBRACE) { + // throwSyntaxError("'}' expected after '{$'."); + // } + // // scanner.encapsedStringStack.pop(); + // getNextToken(); + } else { + expr(); + if (token != TokenNameRBRACE) { + throwSyntaxError("'}' expected."); + } + // scanner.encapsedStringStack.pop(); + getNextToken(); + } + break; + } + } + private void encaps_var_offset() { + // T_STRING + // | T_NUM_STRING + // | T_VARIABLE + switch (token) { + case TokenNameSTRING : + getNextToken(); + break; + case TokenNameIntegerLiteral : + getNextToken(); + break; + case TokenNameVariable : + getNextToken(); + break; + case TokenNameIdentifier : + getNextToken(); + break; + default : + throwSyntaxError("Variable or String token expected."); + break; + } + } + private void internal_functions_in_yacc() { + switch (token) { + case TokenNameisset : + // T_ISSET '(' isset_variables ')' + getNextToken(); + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected after keyword 'isset'"); + } + getNextToken(); + isset_variables(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'isset'"); + } + getNextToken(); + break; + case TokenNameempty : + // T_EMPTY '(' variable ')' + getNextToken(); + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected after keyword 'empty'"); + } + getNextToken(); + variable(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'empty'"); + } + getNextToken(); + break; + case TokenNameinclude : + //T_INCLUDE expr + getNextToken(); + expr(); + // ImportReference impt = new ImportReference(tokens, positions, + // false, AccDefault); + // impt.declarationSourceEnd = impt.sourceEnd; + // impt.declarationEnd = impt.declarationSourceEnd; + // //endPosition is just before the ; + // impt.declarationSourceStart = this.intStack[this.intPtr--]; + break; + case TokenNameinclude_once : + // T_INCLUDE_ONCE expr + getNextToken(); + expr(); + break; + case TokenNameeval : + // T_EVAL '(' expr ')' + getNextToken(); + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected after keyword 'eval'"); + } + getNextToken(); + expr(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'eval'"); + } + getNextToken(); + break; + case TokenNamerequire : + //T_REQUIRE expr + getNextToken(); + expr(); + break; + case TokenNamerequire_once : + // T_REQUIRE_ONCE expr + getNextToken(); + expr(); + break; + } + } + private void isset_variables() { + // variable + // | isset_variables ',' + if (token == TokenNameRPAREN) { + throwSyntaxError("Variable expected after keyword 'isset'"); + } + while (true) { + variable(); + if (token == TokenNameCOMMA) { + getNextToken(); + } else { + break; + } + } + } + private boolean common_scalar() { + // common_scalar: + // T_LNUMBER + // | T_DNUMBER + // | T_CONSTANT_ENCAPSED_STRING + // | T_LINE + // | T_FILE + // | T_CLASS_C + // | T_METHOD_C + // | T_FUNC_C + switch (token) { + case TokenNameIntegerLiteral : + getNextToken(); + return true; + case TokenNameDoubleLiteral : + getNextToken(); + return true; + case TokenNameStringLiteral : + getNextToken(); + return true; + case TokenNameStringConstant : + getNextToken(); + return true; + case TokenNameStringInterpolated : + getNextToken(); + return true; + case TokenNameFILE : + getNextToken(); + return true; + case TokenNameLINE : + getNextToken(); + return true; + case TokenNameCLASS_C : + getNextToken(); + return true; + case TokenNameMETHOD_C : + getNextToken(); + return true; + case TokenNameFUNC_C : + getNextToken(); + return true; + } + return false; + } + private void scalar() { + // scalar: + // T_STRING + //| T_STRING_VARNAME + //| class_constant + //| common_scalar + //| '"' encaps_list '"' + //| '\'' encaps_list '\'' + //| T_START_HEREDOC encaps_list T_END_HEREDOC + throwSyntaxError("Not yet implemented (scalar)."); + } + private void static_scalar() { + // static_scalar: /* compile-time evaluated scalars */ + // common_scalar + // | T_STRING + // | '+' static_scalar + // | '-' static_scalar + // | T_ARRAY '(' static_array_pair_list ')' + // | static_class_constant + if (common_scalar()) { + return; + } + switch (token) { + case TokenNameIdentifier : + getNextToken(); + // static_class_constant: + // T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING + if (token == TokenNamePAAMAYIM_NEKUDOTAYIM) { + getNextToken(); + if (token == TokenNameIdentifier) { + getNextToken(); + } else { + throwSyntaxError("Identifier expected after '::' operator."); + } + } + break; + case TokenNameEncapsedString0 : + try { + scanner.currentCharacter = scanner.source[scanner.currentPosition++]; + while (scanner.currentCharacter != '`') { + if (scanner.currentCharacter == '\\') { + scanner.currentPosition++; + } + scanner.currentCharacter = scanner.source[scanner.currentPosition++]; + } + getNextToken(); + } catch (IndexOutOfBoundsException e) { + throwSyntaxError("'`' expected at end of static string."); + } + break; + case TokenNameEncapsedString1 : + try { + scanner.currentCharacter = scanner.source[scanner.currentPosition++]; + while (scanner.currentCharacter != '\'') { + if (scanner.currentCharacter == '\\') { + scanner.currentPosition++; + } + scanner.currentCharacter = scanner.source[scanner.currentPosition++]; + } + getNextToken(); + } catch (IndexOutOfBoundsException e) { + throwSyntaxError("'\'' expected at end of static string."); + } + break; + case TokenNameEncapsedString2 : + try { + scanner.currentCharacter = scanner.source[scanner.currentPosition++]; + while (scanner.currentCharacter != '"') { + if (scanner.currentCharacter == '\\') { + scanner.currentPosition++; + } + scanner.currentCharacter = scanner.source[scanner.currentPosition++]; + } + getNextToken(); + } catch (IndexOutOfBoundsException e) { + throwSyntaxError("'\"' expected at end of static string."); + } + break; + case TokenNamePLUS : + getNextToken(); + static_scalar(); + break; + case TokenNameMINUS : + getNextToken(); + static_scalar(); + break; + case TokenNamearray : + getNextToken(); + if (token != TokenNameLPAREN) { + throwSyntaxError("'(' expected after keyword 'array'"); + } + getNextToken(); + if (token == TokenNameRPAREN) { + getNextToken(); + break; + } + non_empty_static_array_pair_list(); + if (token != TokenNameRPAREN) { + throwSyntaxError("')' expected after keyword 'array'"); + } + getNextToken(); + break; + // case TokenNamenull : + // getNextToken(); + // break; + // case TokenNamefalse : + // getNextToken(); + // break; + // case TokenNametrue : + // getNextToken(); + // break; + default : + throwSyntaxError("Static scalar/constant expected."); + } + } + private void non_empty_static_array_pair_list() { + // non_empty_static_array_pair_list: + // non_empty_static_array_pair_list ',' static_scalar T_DOUBLE_ARROW + // static_scalar + //| non_empty_static_array_pair_list ',' static_scalar + //| static_scalar T_DOUBLE_ARROW static_scalar + //| static_scalar + while (true) { + static_scalar(); + if (token == TokenNameEQUAL_GREATER) { + getNextToken(); + static_scalar(); + } + if (token != TokenNameCOMMA) { + break; + } + getNextToken(); + if (token == TokenNameRPAREN) { + break; + } + } + } + public void reportSyntaxError() { //int act, int currentKind, int + // stateStackTop) { + /* remember current scanner position */ + int startPos = scanner.startPosition; + int currentPos = scanner.currentPosition; + // String[] expectings; + // String tokenName = name[symbol_index[currentKind]]; + //fetch all "accurate" possible terminals that could recover the error + // int start, end = start = asi(stack[stateStackTop]); + // while (asr[end] != 0) + // end++; + // int length = end - start; + // expectings = new String[length]; + // if (length != 0) { + // char[] indexes = new char[length]; + // System.arraycopy(asr, start, indexes, 0, length); + // for (int i = 0; i < length; i++) { + // expectings[i] = name[symbol_index[indexes[i]]]; + // } + // } + //if the pb is an EOF, try to tell the user that they are some + // if (tokenName.equals(UNEXPECTED_EOF)) { + // if (!this.checkAndReportBracketAnomalies(problemReporter())) { + // char[] tokenSource; + // try { + // tokenSource = this.scanner.getCurrentTokenSource(); + // } catch (Exception e) { + // tokenSource = new char[] {}; + // } + // problemReporter().parseError( + // this.scanner.startPosition, + // this.scanner.currentPosition - 1, + // tokenSource, + // tokenName, + // expectings); + // } + // } else { //the next test is HEAVILY grammar DEPENDENT. + // if ((length == 14) + // && (expectings[0] == "=") //$NON-NLS-1$ + // && (expectings[1] == "*=") //$NON-NLS-1$ + // && (expressionPtr > -1)) { + // switch(currentKind) { + // case TokenNameSEMICOLON: + // case TokenNamePLUS: + // case TokenNameMINUS: + // case TokenNameDIVIDE: + // case TokenNameREMAINDER: + // case TokenNameMULTIPLY: + // case TokenNameLEFT_SHIFT: + // case TokenNameRIGHT_SHIFT: + //// case TokenNameUNSIGNED_RIGHT_SHIFT: + // case TokenNameLESS: + // case TokenNameGREATER: + // case TokenNameLESS_EQUAL: + // case TokenNameGREATER_EQUAL: + // case TokenNameEQUAL_EQUAL: + // case TokenNameNOT_EQUAL: + // case TokenNameXOR: + // case TokenNameAND: + // case TokenNameOR: + // case TokenNameOR_OR: + // case TokenNameAND_AND: + // // the ; is not the expected token ==> it ends a statement when an + // expression is not ended + // problemReporter().invalidExpressionAsStatement(expressionStack[expressionPtr]); + // break; + // case TokenNameRBRACE : + // problemReporter().missingSemiColon(expressionStack[expressionPtr]); + // break; + // default: + // char[] tokenSource; + // try { + // tokenSource = this.scanner.getCurrentTokenSource(); + // } catch (Exception e) { + // tokenSource = new char[] {}; + // } + // problemReporter().parseError( + // this.scanner.startPosition, + // this.scanner.currentPosition - 1, + // tokenSource, + // tokenName, + // expectings); + // this.checkAndReportBracketAnomalies(problemReporter()); + // } + // } else { + char[] tokenSource; + try { + tokenSource = this.scanner.getCurrentTokenSource(); + } catch (Exception e) { + tokenSource = new char[]{}; + } + // problemReporter().parseError( + // this.scanner.startPosition, + // this.scanner.currentPosition - 1, + // tokenSource, + // tokenName, + // expectings); + this.checkAndReportBracketAnomalies(problemReporter()); + // } + // } + /* reset scanner where it was */ + scanner.startPosition = startPos; + scanner.currentPosition = currentPos; + } + public static final int RoundBracket = 0; + public static final int SquareBracket = 1; + public static final int CurlyBracket = 2; + public static final int BracketKinds = 3; + protected int[] nestedMethod; //the ptr is nestedType + protected int nestedType, dimensions; + //ast stack + final static int AstStackIncrement = 100; + protected int astPtr; + protected AstNode[] astStack = new AstNode[AstStackIncrement]; + protected int astLengthPtr; + protected int[] astLengthStack; + AstNode[] noAstNodes = new AstNode[AstStackIncrement]; + public CompilationUnitDeclaration compilationUnit; /* + * the result from + * parse() + */ + protected ReferenceContext referenceContext; + protected ProblemReporter problemReporter; + protected CompilerOptions options; + // protected CompilationResult compilationResult; + /** + * Returns this parser's problem reporter initialized with its reference + * context. Also it is assumed that a problem is going to be reported, so + * initializes the compilation result's line positions. + */ + public ProblemReporter problemReporter() { + if (scanner.recordLineSeparator) { + compilationUnit.compilationResult.lineSeparatorPositions = scanner + .getLineEnds(); + } + problemReporter.referenceContext = referenceContext; + return problemReporter; + } + /* + * Reconsider the entire source looking for inconsistencies in {} () [] + */ + public boolean checkAndReportBracketAnomalies( + ProblemReporter problemReporter) { + scanner.wasAcr = false; + boolean anomaliesDetected = false; + try { + char[] source = scanner.source; + int[] leftCount = {0, 0, 0}; + int[] rightCount = {0, 0, 0}; + 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[][] rightDepths = new int[][]{new int[10], new int[10], + new int[10]}; + scanner.currentPosition = scanner.initialPosition; //starting + // point + // (first-zero-based + // char) + while (scanner.currentPosition < scanner.eofPosition) { //loop for + // jumping + // over + // comments + try { + // ---------Consume white space and handles + // startPosition--------- + boolean isWhiteSpace; + do { + scanner.startPosition = scanner.currentPosition; + // if (((scanner.currentCharacter = + // source[scanner.currentPosition++]) == '\\') && + // (source[scanner.currentPosition] == 'u')) { + // isWhiteSpace = scanner.jumpOverUnicodeWhiteSpace(); + // } else { + 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(); + } + } + isWhiteSpace = CharOperation + .isWhitespace(scanner.currentCharacter); + // } + } 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]++; + } + 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]; + } + 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]++; + } + 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]; + } + 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]++; + } + 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]; + } + 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; + } + // } + } + scanner.getNextChar('\''); + break; + } + case '"' : + // 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; + } + // } + while (scanner.currentCharacter != '"') { + if (scanner.currentCharacter == '\r') { + if (source[scanner.currentPosition] == '\n') + scanner.currentPosition++; + break; // the string cannot go further that + // the line + } + if (scanner.currentCharacter == '\n') { + break; // the string cannot go further that + // the line + } + if (scanner.currentCharacter == '\\') { + scanner.scanEscapeCharacter(); + } + // 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; + 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 + // ------------ + 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()); + } + } + } + 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 ((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); + } + } + //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; + } + break; + } + default : + if (Scanner + .isPHPIdentifierStart(scanner.currentCharacter)) { + scanner.scanIdentifierOrKeyword(false); + break; + } + if (Character.isDigit(scanner.currentCharacter)) { + scanner.scanNumber(false); + break; + } + } + //-----------------end switch while + // try-------------------- + } catch (IndexOutOfBoundsException e) { + break; // read until EOF + } catch (InvalidInputException e) { + return false; // no clue + } + } + if (scanner.recordLineSeparator) { + // compilationUnit.compilationResult.lineSeparatorPositions = + // scanner.getLineEnds(); + } + // check placement anomalies against other kinds of brackets + for (int kind = 0; kind < BracketKinds; kind++) { + for (int leftIndex = leftCount[kind] - 1; leftIndex >= 0; leftIndex--) { + int start = leftPositions[kind][leftIndex]; // deepest + // first + // find matching closing bracket + int depth = leftDepths[kind][leftIndex]; + int end = -1; + for (int i = 0; i < rightCount[kind]; i++) { + int pos = rightPositions[kind][i]; + // want matching bracket further in source with same + // depth + if ((pos > start) && (depth == rightDepths[kind][i])) { + end = pos; + break; + } + } + if (end < 0) { // did not find a good closing match + problemReporter.unmatchedBracket(start, + referenceContext, + compilationUnit.compilationResult); + return true; + } + // check if even number of opening/closing other brackets + // in between this pair of brackets + int balance = 0; + for (int otherKind = 0; (balance == 0) + && (otherKind < BracketKinds); otherKind++) { + for (int i = 0; i < leftCount[otherKind]; i++) { + int pos = leftPositions[otherKind][i]; + if ((pos > start) && (pos < end)) + balance++; + } + for (int i = 0; i < rightCount[otherKind]; i++) { + int pos = rightPositions[otherKind][i]; + if ((pos > start) && (pos < end)) + balance--; + } + if (balance != 0) { + problemReporter.unmatchedBracket(start, + referenceContext, + compilationUnit.compilationResult); //bracket + // anomaly + return true; + } + } + } + // 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); + } + // too many closing brackets ? + for (int i = leftCount[kind]; i < rightCount[kind]; i++) { + anomaliesDetected = true; + problemReporter + .unmatchedBracket(rightPositions[kind][i], + referenceContext, + compilationUnit.compilationResult); + } + if (anomaliesDetected) + return true; + } + return anomaliesDetected; + } catch (ArrayStoreException e) { // jdk1.2.2 jit bug + return anomaliesDetected; + } catch (NullPointerException e) { // jdk1.2.2 jit bug + return anomaliesDetected; + } + } + protected void pushOnAstLengthStack(int pos) { + try { + astLengthStack[++astLengthPtr] = pos; + } catch (IndexOutOfBoundsException e) { + int oldStackLength = astLengthStack.length; + int[] oldPos = astLengthStack; + astLengthStack = new int[oldStackLength + StackIncrement]; + System.arraycopy(oldPos, 0, astLengthStack, 0, oldStackLength); + astLengthStack[astLengthPtr] = pos; + } + } + protected void pushOnAstStack(AstNode node) { + /* + * add a new obj on top of the ast stack + */ + try { + astStack[++astPtr] = node; + } catch (IndexOutOfBoundsException e) { + int oldStackLength = astStack.length; + AstNode[] oldStack = astStack; + astStack = new AstNode[oldStackLength + AstStackIncrement]; + System.arraycopy(oldStack, 0, astStack, 0, oldStackLength); + astPtr = oldStackLength; + astStack[astPtr] = node; + } + try { + astLengthStack[++astLengthPtr] = 1; + } catch (IndexOutOfBoundsException e) { + int oldStackLength = astLengthStack.length; + int[] oldPos = astLengthStack; + astLengthStack = new int[oldStackLength + AstStackIncrement]; + System.arraycopy(oldPos, 0, astLengthStack, 0, oldStackLength); + astLengthStack[astLengthPtr] = 1; + } + } - 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]); - } - } - return compilationUnit; - } - // public PHPOutlineInfo parseInfo(Object parent, String s) { - // PHPOutlineInfo outlineInfo = new PHPOutlineInfo(parent); - // // Stack stack = new Stack(); - // // stack.push(outlineInfo.getDeclarations()); - // this.str = s; - // this.token = TokenNameEOF; - // // this.chIndx = 0; - // // this.rowCount = 1; - // // this.columnCount = 0; - // this.phpEnd = false; - // this.phpMode = false; - // scanner.setSource(s.toCharArray()); - // scanner.setPHPMode(false); - // - // getNextToken(); - // parseDeclarations(outlineInfo, outlineInfo.getDeclarations(), false); - // - // return outlineInfo; - // } - private boolean isVariable() { - return token == TokenNameVariable; // || token == TokenNamethis; - } - // private void parseDeclarations(PHPOutlineInfo outlineInfo, - // OutlineableWithChildren current, boolean goBack) { - // char[] ident; - // // PHPClassDeclaration current = (PHPClassDeclaration) stack.peek(); - // PHPSegmentWithChildren temp; - // int counter = 0; - // IPreferenceStore store = - // PHPeclipsePlugin.getDefault().getPreferenceStore(); - // try { - // while (token != TokenNameEOF && token != TokenNameERROR) { - // if (token == TokenNameVariable) { - // ident = scanner.getCurrentIdentifierSource(); - // outlineInfo.addVariable(new String(ident)); - // getNextToken(); - // } else if (token == TokenNamevar) { - // getNextToken(); - // if (token == TokenNameVariable - // && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_VAR)) { - // ident = scanner.getCurrentIdentifierSource(); - // //substring(1) added because PHPVarDeclaration doesn't - // // need the $ anymore - // String variableName = new String(ident).substring(1); - // outlineInfo.addVariable(variableName); - // getNextToken(); - // if (token != TokenNameSEMICOLON) { - // getNextToken(); - // ident = scanner.getCurrentTokenSource(); - // if (token > TokenNameKEYWORD) { - // current.add(new PHPVarDeclaration(current, variableName, - // // chIndx - ident.length, - // scanner.getCurrentTokenStartPosition(), new String(ident))); - // } else { - // switch (token) { - // case TokenNameVariable : - // case TokenNamethis : - // current.add(new PHPVarDeclaration(current, variableName, - // // chIndx - - // // ident.length, - // scanner.getCurrentTokenStartPosition(), new String( - // ident))); - // break; - // case TokenNameIdentifier : - // current.add(new PHPVarDeclaration(current, variableName, - // // chIndx - - // // ident.length, - // scanner.getCurrentTokenStartPosition(), new String( - // ident))); - // break; - // case TokenNameDoubleLiteral : - // current.add(new PHPVarDeclaration(current, variableName - // + doubleNumber, - // // chIndx - - // // ident.length, - // scanner.getCurrentTokenStartPosition(), new String( - // ident))); - // break; - // case TokenNameIntegerLiteral : - // current.add(new PHPVarDeclaration(current, variableName, - // // chIndx - - // // ident.length, - // scanner.getCurrentTokenStartPosition(), new String( - // ident))); - // break; - // case TokenNameStringInterpolated : - // case TokenNameStringLiteral : - // current.add(new PHPVarDeclaration(current, variableName, - // // chIndx - - // // ident.length, - // scanner.getCurrentTokenStartPosition(), new String( - // ident))); - // break; - // case TokenNameStringConstant : - // current.add(new PHPVarDeclaration(current, variableName, - // // chIndx - - // // ident.length, - // scanner.getCurrentTokenStartPosition(), new String( - // ident))); - // break; - // default : - // current.add(new PHPVarDeclaration(current, variableName, - // // chIndx - - // // ident.length - // scanner.getCurrentTokenStartPosition())); - // break; - // } - // } - // } else { - // ident = scanner.getCurrentIdentifierSource(); - // current.add(new PHPVarDeclaration(current, variableName, - // // chIndx - ident.length - // scanner.getCurrentTokenStartPosition())); - // } - // } - // } else if (token == TokenNamefunction) { - // getNextToken(); - // if (token == TokenNameAND) { - // getNextToken(); - // } - // if (token == TokenNameIdentifier - // && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_FUNC)) { - // ident = scanner.getCurrentIdentifierSource(); - // outlineInfo.addVariable(new String(ident)); - // temp = new PHPFunctionDeclaration(current, new String(ident), - // // chIndx - ident.length - // scanner.getCurrentTokenStartPosition()); - // current.add(temp); - // getNextToken(); - // parseDeclarations(outlineInfo, temp, true); - // } - // } else if (token == TokenNameclass) { - // getNextToken(); - // if (token == TokenNameIdentifier - // && store.getBoolean(PHPeclipsePlugin.PHP_OUTLINE_CLASS)) { - // ident = scanner.getCurrentIdentifierSource(); - // outlineInfo.addVariable(new String(ident)); - // temp = new PHPClassDeclaration(current, new String(ident), - // // chIndx - ident.len - // scanner.getCurrentTokenStartPosition()); - // current.add(temp); - // // stack.push(temp); - // getNextToken(); - // //skip tokens for classname, extends and others until - // // we have the opening '{' - // while (token != TokenNameLBRACE && token != TokenNameEOF - // && token != TokenNameERROR) { - // getNextToken(); - // } - // parseDeclarations(outlineInfo, temp, true); - // // stack.pop(); - // } - // } else if ((token == TokenNameLBRACE) - // || (token == TokenNameDOLLAR_LBRACE)) { - // getNextToken(); - // counter++; - // } else if (token == TokenNameRBRACE) { - // getNextToken(); - // --counter; - // if (counter == 0 && goBack) { - // return; - // } - // } else if (token == TokenNamerequire || token == TokenNamerequire_once - // || token == TokenNameinclude || token == TokenNameinclude_once) { - // ident = scanner.getCurrentTokenSource(); - // getNextToken(); - // int startPosition = scanner.getCurrentTokenStartPosition(); - // expr(); - // char[] expr = scanner.getCurrentTokenSource(startPosition); - // outlineInfo.addVariable(new String(ident)); - // current.add(new PHPReqIncDeclaration(current, new String(ident), - // // chIndx - ident.length, - // startPosition, new String(expr))); - // getNextToken(); - // } else { - // getNextToken(); - // } - // } - // } catch (SyntaxError sytaxErr) { - // // try { - // // // setMarker(sytaxErr.getMessage(), sytaxErr.getLine(), ERROR); - // // setMarker(sytaxErr.getMessage(), - // // scanner.getCurrentTokenStartPosition(), - // // scanner.getCurrentTokenEndPosition(), ERROR); - // // } catch (CoreException e) { - // // } - // } - // } - 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) - || (token == TokenNameEOF) || (token == TokenNameERROR)) { - return; - } - } while (true); - } - private void functionBody(MethodDeclaration methodDecl) { - // '{' [statement-list] '}' - if (token == TokenNameLBRACE) { - getNextToken(); - } else { - throwSyntaxError("'{' expected in compound-statement."); - } - if (token != TokenNameRBRACE) { - statementList(); - } - if (token == TokenNameRBRACE) { - methodDecl.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); - getNextToken(); - } else { - throwSyntaxError("'}' expected in compound-statement."); - } - } - private void statement(int previousToken) { - // if (token > TokenNameKEYWORD && token != TokenNamelist && token != - // TokenNamenew) { - // char[] ident = scanner.getCurrentIdentifierSource(); - // String keyword = new String(ident); - // if (token == TokenNameAT) { - // getNextToken(); - // if (token != TokenNamerequire && token != TokenNamerequire_once - // && token != TokenNameinclude && token != TokenNameinclude_once - // && token != TokenNameIdentifier && token != TokenNameVariable - // && token != TokenNameStringInterpolated) { - // throwSyntaxError("identifier expected after '@'."); - // } - // } - // if (token == TokenNameinclude || token == TokenNameinclude_once) { - // getNextToken(); - // if (token == TokenNameLPAREN) { - // expr(); - // if (token == TokenNameSEMICOLON) { - // getNextToken(); - // } else { - // if (previousToken != TokenNameAT && token != TokenNameStopPHP) { - // throwSyntaxError("';' expected after 'include' or 'include_once'."); - // } - // // getNextToken(); - // } - // } else { - // concatenationExpression(); - // } - // return; - // } else if (token == TokenNamerequire || token == TokenNamerequire_once) - // { - // getNextToken(); - // //constant(); - // if (token == TokenNameLPAREN) { - // expr(); - // if (token == TokenNameSEMICOLON) { - // getNextToken(); - // } else { - // if (previousToken != TokenNameAT && token != TokenNameStopPHP) { - // throwSyntaxError("';' expected after 'require' or 'require_once'."); - // } - // // getNextToken(); - // } - // } else { - // concatenationExpression(); - // } - // return; - // } else - if (token == TokenNameif) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected after 'if' keyword."); - } - expr(); - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected after 'if' condition."); - } - ifStatement(); - return; - } else if (token == TokenNameswitch) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected after 'switch' keyword."); - } - expr(); - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected after 'switch' condition."); - } - switchStatement(); - return; - } else if (token == TokenNamefor) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected after 'for' keyword."); - } - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - expressionList(); - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - throwSyntaxError("';' expected after 'for'."); - } - } - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - expressionList(); - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - throwSyntaxError("';' expected after 'for'."); - } - } - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - expressionList(); - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected after 'for'."); - } - } - forStatement(); - return; - } else if (token == TokenNamewhile) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected after 'while' keyword."); - } - expr(); - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected after 'while' condition."); - } - whileStatement(); - return; - } else if (token == TokenNamedo) { - getNextToken(); - if (token == TokenNameLBRACE) { - getNextToken(); - if (token != TokenNameRBRACE) { - statementList(); - } - if (token == TokenNameRBRACE) { - getNextToken(); - } else { - throwSyntaxError("'}' expected after 'do' keyword."); - } - } else { - statement(TokenNameEOF); - } - if (token == TokenNamewhile) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected after 'while' keyword."); - } - expr(); - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected after 'while' condition."); - } - } else { - throwSyntaxError("'while' expected after 'do' keyword."); - } - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - if (token != TokenNameINLINE_HTML) { - throwSyntaxError("';' expected after do-while statement."); - } - getNextToken(); - } - return; - } else if (token == TokenNameforeach) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected after 'foreach' keyword."); - } - expr(); - if (token == TokenNameas) { - getNextToken(); - } else { - throwSyntaxError("'as' expected after 'foreach' exxpression."); - } - // variable(); - foreach_variable(); - foreach_optional_arg(); - if (token == TokenNameEQUAL_GREATER) { - getNextToken(); - variable(); - } - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected after 'foreach' expression."); - } - foreachStatement(); - return; - } else if (token == TokenNamecontinue || token == TokenNamebreak - || token == TokenNamereturn) { - getNextToken(); - if (token != TokenNameSEMICOLON) { - expr(); - } - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - if (token != TokenNameINLINE_HTML) { - throwSyntaxError("';' expected after 'continue', 'break' or 'return'."); - } - getNextToken(); - } - return; - } else if (token == TokenNameecho) { - getNextToken(); - expressionList(); - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - if (token != TokenNameINLINE_HTML) { - throwSyntaxError("';' expected after 'echo' statement."); - } - getNextToken(); - } - return; - } else if (token == TokenNameINLINE_HTML) { - getNextToken(); - return; - // } else if (token == TokenNameprint) { - // getNextToken(); - // expression(); - // if (token == TokenNameSEMICOLON) { - // getNextToken(); - // } else { - // if (token != TokenNameStopPHP) { - // throwSyntaxError("';' expected after 'print' statement."); - // } - // getNextToken(); - // } - // return; - } else if (token == TokenNameglobal) { - getNextToken(); - global_var_list(); - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - if (token != TokenNameINLINE_HTML) { - throwSyntaxError("';' expected after 'global' statement."); - } - getNextToken(); - } - return; - } else if (token == TokenNamestatic) { - getNextToken(); - static_var_list(); - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - if (token != TokenNameINLINE_HTML) { - throwSyntaxError("';' expected after 'static' statement."); - } - getNextToken(); - } - return; - } else if (token == TokenNameunset) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected after 'unset' statement."); - } - unset_variables(); - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected after 'unset' statement."); - } - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - if (token != TokenNameINLINE_HTML) { - throwSyntaxError("';' expected after 'unset' statement."); - } - getNextToken(); - } - return; - } else if (token == TokenNamefunction) { - MethodDeclaration methodDecl = new MethodDeclaration( - this.compilationUnit.compilationResult); - methodDecl.declarationSourceStart = scanner - .getCurrentTokenStartPosition(); - getNextToken(); - functionDefinition(methodDecl); - return; - } else if (token == TokenNametry) { - getNextToken(); - if (token != TokenNameLBRACE) { - throwSyntaxError("'{' expected in 'try' statement."); - } - getNextToken(); - statementList(); - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected in 'try' statement."); - } - getNextToken(); - return; - } else if (token == TokenNamecatch) { - getNextToken(); - if (token != TokenNameLPAREN) { - throwSyntaxError("'(' expected in 'catch' statement."); - } - getNextToken(); - fully_qualified_class_name(); - if (token != TokenNameVariable) { - throwSyntaxError("Variable expected in 'catch' statement."); - } - getNextToken(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected in 'catch' statement."); - } - getNextToken(); - if (token != TokenNameLBRACE) { - throwSyntaxError("'{' expected in 'catch' statement."); - } - getNextToken(); - if (token != TokenNameRBRACE) { - statementList(); - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected in 'catch' statement."); - } - } - getNextToken(); - additional_catches(); - return; - } else if (token == TokenNamethrow) { - getNextToken(); - expr(); - if (token == TokenNameSEMICOLON) { - getNextToken(); - } else { - throwSyntaxError("';' expected after 'throw' exxpression."); - } - return; - } else if (token == TokenNamefinal || token == TokenNameabstract - || token == TokenNameclass || token == TokenNameinterface) { - TypeDeclaration typeDecl = new TypeDeclaration( - this.compilationUnit.compilationResult); - typeDecl.declarationSourceStart = scanner.getCurrentTokenStartPosition(); - // default super class - typeDecl.superclass = new SingleTypeReference(TypeConstants.OBJECT, 0); - compilationUnit.types.add(typeDecl); - try { - pushOnAstStack(typeDecl); - unticked_class_declaration_statement(typeDecl); - // classBody(typeDecl); - } finally { - astPtr--; - astLengthPtr--; - } - return; - // } else { - // throwSyntaxError("Unexpected keyword '" + keyword + "'"); - } else if (token == TokenNameLBRACE) { - getNextToken(); - if (token != TokenNameRBRACE) { - statementList(); - } - if (token == TokenNameRBRACE) { - getNextToken(); - return; - } else { - throwSyntaxError("'}' expected."); - } - } else { - if (token != TokenNameSEMICOLON) { - expr(); - } - if (token == TokenNameSEMICOLON) { - getNextToken(); - return; - } else { - if (token != TokenNameINLINE_HTML && token != TokenNameEOF) { - throwSyntaxError("';' expected after expression (Found token: " - + scanner.toStringAction(token) + ")"); - } - getNextToken(); - } - } - } - private void additional_catches() { - while (token == TokenNamecatch) { - getNextToken(); - if (token != TokenNameLPAREN) { - throwSyntaxError("'(' expected in 'catch' statement."); - } - getNextToken(); - fully_qualified_class_name(); - if (token != TokenNameVariable) { - throwSyntaxError("Variable expected in 'catch' statement."); - } - getNextToken(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected in 'catch' statement."); - } - getNextToken(); - if (token != TokenNameLBRACE) { - throwSyntaxError("'{' expected in 'catch' statement."); - } - getNextToken(); - statementList(); - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected in 'catch' statement."); - } - getNextToken(); - } - } - private void foreach_variable() { - // w_variable - //| '&' w_variable - if (token == TokenNameAND) { - getNextToken(); - } - w_variable(); - } - private void foreach_optional_arg() { - // /* empty */ - //| T_DOUBLE_ARROW foreach_variable - if (token == TokenNameEQUAL_GREATER) { - getNextToken(); - foreach_variable(); - } - } - private void global_var_list() { - // global_var_list: - // global_var_list ',' global_var - //| global_var - while (true) { - global_var(); - if (token != TokenNameCOMMA) { - break; - } - getNextToken(); - } - } - private void global_var() { - //global_var: - // T_VARIABLE - //| '$' r_variable - //| '$' '{' expr '}' - if (token == TokenNameVariable) { - getNextToken(); - } else if (token == TokenNameDOLLAR) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - expr(); - if (token != TokenNameLPAREN) { - throwSyntaxError("')' expected in global variable."); - } - getNextToken(); - } else { - r_variable(); - } - } - } - private void static_var_list() { - //static_var_list: - // static_var_list ',' T_VARIABLE - //| static_var_list ',' T_VARIABLE '=' static_scalar - //| T_VARIABLE - //| T_VARIABLE '=' static_scalar - while (true) { - if (token == TokenNameVariable) { - getNextToken(); - if (token == TokenNameEQUAL) { - getNextToken(); - static_scalar(); - } - if (token != TokenNameCOMMA) { - break; - } - getNextToken(); - } else { - break; - } - } - } - private void unset_variables() { - // unset_variables: - // unset_variable - // | unset_variables ',' unset_variable - // unset_variable: - // variable - while (true) { - variable(); - if (token != TokenNameCOMMA) { - break; - } - getNextToken(); - } - } - private final void initializeModifiers() { - this.modifiers = 0; - this.modifiersSourceStart = -1; - } - private final void checkAndSetModifiers(int flag) { - this.modifiers |= flag; - if (this.modifiersSourceStart < 0) - this.modifiersSourceStart = this.scanner.startPosition; - } - private void unticked_class_declaration_statement(TypeDeclaration typeDecl) { - initializeModifiers(); - if (token == TokenNameinterface) { - // interface_entry T_STRING - // interface_extends_list - // '{' class_statement_list '}' - checkAndSetModifiers(AccInterface); - getNextToken(); - typeDecl.modifiers = this.modifiers; - 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); - } - 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); - return; - } - } else { - // class_entry_type T_STRING extends_from - // implements_list - // '{' class_statement_list'}' - class_entry_type(); - typeDecl.modifiers = this.modifiers; - //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); - } - getNextToken(); - // extends_from: - // /* empty */ - // | T_EXTENDS fully_qualified_class_name - if (token == TokenNameextends) { - interface_extends_list(); - // getNextToken(); - // if (token != TokenNameIdentifier) { - // 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); - return; - } - } - // '{' class_statement_list '}' - if (token == TokenNameLBRACE) { - getNextToken(); - if (token != TokenNameRBRACE) { - class_statement_list(); - } - if (token == TokenNameRBRACE) { - typeDecl.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); - getNextToken(); - } else { - throwSyntaxError("'}' expected at end of class body."); - } - } else { - throwSyntaxError("'{' expected at start of class body."); - } - } - private void class_entry_type() { - // T_CLASS - // | T_ABSTRACT T_CLASS - // | T_FINAL T_CLASS - if (token == TokenNameclass) { - getNextToken(); - } else if (token == TokenNameabstract) { - checkAndSetModifiers(AccAbstract); - getNextToken(); - if (token != TokenNameclass) { - throwSyntaxError("Keyword 'class' expected after keyword 'abstract'."); - } - getNextToken(); - } else if (token == TokenNamefinal) { - checkAndSetModifiers(AccFinal); - getNextToken(); - if (token != TokenNameclass) { - throwSyntaxError("Keyword 'class' expected after keyword 'final'."); - } - getNextToken(); - } else { - throwSyntaxError("Keyword 'class' 'final' or 'abstract' expected"); - } - } - private void interface_extends_list() { - // /* empty */ - // | T_EXTENDS interface_list - if (token == TokenNameextends) { - getNextToken(); - interface_list(); - } - } - private void implements_list() { - // /* empty */ - // | T_IMPLEMENTS interface_list - if (token == TokenNameimplements) { - getNextToken(); - interface_list(); - } - } - private void interface_list() { - // interface_list: - // fully_qualified_class_name - //| interface_list ',' fully_qualified_class_name - do { - if (token == TokenNameIdentifier) { - getNextToken(); - } else { - throwSyntaxError("Interface name expected after keyword 'implements'."); - } - if (token != TokenNameCOMMA) { - return; - } - getNextToken(); - } while (true); - } - // private void classBody(TypeDeclaration typeDecl) { - // //'{' [class-element-list] '}' - // if (token == TokenNameLBRACE) { - // getNextToken(); - // if (token != TokenNameRBRACE) { - // class_statement_list(); - // } - // if (token == TokenNameRBRACE) { - // typeDecl.declarationSourceEnd = scanner.getCurrentTokenEndPosition(); - // getNextToken(); - // } else { - // throwSyntaxError("'}' expected at end of class body."); - // } - // } else { - // throwSyntaxError("'{' expected at start of class body."); - // } - // } - private void class_statement_list() { - do { - class_statement(); - } while (token == TokenNamepublic || token == TokenNameprotected - || token == TokenNameprivate || token == TokenNamestatic - || token == TokenNameabstract || token == TokenNamefinal - || token == TokenNamefunction || token == TokenNamevar - || token == TokenNameconst); - } - private void class_statement() { - // class_statement: - // variable_modifiers class_variable_declaration ';' - // | class_constant_declaration ';' - // | method_modifiers T_FUNCTION is_reference T_STRING - // '(' parameter_list ')' method_body - initializeModifiers(); - if (token == TokenNamevar) { - checkAndSetModifiers(AccPublic); - problemReporter.phpVarDeprecatedWarning(scanner - .getCurrentTokenStartPosition(), - scanner.getCurrentTokenEndPosition(), referenceContext, - compilationUnit.compilationResult); - getNextToken(); - class_variable_declaration(); - } else if (token == TokenNameconst) { - class_constant_declaration(); - if (token != TokenNameSEMICOLON) { - throwSyntaxError("';' expected after class const declaration."); - } - getNextToken(); - } else { - boolean hasModifiers = member_modifiers(); - if (token == TokenNamefunction) { - if (!hasModifiers) { - checkAndSetModifiers(AccPublic); - } - MethodDeclaration methodDecl = new MethodDeclaration( - this.compilationUnit.compilationResult); - methodDecl.declarationSourceStart = scanner - .getCurrentTokenStartPosition(); - methodDecl.modifiers = this.modifiers; - getNextToken(); - functionDefinition(methodDecl); - } else { - if (!hasModifiers) { - throwSyntaxError("'public' 'private' or 'protected' modifier expected for field declarations."); - } - class_variable_declaration(); - } - } - // 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() { - // class_constant_declaration ',' T_STRING '=' static_scalar - // | T_CONST T_STRING '=' static_scalar - if (token != TokenNameconst) { - throwSyntaxError("'const' keyword expected in class declaration."); - } else { - getNextToken(); - } - while (true) { - if (token != TokenNameIdentifier) { - throwSyntaxError("Identifier expected in class const declaration."); - } - getNextToken(); - if (token != TokenNameEQUAL) { - throwSyntaxError("'=' expected in class const declaration."); - } - getNextToken(); - static_scalar(); - if (token != TokenNameCOMMA) { - break; // while(true)-loop - } - getNextToken(); - } - } - // private void variable_modifiers() { - // // variable_modifiers: - // // non_empty_member_modifiers - // //| T_VAR - // initializeModifiers(); - // if (token == TokenNamevar) { - // checkAndSetModifiers(AccPublic); - // reportSyntaxError( - // "Keyword 'var' is deprecated. Please use 'public' 'private' or 'protected' - // modifier for field declarations.", - // scanner.getCurrentTokenStartPosition(), scanner - // .getCurrentTokenEndPosition()); - // getNextToken(); - // } else { - // if (!member_modifiers()) { - // throwSyntaxError("'public' 'private' or 'protected' modifier expected for - // field declarations."); - // } - // } - // } - // private void method_modifiers() { - // //method_modifiers: - // // /* empty */ - // //| non_empty_member_modifiers - // initializeModifiers(); - // if (!member_modifiers()) { - // checkAndSetModifiers(AccPublic); - // } - // } - private boolean member_modifiers() { - // T_PUBLIC - //| T_PROTECTED - //| T_PRIVATE - //| T_STATIC - //| T_ABSTRACT - //| T_FINAL - boolean foundToken = false; - while (true) { - if (token == TokenNamepublic) { - checkAndSetModifiers(AccPublic); - getNextToken(); - foundToken = true; - } else if (token == TokenNameprotected) { - checkAndSetModifiers(AccProtected); - getNextToken(); - foundToken = true; - } else if (token == TokenNameprivate) { - checkAndSetModifiers(AccPrivate); - getNextToken(); - foundToken = true; - } else if (token == TokenNamestatic) { - checkAndSetModifiers(AccStatic); - getNextToken(); - foundToken = true; - } else if (token == TokenNameabstract) { - checkAndSetModifiers(AccAbstract); - getNextToken(); - foundToken = true; - } else if (token == TokenNamefinal) { - checkAndSetModifiers(AccFinal); - getNextToken(); - foundToken = true; - } else { - break; - } - } - return foundToken; - } - private void class_variable_declaration() { - // class_variable_declaration: - // class_variable_declaration ',' T_VARIABLE - // | class_variable_declaration ',' T_VARIABLE '=' static_scalar - // | T_VARIABLE - // | T_VARIABLE '=' static_scalar - do { - if (token == TokenNameVariable) { - FieldDeclaration fieldDeclaration = new FieldDeclaration(null, scanner - .getCurrentIdentifierSource(), scanner - .getCurrentTokenStartPosition(), scanner - .getCurrentTokenEndPosition()); - getNextToken(); - if (token == TokenNameEQUAL) { - getNextToken(); - static_scalar(); - } - } else { - // if (token == TokenNamethis) { - // throwSyntaxError("'$this' not allowed after keyword 'public' - // 'protected' 'private' 'var'."); - // } - throwSyntaxError("Variable expected after keyword 'public' 'protected' 'private' 'var'."); - } - if (token != TokenNameCOMMA) { - break; - } - getNextToken(); - } while (true); - if (token != TokenNameSEMICOLON) { - throwSyntaxError("';' expected after field declaration."); - } - getNextToken(); - } - private void functionDefinition(MethodDeclaration methodDecl) { - boolean isAbstract = false; - if (astPtr == 0) { - compilationUnit.types.add(methodDecl); - } else { - 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); - newMethods[0] = methodDecl; - typeDecl.methods = newMethods; - } - if ((typeDecl.modifiers & AccAbstract) == AccAbstract) { - isAbstract = true; - } else if ((typeDecl.modifiers & AccInterface) == AccInterface) { - isAbstract = true; - } - } - } - functionDeclarator(methodDecl); - if (token == TokenNameSEMICOLON) { - if (!isAbstract) { - throwSyntaxError("Body declaration expected for method: " - + new String(methodDecl.selector)); - } - getNextToken(); - return; - } - functionBody(methodDecl); - } - private void functionDeclarator(MethodDeclaration methodDecl) { - //identifier '(' [parameter-list] ')' - if (token == TokenNameAND) { - getNextToken(); - } - if (token == TokenNameIdentifier) { - methodDecl.sourceStart = scanner.getCurrentTokenStartPosition(); - methodDecl.sourceEnd = scanner.getCurrentTokenEndPosition(); - methodDecl.selector = scanner.getCurrentIdentifierSource(); - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected in function declaration."); - } - if (token != TokenNameRPAREN) { - parameter_list(); - } - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected in function declaration."); - } else { - methodDecl.bodyStart = scanner.getCurrentTokenEndPosition() + 1; - getNextToken(); - } - } else { - if (token > TokenNameKEYWORD) { - throwSyntaxError("Don't use keyword for function declaration [" + token - + "]."); - } - throwSyntaxError("Function name expected after keyword 'function'."); - } - } - // - private void parameter_list() { - // non_empty_parameter_list - // | /* empty */ - non_empty_parameter_list(true); - } - private void non_empty_parameter_list(boolean empty_allowed) { - // optional_class_type T_VARIABLE - // | optional_class_type '&' T_VARIABLE - // | optional_class_type '&' T_VARIABLE '=' static_scalar - // | optional_class_type T_VARIABLE '=' static_scalar - // | non_empty_parameter_list ',' optional_class_type T_VARIABLE - // | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE - // | non_empty_parameter_list ',' optional_class_type '&' T_VARIABLE '=' - // static_scalar - // | non_empty_parameter_list ',' optional_class_type T_VARIABLE '=' - // static_scalar - if (token == TokenNameIdentifier || token == TokenNameVariable - || token == TokenNameAND) { - while (true) { - if (token == TokenNameIdentifier) { - getNextToken(); - } - if (token == TokenNameAND) { - getNextToken(); - } - if (token == TokenNameVariable) { - getNextToken(); - if (token == TokenNameEQUAL) { - getNextToken(); - static_scalar(); - } - } else { - throwSyntaxError("Variable expected in parameter list."); - } - if (token != TokenNameCOMMA) { - break; - } - getNextToken(); - } - return; - } - if (!empty_allowed) { - throwSyntaxError("Identifier expected in parameter list."); - } - } - private void optional_class_type() { - // /* empty */ - //| T_STRING - } - private void parameterDeclaration() { - //variable - //variable-reference - if (token == TokenNameAND) { - getNextToken(); - if (isVariable()) { - getNextToken(); - } else { - throwSyntaxError("Variable expected after reference operator '&'."); - } - } - //variable '=' constant - if (token == TokenNameVariable) { - getNextToken(); - if (token == TokenNameEQUAL) { - getNextToken(); - static_scalar(); - } - return; - } - // if (token == TokenNamethis) { - // throwSyntaxError("Reserved word '$this' not allowed in parameter - // declaration."); - // } - } - private void labeledStatementList() { - if (token != TokenNamecase && token != TokenNamedefault) { - throwSyntaxError("'case' or 'default' expected."); - } - do { - if (token == TokenNamecase) { - getNextToken(); - expr(); //constant(); - if (token == TokenNameCOLON || token == TokenNameSEMICOLON) { - getNextToken(); - if (token == TokenNamecase || token == TokenNamedefault) { - // empty case statement ? - continue; - } - statementList(); - } - // else if (token == TokenNameSEMICOLON) { - // setMarker( - // "':' expected after 'case' keyword (Found token: " + - // scanner.toStringAction(token) + ")", - // scanner.getCurrentTokenStartPosition(), - // scanner.getCurrentTokenEndPosition(), - // INFO); - // getNextToken(); - // if (token == TokenNamecase) { // empty case statement ? - // continue; - // } - // statementList(); - // } - else { - throwSyntaxError("':' character after 'case' constant expected (Found token: " - + scanner.toStringAction(token) + ")"); - } - } else { // TokenNamedefault - getNextToken(); - if (token == TokenNameCOLON) { - getNextToken(); - if (token==TokenNameRBRACE) { - // empty default case - break; - } - statementList(); - } else { - throwSyntaxError("':' character after 'default' expected."); - } - } - } while (token == TokenNamecase || token == TokenNamedefault); - } - // public void labeledStatement() { - // if (token == TokenNamecase) { - // getNextToken(); - // constant(); - // if (token == TokenNameDDOT) { - // getNextToken(); - // statement(); - // } else { - // throwSyntaxError("':' character after 'case' constant expected."); - // } - // return; - // } else if (token == TokenNamedefault) { - // getNextToken(); - // if (token == TokenNameDDOT) { - // getNextToken(); - // statement(); - // } else { - // throwSyntaxError("':' character after 'default' expected."); - // } - // return; - // } - // } - // public void expressionStatement() { - // } - // private void inclusionStatement() { - // } - // public void compoundStatement() { - // } - // public void selectionStatement() { - // } - // - // public void iterationStatement() { - // } - // - // public void jumpStatement() { - // } - // - // public void outputStatement() { - // } - // - // public void scopeStatement() { - // } - // - // public void flowStatement() { - // } - // - // public void definitionStatement() { - // } - private void ifStatement() { - // ':' statement-list [elseif-list] [else-colon-statement] 'endif' ';' - if (token == TokenNameCOLON) { - getNextToken(); - if (token != TokenNameendif) { - statementList(); - switch (token) { - case TokenNameelse : - getNextToken(); - if (token == TokenNameCOLON) { - getNextToken(); - if (token != TokenNameendif) { - statementList(); - } - } else { - if (token == TokenNameif) { //'else if' - getNextToken(); - elseifStatementList(); - } else { - throwSyntaxError("':' expected after 'else'."); - } - } - break; - case TokenNameelseif : - getNextToken(); - elseifStatementList(); - break; - } - } - if (token != TokenNameendif) { - throwSyntaxError("'endif' expected."); - } - getNextToken(); - if (token != TokenNameSEMICOLON) { - throwSyntaxError("';' expected after if-statement."); - } - getNextToken(); - } else { - // statement [else-statement] - statement(TokenNameEOF); - if (token == TokenNameelseif) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - } else { - throwSyntaxError("'(' expected after 'elseif' keyword."); - } - expr(); - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected after 'elseif' condition."); - } - ifStatement(); - } else if (token == TokenNameelse) { - getNextToken(); - statement(TokenNameEOF); - } - } - } - private void elseifStatementList() { - do { - elseifStatement(); - switch (token) { - case TokenNameelse : - getNextToken(); - if (token == TokenNameCOLON) { - getNextToken(); - if (token != TokenNameendif) { - statementList(); - } - return; - } else { - if (token == TokenNameif) { //'else if' - getNextToken(); - } else { - throwSyntaxError("':' expected after 'else'."); - } - } - break; - case TokenNameelseif : - getNextToken(); - break; - default : - return; - } - } while (true); - } - private void elseifStatement() { - if (token == TokenNameLPAREN) { - getNextToken(); - expr(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected in else-if-statement."); - } - getNextToken(); - if (token != TokenNameCOLON) { - throwSyntaxError("':' expected in else-if-statement."); - } - getNextToken(); - if (token != TokenNameendif) { - statementList(); - } - } - } - private void switchStatement() { - if (token == TokenNameCOLON) { - // ':' [labeled-statement-list] 'endswitch' ';' - getNextToken(); - labeledStatementList(); - if (token != TokenNameendswitch) { - throwSyntaxError("'endswitch' expected."); - } - getNextToken(); - if (token != TokenNameSEMICOLON) { - throwSyntaxError("';' expected after switch-statement."); - } - getNextToken(); - } else { - // '{' [labeled-statement-list] '}' - if (token != TokenNameLBRACE) { - throwSyntaxError("'{' expected in switch statement."); - } - getNextToken(); - if (token != TokenNameRBRACE) { - labeledStatementList(); - } - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected in switch statement."); - } - getNextToken(); - } - } - private void forStatement() { - if (token == TokenNameCOLON) { - getNextToken(); - statementList(); - if (token != TokenNameendfor) { - throwSyntaxError("'endfor' expected."); - } - getNextToken(); - if (token != TokenNameSEMICOLON) { - throwSyntaxError("';' expected after for-statement."); - } - getNextToken(); - } else { - statement(TokenNameEOF); - } - } - private void whileStatement() { - // ':' statement-list 'endwhile' ';' - if (token == TokenNameCOLON) { - getNextToken(); - statementList(); - if (token != TokenNameendwhile) { - throwSyntaxError("'endwhile' expected."); - } - getNextToken(); - if (token != TokenNameSEMICOLON) { - throwSyntaxError("';' expected after while-statement."); - } - getNextToken(); - } else { - statement(TokenNameEOF); - } - } - private void foreachStatement() { - if (token == TokenNameCOLON) { - getNextToken(); - statementList(); - if (token != TokenNameendforeach) { - throwSyntaxError("'endforeach' expected."); - } - getNextToken(); - if (token != TokenNameSEMICOLON) { - throwSyntaxError("';' expected after foreach-statement."); - } - getNextToken(); - } else { - statement(TokenNameEOF); - } - } - // private void exitStatus() { - // if (token == TokenNameLPAREN) { - // getNextToken(); - // } else { - // throwSyntaxError("'(' expected in 'exit-status'."); - // } - // if (token != TokenNameRPAREN) { - // expression(); - // } - // if (token == TokenNameRPAREN) { - // getNextToken(); - // } else { - // throwSyntaxError("')' expected after 'exit-status'."); - // } - // } - private void expressionList() { - do { - expr(); - if (token == TokenNameCOMMA) { - getNextToken(); - } else { - break; - } - } while (true); - } - private void expr() { - // r_variable - // | expr_without_variable - // if (token!=TokenNameEOF) { - if (Scanner.TRACE) { - System.out.println("TRACE: expr()"); - } - expr_without_variable(true); - // } - } - private void expr_without_variable(boolean only_variable) { - // internal_functions_in_yacc - // | T_CLONE expr - // | T_PRINT expr - // | '(' expr ')' - // | '@' expr - // | '+' expr - // | '-' expr - // | '!' expr - // | '~' expr - // | T_INC rw_variable - // | T_DEC rw_variable - // | T_INT_CAST expr - // | T_DOUBLE_CAST expr - // | T_STRING_CAST expr - // | T_ARRAY_CAST expr - // | T_OBJECT_CAST expr - // | T_BOOL_CAST expr - // | T_UNSET_CAST expr - // | T_EXIT exit_expr - // | scalar - // | T_ARRAY '(' array_pair_list ')' - // | '`' encaps_list '`' - // | T_LIST '(' assignment_list ')' '=' expr - // | T_NEW class_name_reference ctor_arguments - // | variable '=' expr - // | variable '=' '&' variable - // | variable '=' '&' T_NEW class_name_reference ctor_arguments - // | variable T_PLUS_EQUAL expr - // | variable T_MINUS_EQUAL expr - // | variable T_MUL_EQUAL expr - // | variable T_DIV_EQUAL expr - // | variable T_CONCAT_EQUAL expr - // | variable T_MOD_EQUAL expr - // | variable T_AND_EQUAL expr - // | variable T_OR_EQUAL expr - // | variable T_XOR_EQUAL expr - // | variable T_SL_EQUAL expr - // | variable T_SR_EQUAL expr - // | rw_variable T_INC - // | rw_variable T_DEC - // | expr T_BOOLEAN_OR expr - // | expr T_BOOLEAN_AND expr - // | expr T_LOGICAL_OR expr - // | expr T_LOGICAL_AND expr - // | expr T_LOGICAL_XOR expr - // | expr '|' expr - // | expr '&' expr - // | expr '^' expr - // | expr '.' expr - // | expr '+' expr - // | expr '-' expr - // | expr '*' expr - // | expr '/' expr - // | expr '%' expr - // | expr T_SL expr - // | expr T_SR expr - // | expr T_IS_IDENTICAL expr - // | expr T_IS_NOT_IDENTICAL expr - // | expr T_IS_EQUAL expr - // | expr T_IS_NOT_EQUAL expr - // | expr '<' expr - // | expr T_IS_SMALLER_OR_EQUAL expr - // | expr '>' expr - // | expr T_IS_GREATER_OR_EQUAL expr - // | expr T_INSTANCEOF class_name_reference - // | expr '?' expr ':' expr - if (Scanner.TRACE) { - System.out.println("TRACE: expr_without_variable() PART 1"); - } - switch (token) { - case TokenNameisset : - case TokenNameempty : - case TokenNameeval : - case TokenNameinclude : - case TokenNameinclude_once : - case TokenNamerequire : - case TokenNamerequire_once : - internal_functions_in_yacc(); - break; - // | '(' expr ')' - case TokenNameLPAREN : - getNextToken(); - expr(); - if (token == TokenNameRPAREN) { - getNextToken(); - } else { - throwSyntaxError("')' expected in expression."); - } - break; - // | T_CLONE expr - // | T_PRINT expr - // | '@' expr - // | '+' expr - // | '-' expr - // | '!' expr - // | '~' expr - // | T_INT_CAST expr - // | T_DOUBLE_CAST expr - // | T_STRING_CAST expr - // | T_ARRAY_CAST expr - // | T_OBJECT_CAST expr - // | T_BOOL_CAST expr - // | T_UNSET_CAST expr - case TokenNameclone : - case TokenNameprint : - case TokenNameAT : - case TokenNamePLUS : - case TokenNameMINUS : - case TokenNameNOT : - case TokenNameTWIDDLE : - case TokenNameintCAST : - case TokenNamedoubleCAST : - case TokenNamestringCAST : - case TokenNamearrayCAST : - case TokenNameobjectCAST : - case TokenNameboolCAST : - case TokenNameunsetCAST : - getNextToken(); - expr(); - break; - case TokenNameexit : - getNextToken(); - exit_expr(); - break; - // scalar: - // T_STRING - //| T_STRING_VARNAME - //| class_constant - //| T_START_HEREDOC encaps_list T_END_HEREDOC - // | '`' encaps_list '`' - // | common_scalar - // | '`' encaps_list '`' - case TokenNameEncapsedString0 : - scanner.encapsedStringStack.push(new Character('`')); - getNextToken(); - try { - if (token == TokenNameEncapsedString0) { - } else { - encaps_list(); - if (token != TokenNameEncapsedString0) { - throwSyntaxError("\'`\' expected at end of string" - + "(Found token: " + scanner.toStringAction(token) + " )"); - } - } - } finally { - scanner.encapsedStringStack.pop(); - getNextToken(); - } - break; - // | '\'' encaps_list '\'' - case TokenNameEncapsedString1 : - scanner.encapsedStringStack.push(new Character('\'')); - getNextToken(); - try { - if (token == TokenNameEncapsedString1) { - } else { - encaps_list(); - if (token != TokenNameEncapsedString1) { - throwSyntaxError("\'\'\' expected at end of string" - + "(Found token: " + scanner.toStringAction(token) + " )"); - } - } - } finally { - scanner.encapsedStringStack.pop(); - getNextToken(); - } - break; - //| '"' encaps_list '"' - case TokenNameEncapsedString2 : - scanner.encapsedStringStack.push(new Character('"')); - getNextToken(); - try { - if (token == TokenNameEncapsedString2) { - } else { - encaps_list(); - if (token != TokenNameEncapsedString2) { - throwSyntaxError("'\"' expected at end of string" - + "(Found token: " + scanner.toStringAction(token) + " )"); - } - } - } finally { - scanner.encapsedStringStack.pop(); - getNextToken(); - } - break; - case TokenNameIntegerLiteral : - case TokenNameDoubleLiteral : - case TokenNameStringLiteral : - case TokenNameStringConstant : - case TokenNameStringInterpolated : - case TokenNameFILE : - case TokenNameLINE : - case TokenNameCLASS_C : - case TokenNameMETHOD_C : - case TokenNameFUNC_C : - common_scalar(); - break; - case TokenNameHEREDOC : - getNextToken(); - break; - case TokenNamearray : - // T_ARRAY '(' array_pair_list ')' - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - if (token == TokenNameRPAREN) { - getNextToken(); - break; - } - array_pair_list(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after keyword 'array'" - + "(Found token: " + scanner.toStringAction(token) + ")"); - } - getNextToken(); - } else { - throwSyntaxError("'(' expected after keyword 'array'" - + "(Found token: " + scanner.toStringAction(token) + ")"); - } - break; - case TokenNamelist : - // | T_LIST '(' assignment_list ')' '=' expr - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - assignment_list(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after 'list' keyword."); - } - getNextToken(); - if (token != TokenNameEQUAL) { - throwSyntaxError("'=' expected after 'list' keyword."); - } - getNextToken(); - expr(); - } else { - throwSyntaxError("'(' expected after 'list' keyword."); - } - break; - case TokenNamenew : - // | T_NEW class_name_reference ctor_arguments - getNextToken(); - class_name_reference(); - ctor_arguments(); - break; - // | T_INC rw_variable - // | T_DEC rw_variable - case TokenNamePLUS_PLUS : - case TokenNameMINUS_MINUS : - getNextToken(); - rw_variable(); - break; - // | variable '=' expr - // | variable '=' '&' variable - // | variable '=' '&' T_NEW class_name_reference ctor_arguments - // | variable T_PLUS_EQUAL expr - // | variable T_MINUS_EQUAL expr - // | variable T_MUL_EQUAL expr - // | variable T_DIV_EQUAL expr - // | variable T_CONCAT_EQUAL expr - // | variable T_MOD_EQUAL expr - // | variable T_AND_EQUAL expr - // | variable T_OR_EQUAL expr - // | variable T_XOR_EQUAL expr - // | variable T_SL_EQUAL expr - // | variable T_SR_EQUAL expr - // | rw_variable T_INC - // | rw_variable T_DEC - case TokenNameIdentifier : - case TokenNameVariable : - case TokenNameDOLLAR : - variable(); - switch (token) { - case TokenNameEQUAL : - getNextToken(); - if (token == TokenNameAND) { - getNextToken(); - if (token == TokenNamenew) { - // | variable '=' '&' T_NEW class_name_reference ctor_arguments - getNextToken(); - class_name_reference(); - ctor_arguments(); - } else { - variable(); - } - } else { - expr(); - } - break; - case TokenNamePLUS_EQUAL : - case TokenNameMINUS_EQUAL : - case TokenNameMULTIPLY_EQUAL : - case TokenNameDIVIDE_EQUAL : - case TokenNameDOT_EQUAL : - case TokenNameREMAINDER_EQUAL : - case TokenNameAND_EQUAL : - case TokenNameOR_EQUAL : - case TokenNameXOR_EQUAL : - case TokenNameRIGHT_SHIFT_EQUAL : - case TokenNameLEFT_SHIFT_EQUAL : - getNextToken(); - expr(); - break; - case TokenNamePLUS_PLUS : - case TokenNameMINUS_MINUS : - getNextToken(); - break; - default : - if (!only_variable) { - throwSyntaxError("Variable expression not allowed (found token '" - + scanner.toStringAction(token) + "')."); - } - } - break; - default : - if (token != TokenNameINLINE_HTML) { - if (token > TokenNameKEYWORD) { - getNextToken(); - break; - } else { - throwSyntaxError("Error in expression (found token '" - + scanner.toStringAction(token) + "')."); - } - } - return; - } - if (Scanner.TRACE) { - System.out.println("TRACE: expr_without_variable() PART 2"); - } - // | expr T_BOOLEAN_OR expr - // | expr T_BOOLEAN_AND expr - // | expr T_LOGICAL_OR expr - // | expr T_LOGICAL_AND expr - // | expr T_LOGICAL_XOR expr - // | expr '|' expr - // | expr '&' expr - // | expr '^' expr - // | expr '.' expr - // | expr '+' expr - // | expr '-' expr - // | expr '*' expr - // | expr '/' expr - // | expr '%' expr - // | expr T_SL expr - // | expr T_SR expr - // | expr T_IS_IDENTICAL expr - // | expr T_IS_NOT_IDENTICAL expr - // | expr T_IS_EQUAL expr - // | expr T_IS_NOT_EQUAL expr - // | expr '<' expr - // | expr T_IS_SMALLER_OR_EQUAL expr - // | expr '>' expr - // | expr T_IS_GREATER_OR_EQUAL expr - while (true) { - switch (token) { - case TokenNameOR_OR : - case TokenNameAND_AND : - case TokenNameand : - case TokenNameor : - case TokenNamexor : - case TokenNameAND : - case TokenNameOR : - case TokenNameXOR : - case TokenNameDOT : - case TokenNamePLUS : - case TokenNameMINUS : - case TokenNameMULTIPLY : - case TokenNameDIVIDE : - case TokenNameREMAINDER : - case TokenNameLEFT_SHIFT : - case TokenNameRIGHT_SHIFT : - case TokenNameEQUAL_EQUAL_EQUAL : - case TokenNameNOT_EQUAL_EQUAL : - case TokenNameEQUAL_EQUAL : - case TokenNameNOT_EQUAL : - case TokenNameLESS : - case TokenNameLESS_EQUAL : - case TokenNameGREATER : - case TokenNameGREATER_EQUAL : - getNextToken(); - expr(); - break; - // | expr T_INSTANCEOF class_name_reference - // | expr '?' expr ':' expr - case TokenNameinstanceof : - getNextToken(); - class_name_reference(); - break; - case TokenNameQUESTION : - getNextToken(); - expr(); - if (token == TokenNameCOLON) { - getNextToken(); - expr(); - } - break; - default : - return; - } - } - } - private void class_name_reference() { - // class_name_reference: - // T_STRING - //| dynamic_class_name_reference - if (Scanner.TRACE) { - System.out.println("TRACE: class_name_reference()"); - } - if (token == TokenNameIdentifier) { - getNextToken(); - } else { - dynamic_class_name_reference(); - } - } - private void dynamic_class_name_reference() { - //dynamic_class_name_reference: - // base_variable T_OBJECT_OPERATOR object_property - // dynamic_class_name_variable_properties - //| base_variable - if (Scanner.TRACE) { - System.out.println("TRACE: dynamic_class_name_reference()"); - } - base_variable(); - if (token == TokenNameMINUS_GREATER) { - getNextToken(); - object_property(); - dynamic_class_name_variable_properties(); - } - } - private void dynamic_class_name_variable_properties() { - // dynamic_class_name_variable_properties: - // dynamic_class_name_variable_properties - // dynamic_class_name_variable_property - // | /* empty */ - if (Scanner.TRACE) { - System.out.println("TRACE: dynamic_class_name_variable_properties()"); - } - while (token == TokenNameMINUS_GREATER) { - dynamic_class_name_variable_property(); - } - } - private void dynamic_class_name_variable_property() { - // dynamic_class_name_variable_property: - // T_OBJECT_OPERATOR object_property - if (Scanner.TRACE) { - System.out.println("TRACE: dynamic_class_name_variable_property()"); - } - if (token == TokenNameMINUS_GREATER) { - getNextToken(); - object_property(); - } - } - private void ctor_arguments() { - // ctor_arguments: - // /* empty */ - //| '(' function_call_parameter_list ')' - if (token == TokenNameLPAREN) { - getNextToken(); - if (token == TokenNameRPAREN) { - getNextToken(); - return; - } - non_empty_function_call_parameter_list(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected in ctor_arguments."); - } - getNextToken(); - } - } - private void assignment_list() { - // assignment_list: - // assignment_list ',' assignment_list_element - //| assignment_list_element - while (true) { - assignment_list_element(); - if (token != TokenNameCOMMA) { - break; - } - getNextToken(); - } - } - private void assignment_list_element() { - //assignment_list_element: - // variable - //| T_LIST '(' assignment_list ')' - //| /* empty */ - if (token == TokenNameVariable || token == TokenNameDOLLAR) { - variable(); - } else { - if (token == TokenNamelist) { - getNextToken(); - if (token == TokenNameLPAREN) { - getNextToken(); - assignment_list(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after 'list' keyword."); - } - getNextToken(); - } else { - throwSyntaxError("'(' expected after 'list' keyword."); - } - } - } - } - private void array_pair_list() { - // array_pair_list: - // /* empty */ - //| non_empty_array_pair_list possible_comma - non_empty_array_pair_list(); - if (token == TokenNameCOMMA) { - getNextToken(); - } - } - private void non_empty_array_pair_list() { - //non_empty_array_pair_list: - // non_empty_array_pair_list ',' expr T_DOUBLE_ARROW expr - //| non_empty_array_pair_list ',' expr - //| expr T_DOUBLE_ARROW expr - //| expr - //| non_empty_array_pair_list ',' expr T_DOUBLE_ARROW '&' w_variable - //| non_empty_array_pair_list ',' '&' w_variable - //| expr T_DOUBLE_ARROW '&' w_variable - //| '&' w_variable - while (true) { - if (token == TokenNameAND) { - getNextToken(); - variable(); - } else { - expr(); - if (token == TokenNameAND) { - getNextToken(); - variable(); - } else if (token == TokenNameEQUAL_GREATER) { - getNextToken(); - if (token == TokenNameAND) { - getNextToken(); - variable(); - } else { - expr(); - } - } - } - if (token != TokenNameCOMMA) { - return; - } - getNextToken(); - if (token == TokenNameRPAREN) { - return; - } - } - } - // private void variableList() { - // do { - // variable(); - // if (token == TokenNameCOMMA) { - // getNextToken(); - // } else { - // break; - // } - // } while (true); - // } - private void variable_without_objects() { - // variable_without_objects: - // reference_variable - // | simple_indirect_reference reference_variable - if (Scanner.TRACE) { - System.out.println("TRACE: variable_without_objects()"); - } - while (token == TokenNameDOLLAR) { - getNextToken(); - } - reference_variable(); - } - private void function_call() { - // function_call: - // T_STRING '(' function_call_parameter_list ')' - //| class_constant '(' function_call_parameter_list ')' - //| static_member '(' function_call_parameter_list ')' - //| variable_without_objects '(' function_call_parameter_list ')' - if (Scanner.TRACE) { - System.out.println("TRACE: function_call()"); - } - if (token == TokenNameIdentifier) { - getNextToken(); - switch (token) { - case TokenNamePAAMAYIM_NEKUDOTAYIM : - // static member: - getNextToken(); - if (token == TokenNameIdentifier) { - // class _constant - getNextToken(); - } else { - // static member: - variable_without_objects(); - } - break; - } - } else { - variable_without_objects(); - } - if (token != TokenNameLPAREN) { - // TODO is this ok ? - return; - // throwSyntaxError("'(' expected in function call."); - } - getNextToken(); - if (token == TokenNameRPAREN) { - getNextToken(); - return; - } - non_empty_function_call_parameter_list(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected in function call."); - } - getNextToken(); - } - // private void function_call_parameter_list() { - // function_call_parameter_list: - // non_empty_function_call_parameter_list { $$ = $1; } - // | /* empty */ - // } - private void non_empty_function_call_parameter_list() { - //non_empty_function_call_parameter_list: - // expr_without_variable - // | variable - // | '&' w_variable - // | non_empty_function_call_parameter_list ',' expr_without_variable - // | non_empty_function_call_parameter_list ',' variable - // | non_empty_function_call_parameter_list ',' '&' w_variable - if (Scanner.TRACE) { - System.out.println("TRACE: non_empty_function_call_parameter_list()"); - } - while (true) { - if (token == TokenNameAND) { - getNextToken(); - w_variable(); - } else { - // if (token == TokenNameIdentifier || token == TokenNameVariable - // || token == TokenNameDOLLAR) { - // variable(); - // } else { - expr_without_variable(true); - // } - } - if (token != TokenNameCOMMA) { - break; - } - getNextToken(); - } - } - private void fully_qualified_class_name() { - if (token == TokenNameIdentifier) { - getNextToken(); - } else { - throwSyntaxError("Class name expected."); - } - } - private void static_member() { - // static_member: - // fully_qualified_class_name T_PAAMAYIM_NEKUDOTAYIM - // variable_without_objects - if (Scanner.TRACE) { - System.out.println("TRACE: static_member()"); - } - fully_qualified_class_name(); - if (token != TokenNamePAAMAYIM_NEKUDOTAYIM) { - throwSyntaxError("'::' expected after class name (static_member)."); - } - getNextToken(); - variable_without_objects(); - } - private void base_variable_with_function_calls() { - // base_variable_with_function_calls: - // base_variable - //| function_call - boolean functionCall = false; - if (Scanner.TRACE) { - System.out.println("TRACE: base_variable_with_function_calls()"); - } - // if (token == TokenNameIdentifier) { - // functionCall = true; - // } else if (token == TokenNameVariable) { - // int tempToken = token; - // int tempPosition = scanner.currentPosition; - // getNextToken(); - // if (token == TokenNameLPAREN) { - // functionCall = true; - // } - // token = tempToken; - // scanner.currentPosition = tempPosition; - // scanner.phpMode = true; - // } - // if (functionCall) { - function_call(); - // } else { - // base_variable(); - // } - } - private void base_variable() { - // base_variable: - // reference_variable - // | simple_indirect_reference reference_variable - // | static_member - if (Scanner.TRACE) { - System.out.println("TRACE: base_variable()"); - } - if (token == TokenNameIdentifier) { - static_member(); - } else { - while (token == TokenNameDOLLAR) { - getNextToken(); - } - reference_variable(); - } - } - // private void simple_indirect_reference() { - // // simple_indirect_reference: - // // '$' - // //| simple_indirect_reference '$' - // } - private void reference_variable() { - // reference_variable: - // reference_variable '[' dim_offset ']' - // | reference_variable '{' expr '}' - // | compound_variable - if (Scanner.TRACE) { - System.out.println("TRACE: reference_variable()"); - } - compound_variable(); - while (true) { - if (token == TokenNameLBRACE) { - getNextToken(); - expr(); - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected in reference variable."); - } - getNextToken(); - } else if (token == TokenNameLBRACKET) { - getNextToken(); - if (token != TokenNameRBRACKET) { - expr(); - // dim_offset(); - if (token != TokenNameRBRACKET) { - throwSyntaxError("']' expected in reference variable."); - } - } - getNextToken(); - } else { - break; - } - } - } - private void compound_variable() { - // compound_variable: - // T_VARIABLE - // | '$' '{' expr '}' - if (Scanner.TRACE) { - System.out.println("TRACE: compound_variable()"); - } - if (token == TokenNameVariable) { - getNextToken(); - } else { - // because of simple_indirect_reference - while (token == TokenNameDOLLAR) { - getNextToken(); - } - if (token != TokenNameLBRACE) { - throwSyntaxError("'{' expected after compound variable token '$'."); - } - getNextToken(); - expr(); - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected after compound variable token '$'."); - } - getNextToken(); - } - } - // private void dim_offset() { - // // dim_offset: - // // /* empty */ - // // | expr - // expr(); - // } - private void object_property() { - // object_property: - // object_dim_list - //| variable_without_objects - if (Scanner.TRACE) { - System.out.println("TRACE: object_property()"); - } - if (token == TokenNameVariable || token == TokenNameDOLLAR) { - variable_without_objects(); - } else { - object_dim_list(); - } - } - private void object_dim_list() { - //object_dim_list: - // object_dim_list '[' dim_offset ']' - //| object_dim_list '{' expr '}' - //| variable_name - if (Scanner.TRACE) { - System.out.println("TRACE: object_dim_list()"); - } - variable_name(); - while (true) { - if (token == TokenNameLBRACE) { - getNextToken(); - expr(); - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected in object_dim_list."); - } - getNextToken(); - } else if (token == TokenNameLBRACKET) { - getNextToken(); - if (token == TokenNameRBRACKET) { - getNextToken(); - continue; - } - expr(); - if (token != TokenNameRBRACKET) { - throwSyntaxError("']' expected in object_dim_list."); - } - getNextToken(); - } else { - break; - } - } - } - private void variable_name() { - //variable_name: - // T_STRING - //| '{' expr '}' - if (Scanner.TRACE) { - System.out.println("TRACE: variable_name()"); - } - if (token == TokenNameIdentifier || token > TokenNameKEYWORD) { - if (token > TokenNameKEYWORD) { - // TODO show a warning "Keyword used as variable" ? - } - getNextToken(); - } else { - if (token != TokenNameLBRACE) { - throwSyntaxError("'{' expected in variable name."); - } - getNextToken(); - expr(); - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected in variable name."); - } - getNextToken(); - } - } - private void r_variable() { - variable(); - } - private void w_variable() { - variable(); - } - private void rw_variable() { - variable(); - } - private void variable() { - // variable: - // base_variable_with_function_calls T_OBJECT_OPERATOR - // object_property method_or_not variable_properties - // | base_variable_with_function_calls - base_variable_with_function_calls(); - if (token == TokenNameMINUS_GREATER) { - getNextToken(); - object_property(); - method_or_not(); - variable_properties(); - } - // if (token == TokenNameDOLLAR_LBRACE) { - // getNextToken(); - // expr(); - // ; - // if (token != TokenNameRBRACE) { - // throwSyntaxError("'}' expected after indirect variable token '${'."); - // } - // getNextToken(); - // } else { - // if (token == TokenNameVariable) { - // getNextToken(); - // if (token == TokenNameLBRACKET) { - // getNextToken(); - // expr(); - // if (token != TokenNameRBRACKET) { - // throwSyntaxError("']' expected in variable-list."); - // } - // getNextToken(); - // } else if (token == TokenNameEQUAL) { - // getNextToken(); - // static_scalar(); - // } - // } else { - // throwSyntaxError("$-variable expected in variable-list."); - // } - // } - } - private void variable_properties() { - // variable_properties: - // variable_properties variable_property - // | /* empty */ - while (token == TokenNameMINUS_GREATER) { - variable_property(); - } - } - private void variable_property() { - // variable_property: - // T_OBJECT_OPERATOR object_property method_or_not - if (Scanner.TRACE) { - System.out.println("TRACE: variable_property()"); - } - if (token == TokenNameMINUS_GREATER) { - getNextToken(); - object_property(); - method_or_not(); - } else { - throwSyntaxError("'->' expected in variable_property."); - } - } - private void method_or_not() { - // method_or_not: - // '(' function_call_parameter_list ')' - // | /* empty */ - if (Scanner.TRACE) { - System.out.println("TRACE: method_or_not()"); - } - if (token == TokenNameLPAREN) { - getNextToken(); - if (token == TokenNameRPAREN) { - getNextToken(); - return; - } - non_empty_function_call_parameter_list(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected in method_or_not."); - } - getNextToken(); - } - } - private void exit_expr() { - // /* empty */ - // | '(' ')' - // | '(' expr ')' - if (token != TokenNameLPAREN) { - return; - } - getNextToken(); - if (token == TokenNameRPAREN) { - getNextToken(); - return; - } - expr(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after keyword 'exit'"); - } - getNextToken(); - } - private void encaps_list() { - // encaps_list encaps_var - // | encaps_list T_STRING - // | encaps_list T_NUM_STRING - // | encaps_list T_ENCAPSED_AND_WHITESPACE - // | encaps_list T_CHARACTER - // | encaps_list T_BAD_CHARACTER - // | encaps_list '[' - // | encaps_list ']' - // | encaps_list '{' - // | encaps_list '}' - // | encaps_list T_OBJECT_OPERATOR - // | /* empty */ - while (true) { - switch (token) { - case TokenNameSTRING : - getNextToken(); - break; - case TokenNameLBRACE : - // scanner.encapsedStringStack.pop(); - getNextToken(); - break; - case TokenNameRBRACE : - // scanner.encapsedStringStack.pop(); - getNextToken(); - break; - case TokenNameLBRACKET : - // scanner.encapsedStringStack.pop(); - getNextToken(); - break; - case TokenNameRBRACKET : - // scanner.encapsedStringStack.pop(); - getNextToken(); - break; - case TokenNameMINUS_GREATER : - // scanner.encapsedStringStack.pop(); - getNextToken(); - break; - case TokenNameVariable : - case TokenNameDOLLAR_LBRACE : - case TokenNameCURLY_OPEN : - encaps_var(); - break; - // case TokenNameDOLLAR : - // getNextToken(); - // if (token == TokenNameLBRACE) { - // token = TokenNameDOLLAR_LBRACE; - // encaps_var(); - // } - // break; - default : - char encapsedChar = ((Character) scanner.encapsedStringStack.peek()) - .charValue(); - if (encapsedChar == '$') { - scanner.encapsedStringStack.pop(); - encapsedChar = ((Character) scanner.encapsedStringStack.peek()) - .charValue(); - switch (encapsedChar) { - case '`' : - if (token == TokenNameEncapsedString0) { - return; - } - token = TokenNameSTRING; - continue; - case '\'' : - if (token == TokenNameEncapsedString1) { - return; - } - token = TokenNameSTRING; - continue; - case '"' : - if (token == TokenNameEncapsedString2) { - return; - } - token = TokenNameSTRING; - continue; - } - } - return; - } - } - } - private void encaps_var() { - // T_VARIABLE - // | T_VARIABLE '[' encaps_var_offset ']' - // | T_VARIABLE T_OBJECT_OPERATOR T_STRING - // | T_DOLLAR_OPEN_CURLY_BRACES expr '}' - // | T_DOLLAR_OPEN_CURLY_BRACES T_STRING_VARNAME '[' expr ']' '}' - // | T_CURLY_OPEN variable '}' - switch (token) { - case TokenNameVariable : - getNextToken(); - if (token == TokenNameLBRACKET) { - getNextToken(); - // if (token == TokenNameRBRACKET) { - // getNextToken(); - // } else { - expr(); //encaps_var_offset(); - if (token != TokenNameRBRACKET) { - throwSyntaxError("']' expected after variable."); - } - // scanner.encapsedStringStack.pop(); - getNextToken(); - // } - } else if (token == TokenNameMINUS_GREATER) { - getNextToken(); - if (token != TokenNameIdentifier) { - throwSyntaxError("Identifier expected after '->'."); - } - // scanner.encapsedStringStack.pop(); - getNextToken(); - } - // else { - // // scanner.encapsedStringStack.pop(); - // int tempToken = TokenNameSTRING; - // if (!scanner.encapsedStringStack.isEmpty() - // && (token == TokenNameEncapsedString0 - // || token == TokenNameEncapsedString1 - // || token == TokenNameEncapsedString2 || token == TokenNameERROR)) { - // char encapsedChar = ((Character) scanner.encapsedStringStack.peek()) - // .charValue(); - // switch (token) { - // case TokenNameEncapsedString0 : - // if (encapsedChar == '`') { - // tempToken = TokenNameEncapsedString0; - // } - // break; - // case TokenNameEncapsedString1 : - // if (encapsedChar == '\'') { - // tempToken = TokenNameEncapsedString1; - // } - // break; - // case TokenNameEncapsedString2 : - // if (encapsedChar == '"') { - // tempToken = TokenNameEncapsedString2; - // } - // break; - // case TokenNameERROR : - // if (scanner.source[scanner.currentPosition - 1] == '\\') { - // scanner.currentPosition--; - // getNextToken(); - // } - // break; - // } - // } - // token = tempToken; - // } - break; - case TokenNameDOLLAR_LBRACE : - getNextToken(); - if (token == TokenNameIdentifier) { - getNextToken(); - if (token == TokenNameLBRACKET) { - getNextToken(); - // if (token == TokenNameRBRACKET) { - // getNextToken(); - // } else { - expr(); - if (token != TokenNameRBRACKET) { - throwSyntaxError("']' expected after '${'."); - } - getNextToken(); - // } - } - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected after '${'."); - } - // scanner.encapsedStringStack.pop(); - getNextToken(); - } else { - expr(); - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected."); - } - // scanner.encapsedStringStack.pop(); - getNextToken(); - } - break; - case TokenNameCURLY_OPEN : - getNextToken(); - if (token == TokenNameIdentifier||token>TokenNameKEYWORD) { - getNextToken(); - if (token == TokenNameLBRACKET) { - getNextToken(); - // if (token == TokenNameRBRACKET) { - // getNextToken(); - // } else { - expr(); - if (token != TokenNameRBRACKET) { - throwSyntaxError("']' expected after '{$'."); - } - getNextToken(); - // } - } else if (token == TokenNameMINUS_GREATER) { - getNextToken(); - if (token != TokenNameIdentifier) { - throwSyntaxError("String token expected."); - } - getNextToken(); - } - // if (token != TokenNameRBRACE) { - // throwSyntaxError("'}' expected after '{$'."); - // } - // // scanner.encapsedStringStack.pop(); - // getNextToken(); - } else { - expr(); - if (token != TokenNameRBRACE) { - throwSyntaxError("'}' expected."); - } - // scanner.encapsedStringStack.pop(); - getNextToken(); - } - break; - } - } - private void encaps_var_offset() { - // T_STRING - // | T_NUM_STRING - // | T_VARIABLE - switch (token) { - case TokenNameSTRING : - getNextToken(); - break; - case TokenNameIntegerLiteral : - getNextToken(); - break; - case TokenNameVariable : - getNextToken(); - break; - case TokenNameIdentifier : - getNextToken(); - break; - default : - throwSyntaxError("Variable or String token expected."); - break; - } - } - private void internal_functions_in_yacc() { - switch (token) { - case TokenNameisset : - // T_ISSET '(' isset_variables ')' - getNextToken(); - if (token != TokenNameLPAREN) { - throwSyntaxError("'(' expected after keyword 'isset'"); - } - getNextToken(); - isset_variables(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after keyword 'isset'"); - } - getNextToken(); - break; - case TokenNameempty : - // T_EMPTY '(' variable ')' - getNextToken(); - if (token != TokenNameLPAREN) { - throwSyntaxError("'(' expected after keyword 'empty'"); - } - getNextToken(); - variable(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after keyword 'empty'"); - } - getNextToken(); - break; - case TokenNameinclude : - //T_INCLUDE expr - getNextToken(); - expr(); - break; - case TokenNameinclude_once : - // T_INCLUDE_ONCE expr - getNextToken(); - expr(); - break; - case TokenNameeval : - // T_EVAL '(' expr ')' - getNextToken(); - if (token != TokenNameLPAREN) { - throwSyntaxError("'(' expected after keyword 'eval'"); - } - getNextToken(); - expr(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after keyword 'eval'"); - } - getNextToken(); - break; - case TokenNamerequire : - //T_REQUIRE expr - getNextToken(); - expr(); - break; - case TokenNamerequire_once : - // T_REQUIRE_ONCE expr - getNextToken(); - expr(); - break; - } - } - private void isset_variables() { - // variable - // | isset_variables ',' - if (token == TokenNameRPAREN) { - throwSyntaxError("Variable expected after keyword 'isset'"); - } - while (true) { - variable(); - if (token == TokenNameCOMMA) { - getNextToken(); - } else { - break; - } - } - } - private boolean common_scalar() { - // common_scalar: - // T_LNUMBER - // | T_DNUMBER - // | T_CONSTANT_ENCAPSED_STRING - // | T_LINE - // | T_FILE - // | T_CLASS_C - // | T_METHOD_C - // | T_FUNC_C - switch (token) { - case TokenNameIntegerLiteral : - getNextToken(); - return true; - case TokenNameDoubleLiteral : - getNextToken(); - return true; - case TokenNameStringLiteral : - getNextToken(); - return true; - case TokenNameStringConstant : - getNextToken(); - return true; - case TokenNameStringInterpolated : - getNextToken(); - return true; - case TokenNameFILE : - getNextToken(); - return true; - case TokenNameLINE : - getNextToken(); - return true; - case TokenNameCLASS_C : - getNextToken(); - return true; - case TokenNameMETHOD_C : - getNextToken(); - return true; - case TokenNameFUNC_C : - getNextToken(); - return true; - } - return false; - } - private void scalar() { - // scalar: - // T_STRING - //| T_STRING_VARNAME - //| class_constant - //| common_scalar - //| '"' encaps_list '"' - //| '\'' encaps_list '\'' - //| T_START_HEREDOC encaps_list T_END_HEREDOC - throwSyntaxError("Not yet implemented (scalar)."); - } - private void static_scalar() { - // static_scalar: /* compile-time evaluated scalars */ - // common_scalar - // | T_STRING - // | '+' static_scalar - // | '-' static_scalar - // | T_ARRAY '(' static_array_pair_list ')' - // | static_class_constant - if (common_scalar()) { - return; - } - switch (token) { - case TokenNameIdentifier : - getNextToken(); - // static_class_constant: - // T_STRING T_PAAMAYIM_NEKUDOTAYIM T_STRING - if (token == TokenNamePAAMAYIM_NEKUDOTAYIM) { - getNextToken(); - if (token == TokenNameIdentifier) { - getNextToken(); - } else { - throwSyntaxError("Identifier expected after '::' operator."); - } - } - break; - case TokenNameEncapsedString0 : - try { - scanner.currentCharacter = scanner.source[scanner.currentPosition++]; - while (scanner.currentCharacter != '`') { - if (scanner.currentCharacter == '\\') { - scanner.currentPosition++; - } - scanner.currentCharacter = scanner.source[scanner.currentPosition++]; - } - getNextToken(); - } catch (IndexOutOfBoundsException e) { - throwSyntaxError("'`' expected at end of static string."); - } - break; - case TokenNameEncapsedString1 : - try { - scanner.currentCharacter = scanner.source[scanner.currentPosition++]; - while (scanner.currentCharacter != '\'') { - if (scanner.currentCharacter == '\\') { - scanner.currentPosition++; - } - scanner.currentCharacter = scanner.source[scanner.currentPosition++]; - } - getNextToken(); - } catch (IndexOutOfBoundsException e) { - throwSyntaxError("'\'' expected at end of static string."); - } - break; - case TokenNameEncapsedString2 : - try { - scanner.currentCharacter = scanner.source[scanner.currentPosition++]; - while (scanner.currentCharacter != '"') { - if (scanner.currentCharacter == '\\') { - scanner.currentPosition++; - } - scanner.currentCharacter = scanner.source[scanner.currentPosition++]; - } - getNextToken(); - } catch (IndexOutOfBoundsException e) { - throwSyntaxError("'\"' expected at end of static string."); - } - break; - case TokenNamePLUS : - getNextToken(); - static_scalar(); - break; - case TokenNameMINUS : - getNextToken(); - static_scalar(); - break; - case TokenNamearray : - getNextToken(); - if (token != TokenNameLPAREN) { - throwSyntaxError("'(' expected after keyword 'array'"); - } - getNextToken(); - if (token == TokenNameRPAREN) { - getNextToken(); - break; - } - non_empty_static_array_pair_list(); - if (token != TokenNameRPAREN) { - throwSyntaxError("')' expected after keyword 'array'"); - } - getNextToken(); - break; - // case TokenNamenull : - // getNextToken(); - // break; - // case TokenNamefalse : - // getNextToken(); - // break; - // case TokenNametrue : - // getNextToken(); - // break; - default : - throwSyntaxError("Static scalar/constant expected."); - } - } - private void non_empty_static_array_pair_list() { - // non_empty_static_array_pair_list: - // non_empty_static_array_pair_list ',' static_scalar T_DOUBLE_ARROW - // static_scalar - //| non_empty_static_array_pair_list ',' static_scalar - //| static_scalar T_DOUBLE_ARROW static_scalar - //| static_scalar - while (true) { - static_scalar(); - if (token == TokenNameEQUAL_GREATER) { - getNextToken(); - static_scalar(); - } - if (token != TokenNameCOMMA) { - break; - } - getNextToken(); - if (token == TokenNameRPAREN) { - break; - } - } - } - public void reportSyntaxError() { //int act, int currentKind, int - // stateStackTop) { - /* remember current scanner position */ - int startPos = scanner.startPosition; - int currentPos = scanner.currentPosition; - // String[] expectings; - // String tokenName = name[symbol_index[currentKind]]; - //fetch all "accurate" possible terminals that could recover the error - // int start, end = start = asi(stack[stateStackTop]); - // while (asr[end] != 0) - // end++; - // int length = end - start; - // expectings = new String[length]; - // if (length != 0) { - // char[] indexes = new char[length]; - // System.arraycopy(asr, start, indexes, 0, length); - // for (int i = 0; i < length; i++) { - // expectings[i] = name[symbol_index[indexes[i]]]; - // } - // } - //if the pb is an EOF, try to tell the user that they are some - // if (tokenName.equals(UNEXPECTED_EOF)) { - // if (!this.checkAndReportBracketAnomalies(problemReporter())) { - // char[] tokenSource; - // try { - // tokenSource = this.scanner.getCurrentTokenSource(); - // } catch (Exception e) { - // tokenSource = new char[] {}; - // } - // problemReporter().parseError( - // this.scanner.startPosition, - // this.scanner.currentPosition - 1, - // tokenSource, - // tokenName, - // expectings); - // } - // } else { //the next test is HEAVILY grammar DEPENDENT. - // if ((length == 14) - // && (expectings[0] == "=") //$NON-NLS-1$ - // && (expectings[1] == "*=") //$NON-NLS-1$ - // && (expressionPtr > -1)) { - // switch(currentKind) { - // case TokenNameSEMICOLON: - // case TokenNamePLUS: - // case TokenNameMINUS: - // case TokenNameDIVIDE: - // case TokenNameREMAINDER: - // case TokenNameMULTIPLY: - // case TokenNameLEFT_SHIFT: - // case TokenNameRIGHT_SHIFT: - //// case TokenNameUNSIGNED_RIGHT_SHIFT: - // case TokenNameLESS: - // case TokenNameGREATER: - // case TokenNameLESS_EQUAL: - // case TokenNameGREATER_EQUAL: - // case TokenNameEQUAL_EQUAL: - // case TokenNameNOT_EQUAL: - // case TokenNameXOR: - // case TokenNameAND: - // case TokenNameOR: - // case TokenNameOR_OR: - // case TokenNameAND_AND: - // // the ; is not the expected token ==> it ends a statement when an - // expression is not ended - // problemReporter().invalidExpressionAsStatement(expressionStack[expressionPtr]); - // break; - // case TokenNameRBRACE : - // problemReporter().missingSemiColon(expressionStack[expressionPtr]); - // break; - // default: - // char[] tokenSource; - // try { - // tokenSource = this.scanner.getCurrentTokenSource(); - // } catch (Exception e) { - // tokenSource = new char[] {}; - // } - // problemReporter().parseError( - // this.scanner.startPosition, - // this.scanner.currentPosition - 1, - // tokenSource, - // tokenName, - // expectings); - // this.checkAndReportBracketAnomalies(problemReporter()); - // } - // } else { - char[] tokenSource; - try { - tokenSource = this.scanner.getCurrentTokenSource(); - } catch (Exception e) { - tokenSource = new char[]{}; - } - // problemReporter().parseError( - // this.scanner.startPosition, - // this.scanner.currentPosition - 1, - // tokenSource, - // tokenName, - // expectings); - this.checkAndReportBracketAnomalies(problemReporter()); - // } - // } - /* reset scanner where it was */ - scanner.startPosition = startPos; - scanner.currentPosition = currentPos; - } - public static final int RoundBracket = 0; - public static final int SquareBracket = 1; - public static final int CurlyBracket = 2; - public static final int BracketKinds = 3; - protected int[] nestedMethod; //the ptr is nestedType - protected int nestedType, dimensions; - //ast stack - final static int AstStackIncrement = 100; - protected int astPtr; - protected AstNode[] astStack = new AstNode[AstStackIncrement]; - protected int astLengthPtr; - protected int[] astLengthStack; - AstNode[] noAstNodes = new AstNode[AstStackIncrement]; - public CompilationUnitDeclaration compilationUnit; /* - * the result from parse() - */ - protected ReferenceContext referenceContext; - protected ProblemReporter problemReporter; - protected CompilerOptions options; - // protected CompilationResult compilationResult; - /** - * Returns this parser's problem reporter initialized with its reference - * context. Also it is assumed that a problem is going to be reported, so - * initializes the compilation result's line positions. - */ - public ProblemReporter problemReporter() { - if (scanner.recordLineSeparator) { - compilationUnit.compilationResult.lineSeparatorPositions = scanner - .getLineEnds(); - } - problemReporter.referenceContext = referenceContext; - return problemReporter; - } - /* - * Reconsider the entire source looking for inconsistencies in {} () [] - */ - public boolean checkAndReportBracketAnomalies(ProblemReporter problemReporter) { - scanner.wasAcr = false; - boolean anomaliesDetected = false; - try { - char[] source = scanner.source; - int[] leftCount = {0, 0, 0}; - int[] rightCount = {0, 0, 0}; - 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[][] rightDepths = new int[][]{new int[10], new int[10], new int[10]}; - scanner.currentPosition = scanner.initialPosition; //starting - // point - // (first-zero-based - // char) - while (scanner.currentPosition < scanner.eofPosition) { //loop for - // jumping - // over - // comments - try { - // ---------Consume white space and handles - // startPosition--------- - boolean isWhiteSpace; - do { - scanner.startPosition = scanner.currentPosition; - // if (((scanner.currentCharacter = - // source[scanner.currentPosition++]) == '\\') && - // (source[scanner.currentPosition] == 'u')) { - // isWhiteSpace = scanner.jumpOverUnicodeWhiteSpace(); - // } else { - 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(); - } - } - isWhiteSpace = CharOperation.isWhitespace(scanner.currentCharacter); - // } - } 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]++; - } - 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]; - } - 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]++; - } - 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]; - } - 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]++; - } - 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]; - } - 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; - } - // } - } - scanner.getNextChar('\''); - break; - } - case '"' : - // 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; - } - // } - while (scanner.currentCharacter != '"') { - if (scanner.currentCharacter == '\r') { - if (source[scanner.currentPosition] == '\n') - scanner.currentPosition++; - break; // the string cannot go further that - // the line - } - if (scanner.currentCharacter == '\n') { - break; // the string cannot go further that - // the line - } - if (scanner.currentCharacter == '\\') { - scanner.scanEscapeCharacter(); - } - // 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; - 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 - // ------------ - 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()); - } - } - } - 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 ((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); - } - } - //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; - } - break; - } - default : - if (Scanner.isPHPIdentifierStart(scanner.currentCharacter)) { - scanner.scanIdentifierOrKeyword(false); - break; - } - if (Character.isDigit(scanner.currentCharacter)) { - scanner.scanNumber(false); - break; - } - } - //-----------------end switch while - // try-------------------- - } catch (IndexOutOfBoundsException e) { - break; // read until EOF - } catch (InvalidInputException e) { - return false; // no clue - } - } - if (scanner.recordLineSeparator) { - // compilationUnit.compilationResult.lineSeparatorPositions = - // scanner.getLineEnds(); - } - // check placement anomalies against other kinds of brackets - for (int kind = 0; kind < BracketKinds; kind++) { - for (int leftIndex = leftCount[kind] - 1; leftIndex >= 0; leftIndex--) { - int start = leftPositions[kind][leftIndex]; // deepest - // first - // find matching closing bracket - int depth = leftDepths[kind][leftIndex]; - int end = -1; - for (int i = 0; i < rightCount[kind]; i++) { - int pos = rightPositions[kind][i]; - // want matching bracket further in source with same - // depth - if ((pos > start) && (depth == rightDepths[kind][i])) { - end = pos; - break; - } - } - if (end < 0) { // did not find a good closing match - problemReporter.unmatchedBracket(start, referenceContext, - compilationUnit.compilationResult); - return true; - } - // check if even number of opening/closing other brackets - // in between this pair of brackets - int balance = 0; - for (int otherKind = 0; (balance == 0) && (otherKind < BracketKinds); otherKind++) { - for (int i = 0; i < leftCount[otherKind]; i++) { - int pos = leftPositions[otherKind][i]; - if ((pos > start) && (pos < end)) - balance++; - } - for (int i = 0; i < rightCount[otherKind]; i++) { - int pos = rightPositions[otherKind][i]; - if ((pos > start) && (pos < end)) - balance--; - } - if (balance != 0) { - problemReporter.unmatchedBracket(start, referenceContext, - compilationUnit.compilationResult); //bracket - // anomaly - return true; - } - } - } - // 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); - } - // too many closing brackets ? - for (int i = leftCount[kind]; i < rightCount[kind]; i++) { - anomaliesDetected = true; - problemReporter.unmatchedBracket(rightPositions[kind][i], - referenceContext, compilationUnit.compilationResult); - } - if (anomaliesDetected) - return true; - } - return anomaliesDetected; - } catch (ArrayStoreException e) { // jdk1.2.2 jit bug - return anomaliesDetected; - } catch (NullPointerException e) { // jdk1.2.2 jit bug - return anomaliesDetected; - } - } - protected void pushOnAstLengthStack(int pos) { - try { - astLengthStack[++astLengthPtr] = pos; - } catch (IndexOutOfBoundsException e) { - int oldStackLength = astLengthStack.length; - int[] oldPos = astLengthStack; - astLengthStack = new int[oldStackLength + StackIncrement]; - System.arraycopy(oldPos, 0, astLengthStack, 0, oldStackLength); - astLengthStack[astLengthPtr] = pos; - } - } - protected void pushOnAstStack(AstNode node) { - /* - * add a new obj on top of the ast stack - */ - try { - astStack[++astPtr] = node; - } catch (IndexOutOfBoundsException e) { - int oldStackLength = astStack.length; - AstNode[] oldStack = astStack; - astStack = new AstNode[oldStackLength + AstStackIncrement]; - System.arraycopy(oldStack, 0, astStack, 0, oldStackLength); - astPtr = oldStackLength; - astStack[astPtr] = node; - } - try { - astLengthStack[++astLengthPtr] = 1; - } catch (IndexOutOfBoundsException e) { - int oldStackLength = astLengthStack.length; - int[] oldPos = astLengthStack; - astLengthStack = new int[oldStackLength + AstStackIncrement]; - System.arraycopy(oldPos, 0, astLengthStack, 0, oldStackLength); - 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 diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Scanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Scanner.java index ea1f9c0..bfbb4d7 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Scanner.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/parser/Scanner.java @@ -13,6 +13,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Stack; + import net.sourceforge.phpdt.core.compiler.CharOperation; import net.sourceforge.phpdt.core.compiler.IScanner; import net.sourceforge.phpdt.core.compiler.ITerminalSymbols; @@ -52,11 +53,11 @@ public class Scanner implements IScanner, ITerminalSymbols { //when == 0 ==> no unicode in the current token public boolean unicodeAsBackSlash = false; public boolean scanningFloatLiteral = false; - //support for /** comments - //public char[][] comments = new char[10][]; - public int[] commentStops = new int[10]; - public int[] commentStarts = new int[10]; - public int commentPtr = -1; // no comment test with commentPtr value -1 +//support for /** comments + public int[] commentStops = new int[10]; + public int[] commentStarts = new int[10]; + public int commentPtr = -1; // no comment test with commentPtr value -1 + protected int lastCommentLinePosition = -1; //diet parsing support - jump over some method body when requested public boolean diet = false; //support for the poor-line-debuggers .... @@ -1482,6 +1483,7 @@ public class Scanner implements IScanner, ITerminalSymbols { int test; if ((startChar == '#') || (test = getNextChar('/', '*')) == 0) { //line comment + this.lastCommentLinePosition = this.currentPosition; int endPositionForLineComment = 0; try { //get the next char currentCharacter = source[currentPosition++]; @@ -1524,6 +1526,7 @@ public class Scanner implements IScanner, ITerminalSymbols { // } //jump over the \\ boolean isUnicode = false; while (currentCharacter != '\r' && currentCharacter != '\n') { + this.lastCommentLinePosition = this.currentPosition; if (currentCharacter == '?') { if (getNextChar('>')) { startPosition = currentPosition - 2; @@ -1581,7 +1584,8 @@ public class Scanner implements IScanner, ITerminalSymbols { } else { endPositionForLineComment = currentPosition - 1; } - recordComment(false); +// recordComment(false); + recordComment(TokenNameCOMMENT_LINE); if (this.taskTags != null) checkTaskTag(this.startPosition, this.currentPosition); if ((currentCharacter == '\r') || (currentCharacter == '\n')) { @@ -1685,7 +1689,13 @@ public class Scanner implements IScanner, ITerminalSymbols { // currentPosition++; // } //jump over the \\ } - recordComment(isJavadoc); + //recordComment(isJavadoc); + if (isJavadoc) { + recordComment(TokenNameCOMMENT_PHPDOC); + } else { + recordComment(TokenNameCOMMENT_BLOCK); + } + if (tokenizeComments) { if (isJavadoc) return TokenNameCOMMENT_PHPDOC; @@ -1733,11 +1743,44 @@ public class Scanner implements IScanner, ITerminalSymbols { } return TokenNameEOF; } + + private int getInlinedHTML(int start) throws InvalidInputException { + int token = getInlinedHTMLToken(start); + if (token == TokenNameINLINE_HTML) { +// Stack stack = new Stack(); +// // scan html for errors +// Source inlinedHTMLSource = new Source(new String(source, startPosition, currentPosition - startPosition)); +// int lastPHPEndPos=0; +// for (Iterator i=inlinedHTMLSource.getNextTagIterator(0); i.hasNext();) { +// Tag tag=(Tag)i.next(); +// +// if (tag instanceof StartTag) { +// StartTag startTag=(StartTag)tag; +// // System.out.println("startTag: "+tag); +// if (startTag.isServerTag()) { +// // TODO : what to do with a server tag ? +// } else { +// // do whatever with HTML start tag +// // use startTag.getElement() to find the element corresponding +// // to this start tag which may be useful if you implement code +// // folding etc +// stack.push(startTag); +// } +// } else { +// EndTag endTag=(EndTag)tag; +// StartTag stag = (StartTag) stack.peek(); +//// System.out.println("endTag: "+tag); +// // do whatever with HTML end tag. +// } +// } + } + return token; + } /** * @return @throws * InvalidInputException */ - private int getInlinedHTML(int start) throws InvalidInputException { + private int getInlinedHTMLToken(int start) throws InvalidInputException { // int htmlPosition = start; if (currentPosition > source.length) { currentPosition = source.length; @@ -2558,26 +2601,48 @@ public class Scanner implements IScanner, ITerminalSymbols { } } } - public final void recordComment(boolean isJavadoc) { - // a new annotation comment is recorded - try { - commentStops[++commentPtr] = isJavadoc - ? currentPosition - : -currentPosition; - } catch (IndexOutOfBoundsException e) { - int oldStackLength = commentStops.length; - int[] oldStack = commentStops; - commentStops = new int[oldStackLength + 30]; - System.arraycopy(oldStack, 0, commentStops, 0, oldStackLength); - commentStops[commentPtr] = isJavadoc ? currentPosition : -currentPosition; - //grows the positions buffers too - int[] old = commentStarts; - commentStarts = new int[oldStackLength + 30]; - System.arraycopy(old, 0, commentStarts, 0, oldStackLength); - } - //the buffer is of a correct size here - commentStarts[commentPtr] = startPosition; - } + public void recordComment(int token) { + // compute position + int stopPosition = this.currentPosition; + switch (token) { + case TokenNameCOMMENT_LINE: + stopPosition = -this.lastCommentLinePosition; + break; + case TokenNameCOMMENT_BLOCK: + stopPosition = -this.currentPosition; + break; + } + + // a new comment is recorded + int length = this.commentStops.length; + if (++this.commentPtr >= length) { + System.arraycopy(this.commentStops, 0, this.commentStops = new int[length + 30], 0, length); + //grows the positions buffers too + System.arraycopy(this.commentStarts, 0, this.commentStarts = new int[length + 30], 0, length); + } + this.commentStops[this.commentPtr] = stopPosition; + this.commentStarts[this.commentPtr] = this.startPosition; +} +// public final void recordComment(boolean isJavadoc) { +// // a new annotation comment is recorded +// try { +// commentStops[++commentPtr] = isJavadoc +// ? currentPosition +// : -currentPosition; +// } catch (IndexOutOfBoundsException e) { +// int oldStackLength = commentStops.length; +// int[] oldStack = commentStops; +// commentStops = new int[oldStackLength + 30]; +// System.arraycopy(oldStack, 0, commentStops, 0, oldStackLength); +// commentStops[commentPtr] = isJavadoc ? currentPosition : -currentPosition; +// //grows the positions buffers too +// int[] old = commentStarts; +// commentStarts = new int[oldStackLength + 30]; +// System.arraycopy(old, 0, commentStarts, 0, oldStackLength); +// } +// //the buffer is of a correct size here +// commentStarts[commentPtr] = startPosition; +// } public void resetTo(int begin, int end) { //reset the scanner to a given position where it may rescan again diet = false; diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/util/Util.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/util/Util.java index 66208c0..8739ba6 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/util/Util.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/util/Util.java @@ -369,6 +369,7 @@ public class Util { } return true; } + /** * Returns true iff str.toLowerCase().endsWith(".java") * implementation is not creating extra strings. diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnit.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnit.java index 56c944e..e93d7c9 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnit.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnit.java @@ -17,6 +17,8 @@ import java.util.Map; import net.sourceforge.phpdt.core.IBuffer; import net.sourceforge.phpdt.core.IBufferFactory; import net.sourceforge.phpdt.core.ICompilationUnit; +import net.sourceforge.phpdt.core.IImportContainer; +import net.sourceforge.phpdt.core.IImportDeclaration; import net.sourceforge.phpdt.core.IJavaElement; import net.sourceforge.phpdt.core.IJavaModelStatusConstants; import net.sourceforge.phpdt.core.IJavaProject; @@ -24,7 +26,6 @@ import net.sourceforge.phpdt.core.IMember; import net.sourceforge.phpdt.core.IMethod; import net.sourceforge.phpdt.core.IOpenable; import net.sourceforge.phpdt.core.IPackageDeclaration; -import net.sourceforge.phpdt.core.IPackageFragment; import net.sourceforge.phpdt.core.IPackageFragmentRoot; import net.sourceforge.phpdt.core.IParent; import net.sourceforge.phpdt.core.IProblemRequestor; @@ -44,7 +45,7 @@ import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions; import net.sourceforge.phpdt.internal.compiler.problem.DefaultProblemFactory; import net.sourceforge.phpdt.internal.core.util.Util; import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration; - +import net.sourceforge.phpdt.core.*; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; @@ -52,20 +53,6 @@ import org.eclipse.core.resources.IResource; import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Path; -import net.sourceforge.phpdt.internal.core.JavaModelManager; -//import net.sourceforge.phpdt.core.dom.AST; -import net.sourceforge.phpdt.internal.core.ReconcileWorkingCopyOperation; - -import net.sourceforge.phpdt.internal.core.DiscardWorkingCopyOperation; - -import net.sourceforge.phpdt.internal.core.CompilationUnitElementInfo; -import net.sourceforge.phpdt.internal.core.JavaModelStatus; - -import net.sourceforge.phpdt.internal.core.BufferManager; -import net.sourceforge.phpdt.internal.core.DefaultWorkingCopyOwner; -import net.sourceforge.phpdt.internal.core.Openable; - -import net.sourceforge.phpdt.internal.core.PackageFragment; /** * @see ICompilationUnit @@ -564,15 +551,16 @@ protected char getHandleMementoDelimiter() { /** * @see ICompilationUnit#getImport(String) */ -//public IImportDeclaration getImport(String name) { -// return new ImportDeclaration(getImportContainer(), name); -//} -///** -// * @see ICompilationUnit#getImportContainer() -// */ -//public IImportContainer getImportContainer() { -// return new ImportContainer(this); -//} +public IImportDeclaration getImport(String importName) { + return new ImportDeclaration((ImportContainer)getImportContainer(), importName); +} + +/** + * @see ICompilationUnit#getImportContainer() + */ +public IImportContainer getImportContainer() { + return new ImportContainer(this); +} /** diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnitStructureRequestor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnitStructureRequestor.java index 7b672a1..cada744 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnitStructureRequestor.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/CompilationUnitStructureRequestor.java @@ -13,12 +13,7 @@ package net.sourceforge.phpdt.internal.core; import java.util.Map; import java.util.Stack; -import net.sourceforge.phpdt.internal.core.JavaElement; -import net.sourceforge.phpdt.internal.core.SourceField; -import net.sourceforge.phpdt.internal.core.SourceFieldElementInfo; -import net.sourceforge.phpdt.internal.core.SourceMethod; -import net.sourceforge.phpdt.internal.core.SourceTypeElementInfo; - +import net.sourceforge.phpdt.core.Flags; import net.sourceforge.phpdt.core.ICompilationUnit; import net.sourceforge.phpdt.core.IField; import net.sourceforge.phpdt.core.IJavaElement; @@ -530,30 +525,30 @@ public class CompilationUnitStructureRequestor extends ReferenceInfoAdapter impl public void exitConstructor(int declarationEnd) { exitMember(declarationEnd); } - ///** - // * @see ISourceElementRequestor - // */ - //public void exitField(int initializationStart, int declarationEnd, int declarationSourceEnd) { - // SourceFieldElementInfo info = (SourceFieldElementInfo) fInfoStack.pop(); - // info.setSourceRangeEnd(declarationSourceEnd); - // - // // remember initializer source if field is a constant - // if (initializationStart != -1) { - // int flags = info.flags; - // Object typeInfo; - // if (Flags.isStatic(flags) && Flags.isFinal(flags) - // || ((typeInfo = fInfoStack.peek()) instanceof SourceTypeElementInfo - // && (Flags.isInterface(((SourceTypeElementInfo)typeInfo).flags)))) { - // int length = declarationEnd - initializationStart; - // if (length > 0) { - // char[] initializer = new char[length]; - // System.arraycopy(this.parser.scanner.source, initializationStart, initializer, 0, length); - // info.initializationSource = initializer; - // } - // } - // } - // fHandleStack.pop(); - //} + /** + * @see ISourceElementRequestor + */ + public void exitField(int initializationStart, int declarationEnd, int declarationSourceEnd) { + SourceFieldElementInfo info = (SourceFieldElementInfo) fInfoStack.pop(); + info.setSourceRangeEnd(declarationSourceEnd); + + // remember initializer source if field is a constant + if (initializationStart != -1) { + int flags = info.flags; + Object typeInfo; + if (Flags.isStatic(flags) && Flags.isFinal(flags) + || ((typeInfo = fInfoStack.peek()) instanceof SourceTypeElementInfo + && (Flags.isInterface(((SourceTypeElementInfo)typeInfo).flags)))) { + int length = declarationEnd - initializationStart; + if (length > 0) { + char[] initializer = new char[length]; + System.arraycopy(this.parser.scanner.source, initializationStart, initializer, 0, length); + info.initializationSource = initializer; + } + } + } + fHandleStack.pop(); + } /** * @see ISourceElementRequestor */ diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/ImportContainer.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/ImportContainer.java new file mode 100644 index 0000000..bf8495a --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/ImportContainer.java @@ -0,0 +1,122 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package net.sourceforge.phpdt.internal.core; + +import net.sourceforge.phpdt.core.*; +import net.sourceforge.phpdt.core.IImportContainer; +import net.sourceforge.phpdt.core.IImportDeclaration; +import net.sourceforge.phpdt.core.IJavaElement; +import net.sourceforge.phpdt.core.ISourceRange; +import net.sourceforge.phpdt.core.ISourceReference; +import net.sourceforge.phpdt.core.JavaModelException; +//import net.sourceforge.phpdt.internal.core.util.MementoTokenizer; + +/** + * @see IImportContainer + */ +public class ImportContainer extends SourceRefElement implements IImportContainer { +protected ImportContainer(CompilationUnit parent) { + super(parent, ""); //$NON-NLS-1$ +} +public boolean equals(Object o) { + if (!(o instanceof ImportContainer)) return false; + return super.equals(o); +} +/** + * @see IJavaElement + */ +public int getElementType() { + return IMPORT_CONTAINER; +} +/* + * @see JavaElement + */ +//public IJavaElement getHandleFromMemento(String token, MementoTokenizer memento, WorkingCopyOwner workingCopyOwner) { +// switch (token.charAt(0)) { +// case JEM_COUNT: +// return getHandleUpdatingCountFromMemento(memento, workingCopyOwner); +// case JEM_IMPORTDECLARATION: +// if (memento.hasMoreTokens()) { +// String importName = memento.nextToken(); +// JavaElement importDecl = (JavaElement)getImport(importName); +// return importDecl.getHandleFromMemento(memento, workingCopyOwner); +// } else { +// return this; +// } +// } +// return null; +//} +/** + * @see JavaElement#getHandleMemento() + */ +protected char getHandleMementoDelimiter() { + return JavaElement.JEM_IMPORTDECLARATION; +} +/** + * @see IImportContainer + */ +public IImportDeclaration getImport(String importName) { + return new ImportDeclaration(this, importName); +} +/* + * @see JavaElement#getPrimaryElement(boolean) + */ +public IJavaElement getPrimaryElement(boolean checkOwner) { + CompilationUnit cu = (CompilationUnit)this.parent; + if (checkOwner && cu.isPrimary()) return this; + return cu.getImportContainer(); +} +/** + * @see ISourceReference + */ +public ISourceRange getSourceRange() throws JavaModelException { + IJavaElement[] imports= getChildren(); + ISourceRange firstRange= ((ISourceReference)imports[0]).getSourceRange(); + ISourceRange lastRange= ((ISourceReference)imports[imports.length - 1]).getSourceRange(); + SourceRange range= new SourceRange(firstRange.getOffset(), lastRange.getOffset() + lastRange.getLength() - firstRange.getOffset()); + return range; +} +/** + * Import containers only exist if they have children. + * @see IParent + */ +public boolean hasChildren() { + return true; +} +/** + */ +public String readableName() { + + return null; +} +/** + * @private Debugging purposes + */ +protected void toString(int tab, StringBuffer buffer) { + Object info = JavaModelManager.getJavaModelManager().peekAtInfo(this); + if (info == null || !(info instanceof JavaElementInfo)) return; + IJavaElement[] children = ((JavaElementInfo)info).getChildren(); + for (int i = 0; i < children.length; i++) { + if (i > 0) buffer.append("\n"); //$NON-NLS-1$ + ((JavaElement)children[i]).toString(tab, buffer); + } +} +/** + * Debugging purposes + */ +protected void toStringInfo(int tab, StringBuffer buffer, Object info) { + buffer.append(this.tabString(tab)); + buffer.append(""); //$NON-NLS-1$ + if (info == null) { + buffer.append(" (not open)"); //$NON-NLS-1$ + } +} +} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/ImportDeclaration.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/ImportDeclaration.java new file mode 100644 index 0000000..0f3ad98 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/ImportDeclaration.java @@ -0,0 +1,110 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package net.sourceforge.phpdt.internal.core; + +import net.sourceforge.phpdt.core.*; +import net.sourceforge.phpdt.core.IImportDeclaration; +import net.sourceforge.phpdt.core.JavaModelException; +import net.sourceforge.phpdt.core.jdom.*; + +/** + * Handle for an import declaration. Info object is a ImportDeclarationElementInfo. + * @see IImportDeclaration + */ + +/* package */ class ImportDeclaration extends SourceRefElement implements IImportDeclaration { + + +/** + * Constructs an ImportDeclaration in the given import container + * with the given name. + */ +protected ImportDeclaration(ImportContainer parent, String name) { + super(parent, name); +} +public boolean equals(Object o) { + if (!(o instanceof ImportDeclaration)) return false; + return super.equals(o); +} +/** + * @see JavaElement#equalsDOMNode + * @deprecated JDOM is obsolete + */ +// TODO - JDOM - remove once model ported off of JDOM +protected boolean equalsDOMNode(IDOMNode node) { + return (node.getNodeType() == IDOMNode.IMPORT) && getElementName().equals(node.getName()); +} +/** + * @see IJavaElement + */ +public int getElementType() { + return IMPORT_DECLARATION; +} +/** + * @see org.eclipse.jdt.core.IImportDeclaration#getFlags() + */ +public int getFlags() throws JavaModelException { + ImportDeclarationElementInfo info = (ImportDeclarationElementInfo)getElementInfo(); + return info.getModifiers(); +} +/** + * @see JavaElement#getHandleMemento() + * For import declarations, the handle delimiter is associated to the import container already + */ +//public String getHandleMemento(){ +// StringBuffer buff= new StringBuffer(((JavaElement)getParent()).getHandleMemento()); +// escapeMementoName(buff, getElementName()); +// if (this.occurrenceCount > 1) { +// buff.append(JEM_COUNT); +// buff.append(this.occurrenceCount); +// } +// return buff.toString(); +//} +/** + * @see JavaElement#getHandleMemento() + */ +protected char getHandleMementoDelimiter() { + // For import declarations, the handle delimiter is associated to the import container already + Assert.isTrue(false, "Should not be called"); //$NON-NLS-1$ + return 0; +} +/* + * @see JavaElement#getPrimaryElement(boolean) + */ +public IJavaElement getPrimaryElement(boolean checkOwner) { + CompilationUnit cu = (CompilationUnit)this.parent.getParent(); + if (checkOwner && cu.isPrimary()) return this; + return cu.getImport(this.name); +} +/** + * Returns true if the import is on-demand (ends with ".*") + */ +public boolean isOnDemand() { + return this.name.endsWith(".*"); //$NON-NLS-1$ +} +/** + */ +public String readableName() { + + return null; +} +/** + * @private Debugging purposes + */ +protected void toStringInfo(int tab, StringBuffer buffer, Object info) { + buffer.append(this.tabString(tab)); + buffer.append("import "); //$NON-NLS-1$ + toStringName(buffer); + if (info == null) { + buffer.append(" (not open)"); //$NON-NLS-1$ + } +} +} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/ImportDeclarationElementInfo.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/ImportDeclarationElementInfo.java new file mode 100644 index 0000000..9a5911d --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/ImportDeclarationElementInfo.java @@ -0,0 +1,34 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package net.sourceforge.phpdt.internal.core; + +import net.sourceforge.phpdt.internal.compiler.env.ISourceImport; + +/** + * Element info for IImportDeclaration elements. + * @see org.eclipse.jdt.core.IImportDeclaration + */ +public class ImportDeclarationElementInfo extends MemberElementInfo implements ISourceImport{ + + // record if import is on demand, the import name doesn't have trailing start + boolean onDemand; + + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.compiler.env.ISourceImport#onDemand() + */ + public boolean onDemand() { + return this.onDemand; + } + + public void setOnDemand(boolean onDemand) { + this.onDemand = onDemand; + } +} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/JavaElement.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/JavaElement.java index b4428cf..afda75c 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/JavaElement.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/JavaElement.java @@ -704,6 +704,16 @@ public abstract class JavaElement extends PlatformObject return buffer.toString(); } /** + * Debugging purposes + */ + protected void toStringName(StringBuffer buffer) { + buffer.append(getElementName()); + if (this.occurrenceCount > 1) { + buffer.append("#"); //$NON-NLS-1$ + buffer.append(this.occurrenceCount); + } + } + /** * Debugging purposes */ protected void toString(int tab, StringBuffer buffer) { diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/JavaModelManager.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/JavaModelManager.java index 16347d2..e87fef2 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/JavaModelManager.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/JavaModelManager.java @@ -310,8 +310,8 @@ public class JavaModelManager implements ISaveParticipant { if (file.getFileExtension() != null) { String name = file.getName(); -// if (Util.isValidCompilationUnitName(name)) - if (PHPFileUtil.isPHPFile(file)) + if (PHPFileUtil.isValidPHPUnitName(name)) + //if (PHPFileUtil.isPHPFile(file)) return createCompilationUnitFrom(file, project); // if (Util.isValidClassFileName(name)) // return createClassFileFrom(file, project); @@ -629,18 +629,17 @@ public class JavaModelManager implements ISaveParticipant { * @see org.eclipse.core.runtime.Preferences.IPropertyChangeListener#propertyChange(PropertyChangeEvent) */ public void propertyChange(Preferences.PropertyChangeEvent event) { - - String propertyName = event.getProperty(); - if (propertyName.startsWith(CP_VARIABLE_PREFERENCES_PREFIX)) { - String varName = propertyName.substring(CP_VARIABLE_PREFERENCES_PREFIX.length()); - String newValue = (String)event.getNewValue(); - if (newValue != null && !(newValue = newValue.trim()).equals(CP_ENTRY_IGNORE)) { - Variables.put(varName, new Path(newValue)); - } else { - Variables.remove(varName); - } - } -// TODO jsurfer temp-del +// TODO : jsurfer temp-del +// String propertyName = event.getProperty(); +// if (propertyName.startsWith(CP_VARIABLE_PREFERENCES_PREFIX)) { +// String varName = propertyName.substring(CP_VARIABLE_PREFERENCES_PREFIX.length()); +// String newValue = (String)event.getNewValue(); +// if (newValue != null && !(newValue = newValue.trim()).equals(CP_ENTRY_IGNORE)) { +// Variables.put(varName, new Path(newValue)); +// } else { +// Variables.remove(varName); +// } +// } // if (propertyName.startsWith(CP_CONTAINER_PREFERENCES_PREFIX)) { // recreatePersistedContainer(propertyName, (String)event.getNewValue(), false); // } diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/PackageFragment.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/PackageFragment.java index ea8f6b4..760e09e 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/PackageFragment.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/PackageFragment.java @@ -236,7 +236,7 @@ protected Object createElementInfo() { * @exception IllegalArgumentExcpetion if the name does not end with ".java" */ public ICompilationUnit getCompilationUnit(String cuName) { - if (! PHPFileUtil.isPHPFileName(cuName)) { + if (! PHPFileUtil.isValidPHPUnitName(cuName)) { throw new IllegalArgumentException(Util.bind("convention.unit.notJavaName")); //$NON-NLS-1$ } return new CompilationUnit(this, cuName, DefaultWorkingCopyOwner.PRIMARY); diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/SourceField.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/SourceField.java index 60e88ae..b8ea749 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/SourceField.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/SourceField.java @@ -14,7 +14,6 @@ import net.sourceforge.phpdt.core.IJavaElement; import net.sourceforge.phpdt.internal.core.JavaElement; import net.sourceforge.phpdt.core.IField; -import net.sourceforge.phpdt.core.IType; import net.sourceforge.phpdt.core.JavaModelException; import net.sourceforge.phpdt.core.Signature; import net.sourceforge.phpdt.core.jdom.IDOMNode; @@ -64,8 +63,9 @@ protected char getHandleMementoDelimiter() { * @see IField */ public String getTypeSignature() throws JavaModelException { - SourceFieldElementInfo info = (SourceFieldElementInfo) getElementInfo(); - return info.getTypeSignature(); +// SourceFieldElementInfo info = (SourceFieldElementInfo) getElementInfo(); +// return info.getTypeSignature(); + return ""; } /** * @private Debugging purposes diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/SourceRefElement.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/SourceRefElement.java index b8dd333..e359e6b 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/SourceRefElement.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/SourceRefElement.java @@ -145,7 +145,14 @@ public String getSource() throws JavaModelException { if (offset == -1 || length == 0 ) { return null; } - return buffer.getText(offset, length); + try { + return buffer.getText(offset, length); + // jsurfer insert start + } catch (ArrayIndexOutOfBoundsException e) { + + } + return null; +// jsurfer insert end } /** * @see ISourceReference diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/builder/PHPBuilder.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/builder/PHPBuilder.java index d6ce598..36dadc0 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/builder/PHPBuilder.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/builder/PHPBuilder.java @@ -31,7 +31,7 @@ import net.sourceforge.phpdt.internal.ui.util.PHPFileUtil; import net.sourceforge.phpeclipse.PHPeclipsePlugin; import net.sourceforge.phpeclipse.builder.IdentifierIndexManager; import net.sourceforge.phpeclipse.phpeditor.PHPParserAction; -import net.sourceforge.phpeclipse.resourcesview.PHPProject; +//import net.sourceforge.phpeclipse.resourcesview.PHPProject; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IMarker; import org.eclipse.core.resources.IProject; diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/util/CommentRecorderParser.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/util/CommentRecorderParser.java new file mode 100644 index 0000000..d0cf93d --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/util/CommentRecorderParser.java @@ -0,0 +1,264 @@ +/******************************************************************************* + * Copyright (c) 2000, 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package net.sourceforge.phpdt.internal.core.util; + +import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions; +import net.sourceforge.phpdt.internal.compiler.parser.UnitParser; +import net.sourceforge.phpdt.internal.compiler.problem.ProblemReporter; +import net.sourceforge.phpdt.internal.compiler.problem.ProblemSeverities; +import net.sourceforge.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration; + +/** + * Internal parser used for parsing source to create DOM AST nodes. + * + * @since 3.0 + */ +public class CommentRecorderParser extends UnitParser { + + // support for comments + int[] commentStops = new int[10]; + int[] commentStarts = new int[10]; + int commentPtr = -1; // no comment test with commentPtr value -1 + protected final static int CommentIncrement = 100; + + /** + * @param problemReporter + * @param optimizeStringLiterals + */ + public CommentRecorderParser(ProblemReporter problemReporter) { // , boolean optimizeStringLiterals) { + super(problemReporter); //, optimizeStringLiterals); + } + + // old javadoc style check which doesn't include all leading comments into declaration + // for backward compatibility with 2.1 DOM +// public void checkComment() { +// +// if (this.currentElement != null && this.scanner.commentPtr >= 0) { +// flushCommentsDefinedPriorTo(this.endStatementPosition); // discard obsolete comments +// } +// boolean deprecated = false; +// boolean checkDeprecated = false; +// int lastCommentIndex = -1; +// +// // +// +// //since jdk1.2 look only in the last java doc comment... +// nextComment : for (lastCommentIndex = this.scanner.commentPtr; lastCommentIndex >= 0; lastCommentIndex--){ +// //look for @deprecated into the first javadoc comment preceeding the declaration +// int commentSourceStart = this.scanner.commentStarts[lastCommentIndex]; +// // javadoc only (non javadoc comment have negative end positions.) +// if ((commentSourceStart < 0) || +// (this.modifiersSourceStart != -1 && this.modifiersSourceStart < commentSourceStart) || +// (this.scanner.commentStops[lastCommentIndex] < 0)) +// { +// continue nextComment; +// } +// checkDeprecated = true; +// int commentSourceEnd = this.scanner.commentStops[lastCommentIndex] - 1; //stop is one over +// +// deprecated = this.javadocParser.checkDeprecation(commentSourceStart, commentSourceEnd); +// this.javadoc = this.javadocParser.docComment; +// break nextComment; +// } +// if (deprecated) { +// checkAndSetModifiers(AccDeprecated); +// } +// // modify the modifier source start to point at the first comment +// if (lastCommentIndex >= 0 && checkDeprecated) { +// this.modifiersSourceStart = this.scanner.commentStarts[lastCommentIndex]; +// if (this.modifiersSourceStart < 0) { +// this.modifiersSourceStart = -this.modifiersSourceStart; +// } +// } +// +// } + +// /* (non-Javadoc) +// * @see org.eclipse.jdt.internal.compiler.parser.Parser#consumeClassHeader() +// */ +// protected void consumeClassHeader() { +// pushOnCommentsStack(0, this.scanner.commentPtr); +// super.consumeClassHeader(); +// } +// /* (non-Javadoc) +// * @see org.eclipse.jdt.internal.compiler.parser.Parser#consumeEmptyClassMemberDeclaration() +// */ +// protected void consumeEmptyClassMemberDeclaration() { +// pushOnCommentsStack(0, this.scanner.commentPtr); +// super.consumeEmptyClassMemberDeclaration(); +// } +// /* (non-Javadoc) +// * @see org.eclipse.jdt.internal.compiler.parser.Parser#consumeEmptyTypeDeclaration() +// */ +// protected void consumeEmptyTypeDeclaration() { +// pushOnCommentsStack(0, this.scanner.commentPtr); +// super.consumeEmptyTypeDeclaration(); +// } +// /* (non-Javadoc) +// * @see org.eclipse.jdt.internal.compiler.parser.Parser#consumeInterfaceHeader() +// */ +// protected void consumeInterfaceHeader() { +// pushOnCommentsStack(0, this.scanner.commentPtr); +// super.consumeInterfaceHeader(); +// } + + /** + * Insure that start position is always positive. + * @see org.eclipse.jdt.internal.compiler.parser.Parser#containsComment(int, int) + */ + public boolean containsComment(int sourceStart, int sourceEnd) { + int iComment = this.scanner.commentPtr; + for (; iComment >= 0; iComment--) { + int commentStart = this.scanner.commentStarts[iComment]; + if (commentStart < 0) { + commentStart = -commentStart; + } + // ignore comments before start + if (commentStart < sourceStart) continue; + // ignore comments after end + if (commentStart > sourceEnd) continue; + return true; + } + return false; + } + + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.compiler.parser.Parser#endParse(int) + */ + protected CompilationUnitDeclaration endParse(int act) { + CompilationUnitDeclaration unit = super.endParse(act); + if (unit.comments == null) { + pushOnCommentsStack(0, this.scanner.commentPtr); + unit.comments = getCommentsPositions(); + } + return unit; + } + + /* (non-Javadoc) + * Save all source comments currently stored before flushing them. + * @see org.eclipse.jdt.internal.compiler.parser.Parser#flushCommentsDefinedPriorTo(int) + */ + public int flushCommentsDefinedPriorTo(int position) { + + int lastCommentIndex = this.scanner.commentPtr; + if (lastCommentIndex < 0) return position; // no comment + + // compute the index of the first obsolete comment + int index = lastCommentIndex; + int validCount = 0; + while (index >= 0){ + int commentEnd = this.scanner.commentStops[index]; + if (commentEnd < 0) commentEnd = -commentEnd; // negative end position for non-javadoc comments + if (commentEnd <= position){ + break; + } + index--; + validCount++; + } + // if the source at is immediately followed by a line comment, then + // flush this comment and shift to the comment end. + if (validCount > 0){ + int immediateCommentEnd = 0; + while (index 0){ // only tolerating non-javadoc comments (non-javadoc comment end positions are negative) + // is there any line break until the end of the immediate comment ? (thus only tolerating line comment) + immediateCommentEnd--; // comment end in one char too far + if (this.scanner.getLineNumber(position) != this.scanner.getLineNumber(immediateCommentEnd)) break; + position = immediateCommentEnd; + validCount--; // flush this comment + index++; + } + } + + if (index < 0) return position; // no obsolete comment + pushOnCommentsStack(0, index); // store comment before flushing them + + if (validCount > 0){ // move valid comment infos, overriding obsolete comment infos + System.arraycopy(this.scanner.commentStarts, index + 1, this.scanner.commentStarts, 0, validCount); + System.arraycopy(this.scanner.commentStops, index + 1, this.scanner.commentStops, 0, validCount); + } + this.scanner.commentPtr = validCount - 1; + return position; + } + + /* + * Build a n*2 matrix of comments positions. + * For each position, 0 is for start position and 1 for end position of the comment. + */ + public int[][] getCommentsPositions() { + int[][] positions = new int[this.commentPtr+1][2]; + for (int i = 0, max = this.commentPtr; i <= max; i++){ + positions[i][0] = this.commentStarts[i]; + positions[i][1] = this.commentStops[i]; + } + return positions; + } + + /* (non-Javadoc) + * @see org.eclipse.jdt.internal.compiler.parser.Parser#initialize() + */ + public void initialize(boolean phpMode) { + super.initialize(phpMode); + this.commentPtr = -1; + } + + /* (non-Javadoc) + * Create and store a specific comment recorder scanner. + * @see org.eclipse.jdt.internal.compiler.parser.Parser#initializeScanner() + */ + public void initializeScanner() { + this.scanner = new CommentRecorderScanner( + false /*comment*/, + false /*whitespace*/, + this.options.getSeverity(CompilerOptions.NonExternalizedString) != ProblemSeverities.Ignore /*nls*/, +// this.options.sourceLevel /*sourceLevel*/, + this.options.taskTags/*taskTags*/, + this.options.taskPriorites);/*taskPriorities*/ +// this.options.isTaskCaseSensitive/*taskCaseSensitive*/); + } + + /* + * Push all stored comments in stack. + */ + private void pushOnCommentsStack(int start, int end) { + + for (int i=start; i<=end; i++) { + // First see if comment hasn't been already stored + int scannerStart = this.scanner.commentStarts[i]<0 ? -this.scanner.commentStarts[i] : this.scanner.commentStarts[i]; + int commentStart = this.commentPtr == -1 ? -1 : (this.commentStarts[this.commentPtr]<0 ? -this.commentStarts[this.commentPtr] : this.commentStarts[this.commentPtr]); + if (commentStart == -1 || scannerStart > commentStart) { + try { + this.commentPtr++; + this.commentStarts[this.commentPtr] = this.scanner.commentStarts[i]; + this.commentStops[this.commentPtr] = this.scanner.commentStops[i]; + } catch (IndexOutOfBoundsException e) { + // this.commentPtr is still correct + int oldStackLength = this.commentStarts.length; + int oldCommentStarts[] = this.commentStarts; + this.commentStarts = new int[oldStackLength + CommentIncrement]; + System.arraycopy(oldCommentStarts, 0, this.commentStarts, 0, oldStackLength); + this.commentStarts[this.commentPtr] = this.scanner.commentStarts[i]; + int oldCommentStops[] = this.commentStops; + this.commentStops = new int[oldStackLength + CommentIncrement]; + System.arraycopy(oldCommentStops, 0, this.commentStops, 0, oldStackLength); + this.commentStops[this.commentPtr] = this.scanner.commentStops[i]; + } + } + } + } + /* (non-Javadoc) + * Save all source comments currently stored before flushing them. + * @see org.eclipse.jdt.internal.compiler.parser.Parser#resetModifiers() + */ + protected void resetModifiers() { + pushOnCommentsStack(0, this.scanner.commentPtr); + super.resetModifiers(); + } +} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/util/CommentRecorderScanner.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/util/CommentRecorderScanner.java new file mode 100644 index 0000000..7f74c39 --- /dev/null +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/core/util/CommentRecorderScanner.java @@ -0,0 +1,50 @@ +/******************************************************************************* + * Copyright (c) 2004 IBM Corporation and others. + * All rights reserved. This program and the accompanying materials + * 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package net.sourceforge.phpdt.internal.core.util; + +import net.sourceforge.phpdt.internal.compiler.parser.Scanner; + +/** + * Internal scanner used for DOM AST nodes. + * + * @since 3.0 + */ +public class CommentRecorderScanner extends Scanner { + + public CommentRecorderScanner( + boolean tokenizeComments, + boolean tokenizeWhiteSpace, + boolean checkNonExternalizedStringLiterals, +// long sourceLevel, + char[][] taskTags, + char[][] taskPriorities) { +// boolean isTaskCaseSensitive) { +// super(tokenizeComments, tokenizeWhiteSpace, +// checkNonExternalizedStringLiterals, +// sourceLevel, +// taskTags, taskPriorities, isTaskCaseSensitive); + super(tokenizeComments, tokenizeWhiteSpace, + checkNonExternalizedStringLiterals, false, false, + taskTags, taskPriorities); + } + + /** + * Set start position negative for line comments. + * @see org.eclipse.jdt.internal.compiler.parser.Scanner#recordComment(int) + */ + public void recordComment(int token) { + super.recordComment(token); + if (token == TokenNameCOMMENT_LINE) { + // for comment line both positions are negative + this.commentStarts[this.commentPtr] = -this.commentStarts[this.commentPtr]; + } + } +} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/JavaEditorHoverConfigurationBlock.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/JavaEditorHoverConfigurationBlock.java index d3a5b50..d5b0fb5 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/JavaEditorHoverConfigurationBlock.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/preferences/JavaEditorHoverConfigurationBlock.java @@ -72,7 +72,7 @@ class JavaEditorHoverConfigurationBlock { private Button fEnableField; private List fHoverList; private Text fDescription; -// private Button fShowHoverAffordanceCheckbox; + private Button fShowHoverAffordanceCheckbox; private JavaEditorPreferencePage fMainPreferencePage; @@ -221,12 +221,12 @@ class JavaEditorHoverConfigurationBlock { filler.setLayoutData(gd); // Affordance checkbox -// fShowHoverAffordanceCheckbox= new Button(hoverComposite, SWT.CHECK); -// fShowHoverAffordanceCheckbox.setText(PreferencesMessages.getString("JavaEditorHoverConfigurationBlock.showAffordance")); //$NON-NLS-1$ -// gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); -// gd.horizontalIndent= 0; -// gd.horizontalSpan= 2; -// fShowHoverAffordanceCheckbox.setLayoutData(gd); + fShowHoverAffordanceCheckbox= new Button(hoverComposite, SWT.CHECK); + fShowHoverAffordanceCheckbox.setText(PreferencesMessages.getString("JavaEditorHoverConfigurationBlock.showAffordance")); //$NON-NLS-1$ + gd= new GridData(GridData.HORIZONTAL_ALIGN_BEGINNING); + gd.horizontalIndent= 0; + gd.horizontalSpan= 2; + fShowHoverAffordanceCheckbox.setLayoutData(gd); initialize(); @@ -257,7 +257,7 @@ class JavaEditorHoverConfigurationBlock { } } }); -// fShowHoverAffordanceCheckbox.setSelection(fStore.getBoolean(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE)); + fShowHoverAffordanceCheckbox.setSelection(fStore.getBoolean(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE)); } void performOk() { @@ -282,7 +282,7 @@ class JavaEditorHoverConfigurationBlock { fStore.setValue(PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIERS, buf.toString()); fStore.setValue(PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIER_MASKS, maskBuf.toString()); -// fStore.setValue(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE, fShowHoverAffordanceCheckbox.getSelection()); + fStore.setValue(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE, fShowHoverAffordanceCheckbox.getSelection()); PHPeclipsePlugin.getDefault().resetJavaEditorTextHoverDescriptors(); } @@ -294,7 +294,7 @@ class JavaEditorHoverConfigurationBlock { private void restoreFromPreferences() { -// fShowHoverAffordanceCheckbox.setSelection(fStore.getBoolean(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE)); + fShowHoverAffordanceCheckbox.setSelection(fStore.getBoolean(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE)); String compiledTextHoverModifiers= fStore.getString(PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIERS); diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/folding/DefaultJavaFoldingPreferenceBlock.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/folding/DefaultJavaFoldingPreferenceBlock.java index 84b49a7..7613683 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/folding/DefaultJavaFoldingPreferenceBlock.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/folding/DefaultJavaFoldingPreferenceBlock.java @@ -64,9 +64,9 @@ public class DefaultJavaFoldingPreferenceBlock implements IJavaFoldingPreference ArrayList overlayKeys= new ArrayList(); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_JAVADOC)); - overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_INNERTYPES)); +// overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_INNERTYPES)); overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_METHODS)); - overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_IMPORTS)); +// overlayKeys.add(new OverlayPreferenceStore.OverlayKey(OverlayPreferenceStore.BOOLEAN, PreferenceConstants.EDITOR_FOLDING_IMPORTS)); return (OverlayKey[]) overlayKeys.toArray(new OverlayKey[overlayKeys.size()]); } @@ -88,9 +88,9 @@ public class DefaultJavaFoldingPreferenceBlock implements IJavaFoldingPreference label.setText(FoldingMessages.getString("DefaultJavaFoldingPreferenceBlock.title")); //$NON-NLS-1$ addCheckBox(inner, FoldingMessages.getString("DefaultJavaFoldingPreferenceBlock.comments"), PreferenceConstants.EDITOR_FOLDING_JAVADOC, 0); //$NON-NLS-1$ - addCheckBox(inner, FoldingMessages.getString("DefaultJavaFoldingPreferenceBlock.innerTypes"), PreferenceConstants.EDITOR_FOLDING_INNERTYPES, 0); //$NON-NLS-1$ +// addCheckBox(inner, FoldingMessages.getString("DefaultJavaFoldingPreferenceBlock.innerTypes"), PreferenceConstants.EDITOR_FOLDING_INNERTYPES, 0); //$NON-NLS-1$ addCheckBox(inner, FoldingMessages.getString("DefaultJavaFoldingPreferenceBlock.methods"), PreferenceConstants.EDITOR_FOLDING_METHODS, 0); //$NON-NLS-1$ - addCheckBox(inner, FoldingMessages.getString("DefaultJavaFoldingPreferenceBlock.imports"), PreferenceConstants.EDITOR_FOLDING_IMPORTS, 0); //$NON-NLS-1$ +// addCheckBox(inner, FoldingMessages.getString("DefaultJavaFoldingPreferenceBlock.imports"), PreferenceConstants.EDITOR_FOLDING_IMPORTS, 0); //$NON-NLS-1$ return inner; } diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/folding/DefaultJavaFoldingStructureProvider.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/folding/DefaultJavaFoldingStructureProvider.java index 6011085..4d81074 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/folding/DefaultJavaFoldingStructureProvider.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/folding/DefaultJavaFoldingStructureProvider.java @@ -316,8 +316,9 @@ public class DefaultJavaFoldingStructureProvider implements IProjectionListener, if (contents == null) return null; - IScanner scanner= ToolFactory.createScanner(true, false, false);//, false); + IScanner scanner= ToolFactory.createScanner(true/*tokenizeComments*/, false, false, true /* phpMode */ ); scanner.setSource(contents.toCharArray()); + List regions= new ArrayList(); int shift= range.getOffset(); int start= shift; diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/hover/AbstractJavaEditorTextHover.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/hover/AbstractJavaEditorTextHover.java index 565a8ab..1103c43 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/hover/AbstractJavaEditorTextHover.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/hover/AbstractJavaEditorTextHover.java @@ -11,13 +11,29 @@ package net.sourceforge.phpdt.internal.ui.text.java.hover; +import java.util.List; + import net.sourceforge.phpdt.core.IJavaElement; +import net.sourceforge.phpdt.internal.ui.text.HTMLTextPresenter; import net.sourceforge.phpdt.internal.ui.text.JavaWordFinder; +import net.sourceforge.phpdt.ui.PreferenceConstants; +import net.sourceforge.phpdt.ui.actions.PHPEditorActionDefinitionIds; import net.sourceforge.phpdt.ui.text.java.hover.IJavaEditorTextHover; +import net.sourceforge.phpeclipse.PHPeclipsePlugin; +import org.eclipse.jface.text.DefaultInformationControl; +import org.eclipse.jface.text.IInformationControl; +import org.eclipse.jface.text.IInformationControlCreator; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.ITextViewer; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Shell; import org.eclipse.ui.IEditorPart; +import org.eclipse.ui.PlatformUI; +import org.eclipse.ui.commands.ICommand; +import org.eclipse.ui.commands.ICommandManager; +import org.eclipse.ui.commands.IKeySequenceBinding; +import org.eclipse.ui.keys.KeySequence; /** * Abstract class for providing hover information for Java elements. @@ -28,7 +44,13 @@ public abstract class AbstractJavaEditorTextHover implements IJavaEditorTextHove private IEditorPart fEditor; - + private ICommand fCommand; + { + ICommandManager commandManager= PlatformUI.getWorkbench().getCommandSupport().getCommandManager(); + fCommand= commandManager.getCommand(PHPEditorActionDefinitionIds.SHOW_JAVADOC); + if (!fCommand.isDefined()) + fCommand= null; + } /* * @see IJavaEditorTextHover#setEditor(IEditorPart) @@ -102,4 +124,55 @@ public abstract class AbstractJavaEditorTextHover implements IJavaEditorTextHove protected String getHoverInfo(IJavaElement[] javaElements) { return null; } + /* + * @see ITextHoverExtension#getHoverControlCreator() + * @since 3.0 + */ + public IInformationControlCreator getHoverControlCreator() { + return new IInformationControlCreator() { + public IInformationControl createInformationControl(Shell parent) { + return new DefaultInformationControl(parent, SWT.NONE, new HTMLTextPresenter(true), getTooltipAffordanceString()); + } + }; + } + + /** + * Returns the tool tip affordance string. + * + * @return the affordance string or null if disabled or no key binding is defined + * @since 3.0 + */ + protected String getTooltipAffordanceString() { + if (!PHPeclipsePlugin.getDefault().getPreferenceStore().getBoolean(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE)) + return null; + + KeySequence[] sequences= getKeySequences(); + if (sequences == null) + return null; + + String keySequence= sequences[0].format(); + return JavaHoverMessages.getFormattedString("JavaTextHover.makeStickyHint", keySequence); //$NON-NLS-1$ + } + + /** + * Returns the array of valid key sequence bindings for the + * show tool tip description command. + * + * @return the array with the {@link KeySequence}s + * + * @since 3.0 + */ + private KeySequence[] getKeySequences() { + if (fCommand != null) { + List list= fCommand.getKeySequenceBindings(); + if (!list.isEmpty()) { + KeySequence[] keySequences= new KeySequence[list.size()]; + for (int i= 0; i < keySequences.length; i++) { + keySequences[i]= ((IKeySequenceBinding) list.get(i)).getKeySequence(); + } + return keySequences; + } + } + return null; + } } diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/hover/JavaHoverMessages.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/hover/JavaHoverMessages.java index 711f49d..238785d 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/hover/JavaHoverMessages.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/text/java/hover/JavaHoverMessages.java @@ -10,6 +10,7 @@ *******************************************************************************/ package net.sourceforge.phpdt.internal.ui.text.java.hover; +import java.text.MessageFormat; import java.util.MissingResourceException; import java.util.ResourceBundle; @@ -29,4 +30,56 @@ class JavaHoverMessages { return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ } } + /** + * Gets a string from the resource bundle and formats it with the argument + * + * @param key the string used to get the bundle value, must not be null + * @since 3.0 + */ + public static String getFormattedString(String key, Object arg) { + String format= null; + try { + format= fgResourceBundle.getString(key); + } catch (MissingResourceException e) { + return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ + } + if (arg == null) + arg= ""; //$NON-NLS-1$ + return MessageFormat.format(format, new Object[] { arg }); + } + /** + * Gets a string from the resource bundle and formats it with the arguments + * + * @param key the string used to get the bundle value, must not be null + * @since 3.0 + */ + public static String getFormattedString(String key, Object arg1, Object arg2) { + String format= null; + try { + format= fgResourceBundle.getString(key); + } catch (MissingResourceException e) { + return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ + } + if (arg1 == null) + arg1= ""; //$NON-NLS-1$ + if (arg2 == null) + arg2= ""; //$NON-NLS-1$ + return MessageFormat.format(format, new Object[] { arg1, arg2 }); + } + + /** + * Gets a string from the resource bundle and formats it with the argument + * + * @param key the string used to get the bundle value, must not be null + * @since 3.0 + */ + public static String getFormattedString(String key, boolean arg) { + String format= null; + try { + format= fgResourceBundle.getString(key); + } catch (MissingResourceException e) { + return "!" + key + "!";//$NON-NLS-2$ //$NON-NLS-1$ + } + return MessageFormat.format(format, new Object[] { new Boolean(arg) }); + } } diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/util/PHPFileUtil.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/util/PHPFileUtil.java index 1f8c8fe..dd4a36f 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/util/PHPFileUtil.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/ui/util/PHPFileUtil.java @@ -19,6 +19,10 @@ public class PHPFileUtil { public final static char[] SUFFIX_PHP4 = ".PHP4".toCharArray(); //$NON-NLS-1$ public final static char[] SUFFIX_inc = ".inc".toCharArray(); //$NON-NLS-1$ public final static char[] SUFFIX_INC = ".INC".toCharArray(); //$NON-NLS-1$ + public final static char[] SUFFIX_html = ".html".toCharArray(); //$NON-NLS-1$ + public final static char[] SUFFIX_HTML = ".HTML".toCharArray(); //$NON-NLS-1$ + public final static char[] SUFFIX_tpl = ".tpl".toCharArray(); //$NON-NLS-1$ + public final static char[] SUFFIX_TPL = ".TPL".toCharArray(); //$NON-NLS-1$ public static boolean isPHPFile(IFile file) { String extension = file.getFileExtension(); @@ -113,4 +117,49 @@ public class PHPFileUtil { } return true; } + + /** + * Returns true iff str.toLowerCase().endsWith(".html") + * implementation is not creating extra strings. + */ + public final static boolean isHTML_FileName(String name) { + int nameLength = name == null ? 0 : name.length(); + int suffixLength = SUFFIX_HTML.length; + if (nameLength < suffixLength) + return false; + + for (int i = 0, offset = nameLength - suffixLength; i < suffixLength; i++) { + char c = name.charAt(offset + i); + if (c != SUFFIX_html[i] && c != SUFFIX_HTML[i]) + return false; + } + return true; + } + /** + * Returns true iff str.toLowerCase().endsWith(".tpl") + * implementation is not creating extra strings. + */ + public final static boolean isTPL_FileName(String name) { + int nameLength = name == null ? 0 : name.length(); + int suffixLength = SUFFIX_TPL.length; + if (nameLength < suffixLength) + return false; + + for (int i = 0, offset = nameLength - suffixLength; i < suffixLength; i++) { + char c = name.charAt(offset + i); + if (c != SUFFIX_tpl[i] && c != SUFFIX_TPL[i]) + return false; + } + return true; + } + + /** + * Returns true iff str.toLowerCase().endsWith(".java") + * implementation is not creating extra strings. + */ + public final static boolean isValidPHPUnitName(String name) { + return PHPFileUtil.isPHPFileName(name) || + PHPFileUtil.isHTML_FileName(name) || + PHPFileUtil.isTPL_FileName(name); + } } diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java index 1f35059..1df600e 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/PreferenceConstants.java @@ -14,6 +14,7 @@ import net.sourceforge.phpdt.core.IClasspathEntry; import net.sourceforge.phpeclipse.IPreferenceConstants; import net.sourceforge.phpeclipse.PHPeclipsePlugin; +import net.sourceforge.phpdt.ui.JavaUI; import org.eclipse.jface.action.Action; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferenceConverter; @@ -384,6 +385,14 @@ public class PreferenceConstants { */ public static final String JAVADOC_COMMAND = "command"; //$NON-NLS-1$ /** + * A named preference that defines whether hint to make hover sticky should be shown. + * + * @see JavaUI + * @since 3.0 + */ + public static final String EDITOR_SHOW_TEXT_HOVER_AFFORDANCE= "PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE"; //$NON-NLS-1$ + + /** * A named preference that defines the key for the hover modifiers. * * @see JavaUI @@ -2310,7 +2319,8 @@ public final static String EDITOR_TEXT_FONT= "net.sourceforge.phpdt.ui.editors.t String ctrl = Action.findModifierString(SWT.CTRL); store.setDefault(PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIERS, "net.sourceforge.phpdt.ui.BestMatchHover;0;net.sourceforge.phpdt.ui.JavaSourceHover;" + ctrl); //$NON-NLS-1$ store.setDefault(PreferenceConstants.EDITOR_TEXT_HOVER_MODIFIER_MASKS, "net.sourceforge.phpdt.ui.BestMatchHover;0;net.sourceforge.phpdt.ui.JavaSourceHover;" + SWT.CTRL); //$NON-NLS-1$ - + store.setDefault(PreferenceConstants.EDITOR_SHOW_TEXT_HOVER_AFFORDANCE, true); + store.setDefault(PreferenceConstants.EDITOR_BROWSER_LIKE_LINKS, true); store.setDefault(PreferenceConstants.EDITOR_BROWSER_LIKE_LINKS_KEY_MODIFIER, ctrl); store.setDefault(PreferenceConstants.EDITOR_BROWSER_LIKE_LINKS_KEY_MODIFIER_MASK, SWT.CTRL); diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/actions/PHPEditorActionDefinitionIds.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/actions/PHPEditorActionDefinitionIds.java index f61a0d9..1e70b6f 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/actions/PHPEditorActionDefinitionIds.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/ui/actions/PHPEditorActionDefinitionIds.java @@ -30,4 +30,10 @@ public interface PHPEditorActionDefinitionIds { */ public static final String TOGGLE_TEXT_HOVER = "net.sourceforge.phpeclipse.ui.edit.text.java.toggle.text.hover"; //$NON-NLS-1$ + /** + * Action definition ID of the edit -> show Javadoc action + * (value "org.eclipse.jdt.ui.edit.text.java.show.javadoc"). + */ +public static final String SHOW_JAVADOC = "net.sourceforge.phpeclipse.ui.edit.text.java.show.javadoc"; //$NON-NLS-1$ + } diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/internal/compiler/ast/CompilationUnitDeclaration.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/internal/compiler/ast/CompilationUnitDeclaration.java index a3aeef4..ad98413 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/internal/compiler/ast/CompilationUnitDeclaration.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/internal/compiler/ast/CompilationUnitDeclaration.java @@ -32,6 +32,7 @@ public class CompilationUnitDeclaration extends AstNode implements ProblemSeveri // public TypeDeclaration[] types; public ArrayList types; //public char[][] name; + public int[][] comments; public boolean ignoreFurtherInvestigation = false; // once pointless to investigate due to errors public boolean ignoreMethodBodies = false; diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/internal/compiler/ast/FieldDeclaration.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/internal/compiler/ast/FieldDeclaration.java index 2fac9eb..9b90707 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/internal/compiler/ast/FieldDeclaration.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/internal/compiler/ast/FieldDeclaration.java @@ -39,7 +39,19 @@ public class FieldDeclaration extends AbstractVariableDeclaration { public FieldDeclaration() { } + public FieldDeclaration( + char[] name, + int sourceStart, + int sourceEnd) { + + this.name = name; + //due to some declaration like + // int x, y = 3, z , x ; + //the sourceStart and the sourceEnd is ONLY on the name + this.sourceStart = sourceStart; + this.sourceEnd = sourceEnd; + } public FieldDeclaration( Expression initialization, char[] name, diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BasicJavaEditorActionContributor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BasicJavaEditorActionContributor.java index c68efcc..d79c30d 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BasicJavaEditorActionContributor.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/BasicJavaEditorActionContributor.java @@ -68,7 +68,7 @@ public class BasicJavaEditorActionContributor extends BasicTextEditorActionContr ResourceBundle b= PHPEditorMessages.getResourceBundle(); fRetargetShowJavaDoc= new RetargetAction(PHPdtActionConstants.SHOW_JAVA_DOC, PHPEditorMessages.getString("ShowJavaDoc.label")); //$NON-NLS-1$ - fRetargetShowJavaDoc.setActionDefinitionId(PHPEditorActionDefinitionIds.SHOW_JAVADOC); + fRetargetShowJavaDoc.setActionDefinitionId(net.sourceforge.phpdt.ui.actions.PHPEditorActionDefinitionIds.SHOW_JAVADOC); markAsPartListener(fRetargetShowJavaDoc); // actions that are "contributed" to editors, they are considered belonging to the active editor @@ -82,7 +82,7 @@ public class BasicJavaEditorActionContributor extends BasicTextEditorActionContr fGotoMatchingBracket.setActionDefinitionId(PHPEditorActionDefinitionIds.GOTO_MATCHING_BRACKET); fShowJavaDoc= new RetargetTextEditorAction(b, "ShowJavaDoc."); //$NON-NLS-1$ - fShowJavaDoc.setActionDefinitionId(PHPEditorActionDefinitionIds.SHOW_JAVADOC); + fShowJavaDoc.setActionDefinitionId(net.sourceforge.phpdt.ui.actions.PHPEditorActionDefinitionIds.SHOW_JAVADOC); // fShowOutline= new RetargetTextEditorAction(PHPEditorMessages.getResourceBundle(), "ShowOutline."); //$NON-NLS-1$ // fShowOutline.setActionDefinitionId(PHPEditorActionDefinitionIds.SHOW_OUTLINE); diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java index c37b2e4..a4f0ef5 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditor.java @@ -1370,7 +1370,7 @@ public abstract class PHPEditor extends AbstractDecoratedTextEditor implements ResourceAction resAction= new TextOperationAction(PHPEditorMessages.getResourceBundle(), "ShowJavaDoc.", this, ISourceViewer.INFORMATION, true); //$NON-NLS-1$ resAction= new InformationDispatchAction(PHPEditorMessages.getResourceBundle(), "ShowJavaDoc.", (TextOperationAction) resAction); //$NON-NLS-1$ - resAction.setActionDefinitionId(PHPEditorActionDefinitionIds.SHOW_JAVADOC); + resAction.setActionDefinitionId(net.sourceforge.phpdt.ui.actions.PHPEditorActionDefinitionIds.SHOW_JAVADOC); setAction("ShowJavaDoc", resAction); //$NON-NLS-1$ // WorkbenchHelp.setHelp(resAction, IJavaHelpContextIds.SHOW_JAVADOC_ACTION); diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorActionDefinitionIds.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorActionDefinitionIds.java index 5022ea2..6605410 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorActionDefinitionIds.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorActionDefinitionIds.java @@ -60,10 +60,5 @@ public interface PHPEditorActionDefinitionIds extends ITextEditorActionDefiniti */ // public static final String CONTENT_ASSIST_PROPOSALS = "net.sourceforge.phpeclipse.ui.edit.text.php.content.assist.proposals"; //$NON-NLS-1$ - /** - * Action definition ID of the edit -> show Javadoc action - * (value "org.eclipse.jdt.ui.edit.text.java.show.javadoc"). - */ - public static final String SHOW_JAVADOC = "net.sourceforge.phpeclipse.ui.edit.text.java.show.javadoc"; //$NON-NLS-1$ - + } diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorMessages.properties b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorMessages.properties index 6d131e9..7c3104b 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorMessages.properties +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/phpeditor/PHPEditorMessages.properties @@ -88,3 +88,29 @@ PHPUnitEditor.warning.save.delete=The original file ''{0}'' has been deleted. PHPUnitEditor.warning.save.nonWorkbenchEncoding.title= Save Resource In Non-Workbench Encoding PHPUnitEditor.warning.save.nonWorkbenchEncoding.message1= {0} will be saved in \" {1} \" encoding which is not the current workbench encoding. This can result in conflicts with other tools. Continue anyway? PHPUnitEditor.warning.save.nonWorkbenchEncoding.message2= The resource will be saved in \" {0} \" encoding which is not the current platform encoding. This can result in conflicts with other tools. Continue anyway? + +JavaOutlinePage.ContextMenu.refactoring.label=&Refactor +JavaOutlinePage.HideFields.description.checked=Shows Fields +JavaOutlinePage.HideFields.description.unchecked=Hides Fields +JavaOutlinePage.HideFields.label=Hide Fields +JavaOutlinePage.HideFields.tooltip.checked=Show Fields +JavaOutlinePage.HideFields.tooltip.unchecked=Hide Fields +JavaOutlinePage.HideNonePublicMembers.description.checked=Shows non-public members +JavaOutlinePage.HideNonePublicMembers.description.unchecked=Hides non-public members +JavaOutlinePage.HideNonePublicMembers.label=Show Public Members Only +JavaOutlinePage.HideNonePublicMembers.tooltip.checked=Show Non-Public Members +JavaOutlinePage.HideNonePublicMembers.tooltip.unchecked=Hide Non-Public Members +JavaOutlinePage.HideStaticMembers.description.checked=Shows static members +JavaOutlinePage.HideStaticMembers.description.unchecked=Hides static members +JavaOutlinePage.HideStaticMembers.label=Hide Static Members +JavaOutlinePage.HideStaticMembers.tooltip.checked=Show Static Members +JavaOutlinePage.HideStaticMembers.tooltip.unchecked=Hide Static Members +JavaOutlinePage.Sort.label=Sort +JavaOutlinePage.Sort.tooltip=Sort +JavaOutlinePage.Sort.description=Enable Sorting +JavaOutlinePage.GoIntoTopLevelType.label=Go Into Top Level Type +JavaOutlinePage.GoIntoTopLevelType.tooltip=Go Into Top Level Type +JavaOutlinePage.GoIntoTopLevelType.description=Show children of top level type only +JavaOutlinePage.error.ChildrenProvider.getChildren.message1=JavaOutlinePage.ChildrenProvider.getChildren +JavaOutlinePage.error.ChildrenProvider.hasChildren.message1=JavaOutlinePage.ChildrenProvider.hasChildren +JavaOutlinePage.error.NoTopLevelType=Top level type not defined \ No newline at end of file diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/MainActionGroup.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/MainActionGroup.java deleted file mode 100644 index cfcfe82..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/MainActionGroup.java +++ /dev/null @@ -1,158 +0,0 @@ -package net.sourceforge.phpeclipse.resourcesview; - -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.Separator; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.ui.IMemento; -import org.eclipse.ui.IPropertyListener; -import org.eclipse.ui.IViewSite; -import org.eclipse.ui.IWorkbenchActionConstants; -import org.eclipse.ui.IWorkbenchPartSite; -import org.eclipse.ui.IWorkingSet; -import org.eclipse.ui.PartInitException; -import org.eclipse.ui.actions.ActionContext; -import org.eclipse.ui.actions.ActionGroup; -import org.eclipse.ui.actions.RefreshAction; -import org.eclipse.ui.dialogs.PropertyDialogAction; -import org.eclipse.ui.views.framelist.FrameList; -import org.eclipse.ui.views.navigator.IResourceNavigator; -import org.eclipse.ui.views.navigator.OpenActionGroup; -import org.eclipse.ui.views.navigator.RefactorActionGroup; -import org.eclipse.ui.views.navigator.ResourcePatternFilter; -import org.eclipse.ui.views.navigator.ResourceSorter; - -public class MainActionGroup extends ActionGroup { - - private OpenActionGroup openActionGroup; - private RefactorActionGroup refactorActionGroup; - private PropertyDialogAction propertyDialogAction ; - private RefreshAction refreshAction ; - - public MainActionGroup(PHPResourcesView phpResourcesView) { - ResourceNavigatorAdapter adapter = new ResourceNavigatorAdapter(phpResourcesView) ; - this.openActionGroup = new OpenActionGroup(adapter); - this.refactorActionGroup = new RefactorActionGroup(adapter); - Shell shell = phpResourcesView.getSite().getShell(); - propertyDialogAction = new PropertyDialogAction(shell, phpResourcesView.getViewer()); - refreshAction = new RefreshAction(shell) ; - } - - public void fillContextMenu(IMenuManager menu) { - this.openActionGroup.fillContextMenu(menu); - menu.add(new Separator()); - this.refactorActionGroup.fillContextMenu(menu); - menu.add(new Separator()); - menu.add(refreshAction) ; - menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS)); - menu.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS + "-end")); //$NON-NLS-1$ - menu.add(propertyDialogAction) ; - - } - - public void setContext(ActionContext actionContext) { - this.openActionGroup.setContext(actionContext); - this.refactorActionGroup.setContext(actionContext); - } - - public void runDefaultAction(IStructuredSelection selection) { - this.openActionGroup.runDefaultAction(selection); - } - - class ResourceNavigatorAdapter implements IResourceNavigator { - PHPResourcesView phpResourcesView; - ResourceNavigatorAdapter(PHPResourcesView phpResourcesView) { - this.phpResourcesView = phpResourcesView; - } - - public FrameList getFrameList() { - return null; - } - - public ResourcePatternFilter getPatternFilter() { - return null; - } - - public ResourceSorter getSorter() { - return null; - } - - public TreeViewer getViewer() { - return phpResourcesView.getViewer(); - } - - public IWorkingSet getWorkingSet() { - return null; - } - - public void setFiltersPreference(String[] patterns) { - } - - public void setSorter(ResourceSorter sorter) { - } - - public void setWorkingSet(IWorkingSet workingSet) { - } - - public IViewSite getViewSite() { - return phpResourcesView.getViewSite(); - } - - public void init(IViewSite arg0, IMemento arg1) throws PartInitException { - } - - public void init(IViewSite arg0) throws PartInitException { - } - - public void saveState(IMemento arg0) { - } - - public void addPropertyListener(IPropertyListener arg0) { - } - - public void createPartControl(Composite arg0) { - } - - public void dispose() { - } - - public IWorkbenchPartSite getSite() { - return phpResourcesView.getSite(); - } - - public String getTitle() { - return phpResourcesView.getTitle(); - } - - public Image getTitleImage() { - return phpResourcesView.getTitleImage(); - } - - public String getTitleToolTip() { - return phpResourcesView.getTitleToolTip(); - } - - public void removePropertyListener(IPropertyListener arg0) { - } - - public void setFocus() { - } - - public Object getAdapter(Class arg0) { - return phpResourcesView.getAdapter(arg0); - } - - //It was missing ? - public boolean isLinkingEnabled() { - return false; - } - - //It was missing ? - public void setLinkingEnabled(boolean b) { - } - } - -} \ No newline at end of file diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPElement.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPElement.java deleted file mode 100644 index d04eca9..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPElement.java +++ /dev/null @@ -1,7 +0,0 @@ -package net.sourceforge.phpeclipse.resourcesview; - -import org.eclipse.core.resources.IResource; - -public interface PHPElement { - public IResource getUnderlyingResource(); -} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPElementAdapterFactory.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPElementAdapterFactory.java deleted file mode 100644 index e921f2c..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPElementAdapterFactory.java +++ /dev/null @@ -1,32 +0,0 @@ -package net.sourceforge.phpeclipse.resourcesview; - -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.IAdapterFactory; - -public class PHPElementAdapterFactory implements IAdapterFactory { - - protected static Class[] ADAPTERS_I_CREATE = new Class[] { - IResource.class - }; - - public PHPElementAdapterFactory() { - super(); - } - - public Object getAdapter(Object adaptableObject, Class adapterType) { - PHPElement phpElement = (PHPElement) adaptableObject; - - if (IResource.class.equals(adapterType)) - return getResource(phpElement); - - return null; - } - - public Class[] getAdapterList() { - return ADAPTERS_I_CREATE; - } - - protected IResource getResource(PHPElement phpElement) { - return phpElement.getUnderlyingResource(); - } -} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPFile.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPFile.java deleted file mode 100644 index fb36859..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPFile.java +++ /dev/null @@ -1,28 +0,0 @@ -package net.sourceforge.phpeclipse.resourcesview; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IResource; - -/** - * Represents an entire PHP (.php source file). - */ -public class PHPFile implements PHPElement { - public static final String EXTENSION = "php"; - public static final String EXTENSION1 = "php3"; - public static final String EXTENSION2 = "php4"; - public static final String EXTENSION3 = "inc"; - public static final String EXTENSION4 = "html"; - public static final String EXTENSION5 = "htm"; - - protected IFile underlyingFile; - - public PHPFile(IFile theUnderlyingFile) { - super(); - underlyingFile = theUnderlyingFile; - } - - public IResource getUnderlyingResource() { - return underlyingFile; - } - -} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPProject.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPProject.java deleted file mode 100644 index e42cf0a..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPProject.java +++ /dev/null @@ -1,216 +0,0 @@ -package net.sourceforge.phpeclipse.resourcesview; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import javax.xml.parsers.SAXParserFactory; - -import net.sourceforge.phpeclipse.LoadPathEntry; -import net.sourceforge.phpeclipse.PHPeclipsePlugin; - -import org.eclipse.core.resources.ICommand; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.resources.IProjectNature; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.xml.sax.Attributes; -import org.xml.sax.ContentHandler; -import org.xml.sax.InputSource; -import org.xml.sax.Locator; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; - -public class PHPProject implements IProjectNature, PHPElement { - protected IProject fProject; - // protected IndexFileReader fIndexManager; - protected List fLoadPathEntries; - protected boolean fScratched; - - public PHPProject() { - } - - public void addLoadPathEntry(IProject anotherPHPProject) { - fScratched = true; - - LoadPathEntry newEntry = new LoadPathEntry(anotherPHPProject); - getLoadPathEntries().add(newEntry); - } - - public void configure() throws CoreException { - // get project description and then the associated build commands - IProjectDescription desc = fProject.getDescription(); - ICommand[] commands = desc.getBuildSpec(); - - // determine if builder already associated - boolean found = false; - for (int i = 0; i < commands.length; ++i) { - if (commands[i].getBuilderName().equals(PHPeclipsePlugin.BUILDER_PARSER_ID)) { - found = true; - break; - } - } - - // add builder if not already in project - if (!found) { - ICommand command = desc.newCommand(); - command.setBuilderName(PHPeclipsePlugin.BUILDER_PARSER_ID); - ICommand[] newCommands = new ICommand[commands.length + 1]; - - // Add it before other builders. - System.arraycopy(commands, 0, newCommands, 1, commands.length); - newCommands[0] = command; - desc.setBuildSpec(newCommands); - fProject.setDescription(desc, null); - } - } - - public void deconfigure() throws CoreException { - } - - public List getLoadPathEntries() { - if (fLoadPathEntries == null) { - loadLoadPathEntries(); - } - - return fLoadPathEntries; - } - - protected ContentHandler getLoadPathEntriesContentHandler() { - return new ContentHandler() { - public void characters(char[] arg0, int arg1, int arg2) throws SAXException { - } - - public void endDocument() throws SAXException { - } - - public void endElement(String arg0, String arg1, String arg2) throws SAXException { - } - - public void endPrefixMapping(String arg0) throws SAXException { - } - - public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException { - } - - public void processingInstruction(String arg0, String arg1) throws SAXException { - } - - public void setDocumentLocator(Locator arg0) { - } - - public void skippedEntity(String arg0) throws SAXException { - } - - public void startDocument() throws SAXException { - } - - public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { - if ("pathentry".equals(qName)) - if ("project".equals(atts.getValue("type"))) { - IPath referencedProjectPath = new Path(atts.getValue("path")); - IProject referencedProject = getProject(referencedProjectPath.lastSegment()); - fLoadPathEntries.add(new LoadPathEntry(referencedProject)); - } - } - - public void startPrefixMapping(String arg0, String arg1) throws SAXException { - } - }; - } - - protected IFile getLoadPathEntriesFile() { - return fProject.getFile(".loadpath"); - } - - protected String getLoadPathXML() { - StringBuffer buffer = new StringBuffer(); - buffer.append(""); - - Iterator pathEntriesIterator = fLoadPathEntries.iterator(); - - while (pathEntriesIterator.hasNext()) { - LoadPathEntry entry = (LoadPathEntry) pathEntriesIterator.next(); - buffer.append(entry.toXML()); - } - - buffer.append(""); - return buffer.toString(); - } - - public IProject getProject() { - return fProject; - } - - protected IProject getProject(String name) { - return PHPeclipsePlugin.getWorkspace().getRoot().getProject(name); - } - - public List getReferencedProjects() { - List referencedProjects = new ArrayList(); - - Iterator iterator = getLoadPathEntries().iterator(); - while (iterator.hasNext()) { - LoadPathEntry pathEntry = (LoadPathEntry) iterator.next(); - if (pathEntry.getType() == LoadPathEntry.TYPE_PROJECT) - referencedProjects.add(pathEntry.getProject()); - } - - return referencedProjects; - } - - public IResource getUnderlyingResource() { - return fProject; - } - - protected void loadLoadPathEntries() { - fLoadPathEntries = new ArrayList(); - - IFile loadPathsFile = getLoadPathEntriesFile(); - - XMLReader reader = null; - try { - reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); - reader.setContentHandler(getLoadPathEntriesContentHandler()); - reader.parse(new InputSource(loadPathsFile.getContents())); - } catch (Exception e) { - //the file is nonextant or unreadable - } - } - - public void removeLoadPathEntry(IProject anotherPHPProject) { - Iterator entries = getLoadPathEntries().iterator(); - while (entries.hasNext()) { - LoadPathEntry entry = (LoadPathEntry) entries.next(); - if (entry.getType() == LoadPathEntry.TYPE_PROJECT && entry.getProject().getName().equals(anotherPHPProject.getName())) { - getLoadPathEntries().remove(entry); - fScratched = true; - break; - } - } - } - - public void save() throws CoreException { - if (fScratched) { - InputStream xmlPath = new ByteArrayInputStream(getLoadPathXML().getBytes()); - IFile loadPathsFile = getLoadPathEntriesFile(); - if (!loadPathsFile.exists()) - loadPathsFile.create(xmlPath, true, null); - else - loadPathsFile.setContents(xmlPath, true, false, null); - - fScratched = false; - } - } - - public void setProject(IProject aProject) { - fProject = aProject; - } - -} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPProject_DeleteIt.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPProject_DeleteIt.java deleted file mode 100644 index 5477b46..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPProject_DeleteIt.java +++ /dev/null @@ -1,216 +0,0 @@ -package net.sourceforge.phpeclipse.resourcesview; - -import java.io.ByteArrayInputStream; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - -import javax.xml.parsers.SAXParserFactory; - -import net.sourceforge.phpeclipse.LoadPathEntry; -import net.sourceforge.phpeclipse.PHPeclipsePlugin; - -import org.eclipse.core.resources.ICommand; -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.resources.IProjectDescription; -import org.eclipse.core.resources.IProjectNature; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IPath; -import org.eclipse.core.runtime.Path; -import org.xml.sax.Attributes; -import org.xml.sax.ContentHandler; -import org.xml.sax.InputSource; -import org.xml.sax.Locator; -import org.xml.sax.SAXException; -import org.xml.sax.XMLReader; - -public class PHPProject_DeleteIt implements IProjectNature, PHPElement { - protected IProject fProject; - // protected IndexFileReader fIndexManager; - protected List fLoadPathEntries; - protected boolean fScratched; - - public PHPProject_DeleteIt() { - } - - public void addLoadPathEntry(IProject anotherPHPProject) { - fScratched = true; - - LoadPathEntry newEntry = new LoadPathEntry(anotherPHPProject); - getLoadPathEntries().add(newEntry); - } - - public void configure() throws CoreException { - // get project description and then the associated build commands - IProjectDescription desc = fProject.getDescription(); - ICommand[] commands = desc.getBuildSpec(); - - // determine if builder already associated - boolean found = false; - for (int i = 0; i < commands.length; ++i) { - if (commands[i].getBuilderName().equals(PHPeclipsePlugin.BUILDER_PARSER_ID)) { - found = true; - break; - } - } - - // add builder if not already in project - if (!found) { - ICommand command = desc.newCommand(); - command.setBuilderName(PHPeclipsePlugin.BUILDER_PARSER_ID); - ICommand[] newCommands = new ICommand[commands.length + 1]; - - // Add it before other builders. - System.arraycopy(commands, 0, newCommands, 1, commands.length); - newCommands[0] = command; - desc.setBuildSpec(newCommands); - fProject.setDescription(desc, null); - } - } - - public void deconfigure() throws CoreException { - } - - public List getLoadPathEntries() { - if (fLoadPathEntries == null) { - loadLoadPathEntries(); - } - - return fLoadPathEntries; - } - - protected ContentHandler getLoadPathEntriesContentHandler() { - return new ContentHandler() { - public void characters(char[] arg0, int arg1, int arg2) throws SAXException { - } - - public void endDocument() throws SAXException { - } - - public void endElement(String arg0, String arg1, String arg2) throws SAXException { - } - - public void endPrefixMapping(String arg0) throws SAXException { - } - - public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException { - } - - public void processingInstruction(String arg0, String arg1) throws SAXException { - } - - public void setDocumentLocator(Locator arg0) { - } - - public void skippedEntity(String arg0) throws SAXException { - } - - public void startDocument() throws SAXException { - } - - public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { - if ("pathentry".equals(qName)) - if ("project".equals(atts.getValue("type"))) { - IPath referencedProjectPath = new Path(atts.getValue("path")); - IProject referencedProject = getProject(referencedProjectPath.lastSegment()); - fLoadPathEntries.add(new LoadPathEntry(referencedProject)); - } - } - - public void startPrefixMapping(String arg0, String arg1) throws SAXException { - } - }; - } - - protected IFile getLoadPathEntriesFile() { - return fProject.getFile(".loadpath"); - } - - protected String getLoadPathXML() { - StringBuffer buffer = new StringBuffer(); - buffer.append(""); - - Iterator pathEntriesIterator = fLoadPathEntries.iterator(); - - while (pathEntriesIterator.hasNext()) { - LoadPathEntry entry = (LoadPathEntry) pathEntriesIterator.next(); - buffer.append(entry.toXML()); - } - - buffer.append(""); - return buffer.toString(); - } - - public IProject getProject() { - return fProject; - } - - protected IProject getProject(String name) { - return PHPeclipsePlugin.getWorkspace().getRoot().getProject(name); - } - - public List getReferencedProjects() { - List referencedProjects = new ArrayList(); - - Iterator iterator = getLoadPathEntries().iterator(); - while (iterator.hasNext()) { - LoadPathEntry pathEntry = (LoadPathEntry) iterator.next(); - if (pathEntry.getType() == LoadPathEntry.TYPE_PROJECT) - referencedProjects.add(pathEntry.getProject()); - } - - return referencedProjects; - } - - public IResource getUnderlyingResource() { - return fProject; - } - - protected void loadLoadPathEntries() { - fLoadPathEntries = new ArrayList(); - - IFile loadPathsFile = getLoadPathEntriesFile(); - - XMLReader reader = null; - try { - reader = SAXParserFactory.newInstance().newSAXParser().getXMLReader(); - reader.setContentHandler(getLoadPathEntriesContentHandler()); - reader.parse(new InputSource(loadPathsFile.getContents())); - } catch (Exception e) { - //the file is nonextant or unreadable - } - } - - public void removeLoadPathEntry(IProject anotherPHPProject) { - Iterator entries = getLoadPathEntries().iterator(); - while (entries.hasNext()) { - LoadPathEntry entry = (LoadPathEntry) entries.next(); - if (entry.getType() == LoadPathEntry.TYPE_PROJECT && entry.getProject().getName().equals(anotherPHPProject.getName())) { - getLoadPathEntries().remove(entry); - fScratched = true; - break; - } - } - } - - public void save() throws CoreException { - if (fScratched) { - InputStream xmlPath = new ByteArrayInputStream(getLoadPathXML().getBytes()); - IFile loadPathsFile = getLoadPathEntriesFile(); - if (!loadPathsFile.exists()) - loadPathsFile.create(xmlPath, true, null); - else - loadPathsFile.setContents(xmlPath, true, false, null); - - fScratched = false; - } - } - - public void setProject(IProject aProject) { - fProject = aProject; - } - -} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPResourcesView.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPResourcesView.java deleted file mode 100644 index d167dee..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPResourcesView.java +++ /dev/null @@ -1,117 +0,0 @@ -package net.sourceforge.phpeclipse.resourcesview; - -import net.sourceforge.phpeclipse.PHPeclipsePlugin; - -import org.eclipse.core.resources.IContainer; -import org.eclipse.core.resources.IResource; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.jface.action.IMenuListener; -import org.eclipse.jface.action.IMenuManager; -import org.eclipse.jface.action.MenuManager; -import org.eclipse.jface.viewers.IOpenListener; -import org.eclipse.jface.viewers.ISelection; -import org.eclipse.jface.viewers.IStructuredSelection; -import org.eclipse.jface.viewers.OpenEvent; -import org.eclipse.jface.viewers.TreeViewer; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Menu; -import org.eclipse.ui.IWorkbenchPartSite; -import org.eclipse.ui.actions.ActionContext; -import org.eclipse.ui.model.WorkbenchContentProvider; -import org.eclipse.ui.model.WorkbenchLabelProvider; -import org.eclipse.ui.part.ISetSelectionTarget; -import org.eclipse.ui.part.ViewPart; - -public class PHPResourcesView extends ViewPart implements ISetSelectionTarget, IMenuListener { - protected TreeViewer viewer; - protected MainActionGroup mainActionGroup; - - public PHPResourcesView() { - - } - - public void createPartControl(Composite parent) { - this.setViewer(new TreeViewer(parent)); - - this.getViewer().addFilter(new PHPViewerFilter()); - this.getViewer().setContentProvider(new WorkbenchContentProvider()); - this.getViewer().setLabelProvider(new WorkbenchLabelProvider()); - this.getViewer().setInput(getInitialInput()); - - this.getViewer().addOpenListener(new IOpenListener() { - public void open(OpenEvent event) { - getMainActionGroup().runDefaultAction((IStructuredSelection) event.getSelection()); - } - }); - - MenuManager menuMgr = new MenuManager("net.sourceforge.phpeclipse.PHPPopupMenu"); //$NON-NLS-1$ - menuMgr.setRemoveAllWhenShown(true); - menuMgr.addMenuListener(this); - - Menu fContextMenu = menuMgr.createContextMenu(this.getViewer().getTree()); - this.getViewer().getTree().setMenu(fContextMenu); - - // Register viewer with site. This must be done before making the actions. - IWorkbenchPartSite site = getSite(); - site.registerContextMenu(menuMgr, viewer); - } - - public void selectReveal(ISelection selection) { - viewer.setSelection(selection, true); - } - - protected IContainer getInitialInput() { - IAdaptable input = getSite().getPage().getInput(); - IResource resource = null; - if (input instanceof IResource) { - resource = (IResource) input; - } else { - resource = (IResource) input.getAdapter(IResource.class); - } - if (resource != null) { - switch (resource.getType()) { - case IResource.FILE : - return resource.getParent(); - case IResource.FOLDER : - case IResource.PROJECT : - case IResource.ROOT : - return (IContainer) resource; - default : - break; - } - } - return PHPeclipsePlugin.getWorkspace().getRoot(); - } - - public void setFocus() { - this.getViewer().getControl().setFocus(); - } - - public void menuAboutToShow(IMenuManager manager) { - IStructuredSelection selection = (IStructuredSelection) viewer.getSelection(); - this.getMainActionGroup().setContext(new ActionContext(selection)); - this.getMainActionGroup().fillContextMenu(manager); - this.getMainActionGroup().setContext(null); - } - - public MainActionGroup getMainActionGroup() { - if (mainActionGroup == null) { - // lazy initialization, because this.getSite() delivers null in constructor - mainActionGroup = new MainActionGroup(this); - } - return mainActionGroup; - } - - public void setMainActionGroup(MainActionGroup mainActionGroup) { - this.mainActionGroup = mainActionGroup; - } - - public TreeViewer getViewer() { - return viewer; - } - - protected void setViewer(TreeViewer viewer) { - this.viewer = viewer; - } - -} \ No newline at end of file diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPViewerFilter.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPViewerFilter.java deleted file mode 100644 index c8c9759..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/PHPViewerFilter.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.sourceforge.phpeclipse.resourcesview; - -import org.eclipse.core.resources.IFolder; -import org.eclipse.core.runtime.IAdaptable; -import org.eclipse.jface.viewers.Viewer; -import org.eclipse.jface.viewers.ViewerFilter; - -public class PHPViewerFilter extends ViewerFilter { - - public PHPViewerFilter() { - super(); - } - - public boolean select(Viewer viewer, Object parentElement, Object element) { - if (element instanceof IFolder) - return true; - - IAdaptable adaptable = (IAdaptable) element; - PHPElement phpElement = (PHPElement) adaptable.getAdapter(PHPElement.class); - if (phpElement != null) - return true; - - return false; - } -} diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/ResourceAdapterFactory.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/ResourceAdapterFactory.java deleted file mode 100644 index 4a5799c..0000000 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpeclipse/resourcesview/ResourceAdapterFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -package net.sourceforge.phpeclipse.resourcesview; - -import net.sourceforge.phpdt.core.JavaCore; -import net.sourceforge.phpdt.internal.core.JavaProject; - -import org.eclipse.core.resources.IFile; -import org.eclipse.core.resources.IProject; -import org.eclipse.core.runtime.IAdapterFactory; - -public class ResourceAdapterFactory implements IAdapterFactory { - - protected static Class[] ADAPTERS_I_CREATE = new Class[] { PHPElement.class, PHPFile.class, JavaProject.class }; - - public ResourceAdapterFactory() { - super(); - } - - public Object getAdapter(Object adaptableObject, Class adapterType) { - if (PHPFile.class.equals(adapterType)) - return JavaCore.create((IFile) adaptableObject); - - if (JavaProject.class.equals(adapterType)) - return JavaCore.create((IProject) adaptableObject); - - if (PHPElement.class.equals(adapterType)) { - if (adaptableObject instanceof IFile) - return JavaCore.create((IFile) adaptableObject); - - if (adaptableObject instanceof IProject) - return JavaCore.create((IProject) adaptableObject); - } - - return null; - } - - public Class[] getAdapterList() { - return ADAPTERS_I_CREATE; - } - -}