From ddbdc5aecddc3fbc2810a3e1dbd2d7506948ee16 Mon Sep 17 00:00:00 2001 From: Mike Rennie Date: Mon, 19 Aug 2013 14:04:12 -0500 Subject: Bug 409428 - Consistently handle implicitly public members pt 1 Change-Id: Ic007eafa9f1c5f2987eed455971e93d9a2a38b5a --- .../APIToolsJavadocCompletionProposalComputer.java | 77 +--------------------- .../pde/api/tools/internal/util/JavaUtils.java | 73 ++++++++++++++++++++ 2 files changed, 76 insertions(+), 74 deletions(-) create mode 100644 apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/util/JavaUtils.java diff --git a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/completion/APIToolsJavadocCompletionProposalComputer.java b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/completion/APIToolsJavadocCompletionProposalComputer.java index d2739ac4d0..edf4387553 100644 --- a/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/completion/APIToolsJavadocCompletionProposalComputer.java +++ b/apitools/org.eclipse.pde.api.tools.ui/src/org/eclipse/pde/api/tools/ui/internal/completion/APIToolsJavadocCompletionProposalComputer.java @@ -22,7 +22,6 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.jdt.core.CompletionContext; import org.eclipse.jdt.core.Flags; import org.eclipse.jdt.core.ICompilationUnit; -import org.eclipse.jdt.core.IField; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IMember; @@ -47,6 +46,7 @@ import org.eclipse.jface.text.IDocument; import org.eclipse.pde.api.tools.internal.JavadocTagManager; import org.eclipse.pde.api.tools.internal.provisional.ApiPlugin; import org.eclipse.pde.api.tools.internal.provisional.IApiJavadocTag; +import org.eclipse.pde.api.tools.internal.util.JavaUtils; import org.eclipse.pde.api.tools.internal.util.Util; import org.eclipse.pde.api.tools.ui.internal.ApiUIPlugin; import org.eclipse.swt.graphics.Image; @@ -122,7 +122,7 @@ public class APIToolsJavadocCompletionProposalComputer implements IJavaCompletio try { int offset = jcontext.getInvocationOffset(); IJavaElement element = cunit.getElementAt(offset); - if (element == null) { + if (!JavaUtils.isVisible(element)) { return Collections.EMPTY_LIST; } ImageDescriptor imagedesc = jcontext.getLabelProvider().createImageDescriptor( @@ -131,24 +131,9 @@ public class APIToolsJavadocCompletionProposalComputer implements IJavaCompletio fImageHandle = (imagedesc == null ? null : imagedesc.createImage()); int type = getType(element); int member = IApiJavadocTag.MEMBER_NONE; - int elementtype = element.getElementType(); - switch(elementtype) { - case IJavaElement.TYPE: { - IType itype = (IType) element; - if(hasNonVisibleParent(element, itype.isInterface())) { - return Collections.EMPTY_LIST; - } - break; - } + switch(element.getElementType()) { case IJavaElement.METHOD: { IMethod method = (IMethod) element; - int flags = method.getFlags(); - boolean inter = method.getDeclaringType().isInterface(); - if(Flags.isPrivate(flags) || - (Flags.isPackageDefault(flags) && !inter) || - hasNonVisibleParent(element, inter)) { - return Collections.EMPTY_LIST; - } member = IApiJavadocTag.MEMBER_METHOD; if(method.isConstructor()) { member = IApiJavadocTag.MEMBER_CONSTRUCTOR; @@ -156,16 +141,6 @@ public class APIToolsJavadocCompletionProposalComputer implements IJavaCompletio break; } case IJavaElement.FIELD: { - IField field = (IField) element; - int flags = field.getFlags(); - boolean inter = field.getDeclaringType().isInterface(); - if(Flags.isFinal(flags) || - field.isEnumConstant() || - Flags.isPrivate(flags) || - (Flags.isPackageDefault(flags) && !inter) || - hasNonVisibleParent(element, inter)) { - return Collections.EMPTY_LIST; - } member = IApiJavadocTag.MEMBER_FIELD; break; } @@ -202,52 +177,6 @@ public class APIToolsJavadocCompletionProposalComputer implements IJavaCompletio return Collections.EMPTY_LIST; } - /** - * Returns if the given element has a non-visible parent in its parent hierarchy - * - * @param element - * @return true if a parent type is non-visible, false otherwise - * @throws JavaModelException - * @since 1.0.400 - */ - boolean hasNonVisibleParent(IJavaElement element, boolean isinterface) throws JavaModelException { - if(element == null) { - return false; - } - boolean isinter = isinterface; - switch(element.getElementType()) { - case IJavaElement.TYPE: { - IType type = (IType) element; - int flags = type.getFlags(); - IType ptype = type.getDeclaringType(); - if(type.isInterface()) { - if(ptype == null) { - return false; - } - isinter &= true; - if(Flags.isPublic(flags) || isinter) { - return hasNonVisibleParent(ptype, isinter); - } - if(ptype.isClass()) { - if(Flags.isPrivate(flags) || Flags.isPackageDefault(flags)) { - return true; - } - } - } - if(ptype != null) { - if(!Flags.isStatic(flags) && ! Flags.isPublic(flags)) { - return true; - } - } - if(Flags.isPrivate(flags) || Flags.isPackageDefault(flags)) { - return true; - } - break; - } - } - return hasNonVisibleParent(element.getParent(), isinter); - } - /** * Method to post process returned flags from the {@link org.eclipse.pde.api.tools.internal.JavadocTagManager} * @param tag the tag to process diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/util/JavaUtils.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/util/JavaUtils.java new file mode 100644 index 0000000000..7e11e7c8da --- /dev/null +++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/util/JavaUtils.java @@ -0,0 +1,73 @@ +/******************************************************************************* + * Copyright (c) Aug 13, 2013 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.pde.api.tools.internal.util; + +import org.eclipse.jdt.core.Flags; +import org.eclipse.jdt.core.IJavaElement; +import org.eclipse.jdt.core.IMember; +import org.eclipse.jdt.core.IType; +import org.eclipse.jdt.core.JavaModelException; + +/** + * A collection of utility methods to help with handling {@link org.eclipse.jdt.core.IJavaElement}s + * and {@link org.eclipse.jdt.core.dom.AST} elements + * + * @since 1.0.600 + */ +public class JavaUtils { + + private JavaUtils() {} + + /** + * Returns if the given {@link IJavaElement} is externally visible + * + * @param element + * @return true if the given element is visible false otherwise + * @throws JavaModelException if a model lookup fails + */ + public static final boolean isVisible(IJavaElement element) throws JavaModelException { + if(element != null) { + switch(element.getElementType()) { + case IJavaElement.FIELD: + case IJavaElement.METHOD: { + IMember member = (IMember) element; + int flags = member.getFlags(); + IType type = member.getDeclaringType(); + if(Flags.isPublic(flags) || Flags.isProtected(flags) || (type != null && type.isInterface())) { + return isVisible(type); + } + break; + } + case IJavaElement.TYPE: { + IType type = (IType) element; + int flags = type.getFlags(); + if(type.isLocal() && !type.isAnonymous()) { + return false; + } + if(type.isMember()) { + if((Flags.isPublic(flags) && Flags.isStatic(flags)) || type.isInterface()) { + return isVisible(type.getDeclaringType()); + } + } + else { + return Flags.isPublic(flags) || type.isInterface(); + } + break; + } + default: { + break; + } + + } + } + return false; + } +} -- cgit v1.2.3