Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVikas Chandra2021-07-07 09:35:46 +0000
committerVikas Chandra2021-07-14 09:05:24 +0000
commit29df5087dfeeb26d3b3ee8f61ea2aa8c24a71198 (patch)
tree224d5d5ca869d61cdd28c0b4549caa47fc7a6f76
parent2263dfb1695b6d0def814a3981aeaf652558a57f (diff)
downloadeclipse.pde.ui-29df5087dfeeb26d3b3ee8f61ea2aa8c24a71198.tar.gz
eclipse.pde.ui-29df5087dfeeb26d3b3ee8f61ea2aa8c24a71198.tar.xz
eclipse.pde.ui-29df5087dfeeb26d3b3ee8f61ea2aa8c24a71198.zip
Bug 332767 - API builder should detect leaked types in APIs that areI20210714-1800
package-visible or type arguments Change-Id: Id7335d35f76f90de0171343a581094b7cd681b36 Signed-off-by: Vikas Chandra <Vikas.Chandra@in.ibm.com> Reviewed-on: https://git.eclipse.org/r/c/pde/eclipse.pde.ui/+/182843
-rw-r--r--apitools/org.eclipse.pde.api.tools.tests/src/org/eclipse/pde/api/tools/builder/tests/leak/MethodReturnTypeLeak.java27
-rw-r--r--apitools/org.eclipse.pde.api.tools.tests/test-builder/leak/method/testMRL23.java25
-rw-r--r--apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/LeakReturnTypeDetector.java18
-rw-r--r--apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/Reference.java32
4 files changed, 97 insertions, 5 deletions
diff --git a/apitools/org.eclipse.pde.api.tools.tests/src/org/eclipse/pde/api/tools/builder/tests/leak/MethodReturnTypeLeak.java b/apitools/org.eclipse.pde.api.tools.tests/src/org/eclipse/pde/api/tools/builder/tests/leak/MethodReturnTypeLeak.java
index b7bb22dbb5..fa13dbfdc1 100644
--- a/apitools/org.eclipse.pde.api.tools.tests/src/org/eclipse/pde/api/tools/builder/tests/leak/MethodReturnTypeLeak.java
+++ b/apitools/org.eclipse.pde.api.tools.tests/src/org/eclipse/pde/api/tools/builder/tests/leak/MethodReturnTypeLeak.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2019 IBM Corporation and others.
+ * Copyright (c) 2008, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -14,6 +14,7 @@
package org.eclipse.pde.api.tools.builder.tests.leak;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.JavaCore;
import org.eclipse.pde.api.tools.internal.problems.ApiProblemFactory;
import org.eclipse.pde.api.tools.internal.provisional.descriptors.IElementDescriptor;
import org.eclipse.pde.api.tools.internal.provisional.problems.IApiProblem;
@@ -35,6 +36,11 @@ public class MethodReturnTypeLeak extends LeakTest {
}
@Override
+ protected String getTestCompliance() {
+ return JavaCore.VERSION_1_8;
+ }
+
+ @Override
protected int getDefaultProblemId() {
if(pid == -1) {
pid = ApiProblemFactory.createProblemId(
@@ -506,7 +512,7 @@ public class MethodReturnTypeLeak extends LeakTest {
/**
* Tests that a protected method(s) in a final class does not report any
* return type leaks https://bugs.eclipse.org/bugs/show_bug.cgi?id=257113
- *
+ *
* @param inc
*/
private void x19(boolean inc) {
@@ -553,4 +559,21 @@ public class MethodReturnTypeLeak extends LeakTest {
deployLeakTest(typename + ".java", inc); //$NON-NLS-1$
}
+ public void testMethodReturnType23F() {
+ x23(false);
+ }
+
+ public void testMethodReturnType23I() {
+ x23(true);
+ }
+
+ private void x23(boolean inc) {
+ setExpectedProblemIds(getDefaultProblemIdSet(1));
+
+ expectingNoProblems();
+ String typename = "testMRL23"; //$NON-NLS-1$
+ setExpectedMessageArgs(new String[][] { { "List<E>", typename, "m1()" } }); //$NON-NLS-1$ //$NON-NLS-2$
+ deployLeakTest(typename + ".java", inc); //$NON-NLS-1$
+ }
+
}
diff --git a/apitools/org.eclipse.pde.api.tools.tests/test-builder/leak/method/testMRL23.java b/apitools/org.eclipse.pde.api.tools.tests/test-builder/leak/method/testMRL23.java
new file mode 100644
index 0000000000..108b7f28ea
--- /dev/null
+++ b/apitools/org.eclipse.pde.api.tools.tests/test-builder/leak/method/testMRL23.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2021 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package x.y.z;
+
+
+import x.y.z.classDefault;
+import java.util.List;
+
+public class testMRL23 {
+
+ public List<classDefault> m1() {
+ return null;
+ }
+} \ No newline at end of file
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/LeakReturnTypeDetector.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/LeakReturnTypeDetector.java
index de29d5043a..a16b2332b4 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/LeakReturnTypeDetector.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/LeakReturnTypeDetector.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2019 IBM Corporation and others.
+ * Copyright (c) 2008, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -13,8 +13,10 @@
*******************************************************************************/
package org.eclipse.pde.api.tools.internal.builder;
+import java.util.List;
import java.util.Set;
+import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.Flags;
import org.eclipse.pde.api.tools.internal.provisional.builder.IReference;
import org.eclipse.pde.api.tools.internal.provisional.model.IApiType;
@@ -57,6 +59,20 @@ public class LeakReturnTypeDetector extends MethodLeakDetector {
}
IApiType type = (IApiType) reference.getResolvedReference();
int modifiers = type.getModifiers();
+ if( Flags.isPackageDefault(modifiers) == false) {
+ if (reference instanceof Reference) {
+ try {
+ List<IApiType> parameterList = ((Reference) reference).getParameterList();
+ for (IApiType iApiType : parameterList) {
+ if (Flags.isPackageDefault(iApiType.getModifiers())) {
+ return true;
+ }
+ }
+ }catch (CoreException e) {
+ // do nothing, skip it
+ }
+ }
+ }
return Flags.isPackageDefault(modifiers);
}
diff --git a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/Reference.java b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/Reference.java
index 3ba725f0ea..095c6ba18e 100644
--- a/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/Reference.java
+++ b/apitools/org.eclipse.pde.api.tools/src/org/eclipse/pde/api/tools/internal/builder/Reference.java
@@ -1,5 +1,5 @@
/*******************************************************************************
- * Copyright (c) 2008, 2014 IBM Corporation and others.
+ * Copyright (c) 2008, 2021 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
@@ -309,10 +309,38 @@ public class Reference implements IReference {
}
/**
- * Resolves this reference
+ * Gets the parameters if return has generics
*
* @throws CoreException
*/
+
+ public List<IApiType> getParameterList() throws CoreException {
+ ArrayList<IApiType> paramList = new ArrayList<>();
+ IApiComponent sourceComponent = getMember().getApiComponent();
+ if (sourceComponent != null) {
+ // add the parameter types
+ if (fSignature != null && fSignature.indexOf('<') >= 0) {
+ String substring = fSignature.substring(fSignature.indexOf('<') + 1, fSignature.indexOf('>'));
+ String[] split = substring.split(";"); //$NON-NLS-1$
+ for (String string : split) {
+ String pack = string.substring(1, string.lastIndexOf('/')).replace('/', '.');
+ IApiTypeRoot param = Util.getClassFile(
+ sourceComponent.getBaseline().resolvePackage(sourceComponent, pack),
+ pack + '.' + string.substring(string.lastIndexOf('/') + 1, string.length()));
+ if (param != null) {
+ IApiType structure = param.getStructure();
+ if (structure != null) {
+ paramList.add(structure);
+ }
+ }
+ }
+ }
+ }
+
+ return paramList;
+
+ }
+
public void resolve() throws CoreException {
if (!this.fStatus) {
return;

Back to the top