Skip to content

Commit

Permalink
feat: JvmClassHelper isPrimitive/isPrimitiveWrapper (#121)
Browse files Browse the repository at this point in the history
  • Loading branch information
tangcent committed Apr 25, 2021
1 parent 09deb5b commit 9429ef1
Show file tree
Hide file tree
Showing 10 changed files with 705 additions and 177 deletions.
2 changes: 1 addition & 1 deletion gradle.properties
Expand Up @@ -11,4 +11,4 @@ kotlin_version=1.4.31
plugin_name=Intellij-kotlin
plugin_version=1.0.0
junit_version=5.7.1
project_version=0.9.7-SNAPSHOT
project_version=0.9.9-SNAPSHOT

Large diffs are not rendered by default.

Expand Up @@ -7,9 +7,6 @@ import com.intellij.psi.PsiParameter
import com.intellij.psi.util.PsiTypesUtil
import com.itangcent.testFramework.ContextLightCodeInsightFixtureTestCase
import java.util.*
import java.util.Collection
import java.util.List
import java.util.Map

/**
* Test case of [PsiClassUtils]
Expand All @@ -33,11 +30,11 @@ internal class PsiClassUtilsTest : ContextLightCodeInsightFixtureTestCase() {
override fun beforeBind() {
super.beforeBind()
objectPsiClass = loadSource(Object::class.java)!!
collectionPsiClass = loadSource(Collection::class.java)!!
mapPsiClass = loadSource(Map::class.java)!!
listPsiClass = loadSource(List::class.java)!!
hashMapPsiClass = loadSource(HashMap::class.java)!!
linkedListPsiClass = loadSource(LinkedList::class.java)!!
collectionPsiClass = loadSource(java.util.Collection::class.java)!!
mapPsiClass = loadSource(java.util.Map::class.java)!!
listPsiClass = loadSource(java.util.List::class.java)!!
hashMapPsiClass = loadSource(java.util.HashMap::class.java)!!
linkedListPsiClass = loadSource(java.util.LinkedList::class.java)!!
modelPsiClass = loadClass("model/Model.java")!!
getStrPsiMethod = modelPsiClass.methods[0]
setStrPsiMethod = modelPsiClass.methods[1]
Expand Down
6 changes: 3 additions & 3 deletions intellij-idea/src/test/resources/constant/Numbers.java
Expand Up @@ -10,16 +10,16 @@ public interface Numbers {
/**
* two
*/
int TWO = 2;
static final int TWO = 2;

/**
* three
*/
int THREE = 3;
static final int THREE = 3;

/**
* four
*/
int FOUR = 4;
static final int FOUR = 4;

}
8 changes: 5 additions & 3 deletions intellij-idea/src/test/resources/model/Result.java
@@ -1,12 +1,14 @@
package com.itangcent.model;

import com.itangcent.model.IResult;

public class Result<T> implements IResult {

private Integer code;//响应码
private Integer code;//The response code

private String msg;//响应消息
private String msg;//The response message

private T data;//响应数据
private T data;//The response data

public Result() {
}
Expand Down
@@ -0,0 +1,77 @@
package com.itangcent.intellij.jvm

import com.itangcent.common.utils.safeComputeIfAbsent
import kotlin.reflect.KClass

object ClassMateDataStorage {

private val mateData = HashMap<String, ClassMateData>()

private val classWithTagCache = HashMap<String, Array<String>>()

fun classWithTag(tag: String): Array<String> {
return classWithTagCache.safeComputeIfAbsent(tag) {
mateData.entries.filter { it.value.tags?.contains(tag) == true }
.map { it.key }
.toTypedArray()
} ?: emptyArray()
}

fun hasTag(className: String, tag: String): Boolean {
return mateData[className]?.tags?.contains(tag) ?: false
}

fun addTag(className: String, vararg tags: String) {
mateDataOf(className).addTags(*tags)
}

fun addTag(cls: Class<*>, vararg tags: String) {
addTag(cls.name, *tags)
addTag(cls.simpleName, *tags)
}

fun addTag(cls: KClass<*>, vararg tags: String) {
cls.qualifiedName?.let { addTag(it, *tags) }
cls.simpleName?.let { addTag(it, *tags) }
}

fun setDefaultValue(className: String, defaultValue: Any) {
mateDataOf(className).defaultValue = defaultValue
}

fun setDefaultValue(cls: Class<*>, defaultValue: Any) {
setDefaultValue(cls.name, defaultValue)
setDefaultValue(cls.simpleName, defaultValue)
}

fun setDefaultValue(cls: KClass<*>, defaultValue: Any) {
cls.qualifiedName?.let { setDefaultValue(it, defaultValue) }
cls.simpleName?.let { setDefaultValue(it, defaultValue) }
}

fun getDefaultValue(className: String): Any? {
return mateData[className]?.defaultValue
}

private fun mateDataOf(className: String): ClassMateData {
return mateData.safeComputeIfAbsent(className) {
ClassMateData()
}!!
}

class ClassMateData {

var tags: Array<String>? = null

var defaultValue: Any? = null

@Synchronized
fun addTags(vararg tags: String) {
if (this.tags == null) {
this.tags = arrayOf(*tags)
} else {
this.tags = this.tags!! + tags
}
}
}
}
Expand Up @@ -33,8 +33,21 @@ interface JvmClassHelper {

fun isPublicStaticFinal(field: PsiField): Boolean

/**
* Returns whether the given {@code type} is a primitive or primitive wrapper
*/
fun isNormalType(typeName: String): Boolean

/**
* Returns whether the given type is a primitive
*/
fun isPrimitive(typeName: String): Boolean

/**
* Returns whether the given type is a primitive wrapper
*/
fun isPrimitiveWrapper(typeName: String): Boolean

fun getDefaultValue(typeName: String): Any?

fun isBasicMethod(methodName: String): Boolean
Expand Down

0 comments on commit 9429ef1

Please sign in to comment.