| /******************************************************************************* |
| * Copyright (c) 2000, 2015 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.internal.codeassist.complete; |
| |
| import org.eclipse.jdt.internal.compiler.*; |
| import org.eclipse.jdt.internal.compiler.ast.*; |
| import org.eclipse.jdt.internal.compiler.lookup.*; |
| |
| /** |
| * Detect the presence of a node in expression |
| */ |
| public class CompletionNodeDetector extends ASTVisitor { |
| private ASTNode searchedNode; |
| private ASTNode parent; |
| private boolean result; |
| |
| public CompletionNodeDetector(ASTNode searchedNode, ASTNode visitedAst){ |
| this.searchedNode = searchedNode; |
| this.result = false; |
| |
| if(searchedNode != null && visitedAst != null) { |
| visitedAst.traverse(this, null); |
| } |
| } |
| |
| public boolean containsCompletionNode() { |
| return this.result; |
| } |
| |
| public ASTNode getCompletionNodeParent() { |
| return this.parent; |
| } |
| public void endVisit(AllocationExpression allocationExpression, BlockScope scope) { |
| endVisit(allocationExpression); |
| } |
| public void endVisit(AND_AND_Expression and_and_Expression, BlockScope scope) { |
| endVisit(and_and_Expression); |
| } |
| public void endVisit(ArrayAllocationExpression arrayAllocationExpression, BlockScope scope) { |
| endVisit(arrayAllocationExpression); |
| } |
| public void endVisit(ArrayInitializer arrayInitializer, BlockScope scope) { |
| endVisit(arrayInitializer); |
| } |
| public void endVisit(ArrayQualifiedTypeReference arrayQualifiedTypeReference, BlockScope scope) { |
| endVisit(arrayQualifiedTypeReference); |
| } |
| public void endVisit(ArrayQualifiedTypeReference arrayQualifiedTypeReference, ClassScope scope) { |
| endVisit(arrayQualifiedTypeReference); |
| } |
| public void endVisit(ArrayReference arrayReference, BlockScope scope) { |
| endVisit(arrayReference); |
| } |
| public void endVisit(ArrayTypeReference arrayTypeReference, BlockScope scope) { |
| endVisit(arrayTypeReference); |
| } |
| public void endVisit(ArrayTypeReference arrayTypeReference, ClassScope scope) { |
| endVisit(arrayTypeReference); |
| } |
| public void endVisit(Assignment assignment, BlockScope scope) { |
| endVisit(assignment); |
| } |
| public void endVisit(BinaryExpression binaryExpression, BlockScope scope) { |
| endVisit(binaryExpression); |
| } |
| public void endVisit(CastExpression castExpression, BlockScope scope) { |
| endVisit(castExpression); |
| } |
| public void endVisit(CompoundAssignment compoundAssignment, BlockScope scope) { |
| endVisit(compoundAssignment); |
| } |
| public void endVisit(ConditionalExpression conditionalExpression, BlockScope scope) { |
| endVisit(conditionalExpression); |
| } |
| public void endVisit(EqualExpression equalExpression, BlockScope scope) { |
| endVisit(equalExpression); |
| } |
| public void endVisit(ExplicitConstructorCall explicitConstructor, BlockScope scope) { |
| endVisit(explicitConstructor); |
| } |
| public void endVisit(FieldReference fieldReference, BlockScope scope) { |
| endVisit(fieldReference); |
| } |
| public void endVisit(InstanceOfExpression instanceOfExpression, BlockScope scope) { |
| endVisit(instanceOfExpression); |
| } |
| public void endVisit(MessageSend messageSend, BlockScope scope) { |
| endVisit(messageSend); |
| } |
| public void endVisit(OR_OR_Expression or_or_Expression, BlockScope scope) { |
| endVisit(or_or_Expression); |
| } |
| public void endVisit(ParameterizedQualifiedTypeReference parameterizedQualifiedTypeReference, BlockScope scope) { |
| endVisit(parameterizedQualifiedTypeReference); |
| } |
| public void endVisit(ParameterizedQualifiedTypeReference parameterizedQualifiedTypeReference, ClassScope scope) { |
| endVisit(parameterizedQualifiedTypeReference); |
| } |
| public void endVisit(ParameterizedSingleTypeReference parameterizedSingleTypeReference, BlockScope scope) { |
| endVisit(parameterizedSingleTypeReference); |
| } |
| public void endVisit(ParameterizedSingleTypeReference parameterizedSingleTypeReference, ClassScope scope) { |
| endVisit(parameterizedSingleTypeReference); |
| } |
| public void endVisit(PostfixExpression postfixExpression, BlockScope scope) { |
| endVisit(postfixExpression); |
| } |
| public void endVisit(PrefixExpression prefixExpression, BlockScope scope) { |
| endVisit(prefixExpression); |
| } |
| public void endVisit(QualifiedAllocationExpression qualifiedAllocationExpression, BlockScope scope) { |
| endVisit(qualifiedAllocationExpression); |
| } |
| public void endVisit(QualifiedNameReference qualifiedNameReference, BlockScope scope) { |
| endVisit(qualifiedNameReference); |
| } |
| public void endVisit(QualifiedSuperReference qualifiedSuperReference, BlockScope scope) { |
| endVisit(qualifiedSuperReference); |
| } |
| public void endVisit(QualifiedThisReference qualifiedThisReference, BlockScope scope) { |
| endVisit(qualifiedThisReference); |
| } |
| public void endVisit(QualifiedTypeReference qualifiedTypeReference, BlockScope scope) { |
| endVisit(qualifiedTypeReference); |
| } |
| public void endVisit(QualifiedTypeReference qualifiedTypeReference, ClassScope scope) { |
| endVisit(qualifiedTypeReference); |
| } |
| @Override |
| public void endVisit(ReferenceExpression referenceExpression, BlockScope blockScope) { |
| endVisit(referenceExpression); |
| } |
| public void endVisit(SingleNameReference singleNameReference, BlockScope scope) { |
| endVisit(singleNameReference); |
| } |
| public void endVisit(SingleTypeReference singleTypeReference, BlockScope scope) { |
| endVisit(singleTypeReference); |
| } |
| public void endVisit(SingleTypeReference singleTypeReference, ClassScope scope) { |
| endVisit(singleTypeReference); |
| } |
| public void endVisit(SuperReference superReference, BlockScope scope) { |
| endVisit(superReference); |
| } |
| public void endVisit(ThisReference thisReference, BlockScope scope) { |
| endVisit(thisReference); |
| } |
| public void endVisit(UnaryExpression unaryExpression, BlockScope scope) { |
| endVisit(unaryExpression); |
| } |
| public void endVisit(MemberValuePair pair, BlockScope scope) { |
| endVisit(pair); |
| } |
| public void endVisit(MemberValuePair pair, CompilationUnitScope scope) { |
| endVisit(pair); |
| } |
| public void endVisit(LambdaExpression lambda, BlockScope scope) { |
| endVisit(lambda); |
| } |
| public boolean visit(AllocationExpression allocationExpression, BlockScope scope) { |
| return this.visit(allocationExpression); |
| } |
| public boolean visit(AND_AND_Expression and_and_Expression, BlockScope scope) { |
| return this.visit(and_and_Expression); |
| } |
| public boolean visit(ArrayAllocationExpression arrayAllocationExpression, BlockScope scope) { |
| return this.visit(arrayAllocationExpression); |
| } |
| public boolean visit(ArrayInitializer arrayInitializer, BlockScope scope) { |
| return this.visit(arrayInitializer); |
| } |
| public boolean visit(ArrayQualifiedTypeReference arrayQualifiedTypeReference, BlockScope scope) { |
| return this.visit(arrayQualifiedTypeReference); |
| } |
| public boolean visit(ArrayQualifiedTypeReference arrayQualifiedTypeReference, ClassScope scope) { |
| return this.visit(arrayQualifiedTypeReference); |
| } |
| public boolean visit(ArrayReference arrayReference, BlockScope scope) { |
| return this.visit(arrayReference); |
| } |
| public boolean visit(ArrayTypeReference arrayTypeReference, BlockScope scope) { |
| return this.visit(arrayTypeReference); |
| } |
| public boolean visit(ArrayTypeReference arrayTypeReference, ClassScope scope) { |
| return this.visit(arrayTypeReference); |
| } |
| public boolean visit(Assignment assignment, BlockScope scope) { |
| return this.visit(assignment); |
| } |
| public boolean visit(BinaryExpression binaryExpression, BlockScope scope) { |
| return this.visit(binaryExpression); |
| } |
| public boolean visit(CastExpression castExpression, BlockScope scope) { |
| return this.visit(castExpression); |
| } |
| public boolean visit(CompoundAssignment compoundAssignment, BlockScope scope) { |
| return this.visit(compoundAssignment); |
| } |
| public boolean visit(ConditionalExpression conditionalExpression, BlockScope scope) { |
| return this.visit(conditionalExpression); |
| } |
| public boolean visit(EqualExpression equalExpression, BlockScope scope) { |
| return this.visit(equalExpression); |
| } |
| public boolean visit(ExplicitConstructorCall explicitConstructor, BlockScope scope) { |
| return this.visit(explicitConstructor); |
| } |
| public boolean visit(FieldReference fieldReference, BlockScope scope) { |
| return this.visit(fieldReference); |
| } |
| public boolean visit(InstanceOfExpression instanceOfExpression, BlockScope scope) { |
| return this.visit(instanceOfExpression); |
| } |
| public boolean visit(MessageSend messageSend, BlockScope scope) { |
| return this.visit(messageSend); |
| } |
| public boolean visit(OR_OR_Expression or_or_Expression, BlockScope scope) { |
| return this.visit(or_or_Expression); |
| } |
| public boolean visit(ParameterizedQualifiedTypeReference parameterizedQualifiedTypeReference, BlockScope scope) { |
| return this.visit(parameterizedQualifiedTypeReference); |
| } |
| public boolean visit(ParameterizedQualifiedTypeReference parameterizedQualifiedTypeReference, ClassScope scope) { |
| return this.visit(parameterizedQualifiedTypeReference); |
| } |
| public boolean visit(ParameterizedSingleTypeReference parameterizedSingleTypeReference, BlockScope scope) { |
| return this.visit(parameterizedSingleTypeReference); |
| } |
| public boolean visit(ParameterizedSingleTypeReference parameterizedSingleTypeReference, ClassScope scope) { |
| return this.visit(parameterizedSingleTypeReference); |
| } |
| public boolean visit(PostfixExpression postfixExpression, BlockScope scope) { |
| return this.visit(postfixExpression); |
| } |
| public boolean visit(PrefixExpression prefixExpression, BlockScope scope) { |
| return this.visit(prefixExpression); |
| } |
| public boolean visit(QualifiedAllocationExpression qualifiedAllocationExpression, BlockScope scope) { |
| return this.visit(qualifiedAllocationExpression); |
| } |
| public boolean visit(QualifiedNameReference qualifiedNameReference, BlockScope scope) { |
| return this.visit(qualifiedNameReference); |
| } |
| public boolean visit(QualifiedSuperReference qualifiedSuperReference, BlockScope scope) { |
| return this.visit(qualifiedSuperReference); |
| } |
| public boolean visit(QualifiedThisReference qualifiedThisReference, BlockScope scope) { |
| return this.visit(qualifiedThisReference); |
| } |
| public boolean visit(QualifiedTypeReference qualifiedTypeReference, BlockScope scope) { |
| return this.visit(qualifiedTypeReference); |
| } |
| public boolean visit(QualifiedTypeReference qualifiedTypeReference, ClassScope scope) { |
| return this.visit(qualifiedTypeReference); |
| } |
| @Override |
| public boolean visit(ReferenceExpression referenceExpression, BlockScope blockScope) { |
| return this.visit(referenceExpression); |
| } |
| public boolean visit(SingleNameReference singleNameReference, BlockScope scope) { |
| return this.visit(singleNameReference); |
| } |
| public boolean visit(SingleTypeReference singleTypeReference, BlockScope scope) { |
| return this.visit(singleTypeReference); |
| } |
| public boolean visit(SingleTypeReference singleTypeReference, ClassScope scope) { |
| return this.visit(singleTypeReference); |
| } |
| public boolean visit(StringLiteral stringLiteral, BlockScope scope) { |
| return this.visit(stringLiteral); |
| } |
| public boolean visit(SuperReference superReference, BlockScope scope) { |
| return this.visit(superReference); |
| } |
| public boolean visit(ThisReference thisReference, BlockScope scope) { |
| return this.visit(thisReference); |
| } |
| public boolean visit(UnaryExpression unaryExpression, BlockScope scope) { |
| return this.visit(unaryExpression); |
| } |
| public boolean visit(MemberValuePair pair, BlockScope scope) { |
| return this.visit(pair); |
| } |
| public boolean visit(MemberValuePair pair, CompilationUnitScope scope) { |
| return this.visit(pair); |
| } |
| private void endVisit(ASTNode astNode) { |
| if(this.result && this.parent == null && astNode != this.searchedNode) { |
| if(!(astNode instanceof AllocationExpression && ((AllocationExpression) astNode).type == this.searchedNode) |
| && !(astNode instanceof ConditionalExpression && ((ConditionalExpression) astNode).valueIfTrue == this.searchedNode) |
| && !(astNode instanceof ConditionalExpression && ((ConditionalExpression) astNode).valueIfFalse == this.searchedNode)) { |
| this.parent = astNode; |
| } |
| } |
| } |
| private boolean visit(ASTNode astNode) { |
| if(astNode == this.searchedNode) { |
| this.result = true; |
| } |
| return !this.result; |
| } |
| } |