<s> package org . eclipse . jdt . internal . codeassist . select ; import org . eclipse . jdt . internal . compiler . * ; import org . eclipse . jdt . internal . compiler . classfmt . ClassFileConstants ; import org . eclipse . jdt . internal . compiler . env . * ; import org . eclipse . jdt . core . compiler . CharOperation ; import org . eclipse . jdt . internal . codeassist . impl . * ; import org . eclipse . jdt . internal . compiler . ast . * ; import org . eclipse . jdt . internal . compiler . lookup . BlockScope ; import org . eclipse . jdt . internal . compiler . lookup . TypeBinding ; import org . eclipse . jdt . internal . compiler . parser . * ; import org . eclipse . jdt . internal . compiler . problem . * ; import org . eclipse . jdt . internal . compiler . util . Util ; public class SelectionParser extends AssistParser { protected static final int SELECTION_PARSER = 1024 ; protected static final int SELECTION_OR_ASSIST_PARSER = ASSIST_PARSER + SELECTION_PARSER ; protected static final int K_BETWEEN_CASE_AND_COLON = SELECTION_PARSER + 1 ; protected static final int K_INSIDE_RETURN_STATEMENT = SELECTION_PARSER + 2 ; protected static final int K_CAST_STATEMENT = SELECTION_PARSER + 3 ; public ASTNode assistNodeParent ; public int selectionStart , selectionEnd ; public static final char [ ] SUPER = "super" . toCharArray ( ) ; public static final char [ ] THIS = "this" . toCharArray ( ) ; public SelectionParser ( ProblemReporter problemReporter ) { super ( problemReporter ) ; this . javadocParser . checkDocComment = true ; } public char [ ] assistIdentifier ( ) { return ( ( SelectionScanner ) this . scanner ) . selectionIdentifier ; } protected void attachOrphanCompletionNode ( ) { if ( this . isOrphanCompletionNode ) { ASTNode orphan = this . assistNode ; this . isOrphanCompletionNode = false ; if ( this . currentElement instanceof RecoveredType ) { RecoveredType recoveredType = ( RecoveredType ) this . currentElement ; if ( recoveredType . foundOpeningBrace ) { if ( orphan instanceof TypeReference ) { this . currentElement = this . currentElement . add ( new SelectionOnFieldType ( ( TypeReference ) orphan ) , 0 ) ; return ; } } } if ( orphan instanceof Expression ) { buildMoreCompletionContext ( ( Expression ) orphan ) ; } else { Statement statement = ( Statement ) orphan ; this . currentElement = this . currentElement . add ( statement , 0 ) ; } this . currentToken = 0 ; } } private void buildMoreCompletionContext ( Expression expression ) { ASTNode parentNode = null ; int kind = topKnownElementKind ( SELECTION_OR_ASSIST_PARSER ) ; if ( kind != 0 ) { int info = topKnownElementInfo ( SELECTION_OR_ASSIST_PARSER ) ; nextElement : switch ( kind ) { case K_BETWEEN_CASE_AND_COLON : if ( this . expressionPtr > 0 ) { SwitchStatement switchStatement = new SwitchStatement ( ) ; switchStatement . expression = this . expressionStack [ this . expressionPtr - 1 ] ; if ( this . astLengthPtr > - 1 && this . astPtr > - 1 ) { int length = this . astLengthStack [ this . astLengthPtr ] ; int newAstPtr = this . astPtr - length ; ASTNode firstNode = this . astStack [ newAstPtr + 1 ] ; if ( length != 0 && firstNode . sourceStart > switchStatement . expression . sourceEnd ) { switchStatement . statements = new Statement [ length + 1 ] ; System . arraycopy ( this . astStack , newAstPtr + 1 , switchStatement . statements , 0 , length ) ; } } CaseStatement caseStatement = new CaseStatement ( expression , expression . sourceStart , expression . sourceEnd ) ; if ( switchStatement . statements == null ) { switchStatement . statements = new Statement [ ] { caseStatement } ; } else { switchStatement . statements [ switchStatement . statements . length - 1 ] = caseStatement ; } parentNode = switchStatement ; this . assistNodeParent = parentNode ; } break nextElement ; case K_INSIDE_RETURN_STATEMENT : if ( info == this . bracketDepth ) { ReturnStatement returnStatement = new ReturnStatement ( expression , expression . sourceStart , expression . sourceEnd ) ; parentNode = returnStatement ; this . assistNodeParent = parentNode ; } break nextElement ; case K_CAST_STATEMENT : Expression castType ; if ( this . expressionPtr > 0 && ( ( castType = this . expressionStack [ this . expressionPtr - 1 ] ) instanceof TypeReference ) ) { CastExpression cast = new CastExpression ( expression , castType ) ; cast . sourceStart = castType . sourceStart ; cast . sourceEnd = expression . sourceEnd ; parentNode = cast ; this . assistNodeParent = parentNode ; } break nextElement ; } } if ( parentNode != null ) { this . currentElement = this . currentElement . add ( ( Statement ) parentNode , 0 ) ; } else { this . currentElement = this . currentElement . add ( ( Statement ) wrapWithExplicitConstructorCallIfNeeded ( expression ) , 0 ) ; if ( this . lastCheckPoint < expression . sourceEnd ) { this . lastCheckPoint = expression . sourceEnd + 1 ; } } } private boolean checkRecoveredType ( ) { if ( this . currentElement instanceof RecoveredType ) { if ( this . indexOfAssistIdentifier ( ) < 0 ) return false ; if ( ( this . lastErrorEndPosition >= this . selectionStart ) && ( this . lastErrorEndPosition <= this . selectionEnd + 1 ) ) { return false ; } RecoveredType recoveredType = ( RecoveredType ) this . currentElement ; if ( recoveredType . foundOpeningBrace ) { this . assistNode = this . getTypeReference ( 0 ) ; this . lastCheckPoint = this . assistNode . sourceEnd + 1 ; this . isOrphanCompletionNode = true ; return true ; } } return false ; } protected void classInstanceCreation ( boolean hasClassBody ) { if ( ( this . astLengthStack [ this . astLengthPtr ] == 1 ) && ( this . astStack [ this . astPtr ] == null ) ) { int index ; if ( ( index = this . indexOfAssistIdentifier ( ) ) < 0 ) { super . classInstanceCreation ( hasClassBody ) ; return ; } else if ( this . identifierLengthPtr > - 1 && ( this . identifierLengthStack [ this . identifierLengthPtr ] - 1 ) != index ) { super . classInstanceCreation ( hasClassBody ) ; return ; } QualifiedAllocationExpression alloc ; this . astPtr -- ; this . astLengthPtr -- ; alloc = new SelectionOnQualifiedAllocationExpression ( ) ; alloc . sourceEnd = this . endPosition ; int length ; if ( ( length = this . expressionLengthStack [ this . expressionLengthPtr -- ] ) != 0 ) { this . expressionPtr -= length ; System . arraycopy ( this . expressionStack , this . expressionPtr + 1 , alloc . arguments = new Expression [ length ] , 0 , length ) ; } char [ ] oldIdent = assistIdentifier ( ) ; setAssistIdentifier ( null ) ; alloc . type = getTypeReference ( 0 ) ; setAssistIdentifier ( oldIdent ) ; alloc . sourceStart = this . intStack [ this . intPtr -- ] ; pushOnExpressionStack ( alloc ) ; this . assistNode = alloc ; this . lastCheckPoint = alloc . sourceEnd + 1 ; if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; } else { super . classInstanceCreation ( hasClassBody ) ; } } protected void consumeArrayCreationExpressionWithoutInitializer ( ) { super . consumeArrayCreationExpressionWithoutInitializer ( ) ; ArrayAllocationExpression alloc = ( ArrayAllocationExpression ) this . expressionStack [ this . expressionPtr ] ; if ( alloc . type == this . assistNode ) { if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; } } protected void consumeArrayCreationExpressionWithInitializer ( ) { super . consumeArrayCreationExpressionWithInitializer ( ) ; ArrayAllocationExpression alloc = ( ArrayAllocationExpression ) this . expressionStack [ this . expressionPtr ] ; if ( alloc . type == this . assistNode ) { if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; } } protected void consumeCastExpressionLL1 ( ) { popElement ( K_CAST_STATEMENT ) ; super . consumeCastExpressionLL1 ( ) ; } protected void consumeCastExpressionWithGenericsArray ( ) { popElement ( K_CAST_STATEMENT ) ; super . consumeCastExpressionWithGenericsArray ( ) ; } protected void consumeCastExpressionWithNameArray ( ) { popElement ( K_CAST_STATEMENT ) ; super . consumeCastExpressionWithNameArray ( ) ; } protected void consumeCastExpressionWithPrimitiveType ( ) { popElement ( K_CAST_STATEMENT ) ; super . consumeCastExpressionWithPrimitiveType ( ) ; } protected void consumeCastExpressionWithQualifiedGenericsArray ( ) { popElement ( K_CAST_STATEMENT ) ; super . consumeCastExpressionWithQualifiedGenericsArray ( ) ; } protected void consumeClassInstanceCreationExpressionQualifiedWithTypeArguments ( ) { QualifiedAllocationExpression alloc ; int length ; if ( ( ( length = this . astLengthStack [ this . astLengthPtr ] ) == 1 ) && ( this . astStack [ this . astPtr ] == null ) ) { if ( this . indexOfAssistIdentifier ( ) < 0 ) { super . consumeClassInstanceCreationExpressionQualifiedWithTypeArguments ( ) ; return ; } this . astPtr -- ; this . astLengthPtr -- ; alloc = new SelectionOnQualifiedAllocationExpression ( ) ; alloc . sourceEnd = this . endPosition ; if ( ( length = this . expressionLengthStack [ this . expressionLengthPtr -- ] ) != 0 ) { this . expressionPtr -= length ; System . arraycopy ( this . expressionStack , this . expressionPtr + 1 , alloc . arguments = new Expression [ length ] , 0 , length ) ; } char [ ] oldIdent = assistIdentifier ( ) ; setAssistIdentifier ( null ) ; alloc . type = getTypeReference ( 0 ) ; setAssistIdentifier ( oldIdent ) ; length = this . genericsLengthStack [ this . genericsLengthPtr -- ] ; this . genericsPtr -= length ; System . arraycopy ( this . genericsStack , this . genericsPtr + 1 , alloc . typeArguments = new TypeReference [ length ] , 0 , length ) ; this . intPtr -- ; alloc . sourceStart = this . intStack [ this . intPtr -- ] ; pushOnExpressionStack ( alloc ) ; this . assistNode = alloc ; this . lastCheckPoint = alloc . sourceEnd + 1 ; if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; } else { super . consumeClassInstanceCreationExpressionQualifiedWithTypeArguments ( ) ; } this . expressionLengthPtr -- ; QualifiedAllocationExpression qae = ( QualifiedAllocationExpression ) this . expressionStack [ this . expressionPtr -- ] ; qae . enclosingInstance = this . expressionStack [ this . expressionPtr ] ; this . expressionStack [ this . expressionPtr ] = qae ; qae . sourceStart = qae . enclosingInstance . sourceStart ; } protected void consumeClassInstanceCreationExpressionWithTypeArguments ( ) { AllocationExpression alloc ; int length ; if ( ( ( length = this . astLengthStack [ this . astLengthPtr ] ) == 1 ) && ( this . astStack [ this . astPtr ] == null ) ) { if ( this . indexOfAssistIdentifier ( ) < 0 ) { super . consumeClassInstanceCreationExpressionWithTypeArguments ( ) ; return ; } this . astPtr -- ; this . astLengthPtr -- ; alloc = new SelectionOnQualifiedAllocationExpression ( ) ; alloc . sourceEnd = this . endPosition ; if ( ( length = this . expressionLengthStack [ this . expressionLengthPtr -- ] ) != 0 ) { this . expressionPtr -= length ; System . arraycopy ( this . expressionStack , this . expressionPtr + 1 , alloc . arguments = new Expression [ length ] , 0 , length ) ; } char [ ] oldIdent = assistIdentifier ( ) ; setAssistIdentifier ( null ) ; alloc . type = getTypeReference ( 0 ) ; setAssistIdentifier ( oldIdent ) ; length = this . genericsLengthStack [ this . genericsLengthPtr -- ] ; this . genericsPtr -= length ; System . arraycopy ( this . genericsStack , this . genericsPtr + 1 , alloc . typeArguments = new TypeReference [ length ] , 0 , length ) ; this . intPtr -- ; alloc . sourceStart = this . intStack [ this . intPtr -- ] ; pushOnExpressionStack ( alloc ) ; this . assistNode = alloc ; this . lastCheckPoint = alloc . sourceEnd + 1 ; if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; } else { super . consumeClassInstanceCreationExpressionWithTypeArguments ( ) ; } } protected void consumeEnterAnonymousClassBody ( boolean qualified ) { if ( this . indexOfAssistIdentifier ( ) < 0 ) { super . consumeEnterAnonymousClassBody ( qualified ) ; return ; } char [ ] oldIdent = assistIdentifier ( ) ; setAssistIdentifier ( null ) ; TypeReference typeReference = getTypeReference ( 0 ) ; setAssistIdentifier ( oldIdent ) ; TypeDeclaration anonymousType = new TypeDeclaration ( this . compilationUnit . compilationResult ) ; anonymousType . name = CharOperation . NO_CHAR ; anonymousType . bits |= ( ASTNode . IsAnonymousType | ASTNode . IsLocalType ) ; QualifiedAllocationExpression alloc = new SelectionOnQualifiedAllocationExpression ( anonymousType ) ; markEnclosingMemberWithLocalType ( ) ; pushOnAstStack ( anonymousType ) ; alloc . sourceEnd = this . rParenPos ; int argumentLength ; if ( ( argumentLength = this . expressionLengthStack [ this . expressionLengthPtr -- ] ) != 0 ) { this . expressionPtr -= argumentLength ; System . arraycopy ( this . expressionStack , this . expressionPtr + 1 , alloc . arguments = new Expression [ argumentLength ] , 0 , argumentLength ) ; } if ( qualified ) { this . expressionLengthPtr -- ; alloc . enclosingInstance = this . expressionStack [ this . expressionPtr -- ] ; } alloc . type = typeReference ; anonymousType . sourceEnd = alloc . sourceEnd ; anonymousType . sourceStart = anonymousType . declarationSourceStart = alloc . type . sourceStart ; alloc . sourceStart = this . intStack [ this . intPtr -- ] ; pushOnExpressionStack ( alloc ) ; this . assistNode = alloc ; this . lastCheckPoint = alloc . sourceEnd + 1 ; if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; this . currentToken = 0 ; this . hasReportedError = true ; } anonymousType . bodyStart = this . scanner . currentPosition ; this . listLength = 0 ; if ( this . currentElement != null ) { this . lastCheckPoint = anonymousType . bodyStart ; this . currentElement = this . currentElement . add ( anonymousType , 0 ) ; this . currentToken = 0 ; this . lastIgnoredToken = - 1 ; } } protected void consumeEnterVariable ( ) { super . consumeEnterVariable ( ) ; AbstractVariableDeclaration variable = ( AbstractVariableDeclaration ) this . astStack [ this . astPtr ] ; if ( variable . type == this . assistNode ) { if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = false ; } } protected void consumeExitVariableWithInitialization ( ) { super . consumeExitVariableWithInitialization ( ) ; AbstractVariableDeclaration variable = ( AbstractVariableDeclaration ) this . astStack [ this . astPtr ] ; int start = variable . initialization . sourceStart ; int end = variable . initialization . sourceEnd ; if ( ( this . selectionStart < start ) && ( this . selectionEnd < start ) || ( this . selectionStart > end ) && ( this . selectionEnd > end ) ) { variable . initialization = null ; } } protected void consumeFieldAccess ( boolean isSuperAccess ) { if ( this . indexOfAssistIdentifier ( ) < 0 ) { super . consumeFieldAccess ( isSuperAccess ) ; return ; } FieldReference fieldReference = new SelectionOnFieldReference ( this . identifierStack [ this . identifierPtr ] , this . identifierPositionStack [ this . identifierPtr -- ] ) ; this . identifierLengthPtr -- ; if ( isSuperAccess ) { fieldReference . sourceStart = this . intStack [ this . intPtr -- ] ; fieldReference . receiver = new SuperReference ( fieldReference . sourceStart , this . endPosition ) ; pushOnExpressionStack ( fieldReference ) ; } else { if ( ( fieldReference . receiver = this . expressionStack [ this . expressionPtr ] ) . isThis ( ) ) { fieldReference . sourceStart = fieldReference . receiver . sourceStart ; } this . expressionStack [ this . expressionPtr ] = fieldReference ; } this . assistNode = fieldReference ; this . lastCheckPoint = fieldReference . sourceEnd + 1 ; if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; } protected void consumeFormalParameter ( boolean isVarArgs ) { if ( this . indexOfAssistIdentifier ( ) < 0 ) { super . consumeFormalParameter ( isVarArgs ) ; if ( ( ! this . diet || this . dietInt != 0 ) && this . astPtr > - 1 ) { Argument argument = ( Argument ) this . astStack [ this . astPtr ] ; if ( argument . type == this . assistNode ) { this . isOrphanCompletionNode = true ; this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } } } else { this . identifierLengthPtr -- ; char [ ] identifierName = this . identifierStack [ this . identifierPtr ] ; long namePositions = this . identifierPositionStack [ this . identifierPtr -- ] ; int extendedDimensions = this . intStack [ this . intPtr -- ] ; int endOfEllipsis = 0 ; if ( isVarArgs ) { endOfEllipsis = this . intStack [ this . intPtr -- ] ; } int firstDimensions = this . intStack [ this . intPtr -- ] ; final int typeDimensions = firstDimensions + extendedDimensions ; TypeReference type = getTypeReference ( typeDimensions ) ; if ( isVarArgs ) { type = copyDims ( type , typeDimensions + 1 ) ; if ( extendedDimensions == 0 ) { type . sourceEnd = endOfEllipsis ; } type . bits |= ASTNode . IsVarArgs ; } int modifierPositions = this . intStack [ this . intPtr -- ] ; this . intPtr -- ; Argument arg = new SelectionOnArgumentName ( identifierName , namePositions , type , this . intStack [ this . intPtr + 1 ] & ~ ClassFileConstants . AccDeprecated ) ; arg . declarationSourceStart = modifierPositions ; int length ; if ( ( length = this . expressionLengthStack [ this . expressionLengthPtr -- ] ) != 0 ) { System . arraycopy ( this . expressionStack , ( this . expressionPtr -= length ) + 1 , arg . annotations = new Annotation [ length ] , 0 , length ) ; } pushOnAstStack ( arg ) ; this . assistNode = arg ; this . lastCheckPoint = ( int ) namePositions ; this . isOrphanCompletionNode = true ; if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . listLength ++ ; } } protected void consumeInsideCastExpression ( ) { super . consumeInsideCastExpression ( ) ; pushOnElementStack ( K_CAST_STATEMENT ) ; } protected void consumeInsideCastExpressionLL1 ( ) { super . consumeInsideCastExpressionLL1 ( ) ; pushOnElementStack ( K_CAST_STATEMENT ) ; } protected void consumeInsideCastExpressionWithQualifiedGenerics ( ) { super . consumeInsideCastExpressionWithQualifiedGenerics ( ) ; pushOnElementStack ( K_CAST_STATEMENT ) ; } protected void consumeInstanceOfExpression ( ) { if ( indexOfAssistIdentifier ( ) < 0 ) { super . consumeInstanceOfExpression ( ) ; } else { getTypeReference ( this . intStack [ this . intPtr -- ] ) ; this . isOrphanCompletionNode = true ; this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } } protected void consumeInstanceOfExpressionWithName ( ) { if ( indexOfAssistIdentifier ( ) < 0 ) { super . consumeInstanceOfExpressionWithName ( ) ; } else { getTypeReference ( this . intStack [ this . intPtr -- ] ) ; this . isOrphanCompletionNode = true ; this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } } protected void consumeLocalVariableDeclarationStatement ( ) { super . consumeLocalVariableDeclarationStatement ( ) ; if ( ! this . diet ) { LocalDeclaration localDeclaration = ( LocalDeclaration ) this . astStack [ this . astPtr ] ; if ( ( this . selectionStart >= localDeclaration . sourceStart ) && ( this . selectionEnd <= localDeclaration . sourceEnd ) ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } } } protected void consumeMarkerAnnotation ( ) { int index ; if ( ( index = this . indexOfAssistIdentifier ( ) ) < 0 ) { super . consumeMarkerAnnotation ( ) ; return ; } MarkerAnnotation markerAnnotation = null ; int length = this . identifierLengthStack [ this . identifierLengthPtr ] ; TypeReference typeReference ; char [ ] [ ] subset = identifierSubSet ( index ) ; this . identifierLengthPtr -- ; this . identifierPtr -= length ; long [ ] positions = new long [ length ] ; System . arraycopy ( this . identifierPositionStack , this . identifierPtr + 1 , positions , 0 , length ) ; if ( index == 0 ) { typeReference = createSingleAssistTypeReference ( assistIdentifier ( ) , positions [ 0 ] ) ; } else { typeReference = createQualifiedAssistTypeReference ( subset , assistIdentifier ( ) , positions ) ; } this . assistNode = typeReference ; this . lastCheckPoint = typeReference . sourceEnd + 1 ; markerAnnotation = new MarkerAnnotation ( typeReference , this . intStack [ this . intPtr -- ] ) ; markerAnnotation . declarationSourceEnd = markerAnnotation . sourceEnd ; pushOnExpressionStack ( markerAnnotation ) ; } protected void consumeMemberValuePair ( ) { if ( this . indexOfAssistIdentifier ( ) < 0 ) { super . consumeMemberValuePair ( ) ; return ; } char [ ] simpleName = this . identifierStack [ this . identifierPtr ] ; long position = this . identifierPositionStack [ this . identifierPtr -- ] ; this . identifierLengthPtr -- ; int end = ( int ) position ; int start = ( int ) ( position >>> 32 ) ; Expression value = this . expressionStack [ this . expressionPtr -- ] ; this . expressionLengthPtr -- ; MemberValuePair memberValuePair = new SelectionOnNameOfMemberValuePair ( simpleName , start , end , value ) ; pushOnAstStack ( memberValuePair ) ; this . assistNode = memberValuePair ; this . lastCheckPoint = memberValuePair . sourceEnd + 1 ; } protected void consumeMethodInvocationName ( ) { char [ ] selector = this . identifierStack [ this . identifierPtr ] ; int accessMode ; if ( selector == assistIdentifier ( ) ) { if ( CharOperation . equals ( selector , SUPER ) ) { accessMode = ExplicitConstructorCall . Super ; } else if ( CharOperation . equals ( selector , THIS ) ) { accessMode = ExplicitConstructorCall . This ; } else { super . consumeMethodInvocationName ( ) ; return ; } } else { super . consumeMethodInvocationName ( ) ; return ; } final ExplicitConstructorCall constructorCall = new SelectionOnExplicitConstructorCall ( accessMode ) ; constructorCall . sourceEnd = this . rParenPos ; constructorCall . sourceStart = ( int ) ( this . identifierPositionStack [ this . identifierPtr ] >>> 32 ) ; int length ; if ( ( length = this . expressionLengthStack [ this . expressionLengthPtr -- ] ) != 0 ) { this . expressionPtr -= length ; System . arraycopy ( this . expressionStack , this . expressionPtr + 1 , constructorCall . arguments = new Expression [ length ] , 0 , length ) ; } if ( ! this . diet ) { pushOnAstStack ( constructorCall ) ; this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } else { pushOnExpressionStack ( new Expression ( ) { public TypeBinding resolveType ( BlockScope scope ) { constructorCall . resolve ( scope ) ; return null ; } public StringBuffer printExpression ( int indent , StringBuffer output ) { return output ; } } ) ; } this . assistNode = constructorCall ; this . lastCheckPoint = constructorCall . sourceEnd + 1 ; this . isOrphanCompletionNode = true ; } protected void consumeMethodInvocationPrimary ( ) { char [ ] selector = this . identifierStack [ this . identifierPtr ] ; int accessMode ; if ( selector == assistIdentifier ( ) ) { if ( CharOperation . equals ( selector , SUPER ) ) { accessMode = ExplicitConstructorCall . Super ; } else if ( CharOperation . equals ( selector , THIS ) ) { accessMode = ExplicitConstructorCall . This ; } else { super . consumeMethodInvocationPrimary ( ) ; return ; } } else { super . consumeMethodInvocationPrimary ( ) ; return ; } final ExplicitConstructorCall constructorCall = new SelectionOnExplicitConstructorCall ( accessMode ) ; constructorCall . sourceEnd = this . rParenPos ; int length ; if ( ( length = this . expressionLengthStack [ this . expressionLengthPtr -- ] ) != 0 ) { this . expressionPtr -= length ; System . arraycopy ( this . expressionStack , this . expressionPtr + 1 , constructorCall . arguments = new Expression [ length ] , 0 , length ) ; } constructorCall . qualification = this . expressionStack [ this . expressionPtr -- ] ; constructorCall . sourceStart = constructorCall . qualification . sourceStart ; if ( ! this . diet ) { pushOnAstStack ( constructorCall ) ; this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } else { pushOnExpressionStack ( new Expression ( ) { public TypeBinding resolveType ( BlockScope scope ) { constructorCall . resolve ( scope ) ; return null ; } public StringBuffer printExpression ( int indent , StringBuffer output ) { return output ; } } ) ; } this . assistNode = constructorCall ; this . lastCheckPoint = constructorCall . sourceEnd + 1 ; this . isOrphanCompletionNode = true ; } protected void consumeNormalAnnotation ( ) { int index ; if ( ( index = this . indexOfAssistIdentifier ( ) ) < 0 ) { super . consumeNormalAnnotation ( ) ; return ; } NormalAnnotation normalAnnotation = null ; int length = this . identifierLengthStack [ this . identifierLengthPtr ] ; TypeReference typeReference ; char [ ] [ ] subset = identifierSubSet ( index ) ; this . identifierLengthPtr -- ; this . identifierPtr -= length ; long [ ] positions = new long [ length ] ; System . arraycopy ( this . identifierPositionStack , this . identifierPtr + 1 , positions , 0 , length ) ; if ( index == 0 ) { typeReference = createSingleAssistTypeReference ( assistIdentifier ( ) , positions [ 0 ] ) ; } else { typeReference = createQualifiedAssistTypeReference ( subset , assistIdentifier ( ) , positions ) ; } this . assistNode = typeReference ; this . lastCheckPoint = typeReference . sourceEnd + 1 ; normalAnnotation = new NormalAnnotation ( typeReference , this . intStack [ this . intPtr -- ] ) ; if ( ( length = this . astLengthStack [ this . astLengthPtr -- ] ) != 0 ) { System . arraycopy ( this . astStack , ( this . astPtr -= length ) + 1 , normalAnnotation . memberValuePairs = new MemberValuePair [ length ] , 0 , length ) ; } normalAnnotation . declarationSourceEnd = this . rParenPos ; pushOnExpressionStack ( normalAnnotation ) ; } protected void consumeSingleMemberAnnotation ( ) { int index ; if ( ( index = this . indexOfAssistIdentifier ( ) ) < 0 ) { super . consumeSingleMemberAnnotation ( ) ; return ; } SingleMemberAnnotation singleMemberAnnotation = null ; int length = this . identifierLengthStack [ this . identifierLengthPtr ] ; TypeReference typeReference ; char [ ] [ ] subset = identifierSubSet ( index ) ; this . identifierLengthPtr -- ; this . identifierPtr -= length ; long [ ] positions = new long [ length ] ; System . arraycopy ( this . identifierPositionStack , this . identifierPtr + 1 , positions , 0 , length ) ; if ( index == 0 ) { typeReference = createSingleAssistTypeReference ( assistIdentifier ( ) , positions [ 0 ] ) ; } else { typeReference = createQualifiedAssistTypeReference ( subset , assistIdentifier ( ) , positions ) ; } this . assistNode = typeReference ; this . lastCheckPoint = typeReference . sourceEnd + 1 ; singleMemberAnnotation = new SingleMemberAnnotation ( typeReference , this . intStack [ this . intPtr -- ] ) ; singleMemberAnnotation . memberValue = this . expressionStack [ this . expressionPtr -- ] ; this . expressionLengthPtr -- ; singleMemberAnnotation . declarationSourceEnd = this . rParenPos ; pushOnExpressionStack ( singleMemberAnnotation ) ; } protected void consumeStaticImportOnDemandDeclarationName ( ) { int index ; if ( ( index = indexOfAssistIdentifier ( ) ) < 0 ) { super . consumeStaticImportOnDemandDeclarationName ( ) ; return ; } int length = this . identifierLengthStack [ this . identifierLengthPtr ] ; char [ ] [ ] subset = identifierSubSet ( index + 1 ) ; this . identifierLengthPtr -- ; this . identifierPtr -= length ; long [ ] positions = new long [ length ] ; System . arraycopy ( this . identifierPositionStack , this . identifierPtr + 1 , positions , 0 , length ) ; ImportReference reference = createAssistImportReference ( subset , positions , ClassFileConstants . AccStatic ) ; reference . bits |= ASTNode . OnDemand ; this . assistNode = reference ; this . lastCheckPoint = reference . sourceEnd + 1 ; pushOnAstStack ( reference ) ; if ( this . currentToken == TokenNameSEMICOLON ) { reference . declarationSourceEnd = this . scanner . currentPosition - 1 ; } else { reference . declarationSourceEnd = ( int ) positions [ length - 1 ] ; } reference . declarationSourceStart = this . intStack [ this . intPtr -- ] ; reference . declarationSourceEnd = flushCommentsDefinedPriorTo ( reference . declarationSourceEnd ) ; if ( this . currentElement != null ) { this . lastCheckPoint = reference . declarationSourceEnd + 1 ; this . currentElement = this . currentElement . add ( reference , 0 ) ; this . lastIgnoredToken = - 1 ; this . restartRecovery = true ; } } protected void consumeToken ( int token ) { super . consumeToken ( token ) ; if ( isInsideMethod ( ) || isInsideFieldInitialization ( ) ) { switch ( token ) { case TokenNamecase : pushOnElementStack ( K_BETWEEN_CASE_AND_COLON ) ; break ; case TokenNameCOLON : if ( topKnownElementKind ( SELECTION_OR_ASSIST_PARSER ) == K_BETWEEN_CASE_AND_COLON ) { popElement ( K_BETWEEN_CASE_AND_COLON ) ; } break ; case TokenNamereturn : pushOnElementStack ( K_INSIDE_RETURN_STATEMENT , this . bracketDepth ) ; break ; case TokenNameSEMICOLON : switch ( topKnownElementKind ( SELECTION_OR_ASSIST_PARSER ) ) { case K_INSIDE_RETURN_STATEMENT : if ( topKnownElementInfo ( SELECTION_OR_ASSIST_PARSER ) == this . bracketDepth ) { popElement ( K_INSIDE_RETURN_STATEMENT ) ; } break ; } break ; } } } protected void consumeTypeImportOnDemandDeclarationName ( ) { int index ; if ( ( index = indexOfAssistIdentifier ( ) ) < 0 ) { super . consumeTypeImportOnDemandDeclarationName ( ) ; return ; } int length = this . identifierLengthStack [ this . identifierLengthPtr ] ; char [ ] [ ] subset = identifierSubSet ( index + 1 ) ; this . identifierLengthPtr -- ; this . identifierPtr -= length ; long [ ] positions = new long [ length ] ; System . arraycopy ( this . identifierPositionStack , this . identifierPtr + 1 , positions , 0 , length ) ; ImportReference reference = createAssistImportReference ( subset , positions , ClassFileConstants . AccDefault ) ; reference . bits |= ASTNode . OnDemand ; this . assistNode = reference ; this . lastCheckPoint = reference . sourceEnd + 1 ; pushOnAstStack ( reference ) ; if ( this . currentToken == TokenNameSEMICOLON ) { reference . declarationSourceEnd = this . scanner . currentPosition - 1 ; } else { reference . declarationSourceEnd = ( int ) positions [ length - 1 ] ; } reference . declarationSourceStart = this . intStack [ this . intPtr -- ] ; reference . declarationSourceEnd = flushCommentsDefinedPriorTo ( reference . declarationSourceEnd ) ; if ( this . currentElement != null ) { this . lastCheckPoint = reference . declarationSourceEnd + 1 ; this . currentElement = this . currentElement . add ( reference , 0 ) ; this . lastIgnoredToken = - 1 ; this . restartRecovery = true ; } } public ImportReference createAssistImportReference ( char [ ] [ ] tokens , long [ ] positions , int mod ) { return new SelectionOnImportReference ( tokens , positions , mod ) ; } public ImportReference createAssistPackageReference ( char [ ] [ ] tokens , long [ ] positions ) { return new SelectionOnPackageReference ( tokens , positions ) ; } protected JavadocParser createJavadocParser ( ) { return new SelectionJavadocParser ( this ) ; } protected LocalDeclaration createLocalDeclaration ( char [ ] assistName , int sourceStart , int sourceEnd ) { if ( this . indexOfAssistIdentifier ( ) < 0 ) { return super . createLocalDeclaration ( assistName , sourceStart , sourceEnd ) ; } else { SelectionOnLocalName local = new SelectionOnLocalName ( assistName , sourceStart , sourceEnd ) ; this . assistNode = local ; this . lastCheckPoint = sourceEnd + 1 ; return local ; } } public NameReference createQualifiedAssistNameReference ( char [ ] [ ] previousIdentifiers , char [ ] assistName , long [ ] positions ) { return new SelectionOnQualifiedNameReference ( previousIdentifiers , assistName , positions ) ; } public TypeReference createQualifiedAssistTypeReference ( char [ ] [ ] previousIdentifiers , char [ ] assistName , long [ ] positions ) { return new SelectionOnQualifiedTypeReference ( previousIdentifiers , assistName , positions ) ; } public TypeReference createParameterizedQualifiedAssistTypeReference ( char [ ] [ ] tokens , TypeReference [ ] [ ] typeArguments , char [ ] assistname , TypeReference [ ] assistTypeArguments , long [ ] positions ) { return new SelectionOnParameterizedQualifiedTypeReference ( tokens , assistname , typeArguments , assistTypeArguments , positions ) ; } public NameReference createSingleAssistNameReference ( char [ ] assistName , long position ) { return new SelectionOnSingleNameReference ( assistName , position ) ; } public TypeReference createSingleAssistTypeReference ( char [ ] assistName , long position ) { return new SelectionOnSingleTypeReference ( assistName , position ) ; } public TypeReference createParameterizedSingleAssistTypeReference ( TypeReference [ ] typeArguments , char [ ] assistName , long position ) { return new SelectionOnParameterizedSingleTypeReference ( assistName , typeArguments , position ) ; } public CompilationUnitDeclaration dietParse ( ICompilationUnit sourceUnit , CompilationResult compilationResult , int start , int end ) { this . selectionStart = start ; this . selectionEnd = end ; SelectionScanner selectionScanner = ( SelectionScanner ) this . scanner ; selectionScanner . selectionIdentifier = null ; selectionScanner . selectionStart = start ; selectionScanner . selectionEnd = end ; return this . dietParse ( sourceUnit , compilationResult ) ; } protected NameReference getUnspecifiedReference ( ) { int completionIndex ; if ( ( completionIndex = indexOfAssistIdentifier ( ) ) < 0 ) { return super . getUnspecifiedReference ( ) ; } int length = this . identifierLengthStack [ this . identifierLengthPtr ] ; if ( CharOperation . equals ( assistIdentifier ( ) , SUPER ) ) { Reference reference ; if ( completionIndex > 0 ) { this . identifierLengthStack [ this . identifierLengthPtr ] = completionIndex ; int ptr = this . identifierPtr -= ( length - completionIndex ) ; pushOnGenericsLengthStack ( 0 ) ; pushOnGenericsIdentifiersLengthStack ( this . identifierLengthStack [ this . identifierLengthPtr ] ) ; reference = new SelectionOnQualifiedSuperReference ( getTypeReference ( 0 ) , ( int ) ( this . identifierPositionStack [ ptr + 1 ] >>> 32 ) , ( int ) this . identifierPositionStack [ ptr + 1 ] ) ; } else { this . identifierPtr -= length ; this . identifierLengthPtr -- ; reference = new SelectionOnSuperReference ( ( int ) ( this . identifierPositionStack [ this . identifierPtr + 1 ] >>> 32 ) , ( int ) this . identifierPositionStack [ this . identifierPtr + 1 ] ) ; } pushOnAstStack ( reference ) ; this . assistNode = reference ; this . lastCheckPoint = reference . sourceEnd + 1 ; if ( ! this . diet || this . dietInt != 0 ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; return new SingleNameReference ( CharOperation . NO_CHAR , 0 ) ; } NameReference nameReference ; char [ ] [ ] subset = identifierSubSet ( completionIndex ) ; this . identifierLengthPtr -- ; this . identifierPtr -= length ; long [ ] positions = new long [ length ] ; System . arraycopy ( this . identifierPositionStack , this . identifierPtr + 1 , positions , 0 , length ) ; if ( completionIndex == 0 ) { nameReference = createSingleAssistNameReference ( assistIdentifier ( ) , positions [ 0 ] ) ; } else { nameReference = createQualifiedAssistNameReference ( subset , assistIdentifier ( ) , positions ) ; } this . assistNode = nameReference ; this . lastCheckPoint = nameReference . sourceEnd + 1 ; if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; return nameReference ; } protected NameReference getUnspecifiedReferenceOptimized ( ) { int index = indexOfAssistIdentifier ( ) ; NameReference reference = super . getUnspecifiedReferenceOptimized ( ) ; if ( index >= 0 ) { if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; } return reference ; } public void initializeScanner ( ) { this . scanner = new SelectionScanner ( this . options . sourceLevel ) ; } protected MessageSend newMessageSend ( ) { char [ ] selector = this . identifierStack [ this . identifierPtr ] ; if ( selector != assistIdentifier ( ) ) { return super . newMessageSend ( ) ; } MessageSend messageSend = new SelectionOnMessageSend ( ) ; int length ; if ( ( length = this . expressionLengthStack [ this . expressionLengthPtr -- ] ) != 0 ) { this . expressionPtr -= length ; System . arraycopy ( this . expressionStack , this . expressionPtr + 1 , messageSend . arguments = new Expression [ length ] , 0 , length ) ; } this . assistNode = messageSend ; if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; return messageSend ; } protected MessageSend newMessageSendWithTypeArguments ( ) { char [ ] selector = this . identifierStack [ this . identifierPtr ] ; if ( selector != assistIdentifier ( ) ) { return super . newMessageSendWithTypeArguments ( ) ; } MessageSend messageSend = new SelectionOnMessageSend ( ) ; int length ; if ( ( length = this . expressionLengthStack [ this . expressionLengthPtr -- ] ) != 0 ) { this . expressionPtr -= length ; System . arraycopy ( this . expressionStack , this . expressionPtr + 1 , messageSend . arguments = new Expression [ length ] , 0 , length ) ; } this . assistNode = messageSend ; if ( ! this . diet ) { this . restartRecovery = true ; this . lastIgnoredToken = - 1 ; } this . isOrphanCompletionNode = true ; return messageSend ; } public CompilationUnitDeclaration parse ( ICompilationUnit sourceUnit , CompilationResult compilationResult , int start , int end ) { if ( end == - 1 ) return super . parse ( sourceUnit , compilationResult , start , end ) ; this . selectionStart = start ; this . selectionEnd = end ; SelectionScanner selectionScanner = ( SelectionScanner ) this . scanner ; selectionScanner . selectionIdentifier = null ; selectionScanner . selectionStart = start ; selectionScanner . selectionEnd = end ; return super . parse ( sourceUnit , compilationResult , - 1 , - 1 ) ; } protected boolean resumeAfterRecovery ( ) { if ( this . assistNode != null && ! ( this . referenceContext instanceof CompilationUnitDeclaration ) ) { this . currentElement . preserveEnclosingBlocks ( ) ; if ( this . currentElement . enclosingType ( ) == null ) { if ( ! ( this . currentElement instanceof RecoveredType ) ) { resetStacks ( ) ; return false ; } RecoveredType recoveredType = ( RecoveredType ) this . currentElement ; if ( recoveredType . typeDeclaration != null && recoveredType . typeDeclaration . allocation == this . assistNode ) { resetStacks ( ) ; return false ; } } } return super . resumeAfterRecovery ( ) ; } public void selectionIdentifierCheck ( ) { if ( checkRecoveredType ( ) ) return ; } public void setAssistIdentifier ( char [ ] assistIdent ) { ( ( SelectionScanner ) this . scanner ) . selectionIdentifier = assistIdent ; } protected void updateRecoveryState ( ) { this . currentElement . updateFromParserState ( ) ; selectionIdentifierCheck ( ) ; attachOrphanCompletionNode ( ) ; if ( this . assistNode != null && this . currentElement != null ) { this . currentElement . preserveEnclosingBlocks ( ) ; } recoveryTokenCheck ( ) ; } public String toString ( ) { String s = Util . EMPTY_STRING ; s = s + "" ; for ( int i = 0 ; i <= this . elementPtr ; i ++ ) { s = s + String . valueOf ( this . elementKindStack [ i ] ) + "," ; } s = s + "}n" ; s = s + "" ; for ( int i = 0 ; i <= this . elementPtr ; i ++ ) { s = s + String . valueOf ( this . elementInfoStack [ i ] ) + "," ; } s = s + "}n" ; return s + super . toString ( ) ; } } </s>