| /******************************************************************************* |
| * Copyright (c) 2010 xored software, Inc. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0. |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * xored software, Inc. - initial API and Implementation (Alex Panchenko) |
| *******************************************************************************/ |
| package org.eclipse.dltk.javascript.scriptdoc; |
| |
| import java.io.Reader; |
| |
| import org.eclipse.dltk.core.IMember; |
| import org.eclipse.dltk.javascript.typeinfo.TypeUtil; |
| import org.eclipse.dltk.javascript.typeinfo.model.Element; |
| import org.eclipse.dltk.javascript.typeinfo.model.Member; |
| import org.eclipse.dltk.javascript.typeinfo.model.Method; |
| import org.eclipse.dltk.javascript.typeinfo.model.Parameter; |
| import org.eclipse.dltk.javascript.typeinfo.model.ParameterKind; |
| import org.eclipse.dltk.javascript.typeinfo.model.Property; |
| import org.eclipse.dltk.javascript.typeinfo.model.RecordType; |
| import org.eclipse.dltk.javascript.typeinfo.model.Type; |
| 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.documentation.IDocumentationResponse; |
| import org.eclipse.dltk.ui.documentation.IScriptDocumentationProvider; |
| import org.eclipse.dltk.ui.documentation.IScriptDocumentationProviderExtension2; |
| import org.eclipse.dltk.ui.documentation.TextDocumentationResponse; |
| import org.eclipse.emf.ecore.EObject; |
| import org.eclipse.jface.resource.ImageDescriptor; |
| |
| /** |
| * @since 3.0 |
| */ |
| public class ElementDocumentationProvider implements |
| IScriptDocumentationProvider, IScriptDocumentationProviderExtension2 { |
| |
| public Reader getInfo(IMember element, boolean lookIntoParents, |
| boolean lookIntoExternal) { |
| return null; |
| } |
| |
| public Reader getInfo(String content) { |
| return null; |
| } |
| |
| public IDocumentationResponse getDocumentationFor(Object element) { |
| if (element instanceof Element) { |
| final Element jsElement = (Element) element; |
| // if (jsElement.getDescription() != null |
| // && jsElement.getDescription().length() != 0) { |
| return new TextDocumentationResponse(element, |
| getElementTitle(jsElement), |
| getElementImageDescriptor(jsElement), |
| jsElement.getDescription() != null ? jsElement |
| .getDescription() : ""); |
| // } |
| } |
| return null; |
| } |
| |
| private boolean appendDeclaringTypePath(StringBuilder sb, EObject object) { |
| if (object instanceof RecordType) { |
| return appendDeclaringTypePath(sb, object.eContainer()); |
| } else if (object instanceof Type) { |
| if (object.eContainer() instanceof RecordType) { |
| return appendDeclaringTypePath(sb, object.eContainer()); |
| } else { |
| final Type type = (Type) object; |
| sb.append(type.getName()); |
| sb.append("."); |
| return true; |
| } |
| } else if (object instanceof Member) { |
| if (appendDeclaringTypePath(sb, object.eContainer())) { |
| final Member member = (Member) object; |
| sb.append(member.getName()); |
| sb.append("."); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| /** |
| * @param element |
| * @return |
| */ |
| protected String getElementTitle(Element element) { |
| final String label = ElementLabelProviderRegistry.getLabel(element, |
| Mode.TITLE); |
| if (label != null) { |
| return label; |
| } |
| final StringBuilder sb = new StringBuilder(); |
| if (element instanceof Member) { |
| final Member member = (Member) element; |
| if (member.getDeclaringType() != null) { |
| if (TypeUtil.isDeclaringTypeVisible(member)) { |
| sb.append(member.getDeclaringType().getName()); |
| sb.append('.'); |
| } else { |
| appendDeclaringTypePath(sb, member.getDeclaringType()); |
| } |
| } |
| } |
| sb.append(element.getName()); |
| if (element instanceof Property) { |
| final Property property = (Property) element; |
| if (TypeUtil.isValueTypeVisible(property.getType())) { |
| sb.append(": "); //$NON-NLS-1$ |
| sb.append(property.getType().getName()); |
| } |
| } else if (element instanceof Method) { |
| final Method method = (Method) element; |
| sb.append('('); |
| int paramCount = 0; |
| for (Parameter parameter : method.getParameters()) { |
| if (paramCount != 0) { |
| sb.append(", "); //$NON-NLS-1$ |
| } |
| sb.append(parameter.getName()); |
| if (parameter.getType() != null) { |
| sb.append(':'); |
| sb.append(parameter.getType().getName()); |
| if (parameter.getKind() == ParameterKind.VARARGS) { |
| sb.append("..."); |
| } |
| } else if (parameter.getKind() == ParameterKind.VARARGS) { |
| sb.append("..."); |
| } |
| ++paramCount; |
| } |
| sb.append(')'); |
| if (method.getType() != null) { |
| sb.append(": "); //$NON-NLS-1$ |
| sb.append(method.getType().getName()); |
| } |
| } |
| return sb.toString(); |
| } |
| |
| protected ImageDescriptor getElementImageDescriptor(Element element) { |
| ImageDescriptor descriptor = ElementLabelProviderRegistry |
| .getImageDescriptor(element); |
| if (descriptor != null) { |
| return descriptor; |
| } |
| if (element instanceof Type) { |
| return decorateImageDescriptor( |
| ScriptElementImageProvider.getTypeImageDescriptor(0, false), |
| element); |
| } else if (element instanceof Member) { |
| final int flags = ((Member) element).getVisibility().getFlags(); |
| if (element instanceof Property) { |
| return decorateImageDescriptor( |
| ScriptElementImageProvider |
| .getFieldImageDescriptor(flags), |
| element); |
| } else if (element instanceof Method) { |
| return decorateImageDescriptor( |
| ScriptElementImageProvider |
| .getMethodImageDescriptor(flags), |
| element); |
| } |
| } |
| return null; |
| } |
| |
| protected ImageDescriptor decorateImageDescriptor( |
| ImageDescriptor descriptor, Element element) { |
| if (element.isDeprecated()) { |
| return new ScriptElementImageDescriptor(descriptor, |
| ScriptElementImageDescriptor.DEPRECATED, |
| ScriptElementImageProvider.SMALL_SIZE); |
| } else if (element instanceof Member && ((Member) element).isStatic()) { |
| return new ScriptElementImageDescriptor(descriptor, |
| ScriptElementImageDescriptor.STATIC, |
| ScriptElementImageProvider.SMALL_SIZE); |
| } |
| return descriptor; |
| } |
| |
| } |