| /******************************************************************************* |
| * Copyright (c) 2005, 2007 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 |
| * |
| |
| *******************************************************************************/ |
| package org.eclipse.dltk.javascript.internal.ui.text.completion; |
| |
| import org.eclipse.dltk.core.CompletionProposal; |
| import org.eclipse.dltk.internal.javascript.ti.IReferenceAttributes; |
| import org.eclipse.dltk.internal.javascript.ti.JSMethod; |
| import org.eclipse.dltk.javascript.typeinference.IValueReference; |
| import org.eclipse.dltk.javascript.typeinference.ReferenceKind; |
| import org.eclipse.dltk.javascript.typeinference.ReferenceLocation; |
| import org.eclipse.dltk.javascript.typeinfo.IModelBuilder.IMethod; |
| import org.eclipse.dltk.javascript.typeinfo.IModelBuilder.IVariable; |
| import org.eclipse.dltk.javascript.typeinfo.IRType; |
| import org.eclipse.dltk.javascript.typeinfo.TypeUtil; |
| import org.eclipse.dltk.javascript.typeinfo.model.Element; |
| import org.eclipse.dltk.javascript.typeinfo.model.GenericType; |
| import org.eclipse.dltk.javascript.typeinfo.model.Member; |
| import org.eclipse.dltk.javascript.typeinfo.model.Method; |
| import org.eclipse.dltk.javascript.typeinfo.model.Property; |
| import org.eclipse.dltk.javascript.typeinfo.model.Type; |
| import org.eclipse.dltk.javascript.typeinfo.model.TypeVariable; |
| import org.eclipse.dltk.javascript.typeinfo.model.Visibility; |
| import org.eclipse.dltk.javascript.ui.typeinfo.ElementLabelProviderRegistry; |
| import org.eclipse.dltk.javascript.ui.typeinfo.IElementLabelProvider.Mode; |
| import org.eclipse.dltk.ui.ScriptElementImageDescriptor; |
| import org.eclipse.dltk.ui.ScriptElementImageProvider; |
| import org.eclipse.dltk.ui.text.completion.CompletionProposalLabelProvider; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| |
| @SuppressWarnings("restriction") |
| public class JavaScriptCompletionProposalLabelProvider extends |
| CompletionProposalLabelProvider { |
| |
| @Override |
| public String createTypeProposalLabel(CompletionProposal typeProposal) { |
| if (typeProposal.getExtraInfo() instanceof Type) { |
| final Type type = (Type) typeProposal.getExtraInfo(); |
| final String label = getElementLabel(type, typeProposal); |
| if (label != null) { |
| return label; |
| } |
| if (type instanceof GenericType) { |
| final StringBuilder sb = new StringBuilder(); |
| sb.append(type.getName()).append('<'); |
| boolean first = true; |
| for (TypeVariable variable : ((GenericType) type) |
| .getTypeParameters()) { |
| if (!first) { |
| sb.append(','); |
| } |
| sb.append(variable.getName()); |
| first = false; |
| } |
| sb.append('>'); |
| return sb.toString(); |
| } |
| } |
| return super.createTypeProposalLabel(typeProposal); |
| } |
| |
| private static String getElementLabel(Element element, |
| CompletionProposal proposal) { |
| return ElementLabelProviderRegistry.getLabel(element, Mode.PROPOSAL, |
| proposal); |
| } |
| |
| @Override |
| protected String createMethodProposalLabel(CompletionProposal methodProposal) { |
| String returnType = null; |
| String source = null; |
| final Object info = methodProposal.getExtraInfo(); |
| if (info instanceof Method) { |
| final Method method = (Method) info; |
| final String label = getElementLabel(method, methodProposal); |
| if (label != null) { |
| return label; |
| } |
| if (method.getType() != null) { |
| returnType = method.getType().getName(); |
| } |
| if (method.getDeclaringType() != null) { |
| source = method.getDeclaringType().getName(); |
| } |
| } else if (info instanceof IValueReference) { |
| final IValueReference reference = (IValueReference) info; |
| final IRType declaredType = reference.getChild( |
| IValueReference.FUNCTION_OP).getDeclaredType(); |
| if (declaredType != null) { |
| returnType = declaredType.getName(); |
| } |
| final ReferenceLocation loc = reference.getLocation(); |
| if (loc != ReferenceLocation.UNKNOWN |
| && loc.getSourceModule() != null) { |
| source = loc.getSourceModule().getPath().toString(); |
| } |
| } |
| StringBuffer nameBuffer = new StringBuffer(); |
| |
| // method name |
| nameBuffer.append(methodProposal.getName()); |
| |
| // parameters |
| nameBuffer.append('('); |
| appendParameterList(nameBuffer, methodProposal); |
| nameBuffer.append(')'); |
| |
| if (returnType != null) { |
| nameBuffer.append(": "); |
| nameBuffer.append(returnType); |
| } |
| // TODO use different color |
| if (source != null) { |
| nameBuffer.append(" - "); |
| nameBuffer.append(source); |
| } |
| return nameBuffer.toString(); |
| } |
| |
| @Override |
| protected String createFieldProposalLabel(CompletionProposal proposal) { |
| final Object info = proposal.getExtraInfo(); |
| if (info instanceof Property) { |
| final Property property = (Property) proposal.getExtraInfo(); |
| final String label = getElementLabel(property, proposal); |
| if (label != null) { |
| return label; |
| } |
| final StringBuilder sb = new StringBuilder(); |
| sb.append(proposal.getName()); |
| if (TypeUtil.isValueTypeVisible(property.getType())) { |
| sb.append(": "); |
| sb.append(property.getType().getName()); |
| } |
| // TODO use different color |
| if (TypeUtil.isDeclaringTypeVisible(property)) { |
| sb.append(" - "); |
| sb.append(property.getDeclaringType().getName()); |
| } |
| return sb.toString(); |
| } else if (proposal.getExtraInfo() instanceof IValueReference) { |
| final IValueReference reference = (IValueReference) proposal |
| .getExtraInfo(); |
| final StringBuilder sb = new StringBuilder(); |
| sb.append(proposal.getName()); |
| if (reference.getKind() != ReferenceKind.PREDEFINED) { |
| final IRType declaredType = reference.getDeclaredType(); |
| if (declaredType != null) { |
| sb.append(": ").append(declaredType.getName()); |
| } |
| } |
| return sb.toString(); |
| } |
| return proposal.getName(); |
| } |
| |
| /** |
| * @see org.eclipse.dltk.ui.text.completion.CompletionProposalLabelProvider#createImageDescriptor(org.eclipse.dltk.core.CompletionProposal) |
| */ |
| @Override |
| public ImageDescriptor createImageDescriptor(CompletionProposal proposal) { |
| ImageDescriptor imageDescriptor = extraImageFromProposal(proposal); |
| if (imageDescriptor != null) |
| return imageDescriptor; |
| return super.createImageDescriptor(proposal); |
| } |
| |
| /** |
| * @param proposal |
| * @return |
| */ |
| private ImageDescriptor extraImageFromProposal(CompletionProposal proposal) { |
| final Object extraInfo = proposal.getExtraInfo(); |
| if (extraInfo instanceof Element) { |
| final Element element = (Element) extraInfo; |
| final ImageDescriptor descriptor = ElementLabelProviderRegistry |
| .getImageDescriptor(element); |
| if (descriptor != null) { |
| return decorateImageDescriptor(descriptor, proposal); |
| } |
| if (element instanceof Member) { |
| final int flags = ((Member) element).getVisibility().getFlags(); |
| if (element instanceof Property) { |
| return decorateImageDescriptor( |
| ScriptElementImageProvider |
| .getFieldImageDescriptor(flags), |
| proposal); |
| } else if (element instanceof Method) { |
| return decorateImageDescriptor( |
| ScriptElementImageProvider |
| .getMethodImageDescriptor(flags), |
| proposal); |
| } |
| } |
| } else if (extraInfo instanceof IValueReference) { |
| final IValueReference reference = (IValueReference) extraInfo; |
| final IMethod method = (IMethod) reference |
| .getAttribute(IReferenceAttributes.METHOD); |
| if (method != null) { |
| return decorateImageDescriptor( |
| ScriptElementImageProvider.getMethodImageDescriptor(Visibility |
| .getFlags(method.getVisibility())), proposal); |
| } |
| final IVariable variable = (IVariable) reference |
| .getAttribute(IReferenceAttributes.VARIABLE); |
| if (variable != null) { |
| return decorateImageDescriptor( |
| ScriptElementImageProvider.getFieldImageDescriptor(Visibility |
| .getFlags(variable.getVisibility())), proposal); |
| } |
| } |
| return null; |
| } |
| |
| /** |
| * @see org.eclipse.dltk.ui.text.completion.CompletionProposalLabelProvider#createFieldImageDescriptor(org.eclipse.dltk.core.CompletionProposal) |
| */ |
| @Override |
| protected ImageDescriptor createFieldImageDescriptor( |
| CompletionProposal proposal) { |
| ImageDescriptor imageDescriptor = extraImageFromProposal(proposal); |
| if (imageDescriptor != null) |
| return imageDescriptor; |
| return super.createFieldImageDescriptor(proposal); |
| } |
| |
| /** |
| * @see org.eclipse.dltk.ui.text.completion.CompletionProposalLabelProvider#createLocalImageDescriptor(org.eclipse.dltk.core.CompletionProposal) |
| */ |
| @Override |
| protected ImageDescriptor createLocalImageDescriptor( |
| CompletionProposal proposal) { |
| ImageDescriptor imageDescriptor = extraImageFromProposal(proposal); |
| if (imageDescriptor != null) |
| return imageDescriptor; |
| return super.createLocalImageDescriptor(proposal); |
| } |
| |
| /** |
| * @see org.eclipse.dltk.ui.text.completion.CompletionProposalLabelProvider#createMethodImageDescriptor(org.eclipse.dltk.core.CompletionProposal) |
| */ |
| @Override |
| public ImageDescriptor createMethodImageDescriptor( |
| CompletionProposal proposal) { |
| ImageDescriptor imageDescriptor = extraImageFromProposal(proposal); |
| if (imageDescriptor != null) |
| return imageDescriptor; |
| return super.createMethodImageDescriptor(proposal); |
| } |
| |
| /** |
| * @see org.eclipse.dltk.ui.text.completion.CompletionProposalLabelProvider#createPackageImageDescriptor(org.eclipse.dltk.core.CompletionProposal) |
| */ |
| @Override |
| protected ImageDescriptor createPackageImageDescriptor( |
| CompletionProposal proposal) { |
| ImageDescriptor imageDescriptor = extraImageFromProposal(proposal); |
| if (imageDescriptor != null) |
| return imageDescriptor; |
| return super.createPackageImageDescriptor(proposal); |
| } |
| |
| /** |
| * @see org.eclipse.dltk.ui.text.completion.CompletionProposalLabelProvider#createTypeImageDescriptor(org.eclipse.dltk.core.CompletionProposal) |
| */ |
| @Override |
| public ImageDescriptor createTypeImageDescriptor(CompletionProposal proposal) { |
| ImageDescriptor imageDescriptor = extraImageFromProposal(proposal); |
| if (imageDescriptor != null) |
| return imageDescriptor; |
| return super.createTypeImageDescriptor(proposal); |
| } |
| |
| @Override |
| protected ImageDescriptor decorateImageDescriptor( |
| ImageDescriptor descriptor, CompletionProposal proposal) { |
| if (isDeprecated(proposal)) { |
| return new ScriptElementImageDescriptor(descriptor, |
| ScriptElementImageDescriptor.DEPRECATED, |
| ScriptElementImageProvider.SMALL_SIZE); |
| } else if (isStatic(proposal)) { |
| return new ScriptElementImageDescriptor(descriptor, |
| ScriptElementImageDescriptor.STATIC, |
| ScriptElementImageProvider.SMALL_SIZE); |
| } |
| return super.decorateImageDescriptor(descriptor, proposal); |
| } |
| |
| /** |
| * @param proposal |
| * @return |
| */ |
| private boolean isStatic(CompletionProposal proposal) { |
| if (proposal.getExtraInfo() instanceof Member) { |
| return ((Member) proposal.getExtraInfo()).isStatic(); |
| } else { |
| return false; |
| } |
| } |
| |
| private boolean isDeprecated(CompletionProposal proposal) { |
| if (proposal.getExtraInfo() instanceof Element) { |
| return ((Element) proposal.getExtraInfo()).isDeprecated(); |
| } else if (proposal.getExtraInfo() instanceof IValueReference) { |
| final IValueReference reference = (IValueReference) proposal |
| .getExtraInfo(); |
| final IMethod method = (IMethod) reference |
| .getAttribute(IReferenceAttributes.METHOD); |
| if (method != null) |
| return method.isDeprecated(); |
| final IVariable variable = (IVariable) reference |
| .getAttribute(IReferenceAttributes.VARIABLE); |
| return variable != null && variable.isDeprecated(); |
| } else if (proposal.getExtraInfo() instanceof JSMethod) { |
| return ((JSMethod) proposal.getExtraInfo()).isDeprecated(); |
| } |
| return false; |
| } |
| } |