diff options
| author | Vikas Chandra | 2021-07-07 09:35:46 +0000 |
|---|---|---|
| committer | Vikas Chandra | 2021-07-14 09:05:24 +0000 |
| commit | 29df5087dfeeb26d3b3ee8f61ea2aa8c24a71198 (patch) | |
| tree | 224d5d5ca869d61cdd28c0b4549caa47fc7a6f76 | |
| parent | 2263dfb1695b6d0def814a3981aeaf652558a57f (diff) | |
| download | eclipse.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
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; |
