Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 10 additions & 2 deletions java-frontend/src/main/java/org/sonar/java/model/JType.java
Original file line number Diff line number Diff line change
Expand Up @@ -137,7 +137,11 @@ public Type primitiveWrapperType() {
if (name == null) {
return null;
}
primitiveWrapperType = sema.type(sema.resolveType(name));
ITypeBinding resolvedType = sema.resolveType(name);
if (resolvedType == null) {
return null;
}
primitiveWrapperType = sema.type(resolvedType);
}
return primitiveWrapperType;
}
Expand All @@ -150,7 +154,11 @@ public Type primitiveType() {
if (name == null) {
return null;
}
primitiveType = sema.type(sema.resolveType(name));
ITypeBinding resolvedType = sema.resolveType(name);
if (resolvedType == null) {
return null;
}
primitiveType = sema.type(resolvedType);
}
return primitiveType;
}
Expand Down
48 changes: 46 additions & 2 deletions java-frontend/src/test/java/org/sonar/java/model/JTypeTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,50 @@ void primitiveType(){
assertThat(byteType.primitiveType()).isNotEqualTo(type("boolean"));
}

@Test
void primitiveWrapperType(){
Type booleanType = type("boolean");
assertThat(booleanType.primitiveWrapperType()).isEqualTo(type("java.lang.Boolean"));
assertThat(booleanType.primitiveWrapperType()).isNotEqualTo(type("java.lang.Byte"));
}

@Test
void non_primitive_type_has_no_primitive() {
Type stringType = type("java.lang.String");
assertThat(stringType.primitiveType()).isNull();
}

@Test
void non_primitive_wrapper_tpe_has_no_primitive_wrapper() {
Type stringType = type("java.lang.String");
assertThat(stringType.primitiveWrapperType()).isNull();
}

@Test
void primitiveWrapperType_returns_null_when_semantic_cannot_resolve_wrapper_type() {
// Sema that can resolve primitives, but fails to resolve wrapper types, which can happen when the classpath is not correctly set up
var brokenSema = spy(sema);
when(brokenSema.resolveType("java.lang.Byte")).thenReturn(null);

var primitiveBinding = sema.resolveType("byte");
var primitiveType = new JType(brokenSema, primitiveBinding);

assertThat(primitiveType.primitiveWrapperType()).isNull();
}

@Test
void primitiveType_returns_null_when_semantic_cannot_resolve_primitive_type() {
// Sema that can resolve wrapper types, but fails to resolve a primitive, this should never happen in practice,
// but we want to make sure it doesn't throw an exception and returns null instead
var brokenSema = spy(sema);
when(brokenSema.resolveType("byte")).thenReturn(null);

var wrapperBinding = sema.resolveType("java.lang.Byte");
var wrapperType = new JType(brokenSema, wrapperBinding);

assertThat(wrapperType.primitiveType()).isNull();
}

@Test
void declaringType(){
Type byteType = type("java.lang.Byte");
Expand All @@ -166,15 +210,15 @@ void isNumerical() {
}

@ParameterizedTest
@MethodSource("names")
@MethodSource("fullyQualifiedNamesToNames")
void names(String expectedFullyQualifiedName, String expectedName) {
assertThat(type(expectedFullyQualifiedName))
.is(expectedFullyQualifiedName)
.hasName(expectedName)
.hasToString(expectedName);
}

private static Stream<Arguments> names() {
private static Stream<Arguments> fullyQualifiedNamesToNames() {
return Stream.of(
Arguments.of("int", "int"),
Arguments.of("int[][]", "int[][]"),
Expand Down
Loading