X-Git-Url: http://git.phpeclipse.com diff --git a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/DocumentElementParser.java b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/DocumentElementParser.java index 4bf670f..b2f8ef1 100644 --- a/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/DocumentElementParser.java +++ b/net.sourceforge.phpeclipse/src/net/sourceforge/phpdt/internal/compiler/DocumentElementParser.java @@ -1,13 +1,10 @@ -/******************************************************************************* - * 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.IProblem; @@ -18,1298 +15,1290 @@ 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.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 , or the end position of a comment line - * immediately following the (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 (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 , or the end position of a comment line immediately following the (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 (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