-/*******************************************************************************
- * Copyright (c) 2000, 2003 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
+/***********************************************************************************************************************************
+ * Copyright (c) 2000, 2003 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
- *******************************************************************************/
+ * Contributors: IBM Corporation - initial API and implementation
+ **********************************************************************************************************************************/
package net.sourceforge.phpdt.internal.compiler;
-import net.sourceforge.phpdt.core.compiler.CharOperation;
import net.sourceforge.phpdt.core.compiler.IProblem;
import net.sourceforge.phpdt.internal.compiler.env.ICompilationUnit;
+import net.sourceforge.phpdt.internal.compiler.impl.CompilerOptions;
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.phpeclipse.internal.compiler.ast.CompilationUnitDeclaration;
-import org.eclipse.core.runtime.CoreException;
-
+import org.eclipse.core.resources.IResource;
/*
- * A document element parser extracts structural information
- * from a piece of source, providing detailed source positions info.
- *
+ * A document element parser extracts structural information from a piece of source, providing detailed source positions info.
+ *
* also see @IDocumentElementRequestor
- *
- * The structural investigation includes:
- * - the package statement
- * - import statements
- * - top-level types: package member, member types (member types of member types...)
- * - fields
- * - methods
- *
+ *
+ * The structural investigation includes: - the package statement - import statements - top-level types: package member, member
+ * types (member types of member types...) - fields - methods
+ *
* Any (parsing) problem encountered is also provided.
*/
public class DocumentElementParser extends UnitParser {
- IDocumentElementRequestor requestor;
- private int localIntPtr;
- private int lastFieldEndPosition;
- private int lastFieldBodyEndPosition;
- private int typeStartPosition;
- private long selectorSourcePositions;
- private int typeDims;
- private int extendsDim;
- private int declarationSourceStart;
+ IDocumentElementRequestor requestor;
- /* int[] stack for storing javadoc positions */
- int[][] intArrayStack;
- int intArrayPtr;
-
-// CompilerOptions options;
-
-public DocumentElementParser(
- final IDocumentElementRequestor requestor,
- IProblemFactory problemFactory) {
-// CompilerOptions options) {
- super(new ProblemReporter(
- DefaultErrorHandlingPolicies.exitAfterAllProblems(),
-// options,
- problemFactory) {
- public void record(IProblem problem, CompilationResult unitResult) {
- requestor.acceptProblem(problem);
- }
- });
-// false,
-// options.sourceLevel >= CompilerOptions.JDK1_4);
- this.requestor = requestor;
- intArrayStack = new int[30][];
-// this.options = options;
-}
+ private int localIntPtr;
-/**
- *
- * INTERNAL USE-ONLY
- */
-//protected void adjustInterfaceModifiers() {
-// intStack[intPtr - 2] |= AccInterface;
-//}
-/*
- * Will clear the comment stack when looking
- * for a potential JavaDoc which might contain @deprecated.
- *
- * Additionally, before investigating for @deprecated, retrieve the positions
- * of the JavaDoc comments so as to notify requestor with them.
- */
-//public void checkAnnotation() {
-//
-// /* persisting javadoc positions */
-// pushOnIntArrayStack(this.getJavaDocPositions());
-// boolean deprecated = false;
-// int lastAnnotationIndex = -1;
-// int commentPtr = scanner.commentPtr;
-//
-// //since jdk1.2 look only in the last java doc comment...
-// nextComment : for (lastAnnotationIndex = scanner.commentPtr; lastAnnotationIndex >= 0; lastAnnotationIndex--){
-// //look for @deprecated into the first javadoc comment preceeding the declaration
-// int commentSourceStart = scanner.commentStarts[lastAnnotationIndex];
-// // javadoc only (non javadoc comment have negative end positions.)
-// if (modifiersSourceStart != -1 && modifiersSourceStart < commentSourceStart) {
-// continue nextComment;
-// }
-// if (scanner.commentStops[lastAnnotationIndex] < 0) {
-// continue nextComment;
-// }
-// int commentSourceEnd = scanner.commentStops[lastAnnotationIndex] - 1; //stop is one over
-// char[] comment = scanner.source;
-//
-// deprecated =
-// checkDeprecation(
-// commentSourceStart,
-// commentSourceEnd,
-// comment);
-// break nextComment;
-// }
-// if (deprecated) {
-// checkAndSetModifiers(AccDeprecated);
-// }
-// // modify the modifier source start to point at the first comment
-// if (commentPtr >= 0) {
-// declarationSourceStart = scanner.commentStarts[0];
-// }
-//}
-/**
- *
- * INTERNAL USE-ONLY
- */
-//protected void consumeClassBodyDeclaration() {
-// // ClassBodyDeclaration ::= Diet Block
-// //push an Initializer
-// //optimize the push/pop
-//
-// super.consumeClassBodyDeclaration();
-// Initializer initializer = (Initializer) astStack[astPtr];
-// requestor.acceptInitializer(
-// initializer.declarationSourceStart,
-// initializer.declarationSourceEnd,
-// intArrayStack[intArrayPtr--],
-// 0,
-// modifiersSourceStart,
-// initializer.block.sourceStart,
-// initializer.block.sourceEnd);
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeClassDeclaration() {
-// super.consumeClassDeclaration();
-// // we know that we have a TypeDeclaration on the top of the astStack
-// if (isLocalDeclaration()) {
-// // we ignore the local variable declarations
-// return;
-// }
-// requestor.exitClass(endStatementPosition, // '}' is the end of the body
-// ((TypeDeclaration) astStack[astPtr]).declarationSourceEnd);
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeClassHeader() {
-// //ClassHeader ::= $empty
-// super.consumeClassHeader();
-// if (isLocalDeclaration()) {
-// // we ignore the local variable declarations
-// intArrayPtr--;
-// return;
-// }
-// TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
-// TypeReference[] superInterfaces = typeDecl.superInterfaces;
-// char[][] interfaceNames = null;
-// int[] interfaceNameStarts = null;
-// int[] interfaceNameEnds = null;
-// if (superInterfaces != null) {
-// int superInterfacesLength = superInterfaces.length;
-// interfaceNames = new char[superInterfacesLength][];
-// interfaceNameStarts = new int[superInterfacesLength];
-// interfaceNameEnds = new int[superInterfacesLength];
-// for (int i = 0; i < superInterfacesLength; i++) {
-// TypeReference superInterface = superInterfaces[i];
-// interfaceNames[i] = CharOperation.concatWith(superInterface.getTypeName(), '.');
-// interfaceNameStarts[i] = superInterface.sourceStart;
-// interfaceNameEnds[i] = superInterface.sourceEnd;
-// }
-// }
-// // flush the comments related to the class header
-// scanner.commentPtr = -1;
-// TypeReference superclass = typeDecl.superclass;
-// if (superclass == null) {
-// requestor.enterClass(
-// typeDecl.declarationSourceStart,
-// intArrayStack[intArrayPtr--],
-// typeDecl.modifiers,
-// typeDecl.modifiersSourceStart,
-// typeStartPosition,
-// typeDecl.name,
-// typeDecl.sourceStart,
-// typeDecl.sourceEnd,
-// null,
-// -1,
-// -1,
-// interfaceNames,
-// interfaceNameStarts,
-// interfaceNameEnds,
-// scanner.currentPosition - 1);
-// } else {
-// requestor.enterClass(
-// typeDecl.declarationSourceStart,
-// intArrayStack[intArrayPtr--],
-// typeDecl.modifiers,
-// typeDecl.modifiersSourceStart,
-// typeStartPosition,
-// typeDecl.name,
-// typeDecl.sourceStart,
-// typeDecl.sourceEnd,
-// CharOperation.concatWith(superclass.getTypeName(), '.'),
-// superclass.sourceStart,
-// superclass.sourceEnd,
-// interfaceNames,
-// interfaceNameStarts,
-// interfaceNameEnds,
-// scanner.currentPosition - 1);
-//
-// }
-//}
-//protected void consumeClassHeaderName() {
-// // ClassHeaderName ::= Modifiersopt 'class' 'Identifier'
-// TypeDeclaration typeDecl;
-// if (nestedMethod[nestedType] == 0) {
-// if (nestedType != 0) {
-// typeDecl = new MemberTypeDeclaration(this.compilationUnit.compilationResult);
-// } else {
-// typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
-// }
-// } else {
-// // Record that the block has a declaration for local types
-// typeDecl = new LocalTypeDeclaration(this.compilationUnit.compilationResult);
-// markEnclosingMemberWithLocalType();
-// blockReal();
-// }
-//
-// //highlight the name of the type
-// long pos = identifierPositionStack[identifierPtr];
-// typeDecl.sourceEnd = (int) pos;
-// typeDecl.sourceStart = (int) (pos >>> 32);
-// typeDecl.name = identifierStack[identifierPtr--];
-// identifierLengthPtr--;
-//
-// //compute the declaration source too
-// // 'class' and 'interface' push an int position
-// typeStartPosition = typeDecl.declarationSourceStart = intStack[intPtr--];
-// intPtr--;
-// int declarationSourceStart = intStack[intPtr--];
-// typeDecl.modifiersSourceStart = intStack[intPtr--];
-// typeDecl.modifiers = intStack[intPtr--];
-// if (typeDecl.declarationSourceStart > declarationSourceStart) {
-// typeDecl.declarationSourceStart = declarationSourceStart;
-// }
-// typeDecl.bodyStart = typeDecl.sourceEnd + 1;
-// pushOnAstStack(typeDecl);
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeCompilationUnit() {
-// // CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt ImportDeclarationsopt
-// requestor.exitCompilationUnit(scanner.source.length - 1);
-//}
-/**
- *
- * INTERNAL USE-ONLY
- */
-//protected void consumeConstructorDeclaration() {
-// // ConstructorDeclaration ::= ConstructorHeader ConstructorBody
-// super.consumeConstructorDeclaration();
-// if (isLocalDeclaration()) {
-// // we ignore the local variable declarations
-// return;
-// }
-// ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr];
-// requestor.exitConstructor(endStatementPosition, cd.declarationSourceEnd);
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeConstructorHeader() {
-// // ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters MethodHeaderThrowsClauseopt
-// super.consumeConstructorHeader();
-// if (isLocalDeclaration()) {
-// // we ignore the local variable declarations
-// intArrayPtr--;
-// return;
-// }
-// ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr];
-// Argument[] arguments = cd.arguments;
-// char[][] argumentTypes = null;
-// char[][] argumentNames = null;
-// int[] argumentTypeStarts = null;
-// int[] argumentTypeEnds = null;
-// int[] argumentNameStarts = null;
-// int[] argumentNameEnds = null;
-// if (arguments != null) {
-// int argumentLength = arguments.length;
-// argumentTypes = new char[argumentLength][];
-// argumentNames = new char[argumentLength][];
-// argumentNameStarts = new int[argumentLength];
-// argumentNameEnds = new int[argumentLength];
-// argumentTypeStarts = new int[argumentLength];
-// argumentTypeEnds = new int[argumentLength];
-// for (int i = 0; i < argumentLength; i++) {
-// Argument argument = arguments[i];
-// TypeReference argumentType = argument.type;
-// argumentTypes[i] = returnTypeName(argumentType);
-// argumentNames[i] = argument.name;
-// argumentNameStarts[i] = argument.sourceStart;
-// argumentNameEnds[i] = argument.sourceEnd;
-// argumentTypeStarts[i] = argumentType.sourceStart;
-// argumentTypeEnds[i] = argumentType.sourceEnd;
-// }
-// }
-// TypeReference[] thrownExceptions = cd.thrownExceptions;
-// char[][] exceptionTypes = null;
-// int[] exceptionTypeStarts = null;
-// int[] exceptionTypeEnds = null;
-// if (thrownExceptions != null) {
-// int thrownExceptionLength = thrownExceptions.length;
-// exceptionTypes = new char[thrownExceptionLength][];
-// exceptionTypeStarts = new int[thrownExceptionLength];
-// exceptionTypeEnds = new int[thrownExceptionLength];
-// for (int i = 0; i < thrownExceptionLength; i++) {
-// TypeReference exception = thrownExceptions[i];
-// exceptionTypes[i] = CharOperation.concatWith(exception.getTypeName(), '.');
-// exceptionTypeStarts[i] = exception.sourceStart;
-// exceptionTypeEnds[i] = exception.sourceEnd;
-// }
-// }
-// requestor
-// .enterConstructor(
-// cd.declarationSourceStart,
-// intArrayStack[intArrayPtr--],
-// cd.modifiers,
-// cd.modifiersSourceStart,
-// cd.selector,
-// cd.sourceStart,
-// (int) (selectorSourcePositions & 0xFFFFFFFFL),
-// // retrieve the source end of the name
-// argumentTypes,
-// argumentTypeStarts,
-// argumentTypeEnds,
-// argumentNames,
-// argumentNameStarts,
-// argumentNameEnds,
-// rParenPos,
-// // right parenthesis
-// exceptionTypes,
-// exceptionTypeStarts,
-// exceptionTypeEnds,
-// scanner.currentPosition - 1);
-//}
-//protected void consumeConstructorHeaderName() {
-// // ConstructorHeaderName ::= Modifiersopt 'Identifier' '('
-// ConstructorDeclaration cd = new ConstructorDeclaration(this.compilationUnit.compilationResult);
-//
-// //name -- this is not really revelant but we do .....
-// cd.selector = identifierStack[identifierPtr];
-// selectorSourcePositions = identifierPositionStack[identifierPtr--];
-// identifierLengthPtr--;
-//
-// //modifiers
-// cd.declarationSourceStart = intStack[intPtr--];
-// cd.modifiersSourceStart = intStack[intPtr--];
-// cd.modifiers = intStack[intPtr--];
-//
-// //highlight starts at the selector starts
-// cd.sourceStart = (int) (selectorSourcePositions >>> 32);
-// pushOnAstStack(cd);
-//
-// cd.sourceEnd = lParenPos;
-// cd.bodyStart = lParenPos + 1;
-//}
-//protected void consumeDefaultModifiers() {
-// checkAnnotation(); // might update modifiers with AccDeprecated
-// pushOnIntStack(modifiers); // modifiers
-// pushOnIntStack(-1);
-// pushOnIntStack(
-// declarationSourceStart >= 0 ? declarationSourceStart : scanner.startPosition);
-// resetModifiers();
-//}
-//protected void consumeDiet() {
-// // Diet ::= $empty
-// super.consumeDiet();
-// /* persisting javadoc positions
-// * Will be consume in consumeClassBodyDeclaration
-// */
-// pushOnIntArrayStack(this.getJavaDocPositions());
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeEnterCompilationUnit() {
-// // EnterCompilationUnit ::= $empty
-// requestor.enterCompilationUnit();
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeEnterVariable() {
-// // EnterVariable ::= $empty
-// boolean isLocalDeclaration = isLocalDeclaration();
-// if (!isLocalDeclaration && (variablesCounter[nestedType] != 0)) {
-// requestor.exitField(lastFieldBodyEndPosition, lastFieldEndPosition);
-// }
-// char[] name = identifierStack[identifierPtr];
-// long namePosition = identifierPositionStack[identifierPtr--];
-// int extendedTypeDimension = intStack[intPtr--];
-//
-// AbstractVariableDeclaration declaration;
-// if (nestedMethod[nestedType] != 0) {
-// // create the local variable declarations
-// declaration =
-// new LocalDeclaration(null, name, (int) (namePosition >>> 32), (int) namePosition);
-// } else {
-// // create the field declaration
-// declaration =
-// new FieldDeclaration(null, name, (int) (namePosition >>> 32), (int) namePosition);
-// }
-// identifierLengthPtr--;
-// TypeReference type;
-// int variableIndex = variablesCounter[nestedType];
-// int typeDim = 0;
-// if (variableIndex == 0) {
-// // first variable of the declaration (FieldDeclaration or LocalDeclaration)
-// if (nestedMethod[nestedType] != 0) {
-// // local declaration
-// declaration.declarationSourceStart = intStack[intPtr--];
-// declaration.modifiersSourceStart = intStack[intPtr--];
-// declaration.modifiers = intStack[intPtr--];
-// type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension
-// pushOnAstStack(type);
-// } else {
-// // field declaration
-// type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension
-// pushOnAstStack(type);
-// declaration.declarationSourceStart = intStack[intPtr--];
-// declaration.modifiersSourceStart = intStack[intPtr--];
-// declaration.modifiers = intStack[intPtr--];
-// }
-// } else {
-// type = (TypeReference) astStack[astPtr - variableIndex];
-// typeDim = type.dimensions();
-// AbstractVariableDeclaration previousVariable =
-// (AbstractVariableDeclaration) astStack[astPtr];
-// declaration.declarationSourceStart = previousVariable.declarationSourceStart;
-// declaration.modifiers = previousVariable.modifiers;
-// declaration.modifiersSourceStart = previousVariable.modifiersSourceStart;
-// }
-//
-// localIntPtr = intPtr;
-//
-// if (extendedTypeDimension == 0) {
-// declaration.type = type;
-// } else {
-// int dimension = typeDim + extendedTypeDimension;
-// //on the identifierLengthStack there is the information about the type....
-// int baseType;
-// if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) {
-// //it was a baseType
-// declaration.type = TypeReference.baseTypeReference(-baseType, dimension);
-// declaration.type.sourceStart = type.sourceStart;
-// declaration.type.sourceEnd = type.sourceEnd;
-// } else {
-// declaration.type = this.copyDims(type, dimension);
-// }
-// }
-// variablesCounter[nestedType]++;
-// nestedMethod[nestedType]++;
-// pushOnAstStack(declaration);
-//
-// int[] javadocPositions = intArrayStack[intArrayPtr];
-// if (!isLocalDeclaration) {
-// requestor
-// .enterField(
-// declaration.declarationSourceStart,
-// javadocPositions,
-// declaration.modifiers,
-// declaration.modifiersSourceStart,
-// returnTypeName(declaration.type),
-// type.sourceStart,
-// type.sourceEnd,
-// typeDims,
-// name,
-// (int) (namePosition >>> 32),
-// (int) namePosition,
-// extendedTypeDimension,
-// extendedTypeDimension == 0 ? -1 : endPosition);
-// }
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeExitVariableWithInitialization() {
-// // ExitVariableWithInitialization ::= $empty
-// // the scanner is located after the comma or the semi-colon.
-// // we want to include the comma or the semi-colon
-// super.consumeExitVariableWithInitialization();
-// nestedMethod[nestedType]--;
-// lastFieldEndPosition = scanner.currentPosition - 1;
-// lastFieldBodyEndPosition = ((AbstractVariableDeclaration) astStack[astPtr]).initialization.sourceEnd;
-//}
-//protected void consumeExitVariableWithoutInitialization() {
-// // ExitVariableWithoutInitialization ::= $empty
-// // do nothing by default
-// super.consumeExitVariableWithoutInitialization();
-// nestedMethod[nestedType]--;
-// lastFieldEndPosition = scanner.currentPosition - 1;
-// lastFieldBodyEndPosition = scanner.startPosition - 1;
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeFieldDeclaration() {
-// // See consumeLocalVariableDeclarationDefaultModifier() in case of change: duplicated code
-// // FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
-// // the super.consumeFieldDeclaration will reinitialize the variableCounter[nestedType]
-// int variableIndex = variablesCounter[nestedType];
-// super.consumeFieldDeclaration();
-// intArrayPtr--;
-// if (isLocalDeclaration())
-// return;
-// if (variableIndex != 0) {
-// requestor.exitField(lastFieldBodyEndPosition, lastFieldEndPosition);
-// }
-//}
-//protected void consumeFormalParameter() {
-// // FormalParameter ::= Type VariableDeclaratorId ==> false
-// // FormalParameter ::= Modifiers Type VariableDeclaratorId ==> true
-// /*
-// astStack :
-// identifierStack : type identifier
-// intStack : dim dim
-// ==>
-// astStack : Argument
-// identifierStack :
-// intStack :
-// */
-//
-// identifierLengthPtr--;
-// char[] name = identifierStack[identifierPtr];
-// long namePositions = identifierPositionStack[identifierPtr--];
-// TypeReference type = getTypeReference(intStack[intPtr--] + intStack[intPtr--]);
-// intPtr -= 3;
-// Argument arg =
-// new Argument(
-// name,
-// namePositions,
-// type,
-// intStack[intPtr + 1]); // modifiers
-// pushOnAstStack(arg);
-// intArrayPtr--;
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeInterfaceDeclaration() {
-// super.consumeInterfaceDeclaration();
-// // we know that we have a TypeDeclaration on the top of the astStack
-// if (isLocalDeclaration()) {
-// // we ignore the local variable declarations
-// return;
-// }
-// requestor.exitInterface(endStatementPosition, // the '}' is the end of the body
-// ((TypeDeclaration) astStack[astPtr]).declarationSourceEnd);
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeInterfaceHeader() {
-// //InterfaceHeader ::= $empty
-// super.consumeInterfaceHeader();
-// if (isLocalDeclaration()) {
-// // we ignore the local variable declarations
-// intArrayPtr--;
-// return;
-// }
-// TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
-// TypeReference[] superInterfaces = typeDecl.superInterfaces;
-// char[][] interfaceNames = null;
-// int[] interfaceNameStarts = null;
-// int[] interfacenameEnds = null;
-// int superInterfacesLength = 0;
-// if (superInterfaces != null) {
-// superInterfacesLength = superInterfaces.length;
-// interfaceNames = new char[superInterfacesLength][];
-// interfaceNameStarts = new int[superInterfacesLength];
-// interfacenameEnds = new int[superInterfacesLength];
-// }
-// if (superInterfaces != null) {
-// for (int i = 0; i < superInterfacesLength; i++) {
-// TypeReference superInterface = superInterfaces[i];
-// interfaceNames[i] = CharOperation.concatWith(superInterface.getTypeName(), '.');
-// interfaceNameStarts[i] = superInterface.sourceStart;
-// interfacenameEnds[i] = superInterface.sourceEnd;
-// }
-// }
-// // flush the comments related to the interface header
-// scanner.commentPtr = -1;
-// requestor.enterInterface(
-// typeDecl.declarationSourceStart,
-// intArrayStack[intArrayPtr--],
-// typeDecl.modifiers,
-// typeDecl.modifiersSourceStart,
-// typeStartPosition,
-// typeDecl.name,
-// typeDecl.sourceStart,
-// typeDecl.sourceEnd,
-// interfaceNames,
-// interfaceNameStarts,
-// interfacenameEnds,
-// scanner.currentPosition - 1);
-//}
-//protected void consumeInterfaceHeaderName() {
-// // InterfaceHeaderName ::= Modifiersopt 'interface' 'Identifier'
-// TypeDeclaration typeDecl;
-// if (nestedMethod[nestedType] == 0) {
-// if (nestedType != 0) {
-// typeDecl = new MemberTypeDeclaration(this.compilationUnit.compilationResult);
-// } else {
-// typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
-// }
-// } else {
-// // Record that the block has a declaration for local types
-// typeDecl = new LocalTypeDeclaration(this.compilationUnit.compilationResult);
-// markEnclosingMemberWithLocalType();
-// blockReal();
-// }
-//
-// //highlight the name of the type
-// long pos = identifierPositionStack[identifierPtr];
-// typeDecl.sourceEnd = (int) pos;
-// typeDecl.sourceStart = (int) (pos >>> 32);
-// typeDecl.name = identifierStack[identifierPtr--];
-// identifierLengthPtr--;
-//
-// //compute the declaration source too
-// // 'class' and 'interface' push an int position
-// typeStartPosition = typeDecl.declarationSourceStart = intStack[intPtr--];
-// intPtr--;
-// int declarationSourceStart = intStack[intPtr--];
-// typeDecl.modifiersSourceStart = intStack[intPtr--];
-// typeDecl.modifiers = intStack[intPtr--];
-// if (typeDecl.declarationSourceStart > declarationSourceStart) {
-// typeDecl.declarationSourceStart = declarationSourceStart;
-// }
-// typeDecl.bodyStart = typeDecl.sourceEnd + 1;
-// pushOnAstStack(typeDecl);
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeLocalVariableDeclaration() {
-// // See consumeLocalVariableDeclarationDefaultModifier() in case of change: duplicated code
-// // FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
-//
-// super.consumeLocalVariableDeclaration();
-// intArrayPtr--;
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeMethodDeclaration(boolean isNotAbstract) {
-// // MethodDeclaration ::= MethodHeader MethodBody
-// // AbstractMethodDeclaration ::= MethodHeader ';'
-// super.consumeMethodDeclaration(isNotAbstract);
-// if (isLocalDeclaration()) {
-// // we ignore the local variable declarations
-// return;
-// }
-// MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
-// requestor.exitMethod(endStatementPosition, md.declarationSourceEnd);
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeMethodHeader() {
-// // MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims ThrowsClauseopt
-// super.consumeMethodHeader();
-// if (isLocalDeclaration()) {
-// // we ignore the local variable declarations
-// intArrayPtr--;
-// return;
-// }
-// MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
-//
-// TypeReference returnType = md.returnType;
-// char[] returnTypeName = returnTypeName(returnType);
-// Argument[] arguments = md.arguments;
-// char[][] argumentTypes = null;
-// char[][] argumentNames = null;
-// int[] argumentTypeStarts = null;
-// int[] argumentTypeEnds = null;
-// int[] argumentNameStarts = null;
-// int[] argumentNameEnds = null;
-// if (arguments != null) {
-// int argumentLength = arguments.length;
-// argumentTypes = new char[argumentLength][];
-// argumentNames = new char[argumentLength][];
-// argumentNameStarts = new int[argumentLength];
-// argumentNameEnds = new int[argumentLength];
-// argumentTypeStarts = new int[argumentLength];
-// argumentTypeEnds = new int[argumentLength];
-// for (int i = 0; i < argumentLength; i++) {
-// Argument argument = arguments[i];
-// TypeReference argumentType = argument.type;
-// argumentTypes[i] = returnTypeName(argumentType);
-// argumentNames[i] = argument.name;
-// argumentNameStarts[i] = argument.sourceStart;
-// argumentNameEnds[i] = argument.sourceEnd;
-// argumentTypeStarts[i] = argumentType.sourceStart;
-// argumentTypeEnds[i] = argumentType.sourceEnd;
-// }
-// }
-// TypeReference[] thrownExceptions = md.thrownExceptions;
-// char[][] exceptionTypes = null;
-// int[] exceptionTypeStarts = null;
-// int[] exceptionTypeEnds = null;
-// if (thrownExceptions != null) {
-// int thrownExceptionLength = thrownExceptions.length;
-// exceptionTypeStarts = new int[thrownExceptionLength];
-// exceptionTypeEnds = new int[thrownExceptionLength];
-// exceptionTypes = new char[thrownExceptionLength][];
-// for (int i = 0; i < thrownExceptionLength; i++) {
-// TypeReference exception = thrownExceptions[i];
-// exceptionTypes[i] = CharOperation.concatWith(exception.getTypeName(), '.');
-// exceptionTypeStarts[i] = exception.sourceStart;
-// exceptionTypeEnds[i] = exception.sourceEnd;
-// }
-// }
-// requestor
-// .enterMethod(
-// md.declarationSourceStart,
-// intArrayStack[intArrayPtr--],
-// md.modifiers,
-// md.modifiersSourceStart,
-// returnTypeName,
-// returnType.sourceStart,
-// returnType.sourceEnd,
-// typeDims,
-// md.selector,
-// md.sourceStart,
-// (int) (selectorSourcePositions & 0xFFFFFFFFL),
-// argumentTypes,
-// argumentTypeStarts,
-// argumentTypeEnds,
-// argumentNames,
-// argumentNameStarts,
-// argumentNameEnds,
-// rParenPos,
-// extendsDim,
-// extendsDim == 0 ? -1 : endPosition,
-// exceptionTypes,
-// exceptionTypeStarts,
-// exceptionTypeEnds,
-// scanner.currentPosition - 1);
-//}
-//protected void consumeMethodHeaderExtendedDims() {
-// // MethodHeaderExtendedDims ::= Dimsopt
-// // now we update the returnType of the method
-// MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
-// int extendedDims = intStack[intPtr--];
-// extendsDim = extendedDims;
-// if (extendedDims != 0) {
-// TypeReference returnType = md.returnType;
-// md.sourceEnd = endPosition;
-// int dims = returnType.dimensions() + extendedDims;
-// int baseType;
-// if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) {
-// //it was a baseType
-// int sourceStart = returnType.sourceStart;
-// int sourceEnd = returnType.sourceEnd;
-// returnType = TypeReference.baseTypeReference(-baseType, dims);
-// returnType.sourceStart = sourceStart;
-// returnType.sourceEnd = sourceEnd;
-// md.returnType = returnType;
-// } else {
-// md.returnType = this.copyDims(md.returnType, dims);
-// }
-// if (currentToken == TokenNameLBRACE) {
-// md.bodyStart = endPosition + 1;
-// }
-// }
-//}
-//protected void consumeMethodHeaderName() {
-// // MethodHeaderName ::= Modifiersopt Type 'Identifier' '('
-// MethodDeclaration md = new MethodDeclaration(this.compilationUnit.compilationResult);
-//
-// //name
-// md.selector = identifierStack[identifierPtr];
-// selectorSourcePositions = identifierPositionStack[identifierPtr--];
-// identifierLengthPtr--;
-// //type
-// md.returnType = getTypeReference(typeDims = intStack[intPtr--]);
-// //modifiers
-// md.declarationSourceStart = intStack[intPtr--];
-// md.modifiersSourceStart = intStack[intPtr--];
-// md.modifiers = intStack[intPtr--];
-//
-// //highlight starts at selector start
-// md.sourceStart = (int) (selectorSourcePositions >>> 32);
-// pushOnAstStack(md);
-// md.bodyStart = scanner.currentPosition-1;
-//}
-//protected void consumeModifiers() {
-// checkAnnotation(); // might update modifiers with AccDeprecated
-// pushOnIntStack(modifiers); // modifiers
-// pushOnIntStack(modifiersSourceStart);
-// pushOnIntStack(
-// declarationSourceStart >= 0 ? declarationSourceStart : modifiersSourceStart);
-// resetModifiers();
-//}
-/**
- *
- * INTERNAL USE-ONLY
- */
-//protected void consumePackageDeclarationName() {
-// /* persisting javadoc positions */
-// pushOnIntArrayStack(this.getJavaDocPositions());
-//
-// super.consumePackageDeclarationName();
-// ImportReference importReference = compilationUnit.currentPackage;
-//
-// requestor.acceptPackage(
-// importReference.declarationSourceStart,
-// importReference.declarationSourceEnd,
-// intArrayStack[intArrayPtr--],
-// CharOperation.concatWith(importReference.getImportName(), '.'),
-// importReference.sourceStart);
-//}
-//protected void consumePushModifiers() {
-// checkAnnotation(); // might update modifiers with AccDeprecated
-// pushOnIntStack(modifiers); // modifiers
-// if (modifiersSourceStart < 0) {
-// pushOnIntStack(-1);
-// pushOnIntStack(
-// declarationSourceStart >= 0 ? declarationSourceStart : scanner.startPosition);
-// } else {
-// pushOnIntStack(modifiersSourceStart);
-// pushOnIntStack(
-// declarationSourceStart >= 0 ? declarationSourceStart : modifiersSourceStart);
-// }
-// resetModifiers();
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeSingleTypeImportDeclarationName() {
-// // SingleTypeImportDeclarationName ::= 'import' Name
-//
-// /* persisting javadoc positions */
-// pushOnIntArrayStack(this.getJavaDocPositions());
-//
-// super.consumeSingleTypeImportDeclarationName();
-// ImportReference importReference = (ImportReference) astStack[astPtr];
-// requestor.acceptImport(
-// importReference.declarationSourceStart,
-// importReference.declarationSourceEnd,
-// intArrayStack[intArrayPtr--],
-// CharOperation.concatWith(importReference.getImportName(), '.'),
-// importReference.sourceStart,
-// false);
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeStaticInitializer() {
-// // StaticInitializer ::= StaticOnly Block
-// //push an Initializer
-// //optimize the push/pop
-// super.consumeStaticInitializer();
-// Initializer initializer = (Initializer) astStack[astPtr];
-// requestor.acceptInitializer(
-// initializer.declarationSourceStart,
-// initializer.declarationSourceEnd,
-// intArrayStack[intArrayPtr--],
-// AccStatic,
-// intStack[intPtr--],
-// initializer.block.sourceStart,
-// initializer.declarationSourceEnd);
-//}
-//protected void consumeStaticOnly() {
-// // StaticOnly ::= 'static'
-// checkAnnotation(); // might update declaration source start
-// pushOnIntStack(modifiersSourceStart);
-// pushOnIntStack(
-// declarationSourceStart >= 0 ? declarationSourceStart : modifiersSourceStart);
-// jumpOverMethodBody();
-// nestedMethod[nestedType]++;
-// resetModifiers();
-//}
-///**
-// *
-// * INTERNAL USE-ONLY
-// */
-//protected void consumeTypeImportOnDemandDeclarationName() {
-// // TypeImportOnDemandDeclarationName ::= 'import' Name '.' '*'
-//
-// /* persisting javadoc positions */
-// pushOnIntArrayStack(this.getJavaDocPositions());
-//
-// super.consumeTypeImportOnDemandDeclarationName();
-// ImportReference importReference = (ImportReference) astStack[astPtr];
-// requestor.acceptImport(
-// importReference.declarationSourceStart,
-// importReference.declarationSourceEnd,
-// intArrayStack[intArrayPtr--],
-// CharOperation.concatWith(importReference.getImportName(), '.'),
-// importReference.sourceStart,
-// true);
-//}
-public CompilationUnitDeclaration endParse(int act) {
- if (scanner.recordLineSeparator) {
- requestor.acceptLineSeparatorPositions(scanner.getLineEnds());
- }
- return super.endParse(act);
-}
-/*
- * Flush annotations defined prior to a given positions.
- *
- * Note: annotations are stacked in syntactical order
- *
- * Either answer given <position>, or the end position of a comment line
- * immediately following the <position> (same line)
- *
- * e.g.
- * void foo(){
- * } // end of method foo
- */
-
-//public int flushAnnotationsDefinedPriorTo(int position) {
-//
-// return lastFieldEndPosition = super.flushAnnotationsDefinedPriorTo(position);
-//}
-//protected TypeReference getTypeReference(int dim) { /* build a Reference on a variable that may be qualified or not
-//This variable is a type reference and dim will be its dimensions*/
-//
-// int length;
-// TypeReference ref;
-// if ((length = identifierLengthStack[identifierLengthPtr--]) == 1) {
-// // single variable reference
-// if (dim == 0) {
-// ref =
-// new SingleTypeReference(
-// identifierStack[identifierPtr],
-// identifierPositionStack[identifierPtr--]);
-// } else {
-// ref =
-// new ArrayTypeReference(
-// identifierStack[identifierPtr],
-// dim,
-// identifierPositionStack[identifierPtr--]);
-// ref.sourceEnd = endPosition;
-// }
-// } else {
-// if (length < 0) { //flag for precompiled type reference on base types
-// ref = TypeReference.baseTypeReference(-length, dim);
-// ref.sourceStart = intStack[intPtr--];
-// if (dim == 0) {
-// ref.sourceEnd = intStack[intPtr--];
-// } else {
-// intPtr--;
-// ref.sourceEnd = endPosition;
-// }
-// } else { //Qualified variable reference
-// char[][] tokens = new char[length][];
-// identifierPtr -= length;
-// long[] positions = new long[length];
-// System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
-// System.arraycopy(
-// identifierPositionStack,
-// identifierPtr + 1,
-// positions,
-// 0,
-// length);
-// if (dim == 0) {
-// ref = new QualifiedTypeReference(tokens, positions);
-// } else {
-// ref = new ArrayQualifiedTypeReference(tokens, dim, positions);
-// ref.sourceEnd = endPosition;
-// }
-// }
-// };
-// return ref;
-//}
-public void initialize() {
- //positionning the parser for a new compilation unit
- //avoiding stack reallocation and all that....
- super.initialize(false);
- intArrayPtr = -1;
-}
-/**
- *
- * INTERNAL USE-ONLY
- */
-//private boolean isLocalDeclaration() {
-// int nestedDepth = nestedType;
-// while (nestedDepth >= 0) {
-// if (nestedMethod[nestedDepth] != 0) {
-// return true;
-// }
-// nestedDepth--;
-// }
-// return false;
-//}
-/*
- * Investigate one entire unit.
- */
-public void parseCompilationUnit(ICompilationUnit unit) {
- char[] regionSource = unit.getContents();
- try {
- initialize();
- goForCompilationUnit();
- referenceContext =
- compilationUnit =
- compilationUnit =
- new CompilationUnitDeclaration(
- problemReporter(),
- new CompilationResult(unit, 0, 0, 10), //this.options.maxProblemsPerUnit),
- regionSource.length);
- scanner.resetTo(0, regionSource.length);
- scanner.setSource(regionSource);
- parse();
- } catch (CoreException e) {
- e.printStackTrace();
- } catch (AbortCompilation ex) {
- }
-}
-/*
- * Investigate one constructor declaration.
- */
-//public void parseConstructor(char[] regionSource) {
-// try {
-// initialize();
-// goForClassBodyDeclarations();
-// referenceContext =
-// compilationUnit =
-// compilationUnit =
-// new CompilationUnitDeclaration(
-// problemReporter(),
-// new CompilationResult(regionSource, 0, 0, 10), //this.options.maxProblemsPerUnit),
-// regionSource.length);
-// scanner.resetTo(0, regionSource.length);
-// scanner.setSource(regionSource);
-// parse();
-// } catch (AbortCompilation ex) {
-// }
-//}
-/*
- * Investigate one field declaration statement (might have multiple declarations in it).
- */
-//public void parseField(char[] regionSource) {
-// try {
-// initialize();
-// goForFieldDeclaration();
-// referenceContext =
-// compilationUnit =
-// compilationUnit =
-// new CompilationUnitDeclaration(
-// problemReporter(),
-// new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
-// regionSource.length);
-// scanner.resetTo(0, regionSource.length);
-// scanner.setSource(regionSource);
-// parse();
-// } catch (AbortCompilation ex) {
-// }
-//
-//}
-///*
-// * Investigate one import statement declaration.
-// */
-//public void parseImport(char[] regionSource) {
-// try {
-// initialize();
-// goForImportDeclaration();
-// referenceContext =
-// compilationUnit =
-// compilationUnit =
-// new CompilationUnitDeclaration(
-// problemReporter(),
-// new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
-// regionSource.length);
-// scanner.resetTo(0, regionSource.length);
-// scanner.setSource(regionSource);
-// parse();
-// } catch (AbortCompilation ex) {
-// }
-//
-//}
-///*
-// * Investigate one initializer declaration.
-// * regionSource need to content exactly an initializer declaration.
-// * e.g: static { i = 4; }
-// * { name = "test"; }
-// */
-//public void parseInitializer(char[] regionSource) {
-// try {
-// initialize();
-// goForInitializer();
-// referenceContext =
-// compilationUnit =
-// compilationUnit =
-// new CompilationUnitDeclaration(
-// problemReporter(),
-// new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
-// regionSource.length);
-// scanner.resetTo(0, regionSource.length);
-// scanner.setSource(regionSource);
-// parse();
-// } catch (AbortCompilation ex) {
-// }
-//
-//}
-///*
-// * Investigate one method declaration.
-// */
-//public void parseMethod(char[] regionSource) {
-// try {
-// initialize();
-// goForGenericMethodDeclaration();
-// referenceContext =
-// compilationUnit =
-// compilationUnit =
-// new CompilationUnitDeclaration(
-// problemReporter(),
-// new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
-// regionSource.length);
-// scanner.resetTo(0, regionSource.length);
-// scanner.setSource(regionSource);
-// parse();
-// } catch (AbortCompilation ex) {
-// }
-//
-//}
-///*
-// * Investigate one package statement declaration.
-// */
-//public void parsePackage(char[] regionSource) {
-// try {
-// initialize();
-// goForPackageDeclaration();
-// referenceContext =
-// compilationUnit =
-// compilationUnit =
-// new CompilationUnitDeclaration(
-// problemReporter(),
-// new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
-// regionSource.length);
-// scanner.resetTo(0, regionSource.length);
-// scanner.setSource(regionSource);
-// parse();
-// } catch (AbortCompilation ex) {
-// }
-//
-//}
-///*
-// * Investigate one type declaration, its fields, methods and member types.
-// */
-//public void parseType(char[] regionSource) {
-// try {
-// initialize();
-// goForTypeDeclaration();
-// referenceContext =
-// compilationUnit =
-// compilationUnit =
-// new CompilationUnitDeclaration(
-// problemReporter(),
-// new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
-// regionSource.length);
-// scanner.resetTo(0, regionSource.length);
-// scanner.setSource(regionSource);
-// parse();
-// } catch (AbortCompilation ex) {
-// }
-//
-//}
-/**
- * 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() {
- problemReporter.referenceContext = referenceContext;
- return problemReporter;
-}
-protected void pushOnIntArrayStack(int[] positions) {
+ private int lastFieldEndPosition;
- try {
- intArrayStack[++intArrayPtr] = positions;
- } catch (IndexOutOfBoundsException e) {
- //intPtr is correct
- int oldStackLength = intArrayStack.length;
- int oldStack[][] = intArrayStack;
- intArrayStack = new int[oldStackLength + StackIncrement][];
- System.arraycopy(oldStack, 0, intArrayStack, 0, oldStackLength);
- intArrayStack[intArrayPtr] = positions;
- }
-}
-//protected void resetModifiers() {
-// super.resetModifiers();
-// declarationSourceStart = -1;
-//}
-/*
- * Syntax error was detected. Will attempt to perform some recovery action in order
- * to resume to the regular parse loop.
- */
-protected boolean resumeOnSyntaxError() {
- return false;
-}
-/*
- * Answer a char array representation of the type name formatted like:
- * - type name + dimensions
- * Example:
- * "A[][]".toCharArray()
- * "java.lang.String".toCharArray()
- */
-//private char[] returnTypeName(TypeReference type) {
-// int dimension = type.dimensions();
-// if (dimension != 0) {
-// char[] dimensionsArray = new char[dimension * 2];
-// for (int i = 0; i < dimension; i++) {
-// dimensionsArray[i*2] = '[';
-// dimensionsArray[(i*2) + 1] = ']';
-// }
-// return CharOperation.concat(
-// CharOperation.concatWith(type.getTypeName(), '.'),
-// dimensionsArray);
-// }
-// return CharOperation.concatWith(type.getTypeName(), '.');
-//}
-//public String toString() {
-// StringBuffer buffer = new StringBuffer();
-// buffer.append("intArrayPtr = " + intArrayPtr + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
-// buffer.append(super.toString());
-// return buffer.toString();
-//}
-///**
-// * INTERNAL USE ONLY
-// */
-//protected TypeReference typeReference(
-// int dim,
-// int localIdentifierPtr,
-// int localIdentifierLengthPtr) {
-// /* build a Reference on a variable that may be qualified or not
-// * This variable is a type reference and dim will be its dimensions.
-// * We don't have any side effect on the stacks' pointers.
-// */
-//
-// int length;
-// TypeReference ref;
-// if ((length = identifierLengthStack[localIdentifierLengthPtr]) == 1) {
-// // single variable reference
-// if (dim == 0) {
-// ref =
-// new SingleTypeReference(
-// identifierStack[localIdentifierPtr],
-// identifierPositionStack[localIdentifierPtr--]);
-// } else {
-// ref =
-// new ArrayTypeReference(
-// identifierStack[localIdentifierPtr],
-// dim,
-// identifierPositionStack[localIdentifierPtr--]);
-// ref.sourceEnd = endPosition;
-// }
-// } else {
-// if (length < 0) { //flag for precompiled type reference on base types
-// ref = TypeReference.baseTypeReference(-length, dim);
-// ref.sourceStart = intStack[localIntPtr--];
-// if (dim == 0) {
-// ref.sourceEnd = intStack[localIntPtr--];
-// } else {
-// localIntPtr--;
-// ref.sourceEnd = endPosition;
-// }
-// } else { //Qualified variable reference
-// char[][] tokens = new char[length][];
-// localIdentifierPtr -= length;
-// long[] positions = new long[length];
-// System.arraycopy(identifierStack, localIdentifierPtr + 1, tokens, 0, length);
-// System.arraycopy(
-// identifierPositionStack,
-// localIdentifierPtr + 1,
-// positions,
-// 0,
-// length);
-// if (dim == 0)
-// ref = new QualifiedTypeReference(tokens, positions);
-// else
-// ref = new ArrayQualifiedTypeReference(tokens, dim, positions);
-// }
-// };
-// return ref;
-//}
-}
+ private int lastFieldBodyEndPosition;
+
+ private int typeStartPosition;
+
+ private long selectorSourcePositions;
+
+ private int typeDims;
+
+ private int extendsDim;
+
+ private int declarationSourceStart;
+
+ /* int[] stack for storing javadoc positions */
+ int[][] intArrayStack;
+
+ int intArrayPtr;
+
+ // CompilerOptions options;
+
+ public DocumentElementParser(final IDocumentElementRequestor requestor, IProblemFactory problemFactory,
+ CompilerOptions options) {
+ super(new ProblemReporter(DefaultErrorHandlingPolicies.exitAfterAllProblems(), options, problemFactory) {
+ public void record(IProblem problem, CompilationResult unitResult) {
+ requestor.acceptProblem(problem);
+ }
+ });
+ // false,
+ // options.sourceLevel >= CompilerOptions.JDK1_4);
+ this.requestor = requestor;
+ intArrayStack = new int[30][];
+ this.options = options;
+ }
+
+ /**
+ *
+ * INTERNAL USE-ONLY
+ */
+ //protected void adjustInterfaceModifiers() {
+ // intStack[intPtr - 2] |= AccInterface;
+ //}
+ /*
+ * Will clear the comment stack when looking for a potential JavaDoc which might contain @deprecated.
+ *
+ * Additionally, before investigating for @deprecated, retrieve the positions of the JavaDoc comments so as to notify requestor
+ * with them.
+ */
+ //public void checkAnnotation() {
+ //
+ // /* persisting javadoc positions */
+ // pushOnIntArrayStack(this.getJavaDocPositions());
+ // boolean deprecated = false;
+ // int lastAnnotationIndex = -1;
+ // int commentPtr = scanner.commentPtr;
+ //
+ // //since jdk1.2 look only in the last java doc comment...
+ // nextComment : for (lastAnnotationIndex = scanner.commentPtr; lastAnnotationIndex >= 0; lastAnnotationIndex--){
+ // //look for @deprecated into the first javadoc comment preceeding the declaration
+ // int commentSourceStart = scanner.commentStarts[lastAnnotationIndex];
+ // // javadoc only (non javadoc comment have negative end positions.)
+ // if (modifiersSourceStart != -1 && modifiersSourceStart < commentSourceStart) {
+ // continue nextComment;
+ // }
+ // if (scanner.commentStops[lastAnnotationIndex] < 0) {
+ // continue nextComment;
+ // }
+ // int commentSourceEnd = scanner.commentStops[lastAnnotationIndex] - 1; //stop is one over
+ // char[] comment = scanner.source;
+ //
+ // deprecated =
+ // checkDeprecation(
+ // commentSourceStart,
+ // commentSourceEnd,
+ // comment);
+ // break nextComment;
+ // }
+ // if (deprecated) {
+ // checkAndSetModifiers(AccDeprecated);
+ // }
+ // // modify the modifier source start to point at the first comment
+ // if (commentPtr >= 0) {
+ // declarationSourceStart = scanner.commentStarts[0];
+ // }
+ //}
+ /**
+ *
+ * INTERNAL USE-ONLY
+ */
+ //protected void consumeClassBodyDeclaration() {
+ // // ClassBodyDeclaration ::= Diet Block
+ // //push an Initializer
+ // //optimize the push/pop
+ //
+ // super.consumeClassBodyDeclaration();
+ // Initializer initializer = (Initializer) astStack[astPtr];
+ // requestor.acceptInitializer(
+ // initializer.declarationSourceStart,
+ // initializer.declarationSourceEnd,
+ // intArrayStack[intArrayPtr--],
+ // 0,
+ // modifiersSourceStart,
+ // initializer.block.sourceStart,
+ // initializer.block.sourceEnd);
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeClassDeclaration() {
+ // super.consumeClassDeclaration();
+ // // we know that we have a TypeDeclaration on the top of the astStack
+ // if (isLocalDeclaration()) {
+ // // we ignore the local variable declarations
+ // return;
+ // }
+ // requestor.exitClass(endStatementPosition, // '}' is the end of the body
+ // ((TypeDeclaration) astStack[astPtr]).declarationSourceEnd);
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeClassHeader() {
+ // //ClassHeader ::= $empty
+ // super.consumeClassHeader();
+ // if (isLocalDeclaration()) {
+ // // we ignore the local variable declarations
+ // intArrayPtr--;
+ // return;
+ // }
+ // TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+ // TypeReference[] superInterfaces = typeDecl.superInterfaces;
+ // char[][] interfaceNames = null;
+ // int[] interfaceNameStarts = null;
+ // int[] interfaceNameEnds = null;
+ // if (superInterfaces != null) {
+ // int superInterfacesLength = superInterfaces.length;
+ // interfaceNames = new char[superInterfacesLength][];
+ // interfaceNameStarts = new int[superInterfacesLength];
+ // interfaceNameEnds = new int[superInterfacesLength];
+ // for (int i = 0; i < superInterfacesLength; i++) {
+ // TypeReference superInterface = superInterfaces[i];
+ // interfaceNames[i] = CharOperation.concatWith(superInterface.getTypeName(), '.');
+ // interfaceNameStarts[i] = superInterface.sourceStart;
+ // interfaceNameEnds[i] = superInterface.sourceEnd;
+ // }
+ // }
+ // // flush the comments related to the class header
+ // scanner.commentPtr = -1;
+ // TypeReference superclass = typeDecl.superclass;
+ // if (superclass == null) {
+ // requestor.enterClass(
+ // typeDecl.declarationSourceStart,
+ // intArrayStack[intArrayPtr--],
+ // typeDecl.modifiers,
+ // typeDecl.modifiersSourceStart,
+ // typeStartPosition,
+ // typeDecl.name,
+ // typeDecl.sourceStart,
+ // typeDecl.sourceEnd,
+ // null,
+ // -1,
+ // -1,
+ // interfaceNames,
+ // interfaceNameStarts,
+ // interfaceNameEnds,
+ // scanner.currentPosition - 1);
+ // } else {
+ // requestor.enterClass(
+ // typeDecl.declarationSourceStart,
+ // intArrayStack[intArrayPtr--],
+ // typeDecl.modifiers,
+ // typeDecl.modifiersSourceStart,
+ // typeStartPosition,
+ // typeDecl.name,
+ // typeDecl.sourceStart,
+ // typeDecl.sourceEnd,
+ // CharOperation.concatWith(superclass.getTypeName(), '.'),
+ // superclass.sourceStart,
+ // superclass.sourceEnd,
+ // interfaceNames,
+ // interfaceNameStarts,
+ // interfaceNameEnds,
+ // scanner.currentPosition - 1);
+ //
+ // }
+ //}
+ //protected void consumeClassHeaderName() {
+ // // ClassHeaderName ::= Modifiersopt 'class' 'Identifier'
+ // TypeDeclaration typeDecl;
+ // if (nestedMethod[nestedType] == 0) {
+ // if (nestedType != 0) {
+ // typeDecl = new MemberTypeDeclaration(this.compilationUnit.compilationResult);
+ // } else {
+ // typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
+ // }
+ // } else {
+ // // Record that the block has a declaration for local types
+ // typeDecl = new LocalTypeDeclaration(this.compilationUnit.compilationResult);
+ // markEnclosingMemberWithLocalType();
+ // blockReal();
+ // }
+ //
+ // //highlight the name of the type
+ // long pos = identifierPositionStack[identifierPtr];
+ // typeDecl.sourceEnd = (int) pos;
+ // typeDecl.sourceStart = (int) (pos >>> 32);
+ // typeDecl.name = identifierStack[identifierPtr--];
+ // identifierLengthPtr--;
+ //
+ // //compute the declaration source too
+ // // 'class' and 'interface' push an int position
+ // typeStartPosition = typeDecl.declarationSourceStart = intStack[intPtr--];
+ // intPtr--;
+ // int declarationSourceStart = intStack[intPtr--];
+ // typeDecl.modifiersSourceStart = intStack[intPtr--];
+ // typeDecl.modifiers = intStack[intPtr--];
+ // if (typeDecl.declarationSourceStart > declarationSourceStart) {
+ // typeDecl.declarationSourceStart = declarationSourceStart;
+ // }
+ // typeDecl.bodyStart = typeDecl.sourceEnd + 1;
+ // pushOnAstStack(typeDecl);
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeCompilationUnit() {
+ // // CompilationUnit ::= EnterCompilationUnit PackageDeclarationopt ImportDeclarationsopt
+ // requestor.exitCompilationUnit(scanner.source.length - 1);
+ //}
+ /**
+ *
+ * INTERNAL USE-ONLY
+ */
+ //protected void consumeConstructorDeclaration() {
+ // // ConstructorDeclaration ::= ConstructorHeader ConstructorBody
+ // super.consumeConstructorDeclaration();
+ // if (isLocalDeclaration()) {
+ // // we ignore the local variable declarations
+ // return;
+ // }
+ // ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr];
+ // requestor.exitConstructor(endStatementPosition, cd.declarationSourceEnd);
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeConstructorHeader() {
+ // // ConstructorHeader ::= ConstructorHeaderName MethodHeaderParameters MethodHeaderThrowsClauseopt
+ // super.consumeConstructorHeader();
+ // if (isLocalDeclaration()) {
+ // // we ignore the local variable declarations
+ // intArrayPtr--;
+ // return;
+ // }
+ // ConstructorDeclaration cd = (ConstructorDeclaration) astStack[astPtr];
+ // Argument[] arguments = cd.arguments;
+ // char[][] argumentTypes = null;
+ // char[][] argumentNames = null;
+ // int[] argumentTypeStarts = null;
+ // int[] argumentTypeEnds = null;
+ // int[] argumentNameStarts = null;
+ // int[] argumentNameEnds = null;
+ // if (arguments != null) {
+ // int argumentLength = arguments.length;
+ // argumentTypes = new char[argumentLength][];
+ // argumentNames = new char[argumentLength][];
+ // argumentNameStarts = new int[argumentLength];
+ // argumentNameEnds = new int[argumentLength];
+ // argumentTypeStarts = new int[argumentLength];
+ // argumentTypeEnds = new int[argumentLength];
+ // for (int i = 0; i < argumentLength; i++) {
+ // Argument argument = arguments[i];
+ // TypeReference argumentType = argument.type;
+ // argumentTypes[i] = returnTypeName(argumentType);
+ // argumentNames[i] = argument.name;
+ // argumentNameStarts[i] = argument.sourceStart;
+ // argumentNameEnds[i] = argument.sourceEnd;
+ // argumentTypeStarts[i] = argumentType.sourceStart;
+ // argumentTypeEnds[i] = argumentType.sourceEnd;
+ // }
+ // }
+ // TypeReference[] thrownExceptions = cd.thrownExceptions;
+ // char[][] exceptionTypes = null;
+ // int[] exceptionTypeStarts = null;
+ // int[] exceptionTypeEnds = null;
+ // if (thrownExceptions != null) {
+ // int thrownExceptionLength = thrownExceptions.length;
+ // exceptionTypes = new char[thrownExceptionLength][];
+ // exceptionTypeStarts = new int[thrownExceptionLength];
+ // exceptionTypeEnds = new int[thrownExceptionLength];
+ // for (int i = 0; i < thrownExceptionLength; i++) {
+ // TypeReference exception = thrownExceptions[i];
+ // exceptionTypes[i] = CharOperation.concatWith(exception.getTypeName(), '.');
+ // exceptionTypeStarts[i] = exception.sourceStart;
+ // exceptionTypeEnds[i] = exception.sourceEnd;
+ // }
+ // }
+ // requestor
+ // .enterConstructor(
+ // cd.declarationSourceStart,
+ // intArrayStack[intArrayPtr--],
+ // cd.modifiers,
+ // cd.modifiersSourceStart,
+ // cd.selector,
+ // cd.sourceStart,
+ // (int) (selectorSourcePositions & 0xFFFFFFFFL),
+ // // retrieve the source end of the name
+ // argumentTypes,
+ // argumentTypeStarts,
+ // argumentTypeEnds,
+ // argumentNames,
+ // argumentNameStarts,
+ // argumentNameEnds,
+ // rParenPos,
+ // // right parenthesis
+ // exceptionTypes,
+ // exceptionTypeStarts,
+ // exceptionTypeEnds,
+ // scanner.currentPosition - 1);
+ //}
+ //protected void consumeConstructorHeaderName() {
+ // // ConstructorHeaderName ::= Modifiersopt 'Identifier' '('
+ // ConstructorDeclaration cd = new ConstructorDeclaration(this.compilationUnit.compilationResult);
+ //
+ // //name -- this is not really revelant but we do .....
+ // cd.selector = identifierStack[identifierPtr];
+ // selectorSourcePositions = identifierPositionStack[identifierPtr--];
+ // identifierLengthPtr--;
+ //
+ // //modifiers
+ // cd.declarationSourceStart = intStack[intPtr--];
+ // cd.modifiersSourceStart = intStack[intPtr--];
+ // cd.modifiers = intStack[intPtr--];
+ //
+ // //highlight starts at the selector starts
+ // cd.sourceStart = (int) (selectorSourcePositions >>> 32);
+ // pushOnAstStack(cd);
+ //
+ // cd.sourceEnd = lParenPos;
+ // cd.bodyStart = lParenPos + 1;
+ //}
+ //protected void consumeDefaultModifiers() {
+ // checkAnnotation(); // might update modifiers with AccDeprecated
+ // pushOnIntStack(modifiers); // modifiers
+ // pushOnIntStack(-1);
+ // pushOnIntStack(
+ // declarationSourceStart >= 0 ? declarationSourceStart : scanner.startPosition);
+ // resetModifiers();
+ //}
+ //protected void consumeDiet() {
+ // // Diet ::= $empty
+ // super.consumeDiet();
+ // /* persisting javadoc positions
+ // * Will be consume in consumeClassBodyDeclaration
+ // */
+ // pushOnIntArrayStack(this.getJavaDocPositions());
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeEnterCompilationUnit() {
+ // // EnterCompilationUnit ::= $empty
+ // requestor.enterCompilationUnit();
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeEnterVariable() {
+ // // EnterVariable ::= $empty
+ // boolean isLocalDeclaration = isLocalDeclaration();
+ // if (!isLocalDeclaration && (variablesCounter[nestedType] != 0)) {
+ // requestor.exitField(lastFieldBodyEndPosition, lastFieldEndPosition);
+ // }
+ // char[] name = identifierStack[identifierPtr];
+ // long namePosition = identifierPositionStack[identifierPtr--];
+ // int extendedTypeDimension = intStack[intPtr--];
+ //
+ // AbstractVariableDeclaration declaration;
+ // if (nestedMethod[nestedType] != 0) {
+ // // create the local variable declarations
+ // declaration =
+ // new LocalDeclaration(null, name, (int) (namePosition >>> 32), (int) namePosition);
+ // } else {
+ // // create the field declaration
+ // declaration =
+ // new FieldDeclaration(null, name, (int) (namePosition >>> 32), (int) namePosition);
+ // }
+ // identifierLengthPtr--;
+ // TypeReference type;
+ // int variableIndex = variablesCounter[nestedType];
+ // int typeDim = 0;
+ // if (variableIndex == 0) {
+ // // first variable of the declaration (FieldDeclaration or LocalDeclaration)
+ // if (nestedMethod[nestedType] != 0) {
+ // // local declaration
+ // declaration.declarationSourceStart = intStack[intPtr--];
+ // declaration.modifiersSourceStart = intStack[intPtr--];
+ // declaration.modifiers = intStack[intPtr--];
+ // type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension
+ // pushOnAstStack(type);
+ // } else {
+ // // field declaration
+ // type = getTypeReference(typeDim = intStack[intPtr--]); // type dimension
+ // pushOnAstStack(type);
+ // declaration.declarationSourceStart = intStack[intPtr--];
+ // declaration.modifiersSourceStart = intStack[intPtr--];
+ // declaration.modifiers = intStack[intPtr--];
+ // }
+ // } else {
+ // type = (TypeReference) astStack[astPtr - variableIndex];
+ // typeDim = type.dimensions();
+ // AbstractVariableDeclaration previousVariable =
+ // (AbstractVariableDeclaration) astStack[astPtr];
+ // declaration.declarationSourceStart = previousVariable.declarationSourceStart;
+ // declaration.modifiers = previousVariable.modifiers;
+ // declaration.modifiersSourceStart = previousVariable.modifiersSourceStart;
+ // }
+ //
+ // localIntPtr = intPtr;
+ //
+ // if (extendedTypeDimension == 0) {
+ // declaration.type = type;
+ // } else {
+ // int dimension = typeDim + extendedTypeDimension;
+ // //on the identifierLengthStack there is the information about the type....
+ // int baseType;
+ // if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) {
+ // //it was a baseType
+ // declaration.type = TypeReference.baseTypeReference(-baseType, dimension);
+ // declaration.type.sourceStart = type.sourceStart;
+ // declaration.type.sourceEnd = type.sourceEnd;
+ // } else {
+ // declaration.type = this.copyDims(type, dimension);
+ // }
+ // }
+ // variablesCounter[nestedType]++;
+ // nestedMethod[nestedType]++;
+ // pushOnAstStack(declaration);
+ //
+ // int[] javadocPositions = intArrayStack[intArrayPtr];
+ // if (!isLocalDeclaration) {
+ // requestor
+ // .enterField(
+ // declaration.declarationSourceStart,
+ // javadocPositions,
+ // declaration.modifiers,
+ // declaration.modifiersSourceStart,
+ // returnTypeName(declaration.type),
+ // type.sourceStart,
+ // type.sourceEnd,
+ // typeDims,
+ // name,
+ // (int) (namePosition >>> 32),
+ // (int) namePosition,
+ // extendedTypeDimension,
+ // extendedTypeDimension == 0 ? -1 : endPosition);
+ // }
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeExitVariableWithInitialization() {
+ // // ExitVariableWithInitialization ::= $empty
+ // // the scanner is located after the comma or the semi-colon.
+ // // we want to include the comma or the semi-colon
+ // super.consumeExitVariableWithInitialization();
+ // nestedMethod[nestedType]--;
+ // lastFieldEndPosition = scanner.currentPosition - 1;
+ // lastFieldBodyEndPosition = ((AbstractVariableDeclaration) astStack[astPtr]).initialization.sourceEnd;
+ //}
+ //protected void consumeExitVariableWithoutInitialization() {
+ // // ExitVariableWithoutInitialization ::= $empty
+ // // do nothing by default
+ // super.consumeExitVariableWithoutInitialization();
+ // nestedMethod[nestedType]--;
+ // lastFieldEndPosition = scanner.currentPosition - 1;
+ // lastFieldBodyEndPosition = scanner.startPosition - 1;
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeFieldDeclaration() {
+ // // See consumeLocalVariableDeclarationDefaultModifier() in case of change: duplicated code
+ // // FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
+ // // the super.consumeFieldDeclaration will reinitialize the variableCounter[nestedType]
+ // int variableIndex = variablesCounter[nestedType];
+ // super.consumeFieldDeclaration();
+ // intArrayPtr--;
+ // if (isLocalDeclaration())
+ // return;
+ // if (variableIndex != 0) {
+ // requestor.exitField(lastFieldBodyEndPosition, lastFieldEndPosition);
+ // }
+ //}
+ //protected void consumeFormalParameter() {
+ // // FormalParameter ::= Type VariableDeclaratorId ==> false
+ // // FormalParameter ::= Modifiers Type VariableDeclaratorId ==> true
+ // /*
+ // astStack :
+ // identifierStack : type identifier
+ // intStack : dim dim
+ // ==>
+ // astStack : Argument
+ // identifierStack :
+ // intStack :
+ // */
+ //
+ // identifierLengthPtr--;
+ // char[] name = identifierStack[identifierPtr];
+ // long namePositions = identifierPositionStack[identifierPtr--];
+ // TypeReference type = getTypeReference(intStack[intPtr--] + intStack[intPtr--]);
+ // intPtr -= 3;
+ // Argument arg =
+ // new Argument(
+ // name,
+ // namePositions,
+ // type,
+ // intStack[intPtr + 1]); // modifiers
+ // pushOnAstStack(arg);
+ // intArrayPtr--;
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeInterfaceDeclaration() {
+ // super.consumeInterfaceDeclaration();
+ // // we know that we have a TypeDeclaration on the top of the astStack
+ // if (isLocalDeclaration()) {
+ // // we ignore the local variable declarations
+ // return;
+ // }
+ // requestor.exitInterface(endStatementPosition, // the '}' is the end of the body
+ // ((TypeDeclaration) astStack[astPtr]).declarationSourceEnd);
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeInterfaceHeader() {
+ // //InterfaceHeader ::= $empty
+ // super.consumeInterfaceHeader();
+ // if (isLocalDeclaration()) {
+ // // we ignore the local variable declarations
+ // intArrayPtr--;
+ // return;
+ // }
+ // TypeDeclaration typeDecl = (TypeDeclaration) astStack[astPtr];
+ // TypeReference[] superInterfaces = typeDecl.superInterfaces;
+ // char[][] interfaceNames = null;
+ // int[] interfaceNameStarts = null;
+ // int[] interfacenameEnds = null;
+ // int superInterfacesLength = 0;
+ // if (superInterfaces != null) {
+ // superInterfacesLength = superInterfaces.length;
+ // interfaceNames = new char[superInterfacesLength][];
+ // interfaceNameStarts = new int[superInterfacesLength];
+ // interfacenameEnds = new int[superInterfacesLength];
+ // }
+ // if (superInterfaces != null) {
+ // for (int i = 0; i < superInterfacesLength; i++) {
+ // TypeReference superInterface = superInterfaces[i];
+ // interfaceNames[i] = CharOperation.concatWith(superInterface.getTypeName(), '.');
+ // interfaceNameStarts[i] = superInterface.sourceStart;
+ // interfacenameEnds[i] = superInterface.sourceEnd;
+ // }
+ // }
+ // // flush the comments related to the interface header
+ // scanner.commentPtr = -1;
+ // requestor.enterInterface(
+ // typeDecl.declarationSourceStart,
+ // intArrayStack[intArrayPtr--],
+ // typeDecl.modifiers,
+ // typeDecl.modifiersSourceStart,
+ // typeStartPosition,
+ // typeDecl.name,
+ // typeDecl.sourceStart,
+ // typeDecl.sourceEnd,
+ // interfaceNames,
+ // interfaceNameStarts,
+ // interfacenameEnds,
+ // scanner.currentPosition - 1);
+ //}
+ //protected void consumeInterfaceHeaderName() {
+ // // InterfaceHeaderName ::= Modifiersopt 'interface' 'Identifier'
+ // TypeDeclaration typeDecl;
+ // if (nestedMethod[nestedType] == 0) {
+ // if (nestedType != 0) {
+ // typeDecl = new MemberTypeDeclaration(this.compilationUnit.compilationResult);
+ // } else {
+ // typeDecl = new TypeDeclaration(this.compilationUnit.compilationResult);
+ // }
+ // } else {
+ // // Record that the block has a declaration for local types
+ // typeDecl = new LocalTypeDeclaration(this.compilationUnit.compilationResult);
+ // markEnclosingMemberWithLocalType();
+ // blockReal();
+ // }
+ //
+ // //highlight the name of the type
+ // long pos = identifierPositionStack[identifierPtr];
+ // typeDecl.sourceEnd = (int) pos;
+ // typeDecl.sourceStart = (int) (pos >>> 32);
+ // typeDecl.name = identifierStack[identifierPtr--];
+ // identifierLengthPtr--;
+ //
+ // //compute the declaration source too
+ // // 'class' and 'interface' push an int position
+ // typeStartPosition = typeDecl.declarationSourceStart = intStack[intPtr--];
+ // intPtr--;
+ // int declarationSourceStart = intStack[intPtr--];
+ // typeDecl.modifiersSourceStart = intStack[intPtr--];
+ // typeDecl.modifiers = intStack[intPtr--];
+ // if (typeDecl.declarationSourceStart > declarationSourceStart) {
+ // typeDecl.declarationSourceStart = declarationSourceStart;
+ // }
+ // typeDecl.bodyStart = typeDecl.sourceEnd + 1;
+ // pushOnAstStack(typeDecl);
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeLocalVariableDeclaration() {
+ // // See consumeLocalVariableDeclarationDefaultModifier() in case of change: duplicated code
+ // // FieldDeclaration ::= Modifiersopt Type VariableDeclarators ';'
+ //
+ // super.consumeLocalVariableDeclaration();
+ // intArrayPtr--;
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeMethodDeclaration(boolean isNotAbstract) {
+ // // MethodDeclaration ::= MethodHeader MethodBody
+ // // AbstractMethodDeclaration ::= MethodHeader ';'
+ // super.consumeMethodDeclaration(isNotAbstract);
+ // if (isLocalDeclaration()) {
+ // // we ignore the local variable declarations
+ // return;
+ // }
+ // MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
+ // requestor.exitMethod(endStatementPosition, md.declarationSourceEnd);
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeMethodHeader() {
+ // // MethodHeader ::= MethodHeaderName MethodHeaderParameters MethodHeaderExtendedDims ThrowsClauseopt
+ // super.consumeMethodHeader();
+ // if (isLocalDeclaration()) {
+ // // we ignore the local variable declarations
+ // intArrayPtr--;
+ // return;
+ // }
+ // MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
+ //
+ // TypeReference returnType = md.returnType;
+ // char[] returnTypeName = returnTypeName(returnType);
+ // Argument[] arguments = md.arguments;
+ // char[][] argumentTypes = null;
+ // char[][] argumentNames = null;
+ // int[] argumentTypeStarts = null;
+ // int[] argumentTypeEnds = null;
+ // int[] argumentNameStarts = null;
+ // int[] argumentNameEnds = null;
+ // if (arguments != null) {
+ // int argumentLength = arguments.length;
+ // argumentTypes = new char[argumentLength][];
+ // argumentNames = new char[argumentLength][];
+ // argumentNameStarts = new int[argumentLength];
+ // argumentNameEnds = new int[argumentLength];
+ // argumentTypeStarts = new int[argumentLength];
+ // argumentTypeEnds = new int[argumentLength];
+ // for (int i = 0; i < argumentLength; i++) {
+ // Argument argument = arguments[i];
+ // TypeReference argumentType = argument.type;
+ // argumentTypes[i] = returnTypeName(argumentType);
+ // argumentNames[i] = argument.name;
+ // argumentNameStarts[i] = argument.sourceStart;
+ // argumentNameEnds[i] = argument.sourceEnd;
+ // argumentTypeStarts[i] = argumentType.sourceStart;
+ // argumentTypeEnds[i] = argumentType.sourceEnd;
+ // }
+ // }
+ // TypeReference[] thrownExceptions = md.thrownExceptions;
+ // char[][] exceptionTypes = null;
+ // int[] exceptionTypeStarts = null;
+ // int[] exceptionTypeEnds = null;
+ // if (thrownExceptions != null) {
+ // int thrownExceptionLength = thrownExceptions.length;
+ // exceptionTypeStarts = new int[thrownExceptionLength];
+ // exceptionTypeEnds = new int[thrownExceptionLength];
+ // exceptionTypes = new char[thrownExceptionLength][];
+ // for (int i = 0; i < thrownExceptionLength; i++) {
+ // TypeReference exception = thrownExceptions[i];
+ // exceptionTypes[i] = CharOperation.concatWith(exception.getTypeName(), '.');
+ // exceptionTypeStarts[i] = exception.sourceStart;
+ // exceptionTypeEnds[i] = exception.sourceEnd;
+ // }
+ // }
+ // requestor
+ // .enterMethod(
+ // md.declarationSourceStart,
+ // intArrayStack[intArrayPtr--],
+ // md.modifiers,
+ // md.modifiersSourceStart,
+ // returnTypeName,
+ // returnType.sourceStart,
+ // returnType.sourceEnd,
+ // typeDims,
+ // md.selector,
+ // md.sourceStart,
+ // (int) (selectorSourcePositions & 0xFFFFFFFFL),
+ // argumentTypes,
+ // argumentTypeStarts,
+ // argumentTypeEnds,
+ // argumentNames,
+ // argumentNameStarts,
+ // argumentNameEnds,
+ // rParenPos,
+ // extendsDim,
+ // extendsDim == 0 ? -1 : endPosition,
+ // exceptionTypes,
+ // exceptionTypeStarts,
+ // exceptionTypeEnds,
+ // scanner.currentPosition - 1);
+ //}
+ //protected void consumeMethodHeaderExtendedDims() {
+ // // MethodHeaderExtendedDims ::= Dimsopt
+ // // now we update the returnType of the method
+ // MethodDeclaration md = (MethodDeclaration) astStack[astPtr];
+ // int extendedDims = intStack[intPtr--];
+ // extendsDim = extendedDims;
+ // if (extendedDims != 0) {
+ // TypeReference returnType = md.returnType;
+ // md.sourceEnd = endPosition;
+ // int dims = returnType.dimensions() + extendedDims;
+ // int baseType;
+ // if ((baseType = identifierLengthStack[identifierLengthPtr + 1]) < 0) {
+ // //it was a baseType
+ // int sourceStart = returnType.sourceStart;
+ // int sourceEnd = returnType.sourceEnd;
+ // returnType = TypeReference.baseTypeReference(-baseType, dims);
+ // returnType.sourceStart = sourceStart;
+ // returnType.sourceEnd = sourceEnd;
+ // md.returnType = returnType;
+ // } else {
+ // md.returnType = this.copyDims(md.returnType, dims);
+ // }
+ // if (currentToken == TokenNameLBRACE) {
+ // md.bodyStart = endPosition + 1;
+ // }
+ // }
+ //}
+ //protected void consumeMethodHeaderName() {
+ // // MethodHeaderName ::= Modifiersopt Type 'Identifier' '('
+ // MethodDeclaration md = new MethodDeclaration(this.compilationUnit.compilationResult);
+ //
+ // //name
+ // md.selector = identifierStack[identifierPtr];
+ // selectorSourcePositions = identifierPositionStack[identifierPtr--];
+ // identifierLengthPtr--;
+ // //type
+ // md.returnType = getTypeReference(typeDims = intStack[intPtr--]);
+ // //modifiers
+ // md.declarationSourceStart = intStack[intPtr--];
+ // md.modifiersSourceStart = intStack[intPtr--];
+ // md.modifiers = intStack[intPtr--];
+ //
+ // //highlight starts at selector start
+ // md.sourceStart = (int) (selectorSourcePositions >>> 32);
+ // pushOnAstStack(md);
+ // md.bodyStart = scanner.currentPosition-1;
+ //}
+ //protected void consumeModifiers() {
+ // checkAnnotation(); // might update modifiers with AccDeprecated
+ // pushOnIntStack(modifiers); // modifiers
+ // pushOnIntStack(modifiersSourceStart);
+ // pushOnIntStack(
+ // declarationSourceStart >= 0 ? declarationSourceStart : modifiersSourceStart);
+ // resetModifiers();
+ //}
+ /**
+ *
+ * INTERNAL USE-ONLY
+ */
+ //protected void consumePackageDeclarationName() {
+ // /* persisting javadoc positions */
+ // pushOnIntArrayStack(this.getJavaDocPositions());
+ //
+ // super.consumePackageDeclarationName();
+ // ImportReference importReference = compilationUnit.currentPackage;
+ //
+ // requestor.acceptPackage(
+ // importReference.declarationSourceStart,
+ // importReference.declarationSourceEnd,
+ // intArrayStack[intArrayPtr--],
+ // CharOperation.concatWith(importReference.getImportName(), '.'),
+ // importReference.sourceStart);
+ //}
+ //protected void consumePushModifiers() {
+ // checkAnnotation(); // might update modifiers with AccDeprecated
+ // pushOnIntStack(modifiers); // modifiers
+ // if (modifiersSourceStart < 0) {
+ // pushOnIntStack(-1);
+ // pushOnIntStack(
+ // declarationSourceStart >= 0 ? declarationSourceStart : scanner.startPosition);
+ // } else {
+ // pushOnIntStack(modifiersSourceStart);
+ // pushOnIntStack(
+ // declarationSourceStart >= 0 ? declarationSourceStart : modifiersSourceStart);
+ // }
+ // resetModifiers();
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeSingleTypeImportDeclarationName() {
+ // // SingleTypeImportDeclarationName ::= 'import' Name
+ //
+ // /* persisting javadoc positions */
+ // pushOnIntArrayStack(this.getJavaDocPositions());
+ //
+ // super.consumeSingleTypeImportDeclarationName();
+ // ImportReference importReference = (ImportReference) astStack[astPtr];
+ // requestor.acceptImport(
+ // importReference.declarationSourceStart,
+ // importReference.declarationSourceEnd,
+ // intArrayStack[intArrayPtr--],
+ // CharOperation.concatWith(importReference.getImportName(), '.'),
+ // importReference.sourceStart,
+ // false);
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeStaticInitializer() {
+ // // StaticInitializer ::= StaticOnly Block
+ // //push an Initializer
+ // //optimize the push/pop
+ // super.consumeStaticInitializer();
+ // Initializer initializer = (Initializer) astStack[astPtr];
+ // requestor.acceptInitializer(
+ // initializer.declarationSourceStart,
+ // initializer.declarationSourceEnd,
+ // intArrayStack[intArrayPtr--],
+ // AccStatic,
+ // intStack[intPtr--],
+ // initializer.block.sourceStart,
+ // initializer.declarationSourceEnd);
+ //}
+ //protected void consumeStaticOnly() {
+ // // StaticOnly ::= 'static'
+ // checkAnnotation(); // might update declaration source start
+ // pushOnIntStack(modifiersSourceStart);
+ // pushOnIntStack(
+ // declarationSourceStart >= 0 ? declarationSourceStart : modifiersSourceStart);
+ // jumpOverMethodBody();
+ // nestedMethod[nestedType]++;
+ // resetModifiers();
+ //}
+ ///**
+ // *
+ // * INTERNAL USE-ONLY
+ // */
+ //protected void consumeTypeImportOnDemandDeclarationName() {
+ // // TypeImportOnDemandDeclarationName ::= 'import' Name '.' '*'
+ //
+ // /* persisting javadoc positions */
+ // pushOnIntArrayStack(this.getJavaDocPositions());
+ //
+ // super.consumeTypeImportOnDemandDeclarationName();
+ // ImportReference importReference = (ImportReference) astStack[astPtr];
+ // requestor.acceptImport(
+ // importReference.declarationSourceStart,
+ // importReference.declarationSourceEnd,
+ // intArrayStack[intArrayPtr--],
+ // CharOperation.concatWith(importReference.getImportName(), '.'),
+ // importReference.sourceStart,
+ // true);
+ //}
+ public CompilationUnitDeclaration endParse(int act) {
+ if (scanner.recordLineSeparator) {
+ requestor.acceptLineSeparatorPositions(scanner.getLineEnds());
+ }
+ return super.endParse(act);
+ }
+
+ /*
+ * Flush annotations defined prior to a given positions.
+ *
+ * Note: annotations are stacked in syntactical order
+ *
+ * Either answer given <position>, or the end position of a comment line immediately following the <position> (same line)
+ *
+ * e.g. void foo(){ } // end of method foo
+ */
+
+ //public int flushAnnotationsDefinedPriorTo(int position) {
+ //
+ // return lastFieldEndPosition = super.flushAnnotationsDefinedPriorTo(position);
+ //}
+ //protected TypeReference getTypeReference(int dim) { /* build a Reference on a variable that may be qualified or not
+ //This variable is a type reference and dim will be its dimensions*/
+ //
+ // int length;
+ // TypeReference ref;
+ // if ((length = identifierLengthStack[identifierLengthPtr--]) == 1) {
+ // // single variable reference
+ // if (dim == 0) {
+ // ref =
+ // new SingleTypeReference(
+ // identifierStack[identifierPtr],
+ // identifierPositionStack[identifierPtr--]);
+ // } else {
+ // ref =
+ // new ArrayTypeReference(
+ // identifierStack[identifierPtr],
+ // dim,
+ // identifierPositionStack[identifierPtr--]);
+ // ref.sourceEnd = endPosition;
+ // }
+ // } else {
+ // if (length < 0) { //flag for precompiled type reference on base types
+ // ref = TypeReference.baseTypeReference(-length, dim);
+ // ref.sourceStart = intStack[intPtr--];
+ // if (dim == 0) {
+ // ref.sourceEnd = intStack[intPtr--];
+ // } else {
+ // intPtr--;
+ // ref.sourceEnd = endPosition;
+ // }
+ // } else { //Qualified variable reference
+ // char[][] tokens = new char[length][];
+ // identifierPtr -= length;
+ // long[] positions = new long[length];
+ // System.arraycopy(identifierStack, identifierPtr + 1, tokens, 0, length);
+ // System.arraycopy(
+ // identifierPositionStack,
+ // identifierPtr + 1,
+ // positions,
+ // 0,
+ // length);
+ // if (dim == 0) {
+ // ref = new QualifiedTypeReference(tokens, positions);
+ // } else {
+ // ref = new ArrayQualifiedTypeReference(tokens, dim, positions);
+ // ref.sourceEnd = endPosition;
+ // }
+ // }
+ // };
+ // return ref;
+ //}
+ public void initialize() {
+ //positionning the parser for a new compilation unit
+ //avoiding stack reallocation and all that....
+ super.initialize(false);
+ intArrayPtr = -1;
+ }
+
+ /**
+ *
+ * INTERNAL USE-ONLY
+ */
+ //private boolean isLocalDeclaration() {
+ // int nestedDepth = nestedType;
+ // while (nestedDepth >= 0) {
+ // if (nestedMethod[nestedDepth] != 0) {
+ // return true;
+ // }
+ // nestedDepth--;
+ // }
+ // return false;
+ //}
+ /*
+ * Investigate one entire unit.
+ */
+ public void parseCompilationUnit(ICompilationUnit unit) {
+ char[] regionSource = unit.getContents();
+ try {
+ initialize();
+ goForCompilationUnit();
+ referenceContext = compilationUnit = new CompilationUnitDeclaration(problemReporter(),
+ new CompilationResult(unit, 0, 0, 10), //this.options.maxProblemsPerUnit),
+ regionSource.length);
+ scanner.resetTo(0, regionSource.length);
+ scanner.setSource(regionSource);
+ parse();
+ } catch (AbortCompilation ex) {
+ }
+ }
+
+ /*
+ * Investigate one constructor declaration.
+ */
+ //public void parseConstructor(char[] regionSource) {
+ // try {
+ // initialize();
+ // goForClassBodyDeclarations();
+ // referenceContext =
+ // compilationUnit =
+ // compilationUnit =
+ // new CompilationUnitDeclaration(
+ // problemReporter(),
+ // new CompilationResult(regionSource, 0, 0, 10), //this.options.maxProblemsPerUnit),
+ // regionSource.length);
+ // scanner.resetTo(0, regionSource.length);
+ // scanner.setSource(regionSource);
+ // parse();
+ // } catch (AbortCompilation ex) {
+ // }
+ //}
+ /*
+ * Investigate one field declaration statement (might have multiple declarations in it).
+ */
+ //public void parseField(char[] regionSource) {
+ // try {
+ // initialize();
+ // goForFieldDeclaration();
+ // referenceContext =
+ // compilationUnit =
+ // compilationUnit =
+ // new CompilationUnitDeclaration(
+ // problemReporter(),
+ // new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
+ // regionSource.length);
+ // scanner.resetTo(0, regionSource.length);
+ // scanner.setSource(regionSource);
+ // parse();
+ // } catch (AbortCompilation ex) {
+ // }
+ //
+ //}
+ ///*
+ // * Investigate one import statement declaration.
+ // */
+ //public void parseImport(char[] regionSource) {
+ // try {
+ // initialize();
+ // goForImportDeclaration();
+ // referenceContext =
+ // compilationUnit =
+ // compilationUnit =
+ // new CompilationUnitDeclaration(
+ // problemReporter(),
+ // new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
+ // regionSource.length);
+ // scanner.resetTo(0, regionSource.length);
+ // scanner.setSource(regionSource);
+ // parse();
+ // } catch (AbortCompilation ex) {
+ // }
+ //
+ //}
+ ///*
+ // * Investigate one initializer declaration.
+ // * regionSource need to content exactly an initializer declaration.
+ // * e.g: static { i = 4; }
+ // * { name = "test"; }
+ // */
+ //public void parseInitializer(char[] regionSource) {
+ // try {
+ // initialize();
+ // goForInitializer();
+ // referenceContext =
+ // compilationUnit =
+ // compilationUnit =
+ // new CompilationUnitDeclaration(
+ // problemReporter(),
+ // new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
+ // regionSource.length);
+ // scanner.resetTo(0, regionSource.length);
+ // scanner.setSource(regionSource);
+ // parse();
+ // } catch (AbortCompilation ex) {
+ // }
+ //
+ //}
+ ///*
+ // * Investigate one method declaration.
+ // */
+ //public void parseMethod(char[] regionSource) {
+ // try {
+ // initialize();
+ // goForGenericMethodDeclaration();
+ // referenceContext =
+ // compilationUnit =
+ // compilationUnit =
+ // new CompilationUnitDeclaration(
+ // problemReporter(),
+ // new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
+ // regionSource.length);
+ // scanner.resetTo(0, regionSource.length);
+ // scanner.setSource(regionSource);
+ // parse();
+ // } catch (AbortCompilation ex) {
+ // }
+ //
+ //}
+ ///*
+ // * Investigate one package statement declaration.
+ // */
+ //public void parsePackage(char[] regionSource) {
+ // try {
+ // initialize();
+ // goForPackageDeclaration();
+ // referenceContext =
+ // compilationUnit =
+ // compilationUnit =
+ // new CompilationUnitDeclaration(
+ // problemReporter(),
+ // new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
+ // regionSource.length);
+ // scanner.resetTo(0, regionSource.length);
+ // scanner.setSource(regionSource);
+ // parse();
+ // } catch (AbortCompilation ex) {
+ // }
+ //
+ //}
+ ///*
+ // * Investigate one type declaration, its fields, methods and member types.
+ // */
+ //public void parseType(char[] regionSource) {
+ // try {
+ // initialize();
+ // goForTypeDeclaration();
+ // referenceContext =
+ // compilationUnit =
+ // compilationUnit =
+ // new CompilationUnitDeclaration(
+ // problemReporter(),
+ // new CompilationResult(regionSource, 0, 0, this.options.maxProblemsPerUnit),
+ // regionSource.length);
+ // scanner.resetTo(0, regionSource.length);
+ // scanner.setSource(regionSource);
+ // parse();
+ // } catch (AbortCompilation ex) {
+ // }
+ //
+ //}
+ /**
+ * 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() {
+ problemReporter.referenceContext = referenceContext;
+ return problemReporter;
+ }
+
+ protected void pushOnIntArrayStack(int[] positions) {
+
+ try {
+ intArrayStack[++intArrayPtr] = positions;
+ } catch (IndexOutOfBoundsException e) {
+ //intPtr is correct
+ int oldStackLength = intArrayStack.length;
+ int oldStack[][] = intArrayStack;
+ intArrayStack = new int[oldStackLength + StackIncrement][];
+ System.arraycopy(oldStack, 0, intArrayStack, 0, oldStackLength);
+ intArrayStack[intArrayPtr] = positions;
+ }
+ }
+
+ //protected void resetModifiers() {
+ // super.resetModifiers();
+ // declarationSourceStart = -1;
+ //}
+ /*
+ * Syntax error was detected. Will attempt to perform some recovery action in order to resume to the regular parse loop.
+ */
+ protected boolean resumeOnSyntaxError() {
+ return false;
+ }
+ /*
+ * Answer a char array representation of the type name formatted like: - type name + dimensions Example: "A[][]".toCharArray()
+ * "java.lang.String".toCharArray()
+ */
+ //private char[] returnTypeName(TypeReference type) {
+ // int dimension = type.dimensions();
+ // if (dimension != 0) {
+ // char[] dimensionsArray = new char[dimension * 2];
+ // for (int i = 0; i < dimension; i++) {
+ // dimensionsArray[i*2] = '[';
+ // dimensionsArray[(i*2) + 1] = ']';
+ // }
+ // return CharOperation.concat(
+ // CharOperation.concatWith(type.getTypeName(), '.'),
+ // dimensionsArray);
+ // }
+ // return CharOperation.concatWith(type.getTypeName(), '.');
+ //}
+ //public String toString() {
+ // StringBuffer buffer = new StringBuffer();
+ // buffer.append("intArrayPtr = " + intArrayPtr + "\n"); //$NON-NLS-1$ //$NON-NLS-2$
+ // buffer.append(super.toString());
+ // return buffer.toString();
+ //}
+ ///**
+ // * INTERNAL USE ONLY
+ // */
+ //protected TypeReference typeReference(
+ // int dim,
+ // int localIdentifierPtr,
+ // int localIdentifierLengthPtr) {
+ // /* build a Reference on a variable that may be qualified or not
+ // * This variable is a type reference and dim will be its dimensions.
+ // * We don't have any side effect on the stacks' pointers.
+ // */
+ //
+ // int length;
+ // TypeReference ref;
+ // if ((length = identifierLengthStack[localIdentifierLengthPtr]) == 1) {
+ // // single variable reference
+ // if (dim == 0) {
+ // ref =
+ // new SingleTypeReference(
+ // identifierStack[localIdentifierPtr],
+ // identifierPositionStack[localIdentifierPtr--]);
+ // } else {
+ // ref =
+ // new ArrayTypeReference(
+ // identifierStack[localIdentifierPtr],
+ // dim,
+ // identifierPositionStack[localIdentifierPtr--]);
+ // ref.sourceEnd = endPosition;
+ // }
+ // } else {
+ // if (length < 0) { //flag for precompiled type reference on base types
+ // ref = TypeReference.baseTypeReference(-length, dim);
+ // ref.sourceStart = intStack[localIntPtr--];
+ // if (dim == 0) {
+ // ref.sourceEnd = intStack[localIntPtr--];
+ // } else {
+ // localIntPtr--;
+ // ref.sourceEnd = endPosition;
+ // }
+ // } else { //Qualified variable reference
+ // char[][] tokens = new char[length][];
+ // localIdentifierPtr -= length;
+ // long[] positions = new long[length];
+ // System.arraycopy(identifierStack, localIdentifierPtr + 1, tokens, 0, length);
+ // System.arraycopy(
+ // identifierPositionStack,
+ // localIdentifierPtr + 1,
+ // positions,
+ // 0,
+ // length);
+ // if (dim == 0)
+ // ref = new QualifiedTypeReference(tokens, positions);
+ // else
+ // ref = new ArrayQualifiedTypeReference(tokens, dim, positions);
+ // }
+ // };
+ // return ref;
+ //}
+}
\ No newline at end of file