Skip to content

Commit 14a56e3

Browse files
authored
fix: fix NullPointerException (issue #3514) (#3515)
1 parent d904691 commit 14a56e3

File tree

3 files changed

+29
-3
lines changed

3 files changed

+29
-3
lines changed

src/main/java/spoon/support/reflect/declaration/CtTypeImpl.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import java.util.Comparator;
6060
import java.util.HashSet;
6161
import java.util.List;
62+
import java.util.Optional;
6263
import java.util.Set;
6364

6465
/**
@@ -283,7 +284,7 @@ public Set<CtTypeReference<?>> getUsedTypes(boolean includeSamePackage) {
283284
}
284285

285286
private boolean shouldIncludeSamePackage(boolean includeSamePackage, CtTypeReference<?> typeRef) {
286-
return includeSamePackage || (getPackage() != null && !getPackageReference(typeRef).equals(getPackage().getReference()));
287+
return includeSamePackage || (getPackage() != null && !getPackageReference(typeRef).map(v -> v.equals(getPackage().getReference())).orElse(false));
287288
}
288289

289290
private boolean isValidTypeReference(CtTypeReference<?> typeRef) {
@@ -305,13 +306,16 @@ private boolean isFromJavaLang(CtTypeReference<?> typeRef) {
305306
* @see CtTypeReference#getPackage()
306307
* @since 4.0
307308
*/
308-
private static CtPackageReference getPackageReference(CtTypeReference<?> tref) {
309+
private static Optional<CtPackageReference> getPackageReference(CtTypeReference<?> tref) {
309310
CtPackageReference pref = tref.getPackage();
310311
while (pref == null) {
311312
tref = tref.getDeclaringType();
313+
if (tref == null) {
314+
return Optional.empty();
315+
}
312316
pref = tref.getPackage();
313317
}
314-
return pref;
318+
return Optional.of(pref);
315319
}
316320

317321
@Override

src/test/java/spoon/test/ctType/CtTypeTest.java

+12
Original file line numberDiff line numberDiff line change
@@ -237,4 +237,16 @@ public void testRetainsInterfaceOrder() {
237237

238238
assertEquals(expectedInterfaceOrder, interfaces);
239239
}
240+
@Test
241+
public void getUsedTypesWithWildcard() {
242+
//contract: Wildcard types like "?" shouldn't create a NPE. For more context see issue#3514
243+
String input = "src/test/resources/layornos/AllocationStorage.java";
244+
Launcher launcher = new Launcher();
245+
launcher.getEnvironment().setNoClasspath(true);
246+
launcher.addInputResource(input);
247+
CtModel model = launcher.buildModel();
248+
model.getAllTypes().forEach(type -> {
249+
type.getUsedTypes(false);
250+
});
251+
}
240252
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
public class AllocationStorage
2+
{
3+
4+
public void initContainerTemplate()
5+
{
6+
Class<?> component;
7+
8+
}
9+
}
10+

0 commit comments

Comments
 (0)