Example usage for org.eclipse.jdt.core IMethod getDeclaringType

List of usage examples for org.eclipse.jdt.core IMethod getDeclaringType

Introduction

In this page you can find the example usage for org.eclipse.jdt.core IMethod getDeclaringType.

Prototype

IType getDeclaringType();

Source Link

Document

Returns the type in which this member is declared, or null if this member is not declared in a type (for example, a top-level type).

Usage

From source file:at.bestsolution.fxide.jdt.corext.util.MethodOverrideTester.java

License:Open Source License

/**
 * Finds the method that is overridden by the given method.
 * First the super class is examined and then the implemented interfaces.
 * @param overriding the overriding method
 * @param testVisibility If true the result is tested on visibility. Null is returned if the method is not visible.
 * @return a method that is directly overridden by the given method, or <code>null</code>
 * @throws JavaModelException if a problem occurs
 *//*from   w w w  .  jav a  2  s.  c  o m*/
public IMethod findOverriddenMethod(IMethod overriding, boolean testVisibility) throws JavaModelException {
    int flags = overriding.getFlags();
    if (Flags.isPrivate(flags) || Flags.isStatic(flags) || overriding.isConstructor()) {
        return null;
    }

    IType type = overriding.getDeclaringType();
    IType superClass = fHierarchy.getSuperclass(type);
    if (superClass != null) {
        IMethod res = findOverriddenMethodInHierarchy(superClass, overriding);
        if (res != null) {
            if (!testVisibility || JavaModelUtil.isVisibleInHierarchy(res, type.getPackageFragment())) {
                return res;
            }
        }
    }
    IType[] interfaces = fHierarchy.getSuperInterfaces(type);
    for (int i = 0; i < interfaces.length; i++) {
        IMethod res = findOverriddenMethodInHierarchy(interfaces[i], overriding);
        if (res != null) {
            return res; // methods from interfaces are always public and therefore visible
        }
    }
    return null;
}

From source file:at.bestsolution.fxide.jdt.corext.util.MethodOverrideTester.java

License:Open Source License

private Substitutions getMethodSubstitions(IMethod method) throws JavaModelException {
    if (fMethodSubstitutions == null) {
        fMethodSubstitutions = new LRUMap<>(3);
    }//from w  ww . ja  v  a2  s  . c  o  m

    Substitutions s = fMethodSubstitutions.get(method);
    if (s == null) {
        ITypeParameter[] typeParameters = method.getTypeParameters();
        if (typeParameters.length == 0) {
            s = Substitutions.EMPTY_SUBST;
        } else {
            IType instantiatedType = method.getDeclaringType();
            s = new Substitutions();
            for (int i = 0; i < typeParameters.length; i++) {
                ITypeParameter curr = typeParameters[i];
                s.addSubstitution(curr.getElementName(), '+' + String.valueOf(i),
                        getTypeParameterErasure(curr, instantiatedType));
            }
        }
        fMethodSubstitutions.put(method, s);
    }
    return s;
}

From source file:at.bestsolution.fxide.jdt.text.javadoc.JavadocContentAccess.java

License:Open Source License

private static Reader findDocInHierarchy(IMethod method, boolean isHTML, boolean useAttachedJavadoc)
        throws JavaModelException {
    /*/*  w w w .  ja  va  2 s. c o  m*/
     * Catch ExternalJavaProject in which case
     * no hierarchy can be built.
     */
    if (!method.getJavaProject().exists())
        return null;

    IType type = method.getDeclaringType();
    ITypeHierarchy hierarchy = type.newSupertypeHierarchy(null);

    MethodOverrideTester tester = new MethodOverrideTester(type, hierarchy);

    IType[] superTypes = hierarchy.getAllSupertypes(type);
    for (int i = 0; i < superTypes.length; i++) {
        IType curr = superTypes[i];
        IMethod overridden = tester.findOverriddenMethodInType(curr, method);
        if (overridden != null) {
            Reader reader;
            if (isHTML)
                reader = getHTMLContentReader(overridden, false, useAttachedJavadoc);
            else
                reader = getContentReader(overridden, false);
            if (reader != null)
                return reader;
        }
    }
    return null;
}

From source file:at.bestsolution.fxide.jdt.text.javadoc.JavadocContentAccess2.java

License:Open Source License

private static StringBuffer createSuperMethodReferences(final IMethod method) throws JavaModelException {
    IType type = method.getDeclaringType();
    ITypeHierarchy hierarchy = SuperTypeHierarchyCache.getTypeHierarchy(type);
    final MethodOverrideTester tester = SuperTypeHierarchyCache.getMethodOverrideTester(type);

    final ArrayList<IMethod> superInterfaceMethods = new ArrayList<>();
    final IMethod[] superClassMethod = { null };
    new InheritDocVisitor() {
        @Override//from   w  ww.  j  ava 2 s  .  co  m
        public Object visit(IType currType) throws JavaModelException {
            IMethod overridden = tester.findOverriddenMethodInType(currType, method);
            if (overridden == null)
                return InheritDocVisitor.CONTINUE;

            if (currType.isInterface())
                superInterfaceMethods.add(overridden);
            else
                superClassMethod[0] = overridden;

            return STOP_BRANCH;
        }
    }.visitInheritDoc(type, hierarchy);

    boolean hasSuperInterfaceMethods = superInterfaceMethods.size() != 0;
    if (!hasSuperInterfaceMethods && superClassMethod[0] == null)
        return null;

    StringBuffer buf = new StringBuffer();
    buf.append("<div>"); //$NON-NLS-1$
    if (hasSuperInterfaceMethods) {
        buf.append("<b>"); //$NON-NLS-1$
        buf.append(JavaDocMessages.JavaDoc2HTMLTextReader_specified_by_section);
        buf.append("</b> "); //$NON-NLS-1$
        for (Iterator<IMethod> iter = superInterfaceMethods.iterator(); iter.hasNext();) {
            IMethod overridden = iter.next();
            buf.append(createMethodInTypeLinks(overridden));
            if (iter.hasNext())
                buf.append(JavaElementLabels.COMMA_STRING);
        }
    }
    if (superClassMethod[0] != null) {
        if (hasSuperInterfaceMethods)
            buf.append(JavaElementLabels.COMMA_STRING);
        buf.append("<b>"); //$NON-NLS-1$
        buf.append(JavaDocMessages.JavaDoc2HTMLTextReader_overrides_section);
        buf.append("</b> "); //$NON-NLS-1$
        buf.append(createMethodInTypeLinks(superClassMethod[0]));
    }
    buf.append("</div>"); //$NON-NLS-1$
    return buf;
}

From source file:at.bestsolution.fxide.jdt.text.javadoc.JavadocContentAccess2.java

License:Open Source License

private static String createMethodInTypeLinks(IMethod overridden) {
    CharSequence methodLink = createSimpleMemberLink(overridden);
    CharSequence typeLink = createSimpleMemberLink(overridden.getDeclaringType());
    String methodInType = MessageFormat.format(JavaDocMessages.JavaDoc2HTMLTextReader_method_in_type,
            new Object[] { methodLink, typeLink });
    return methodInType;
}

From source file:at.bestsolution.fxide.jdt.text.javadoc.JavadocContentAccess2.java

License:Open Source License

private static String javadoc2HTML(IMember member, IJavaElement element, String rawJavadoc) {
    rawJavadoc = CodeSanatizer.sanatizeCodeContent(rawJavadoc);
    Javadoc javadoc = getJavadocNode(member, rawJavadoc);

    if (javadoc == null) {
        Reader contentReader = null;
        // fall back to JavadocContentAccess:
        try {/* ww w  . j  ava2 s  .  c  o m*/
            contentReader = JavadocContentAccess.getHTMLContentReader(member, false, false);
            if (contentReader != null)
                return getString(contentReader);
        } catch (JavaModelException e) {
            // TODO
            e.printStackTrace();
        } finally {
            if (contentReader != null) {
                try {
                    contentReader.close();
                } catch (IOException e) {
                    //ignore
                }
            }
        }
        return null;
    }

    if (canInheritJavadoc(member)) {
        IMethod method = (IMethod) member;
        return new JavadocContentAccess2(element, javadoc, rawJavadoc,
                new JavadocLookup(method.getDeclaringType())).toHTML();
    }
    return new JavadocContentAccess2(element, javadoc, rawJavadoc).toHTML();
}

From source file:at.bestsolution.fxide.jdt.text.javadoc.JavadocContentAccess2.java

License:Open Source License

/**
 * Finds the first available attached Javadoc in the hierarchy of the given method.
 *
 * @param method the method//w w w.  j a  v  a2 s .c  o  m
 * @return the inherited Javadoc from the Javadoc attachment, or <code>null</code> if none
 * @throws JavaModelException unexpected problem
 */
private static String findAttachedDocInHierarchy(final IMethod method) throws JavaModelException {
    IType type = method.getDeclaringType();
    ITypeHierarchy hierarchy = SuperTypeHierarchyCache.getTypeHierarchy(type);
    final MethodOverrideTester tester = SuperTypeHierarchyCache.getMethodOverrideTester(type);

    return (String) new InheritDocVisitor() {
        @Override
        public Object visit(IType currType) throws JavaModelException {
            IMethod overridden = tester.findOverriddenMethodInType(currType, method);
            if (overridden == null)
                return InheritDocVisitor.CONTINUE;

            if (overridden.getOpenable().getBuffer() == null) { // only if no source available
                String attachedJavadoc = overridden.getAttachedJavadoc(null);
                if (attachedJavadoc != null) {
                    // BaseURL for the original method can be wrong for attached Javadoc from overridden
                    // (e.g. when overridden is from rt.jar).
                    // Fix is to store the baseURL inside the doc content and later fetch it with #extractBaseURL(String).
                    String baseURL = JavaDocLocations.getBaseURL(overridden, overridden.isBinary());
                    if (baseURL != null) {
                        attachedJavadoc = BASE_URL_COMMENT_INTRO + baseURL + "\"--> " + attachedJavadoc; //$NON-NLS-1$
                    }
                    return attachedJavadoc;
                }
            }
            return CONTINUE;
        }
    }.visitInheritDoc(type, hierarchy);
}

From source file:at.bestsolution.fxide.jdt.text.viewersupport.JavaElementLabelComposer.java

License:Open Source License

/**
 * Appends the label for a method. Considers the M_* flags.
 *
 * @param method the element to render//from  w ww . j  av  a  2  s.c  o  m
 * @param flags the rendering flags. Flags with names starting with 'M_' are considered.
 */
public void appendMethodLabel(IMethod method, long flags) {
    try {
        BindingKey resolvedKey = getFlag(flags, JavaElementLabels.USE_RESOLVED) && method.isResolved()
                ? new BindingKey(method.getKey())
                : null;
        String resolvedSig = (resolvedKey != null) ? resolvedKey.toSignature() : null;

        // type parameters
        if (getFlag(flags, JavaElementLabels.M_PRE_TYPE_PARAMETERS)) {
            if (resolvedKey != null) {
                if (resolvedKey.isParameterizedMethod()) {
                    String[] typeArgRefs = resolvedKey.getTypeArguments();
                    if (typeArgRefs.length > 0) {
                        appendTypeArgumentSignaturesLabel(method, typeArgRefs, flags);
                        fBuffer.append(' ');
                    }
                } else {
                    String[] typeParameterSigs = Signature.getTypeParameters(resolvedSig);
                    if (typeParameterSigs.length > 0) {
                        appendTypeParameterSignaturesLabel(typeParameterSigs, flags);
                        fBuffer.append(' ');
                    }
                }
            } else if (method.exists()) {
                ITypeParameter[] typeParameters = method.getTypeParameters();
                if (typeParameters.length > 0) {
                    appendTypeParametersLabels(typeParameters, flags);
                    fBuffer.append(' ');
                }
            }
        }

        // return type
        if (getFlag(flags, JavaElementLabels.M_PRE_RETURNTYPE) && method.exists() && !method.isConstructor()) {
            String returnTypeSig = resolvedSig != null ? Signature.getReturnType(resolvedSig)
                    : method.getReturnType();
            appendTypeSignatureLabel(method, returnTypeSig, flags);
            fBuffer.append(' ');
        }

        // qualification
        if (getFlag(flags, JavaElementLabels.M_FULLY_QUALIFIED)) {
            appendTypeLabel(method.getDeclaringType(),
                    JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
            fBuffer.append('.');
        }

        fBuffer.append(getElementName(method));

        // constructor type arguments
        if (getFlag(flags, JavaElementLabels.T_TYPE_PARAMETERS) && method.exists() && method.isConstructor()) {
            if (resolvedSig != null && resolvedKey.isParameterizedType()) {
                BindingKey declaringType = resolvedKey.getDeclaringType();
                if (declaringType != null) {
                    String[] declaringTypeArguments = declaringType.getTypeArguments();
                    appendTypeArgumentSignaturesLabel(method, declaringTypeArguments, flags);
                }
            }
        }

        // parameters
        fBuffer.append('(');
        String[] declaredParameterTypes = method.getParameterTypes();
        if (getFlag(flags, JavaElementLabels.M_PARAMETER_TYPES | JavaElementLabels.M_PARAMETER_NAMES)) {
            String[] types = null;
            int nParams = 0;
            boolean renderVarargs = false;
            boolean isPolymorphic = false;
            if (getFlag(flags, JavaElementLabels.M_PARAMETER_TYPES)) {
                if (resolvedSig != null) {
                    types = Signature.getParameterTypes(resolvedSig);
                } else {
                    types = declaredParameterTypes;
                }
                nParams = types.length;
                renderVarargs = method.exists() && Flags.isVarargs(method.getFlags());
                if (renderVarargs && resolvedSig != null && declaredParameterTypes.length == 1
                        && JavaModelUtil.isPolymorphicSignature(method)) {
                    renderVarargs = false;
                    isPolymorphic = true;
                }
            }
            String[] names = null;
            if (getFlag(flags, JavaElementLabels.M_PARAMETER_NAMES) && method.exists()) {
                names = method.getParameterNames();
                if (isPolymorphic) {
                    // handled specially below
                } else if (types == null) {
                    nParams = names.length;
                } else { // types != null
                    if (nParams != names.length) {
                        if (resolvedSig != null && types.length > names.length) {
                            // see https://bugs.eclipse.org/bugs/show_bug.cgi?id=99137
                            nParams = names.length;
                            String[] typesWithoutSyntheticParams = new String[nParams];
                            System.arraycopy(types, types.length - nParams, typesWithoutSyntheticParams, 0,
                                    nParams);
                            types = typesWithoutSyntheticParams;
                        } else {
                            // https://bugs.eclipse.org/bugs/show_bug.cgi?id=101029
                            // JavaPlugin.logErrorMessage("JavaElementLabels: Number of param types(" + nParams + ") != number of names(" + names.length + "): " + method.getElementName());   //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
                            names = null; // no names rendered
                        }
                    }
                }
            }

            ILocalVariable[] annotatedParameters = null;
            if (nParams > 0 && getFlag(flags, JavaElementLabels.M_PARAMETER_ANNOTATIONS)) {
                annotatedParameters = method.getParameters();
            }

            for (int i = 0; i < nParams; i++) {
                if (i > 0) {
                    fBuffer.append(JavaElementLabels.COMMA_STRING);
                }
                if (annotatedParameters != null && i < annotatedParameters.length) {
                    appendAnnotationLabels(annotatedParameters[i].getAnnotations(), flags);
                }

                if (types != null) {
                    String paramSig = types[i];
                    if (renderVarargs && (i == nParams - 1)) {
                        int newDim = Signature.getArrayCount(paramSig) - 1;
                        appendTypeSignatureLabel(method, Signature.getElementType(paramSig), flags);
                        for (int k = 0; k < newDim; k++) {
                            fBuffer.append('[').append(']');
                        }
                        fBuffer.append(JavaElementLabels.ELLIPSIS_STRING);
                    } else {
                        appendTypeSignatureLabel(method, paramSig, flags);
                    }
                }
                if (names != null) {
                    if (types != null) {
                        fBuffer.append(' ');
                    }
                    if (isPolymorphic) {
                        fBuffer.append(names[0] + i);
                    } else {
                        fBuffer.append(names[i]);
                    }
                }
            }
        } else {
            if (declaredParameterTypes.length > 0) {
                fBuffer.append(JavaElementLabels.ELLIPSIS_STRING);
            }
        }
        fBuffer.append(')');

        if (getFlag(flags, JavaElementLabels.M_EXCEPTIONS)) {
            String[] types;
            if (resolvedKey != null) {
                types = resolvedKey.getThrownExceptions();
            } else {
                types = method.exists() ? method.getExceptionTypes() : new String[0];
            }
            if (types.length > 0) {
                fBuffer.append(" throws "); //$NON-NLS-1$
                for (int i = 0; i < types.length; i++) {
                    if (i > 0) {
                        fBuffer.append(JavaElementLabels.COMMA_STRING);
                    }
                    appendTypeSignatureLabel(method, types[i], flags);
                }
            }
        }

        if (getFlag(flags, JavaElementLabels.M_APP_TYPE_PARAMETERS)) {
            int offset = fBuffer.length();
            if (resolvedKey != null) {
                if (resolvedKey.isParameterizedMethod()) {
                    String[] typeArgRefs = resolvedKey.getTypeArguments();
                    if (typeArgRefs.length > 0) {
                        fBuffer.append(' ');
                        appendTypeArgumentSignaturesLabel(method, typeArgRefs, flags);
                    }
                } else {
                    String[] typeParameterSigs = Signature.getTypeParameters(resolvedSig);
                    if (typeParameterSigs.length > 0) {
                        fBuffer.append(' ');
                        appendTypeParameterSignaturesLabel(typeParameterSigs, flags);
                    }
                }
            } else if (method.exists()) {
                ITypeParameter[] typeParameters = method.getTypeParameters();
                if (typeParameters.length > 0) {
                    fBuffer.append(' ');
                    appendTypeParametersLabels(typeParameters, flags);
                }
            }
            //            if (getFlag(flags, JavaElementLabels.COLORIZE) && offset != fBuffer.length()) {
            //               fBuffer.setStyle(offset, fBuffer.length() - offset, DECORATIONS_STYLE);
            //            }
        }

        if (getFlag(flags, JavaElementLabels.M_APP_RETURNTYPE) && method.exists() && !method.isConstructor()) {
            int offset = fBuffer.length();
            fBuffer.append(JavaElementLabels.DECL_STRING);
            String returnTypeSig = resolvedSig != null ? Signature.getReturnType(resolvedSig)
                    : method.getReturnType();
            appendTypeSignatureLabel(method, returnTypeSig, flags);
            //            if (getFlag(flags, JavaElementLabels.COLORIZE)) {
            //               fBuffer.setStyle(offset, fBuffer.length() - offset, DECORATIONS_STYLE);
            //            }
        }

        // category
        if (getFlag(flags, JavaElementLabels.M_CATEGORY) && method.exists())
            appendCategoryLabel(method, flags);

        // post qualification
        if (getFlag(flags, JavaElementLabels.M_POST_QUALIFIED)) {
            int offset = fBuffer.length();
            fBuffer.append(JavaElementLabels.CONCAT_STRING);
            appendTypeLabel(method.getDeclaringType(),
                    JavaElementLabels.T_FULLY_QUALIFIED | (flags & QUALIFIER_FLAGS));
            //            if (getFlag(flags, JavaElementLabels.COLORIZE)) {
            //               fBuffer.setStyle(offset, fBuffer.length() - offset, QUALIFIER_STYLE);
            //            }
        }

    } catch (JavaModelException e) {
        //TODO
        e.printStackTrace();
    }
}

From source file:bndtools.editor.components.MethodProposalLabelProvider.java

License:Open Source License

private static StyledString getStyledString(Object element) {
    MethodContentProposal proposal = (MethodContentProposal) element;

    IMethod method = proposal.getMethod();
    String methodName = method.getElementName();
    IType type = method.getDeclaringType();
    String typeName = type.getElementName();

    StyledString styledString = new StyledString(methodName);
    styledString.append(": " + typeName, StyledString.QUALIFIER_STYLER);

    return styledString;
}

From source file:ca.ecliptical.pde.ds.search.DescriptorQueryParticipant.java

License:Open Source License

private IMethod findActivateMethod(IType implClassType, String name, IProgressMonitor monitor)
        throws JavaModelException {
    IMethod candidate = null;/*from   w  w  w . j  av  a2 s. c o m*/
    int priority = Integer.MAX_VALUE;

    IType type = implClassType;
    while (type != null) {
        for (IMethod method : type.getMethods()) {
            if (!name.equals(method.getElementName()))
                continue;

            if (!VOID_SIG.equals(method.getReturnType()))
                continue;

            if (type != implClassType && (Flags.isPrivate(method.getFlags())
                    || (Flags.isPackageDefault(method.getFlags()) && !implClassType.getPackageFragment()
                            .equals(method.getDeclaringType().getPackageFragment()))))
                continue;

            String[] paramSigs = resolveParameterTypes(method, Integer.MAX_VALUE);

            if (paramSigs.length == 1 && COMPONENT_CONTEXT_SIG.equals(paramSigs[0])) {
                // best match
                return method;
            }

            if (priority > 1 && paramSigs.length == 1 && COMPONENT_CONTEXT_SIG.equals(paramSigs[0])) {
                candidate = method;
                priority = 1;
                continue;
            }

            if (priority > 2 && paramSigs.length == 1 && MAP_SIG.equals(paramSigs[0])) {
                candidate = method;
                priority = 2;
                continue;
            }

            if (priority > 3 && paramSigs.length >= 2) {
                boolean valid = true;
                for (String paramSig : paramSigs) {
                    if (!COMPONENT_CONTEXT_SIG.equals(paramSig) && !BUNDLE_CONTEXT_SIG.equals(paramSig)
                            && !MAP_SIG.equals(paramSig)) {
                        valid = false;
                        break;
                    }
                }

                if (valid) {
                    candidate = method;
                    priority = 3;
                }

                continue;
            }

            if (priority > 4 && paramSigs.length == 0) {
                candidate = method;
                priority = 4;
                continue;
            }
        }

        type = findSuperclassType(type, implClassType.getJavaProject(), monitor);
    }

    return candidate;
}