Skip to content

Commit b6ad839

Browse files
authored
Allow primitives in collections to be Moshi-compatible (#430)
* Allow enums to be Moshi compatible * Run spotless * Support sealed interfaces with moshi-sealed * Support primitives in collections * Run spotless * Fix typo * Clean up primitive map test * Remove unused ValidModel
1 parent 377da8a commit b6ad839

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

slack-lint-checks/src/main/java/slack/lint/JsonInflaterMoshiCompatibilityDetector.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,8 @@ class JsonInflaterMoshiCompatibilityDetector : Detector(), SourceCodeScanner {
139139
}
140140

141141
private fun isMoshiCompatible(psiClass: PsiClass): Boolean {
142+
if (isPrimitiveType(psiClass)) return true
143+
142144
if (isCollectionType(psiClass)) return true
143145

144146
if (isAbstractOrNonPublicClass(psiClass)) return false
@@ -153,6 +155,22 @@ class JsonInflaterMoshiCompatibilityDetector : Detector(), SourceCodeScanner {
153155
return qualifiedName in listOf(FQCN_LIST, FQCN_SET, FQCN_MAP, FQCN_COLLECTION)
154156
}
155157

158+
private fun isPrimitiveType(psiClass: PsiClass): Boolean {
159+
val qualifiedName = psiClass.qualifiedName ?: return false
160+
return qualifiedName in
161+
listOf(
162+
FQCN_JAVA_STRING,
163+
FQCN_JAVA_BOOLEAN,
164+
FQCN_JAVA_BYTE,
165+
FQCN_JAVA_CHARACTER,
166+
FQCN_JAVA_SHORT,
167+
FQCN_JAVA_INTEGER,
168+
FQCN_JAVA_LONG,
169+
FQCN_JAVA_FLOAT,
170+
FQCN_JAVA_DOUBLE,
171+
)
172+
}
173+
156174
private fun isAbstractOrNonPublicClass(psiClass: PsiClass): Boolean {
157175
return !psiClass.isInterface &&
158176
(psiClass.hasModifierProperty(PsiModifier.ABSTRACT) ||
@@ -176,6 +194,14 @@ class JsonInflaterMoshiCompatibilityDetector : Detector(), SourceCodeScanner {
176194
// Fully qualified class names for relevant annotations and types
177195
private const val FQCN_JSON_INFLATER = "slack.commons.json.JsonInflater"
178196
private const val FQCN_JAVA_STRING = "java.lang.String"
197+
private const val FQCN_JAVA_BOOLEAN = "java.lang.Boolean"
198+
private const val FQCN_JAVA_BYTE = "java.lang.Byte"
199+
private const val FQCN_JAVA_CHARACTER = "java.lang.Character"
200+
private const val FQCN_JAVA_SHORT = "java.lang.Short"
201+
private const val FQCN_JAVA_INTEGER = "java.lang.Integer"
202+
private const val FQCN_JAVA_LONG = "java.lang.Long"
203+
private const val FQCN_JAVA_FLOAT = "java.lang.Float"
204+
private const val FQCN_JAVA_DOUBLE = "java.lang.Double"
179205
private const val FQCN_LIST = "java.util.List"
180206
private const val FQCN_SET = "java.util.Set"
181207
private const val FQCN_MAP = "java.util.Map"

slack-lint-checks/src/test/java/slack/lint/JsonInflaterMoshiCompatibilityDetectorTest.kt

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,37 @@ class JsonInflaterMoshiCompatibilityDetectorTest : LintDetectorTest() {
279279
.expectClean()
280280
}
281281

282+
@Test
283+
fun testValidMapOfPrimitives() {
284+
lint()
285+
.files(
286+
jsonClassStub,
287+
jsonInflaterStub,
288+
adaptedByStub,
289+
parameterizedTypeStub,
290+
kotlin(
291+
"""
292+
package test
293+
294+
import com.squareup.moshi.JsonClass
295+
import com.squareup.moshi.StubParameterizedType
296+
import slack.commons.json.JsonInflater
297+
298+
fun useJsonInflater(jsonInflater: JsonInflater) {
299+
val type = StubParameterizedType(
300+
Map::class.java,
301+
arrayOf(String::class.java, Int::class.java)
302+
)
303+
val model = jsonInflater.inflate<Map<String, Int>>("{}", type)
304+
val json = jsonInflater.deflate(model, type)
305+
}
306+
"""
307+
),
308+
)
309+
.run()
310+
.expectClean()
311+
}
312+
282313
@Test
283314
fun testInvalidDataClassInList() {
284315
lint()

0 commit comments

Comments
 (0)