/******************************************************************************* * Copyright (c) 2000, 2009 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.select; import org.eclipse.jdt.internal.compiler.ast.Expression; import org.eclipse.jdt.internal.compiler.ast.Javadoc; import org.eclipse.jdt.internal.compiler.ast.JavadocAllocationExpression; import org.eclipse.jdt.internal.compiler.ast.JavadocFieldReference; import org.eclipse.jdt.internal.compiler.ast.JavadocMessageSend; import org.eclipse.jdt.internal.compiler.ast.JavadocQualifiedTypeReference; import org.eclipse.jdt.internal.compiler.ast.JavadocSingleNameReference; import org.eclipse.jdt.internal.compiler.ast.JavadocSingleTypeReference; import org.eclipse.jdt.internal.compiler.lookup.Binding; import org.eclipse.jdt.internal.compiler.lookup.ClassScope; import org.eclipse.jdt.internal.compiler.lookup.MethodScope; import org.eclipse.jdt.internal.compiler.lookup.Scope; /** * Node representing a Javadoc comment including code selection. */ public class SelectionJavadoc extends Javadoc { Expression selectedNode; public SelectionJavadoc(int sourceStart, int sourceEnd) { super(sourceStart, sourceEnd); } /* (non-Javadoc) * @see org.eclipse.jdt.internal.compiler.ast.Javadoc#print(int, java.lang.StringBuffer) */ public StringBuffer print(int indent, StringBuffer output) { super.print(indent, output); if (this.selectedNode != null) { String selectedString= null; if (this.selectedNode instanceof JavadocFieldReference) { JavadocFieldReference fieldRef= (JavadocFieldReference)this.selectedNode; if (fieldRef.methodBinding != null) { selectedString= "<SelectOnMethod:"; //$NON-NLS-1$ } else { selectedString= "<SelectOnField:"; //$NON-NLS-1$ } } else if (this.selectedNode instanceof JavadocMessageSend) { selectedString= "<SelectOnMethod:"; //$NON-NLS-1$ } else if (this.selectedNode instanceof JavadocAllocationExpression) { selectedString= "<SelectOnConstructor:"; //$NON-NLS-1$ } else if (this.selectedNode instanceof JavadocSingleNameReference) { selectedString= "<SelectOnLocalVariable:"; //$NON-NLS-1$ } else if (this.selectedNode instanceof JavadocSingleTypeReference) { JavadocSingleTypeReference typeRef= (JavadocSingleTypeReference)this.selectedNode; if (typeRef.packageBinding == null) { selectedString= "<SelectOnType:"; //$NON-NLS-1$ } } else if (this.selectedNode instanceof JavadocQualifiedTypeReference) { JavadocQualifiedTypeReference typeRef= (JavadocQualifiedTypeReference)this.selectedNode; if (typeRef.packageBinding == null) { selectedString= "<SelectOnType:"; //$NON-NLS-1$ } } else { selectedString= "<SelectOnType:"; //$NON-NLS-1$ } int pos= output.length() - 3; output.replace(pos - 2, pos, selectedString + this.selectedNode + '>'); } return output; } /** * Resolve selected node if not null and throw exception to let clients know that it has been * found. * * @throws SelectionNodeFound */ private void internalResolve(Scope scope) { if (this.selectedNode != null) { switch (scope.kind) { case Scope.CLASS_SCOPE: this.selectedNode.resolveType((ClassScope)scope); break; case Scope.METHOD_SCOPE: this.selectedNode.resolveType((MethodScope)scope); break; } Binding binding= null; if (this.selectedNode instanceof JavadocFieldReference) { JavadocFieldReference fieldRef= (JavadocFieldReference)this.selectedNode; binding= fieldRef.binding; if (binding == null && fieldRef.methodBinding != null) { binding= fieldRef.methodBinding; } } else if (this.selectedNode instanceof JavadocMessageSend) { binding= ((JavadocMessageSend)this.selectedNode).binding; } else if (this.selectedNode instanceof JavadocAllocationExpression) { binding= ((JavadocAllocationExpression)this.selectedNode).binding; } else if (this.selectedNode instanceof JavadocSingleNameReference) { binding= ((JavadocSingleNameReference)this.selectedNode).binding; } else if (this.selectedNode instanceof JavadocSingleTypeReference) { JavadocSingleTypeReference typeRef= (JavadocSingleTypeReference)this.selectedNode; if (typeRef.packageBinding == null) { binding= typeRef.resolvedType; } } else if (this.selectedNode instanceof JavadocQualifiedTypeReference) { JavadocQualifiedTypeReference typeRef= (JavadocQualifiedTypeReference)this.selectedNode; if (typeRef.packageBinding == null) { binding= typeRef.resolvedType; } } else { binding= this.selectedNode.resolvedType; } throw new SelectionNodeFound(binding); } } /** * Resolve selected node if not null and throw exception to let clients know that it has been * found. * * @throws SelectionNodeFound */ public void resolve(ClassScope scope) { internalResolve(scope); } /** * Resolve selected node if not null and throw exception to let clients know that it has been * found. * * @throws SelectionNodeFound */ public void resolve(MethodScope scope) { internalResolve(scope); } }