From 7732ee368c314ce9064d6eb244dfa3fc7fb49036 Mon Sep 17 00:00:00 2001 From: pyltsin Date: Sun, 19 Jul 2020 21:19:37 +0300 Subject: [PATCH 1/8] add Feign Client --- build.gradle | 2 +- .../com/viartemev/requestmapper/BoundType.kt | 5 + .../requestmapper/RequestMappingItem.kt | 7 +- .../RequestMappingItemProvider.kt | 19 +- .../AbstractGoToRequestMappingAction.kt} | 12 +- .../actions/GoToInRequestMappingAction.kt | 17 ++ .../actions/GoToOutRequestMappingAction.kt | 17 ++ .../InRequestMappingGoToContributor.kt} | 12 +- .../OutRequestMappingGoToContributor.kt | 34 ++++ .../spring/SpringAnnotationUtils.kt | 15 ++ .../spring/SpringMappingAnnotation.kt | 26 +-- .../classmapping/ClassRequestMapping.kt | 15 ++ .../classmapping/ClassUnknownAnnotation.kt | 13 ++ .../spring/classmapping/FeignClientMapping.kt | 38 ++++ .../SpringClassMappingAnnotation.kt | 48 +++++ .../CustomFilterWrapperMappingContributor.kt | 35 ++++ ...ributor.kt => JavaRequestMappingFinder.kt} | 2 +- ...butor.kt => KotlinRequestMappingFinder.kt} | 2 +- ...butor.kt => RequestMappingByNameFinder.kt} | 23 +-- .../requestmapper/extensions/Extensions.kt | 6 +- .../com/viartemev/requestmapper/model/Path.kt | 10 +- src/main/resources/META-INF/plugin.xml | 19 +- src/main/resources/META-INF/pluginKotlin.xml | 2 +- .../RequestMappingContributorSpek.kt | 185 ++++++++---------- .../requestmapper/model/PathElementSpek.kt | 2 +- 25 files changed, 395 insertions(+), 171 deletions(-) create mode 100644 src/main/kotlin/com/viartemev/requestmapper/BoundType.kt rename src/main/kotlin/com/viartemev/requestmapper/{GoToRequestMappingAction.kt => actions/AbstractGoToRequestMappingAction.kt} (65%) create mode 100644 src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt create mode 100644 src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt rename src/main/kotlin/com/viartemev/requestmapper/{RequestMappingGoToContributor.kt => actions/InRequestMappingGoToContributor.kt} (68%) create mode 100644 src/main/kotlin/com/viartemev/requestmapper/actions/OutRequestMappingGoToContributor.kt create mode 100644 src/main/kotlin/com/viartemev/requestmapper/annotations/spring/SpringAnnotationUtils.kt create mode 100644 src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMapping.kt create mode 100644 src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassUnknownAnnotation.kt create mode 100644 src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/FeignClientMapping.kt create mode 100644 src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotation.kt create mode 100644 src/main/kotlin/com/viartemev/requestmapper/contributor/CustomFilterWrapperMappingContributor.kt rename src/main/kotlin/com/viartemev/requestmapper/contributor/{JavaRequestMappingContributor.kt => JavaRequestMappingFinder.kt} (87%) rename src/main/kotlin/com/viartemev/requestmapper/contributor/{KotlinRequestMappingContributor.kt => KotlinRequestMappingFinder.kt} (89%) rename src/main/kotlin/com/viartemev/requestmapper/contributor/{RequestMappingByNameContributor.kt => RequestMappingByNameFinder.kt} (59%) diff --git a/build.gradle b/build.gradle index 448d5366..9d8d6f98 100644 --- a/build.gradle +++ b/build.gradle @@ -43,7 +43,7 @@ apply plugin: "org.junit.platform.gradle.plugin" apply plugin: "org.jmailen.kotlinter" group "com.viartemev.requestmapper" -version "1.0" +version "1.1" dependencies { compile("org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version") diff --git a/src/main/kotlin/com/viartemev/requestmapper/BoundType.kt b/src/main/kotlin/com/viartemev/requestmapper/BoundType.kt new file mode 100644 index 00000000..0474d1db --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/BoundType.kt @@ -0,0 +1,5 @@ +package com.viartemev.requestmapper + +enum class BoundType { + INBOUND, OUTBOUND +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItem.kt b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItem.kt index e414ca7f..188b7b3a 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItem.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItem.kt @@ -7,7 +7,12 @@ import com.intellij.psi.PsiClass import com.intellij.psi.PsiElement import com.intellij.psi.PsiMethod -class RequestMappingItem(val psiElement: PsiElement, private val urlPath: String, private val requestMethod: String) : NavigationItem { +class RequestMappingItem( + val psiElement: PsiElement, + private val urlPath: String, + private val requestMethod: String, + val boundType: Set = setOf(BoundType.INBOUND) +) : NavigationItem { private val navigationElement = psiElement.navigationElement as? Navigatable diff --git a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt index d511c4a1..570f41e3 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt @@ -57,14 +57,17 @@ open class RequestMappingItemProvider : ChooseByNameItemProvider { val model = base.model if (model is ChooseByNameModelEx) { indicator.checkCanceled() - model.processNames({ sequence: String? -> - indicator.checkCanceled() - if (matches(sequence, pattern)) { - collect.consume(sequence) - return@processNames true - } - return@processNames false - }, parameters) + model.processNames( + { sequence: String? -> + indicator.checkCanceled() + if (matches(sequence, pattern)) { + collect.consume(sequence) + return@processNames true + } + return@processNames false + }, + parameters + ) } namesList.sortWith(compareBy { PopupPath(it) }) diff --git a/src/main/kotlin/com/viartemev/requestmapper/GoToRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/AbstractGoToRequestMappingAction.kt similarity index 65% rename from src/main/kotlin/com/viartemev/requestmapper/GoToRequestMappingAction.kt rename to src/main/kotlin/com/viartemev/requestmapper/actions/AbstractGoToRequestMappingAction.kt index b9ee8957..3b071ae4 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/GoToRequestMappingAction.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/AbstractGoToRequestMappingAction.kt @@ -1,20 +1,24 @@ -package com.viartemev.requestmapper +package com.viartemev.requestmapper.actions import com.intellij.ide.actions.GotoActionBase import com.intellij.ide.util.gotoByName.ChooseByNamePopup +import com.intellij.navigation.ChooseByNameContributor import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.actionSystem.CommonDataKeys.PROJECT import com.intellij.openapi.project.DumbAware -import com.viartemev.requestmapper.extensions.Extensions +import com.viartemev.requestmapper.RequestMappingItem +import com.viartemev.requestmapper.RequestMappingModel -class GoToRequestMappingAction : GotoActionBase(), DumbAware { +abstract class AbstractGoToRequestMappingAction : GotoActionBase(), DumbAware { override fun gotoActionPerformed(e: AnActionEvent) { val project = e.getData(PROJECT) ?: return - val requestMappingModel = RequestMappingModel(project, Extensions.getExtensions()) + val requestMappingModel = RequestMappingModel(project, getContributors()) showNavigationPopup(e, requestMappingModel, GoToRequestMappingActionCallback(), null, true, false) } + abstract fun getContributors(): List + private class GoToRequestMappingActionCallback : GotoActionBase.GotoActionCallback() { override fun elementChosen(popup: ChooseByNamePopup, element: Any) { diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt new file mode 100644 index 00000000..b138fbe6 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt @@ -0,0 +1,17 @@ +package com.viartemev.requestmapper.actions + +import com.intellij.navigation.ChooseByNameContributor +import com.viartemev.requestmapper.BoundType +import com.viartemev.requestmapper.contributor.CustomFilterWrapperMappingContributor +import com.viartemev.requestmapper.extensions.Extensions + +class GoToInRequestMappingAction : AbstractGoToRequestMappingAction() { + override fun getContributors(): List { + return Extensions.getContributors().map { + CustomFilterWrapperMappingContributor( + it, + { requestMappingItem -> requestMappingItem.boundType.contains(BoundType.INBOUND) } + ) + } + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt new file mode 100644 index 00000000..b886bd61 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt @@ -0,0 +1,17 @@ +package com.viartemev.requestmapper.actions + +import com.intellij.navigation.ChooseByNameContributor +import com.viartemev.requestmapper.BoundType +import com.viartemev.requestmapper.contributor.CustomFilterWrapperMappingContributor +import com.viartemev.requestmapper.extensions.Extensions + +class GoToOutRequestMappingAction : AbstractGoToRequestMappingAction() { + override fun getContributors(): List { + return Extensions.getContributors().map { + CustomFilterWrapperMappingContributor( + it, + { requestMappingItem -> requestMappingItem.boundType.contains(BoundType.OUTBOUND) } + ) + } + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingGoToContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/InRequestMappingGoToContributor.kt similarity index 68% rename from src/main/kotlin/com/viartemev/requestmapper/RequestMappingGoToContributor.kt rename to src/main/kotlin/com/viartemev/requestmapper/actions/InRequestMappingGoToContributor.kt index 6187ee5f..51bd9775 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingGoToContributor.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/InRequestMappingGoToContributor.kt @@ -1,4 +1,4 @@ -package com.viartemev.requestmapper +package com.viartemev.requestmapper.actions import com.intellij.ide.actions.searcheverywhere.AbstractGotoSEContributor import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributor @@ -6,12 +6,12 @@ import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributorFact import com.intellij.ide.util.gotoByName.FilteringGotoByModel import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.project.Project -import com.viartemev.requestmapper.extensions.Extensions +import com.viartemev.requestmapper.RequestMappingModel -class RequestMappingGoToContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { +class InRequestMappingGoToContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { override fun createModel(project: Project): FilteringGotoByModel<*> { - return RequestMappingModel(project, Extensions.getExtensions()) + return RequestMappingModel(project, GoToInRequestMappingAction().getContributors()) } override fun getSortWeight(): Int { @@ -19,7 +19,7 @@ class RequestMappingGoToContributor(event: AnActionEvent) : AbstractGotoSEContri } override fun getGroupName(): String { - return "Request mapping" + return "Inbound requests" } override fun showInFindResults(): Boolean { @@ -28,7 +28,7 @@ class RequestMappingGoToContributor(event: AnActionEvent) : AbstractGotoSEContri class Factory : SearchEverywhereContributorFactory { override fun createContributor(initEvent: AnActionEvent): SearchEverywhereContributor { - return RequestMappingGoToContributor(initEvent) + return InRequestMappingGoToContributor(initEvent) } } } diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/OutRequestMappingGoToContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/OutRequestMappingGoToContributor.kt new file mode 100644 index 00000000..3abe0c90 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/OutRequestMappingGoToContributor.kt @@ -0,0 +1,34 @@ +package com.viartemev.requestmapper.actions + +import com.intellij.ide.actions.searcheverywhere.AbstractGotoSEContributor +import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributor +import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributorFactory +import com.intellij.ide.util.gotoByName.FilteringGotoByModel +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.Project +import com.viartemev.requestmapper.RequestMappingModel + +class OutRequestMappingGoToContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { + + override fun createModel(project: Project): FilteringGotoByModel<*> { + return RequestMappingModel(project, GoToOutRequestMappingAction().getContributors()) + } + + override fun getSortWeight(): Int { + return 2000 + } + + override fun getGroupName(): String { + return "Outbound requests" + } + + override fun showInFindResults(): Boolean { + return false + } + + class Factory : SearchEverywhereContributorFactory { + override fun createContributor(initEvent: AnActionEvent): SearchEverywhereContributor { + return OutRequestMappingGoToContributor(initEvent) + } + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/SpringAnnotationUtils.kt b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/SpringAnnotationUtils.kt new file mode 100644 index 00000000..11dad712 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/SpringAnnotationUtils.kt @@ -0,0 +1,15 @@ +package com.viartemev.requestmapper.annotations.spring + +import com.intellij.psi.PsiAnnotation +import com.viartemev.requestmapper.annotations.PathAnnotation + +fun fetchPathValueMapping(annotation: PsiAnnotation): List { + val pathMapping = PathAnnotation(annotation).fetchMappings(PATH) + return if (pathMapping.isNotEmpty()) pathMapping else { + val valueMapping = PathAnnotation(annotation).fetchMappings(VALUE) + if (valueMapping.isNotEmpty()) valueMapping else listOf("") + } +} + +private const val VALUE = "value" +private const val PATH = "path" diff --git a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/SpringMappingAnnotation.kt b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/SpringMappingAnnotation.kt index cee5b02a..e1d0e4cd 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/SpringMappingAnnotation.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/SpringMappingAnnotation.kt @@ -5,11 +5,13 @@ import com.intellij.psi.PsiAnnotationMemberValue import com.intellij.psi.PsiLiteralExpression import com.intellij.psi.PsiMethod import com.intellij.psi.PsiReferenceExpression +import com.viartemev.requestmapper.BoundType import com.viartemev.requestmapper.RequestMappingItem import com.viartemev.requestmapper.annotations.MappingAnnotation import com.viartemev.requestmapper.annotations.PathAnnotation import com.viartemev.requestmapper.annotations.UrlFormatter import com.viartemev.requestmapper.annotations.extraction.PsiExpressionExtractor +import com.viartemev.requestmapper.annotations.spring.classmapping.SpringClassMappingAnnotation import com.viartemev.requestmapper.model.Path import com.viartemev.requestmapper.model.PathParameter import com.viartemev.requestmapper.utils.fetchAnnotatedMethod @@ -28,10 +30,11 @@ abstract class SpringMappingAnnotation( val classMappings = fetchMappingsFromClass(psiMethod) val methodMappings = fetchMappingsFromMethod(annotation, psiMethod) val paramsMappings = fetchMappingsParams(annotation) + val boundMapping = fetchBoundMapping(psiMethod) return classMappings.map { clazz -> methodMappings.map { method -> paramsMappings.map { param -> - RequestMappingItem(psiMethod, urlFormatter.format(clazz, method, param), methodName) + RequestMappingItem(psiMethod, urlFormatter.format(clazz, method, param), methodName, boundMapping) } }.flatten() }.flatten() @@ -43,22 +46,11 @@ abstract class SpringMappingAnnotation( } private fun fetchMappingsFromClass(psiMethod: PsiMethod): List { - val classMapping = psiMethod - .containingClass - ?.modifierList - ?.annotations - ?.filterNotNull() - ?.filter { it.qualifiedName == SPRING_REQUEST_MAPPING_CLASS } - ?.flatMap { fetchMapping(it) } ?: emptyList() - return if (classMapping.isEmpty()) listOf("") else classMapping + return SpringClassMappingAnnotation.fetchMappingsFromClass(psiMethod) } - private fun fetchMapping(annotation: PsiAnnotation): List { - val pathMapping = PathAnnotation(annotation).fetchMappings(PATH) - return if (pathMapping.isNotEmpty()) pathMapping else { - val valueMapping = PathAnnotation(annotation).fetchMappings(VALUE) - if (valueMapping.isNotEmpty()) valueMapping else listOf("") - } + private fun fetchBoundMapping(psiMethod: PsiMethod): Set { + return SpringClassMappingAnnotation.fetchBoundMappingFromClass(psiMethod) } private fun fetchMappingsFromMethod(annotation: PsiAnnotation, method: PsiMethod): List { @@ -68,7 +60,7 @@ abstract class SpringMappingAnnotation( .mapNotNull { PathParameter(it).extractParameterNameWithType(SPRING_PATH_VARIABLE_CLASS, ::extractParameterNameFromAnnotation) } .toMap() - return fetchMapping(annotation) + return fetchPathValueMapping(annotation) .map { Path(it).addPathVariablesTypes(parametersNameWithType).toFullPath() } } @@ -96,10 +88,8 @@ abstract class SpringMappingAnnotation( companion object { private const val VALUE = "value" - private const val PATH = "path" private const val NAME = "name" private const val PARAMS = "params" - private const val SPRING_REQUEST_MAPPING_CLASS = "org.springframework.web.bind.annotation.RequestMapping" private const val SPRING_PATH_VARIABLE_CLASS = "org.springframework.web.bind.annotation.PathVariable" } } diff --git a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMapping.kt b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMapping.kt new file mode 100644 index 00000000..c009f2d3 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMapping.kt @@ -0,0 +1,15 @@ +package com.viartemev.requestmapper.annotations.spring.classmapping + +import com.intellij.psi.PsiAnnotation +import com.viartemev.requestmapper.BoundType +import com.viartemev.requestmapper.annotations.spring.fetchPathValueMapping + +class ClassRequestMapping(val psiAnnotation: PsiAnnotation) : SpringClassMappingAnnotation { + override fun fetchClassMapping(): List { + return fetchPathValueMapping(psiAnnotation) + } + + override fun fetchBoundMappingFromClass(): Set { + return setOf(BoundType.INBOUND) + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassUnknownAnnotation.kt b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassUnknownAnnotation.kt new file mode 100644 index 00000000..0d7f5ff8 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassUnknownAnnotation.kt @@ -0,0 +1,13 @@ +package com.viartemev.requestmapper.annotations.spring.classmapping + +import com.viartemev.requestmapper.BoundType + +class ClassUnknownAnnotation : SpringClassMappingAnnotation { + override fun fetchClassMapping(): List { + return listOf() + } + + override fun fetchBoundMappingFromClass(): Set { + return emptySet() + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/FeignClientMapping.kt b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/FeignClientMapping.kt new file mode 100644 index 00000000..fc0e3205 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/FeignClientMapping.kt @@ -0,0 +1,38 @@ +package com.viartemev.requestmapper.annotations.spring.classmapping + +import com.intellij.psi.PsiAnnotation +import com.viartemev.requestmapper.BoundType +import com.viartemev.requestmapper.annotations.PathAnnotation + +const val URL = "url" +const val PATH = "path" +const val NAME = "name" + +class FeignClientMapping(val annotation: PsiAnnotation) : SpringClassMappingAnnotation { + override fun fetchClassMapping(): List { + val name = getString(PathAnnotation(annotation).fetchMappings(NAME)) + var url = getString(PathAnnotation(annotation).fetchMappings(URL)) + val path = getString(PathAnnotation(annotation).fetchMappings(PATH)) + + // analogue of org.springframework.cloud.openfeign.FeignClientFactoryBean#getTarget + if (url.isBlank()) { + url = name + } + return listOf(url + getCleanPath(path)) + } + + // analogue of org.springframework.cloud.openfeign.FeignClientFactoryBean#cleanPath + private fun getCleanPath(path: String): String { + var normalizedPath = if (!path.startsWith("/")) "/$path" else path + normalizedPath = if (normalizedPath.endsWith("/")) normalizedPath.substring(0, normalizedPath.length - 1) else normalizedPath + return normalizedPath + } + + private fun getString(fetchMappings: List): String { + return if (fetchMappings.isEmpty()) "" else fetchMappings[0] + } + + override fun fetchBoundMappingFromClass(): Set { + return setOf(BoundType.OUTBOUND) + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotation.kt b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotation.kt new file mode 100644 index 00000000..a101ee1d --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotation.kt @@ -0,0 +1,48 @@ +package com.viartemev.requestmapper.annotations.spring.classmapping + +import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiMethod +import com.viartemev.requestmapper.BoundType + +private const val SPRING_REQUEST_MAPPING_CLASS = "org.springframework.web.bind.annotation.RequestMapping" +private const val SPRING_OPEN_FEIGN_CLASS = "org.springframework.cloud.openfeign.FeignClient" +private const val SPRING_NETFLIX_FEIGN_CLASS = "org.springframework.cloud.netflix.feign.FeignClient" + +interface SpringClassMappingAnnotation { + + companion object { + + private fun mappingAnnotation(psiAnnotation: PsiAnnotation): SpringClassMappingAnnotation { + return when (psiAnnotation.qualifiedName) { + SPRING_REQUEST_MAPPING_CLASS -> ClassRequestMapping(psiAnnotation) + SPRING_OPEN_FEIGN_CLASS -> FeignClientMapping(psiAnnotation) + SPRING_NETFLIX_FEIGN_CLASS -> FeignClientMapping(psiAnnotation) + else -> ClassUnknownAnnotation() + } + } + + fun fetchMappingsFromClass(psiMethod: PsiMethod): List { + val classMapping = getAnnotations(psiMethod) + ?.flatMap { mappingAnnotation(it).fetchClassMapping() } ?: emptyList() + return if (classMapping.isEmpty()) listOf("") else classMapping + } + + fun fetchBoundMappingFromClass(psiMethod: PsiMethod): Set { + val classMapping = getAnnotations(psiMethod) + ?.flatMap { mappingAnnotation(it).fetchBoundMappingFromClass() } + ?.toSet() ?: emptySet() + return if (classMapping.isEmpty()) setOf(BoundType.INBOUND) else classMapping + } + + private fun getAnnotations(psiMethod: PsiMethod): List? { + return psiMethod + .containingClass + ?.modifierList + ?.annotations + ?.filterNotNull() + } + } + + fun fetchClassMapping(): List + fun fetchBoundMappingFromClass(): Set +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/contributor/CustomFilterWrapperMappingContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/contributor/CustomFilterWrapperMappingContributor.kt new file mode 100644 index 00000000..0aca8353 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/contributor/CustomFilterWrapperMappingContributor.kt @@ -0,0 +1,35 @@ +package com.viartemev.requestmapper.contributor + +import com.intellij.navigation.ChooseByNameContributorEx +import com.intellij.navigation.NavigationItem +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.util.Processor +import com.intellij.util.containers.ContainerUtil +import com.intellij.util.indexing.FindSymbolParameters +import com.intellij.util.indexing.IdFilter +import com.viartemev.requestmapper.RequestMappingItem + +class CustomFilterWrapperMappingContributor( + private var finder: RequestMappingByNameFinder, + private val customFilter: (RequestMappingItem) -> Boolean = { true }, + private var navigationItems: List = emptyList() +) : ChooseByNameContributorEx { + override fun processNames(processor: Processor, scope: GlobalSearchScope, filter: IdFilter?) { + navigationItems = finder.findItems(scope) + .filter(customFilter) + + val names = navigationItems + .map { it.name } + .distinct() + .toTypedArray() + + ContainerUtil.process(names, processor) + } + + override fun processElementsWithName(name: String, processor: Processor, parameters: FindSymbolParameters) { + val filteredNames = navigationItems + .filter { it.name == name } + .toTypedArray() + ContainerUtil.process(filteredNames, processor) + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/contributor/JavaRequestMappingContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/contributor/JavaRequestMappingFinder.kt similarity index 87% rename from src/main/kotlin/com/viartemev/requestmapper/contributor/JavaRequestMappingContributor.kt rename to src/main/kotlin/com/viartemev/requestmapper/contributor/JavaRequestMappingFinder.kt index ca8721cf..c67e456d 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/contributor/JavaRequestMappingContributor.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/contributor/JavaRequestMappingFinder.kt @@ -5,7 +5,7 @@ import com.intellij.psi.PsiAnnotation import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex import com.intellij.psi.search.GlobalSearchScope -class JavaRequestMappingContributor : RequestMappingByNameContributor() { +class JavaRequestMappingFinder : RequestMappingByNameFinder() { override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence { return JavaAnnotationIndex diff --git a/src/main/kotlin/com/viartemev/requestmapper/contributor/KotlinRequestMappingContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/contributor/KotlinRequestMappingFinder.kt similarity index 89% rename from src/main/kotlin/com/viartemev/requestmapper/contributor/KotlinRequestMappingContributor.kt rename to src/main/kotlin/com/viartemev/requestmapper/contributor/KotlinRequestMappingFinder.kt index 5739d9eb..0397de18 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/contributor/KotlinRequestMappingContributor.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/contributor/KotlinRequestMappingFinder.kt @@ -6,7 +6,7 @@ import com.intellij.psi.search.GlobalSearchScope.projectScope import org.jetbrains.kotlin.asJava.toLightAnnotation import org.jetbrains.kotlin.idea.stubindex.KotlinAnnotationsIndex -class KotlinRequestMappingContributor : RequestMappingByNameContributor() { +class KotlinRequestMappingFinder : RequestMappingByNameFinder() { override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence { return KotlinAnnotationsIndex diff --git a/src/main/kotlin/com/viartemev/requestmapper/contributor/RequestMappingByNameContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/contributor/RequestMappingByNameFinder.kt similarity index 59% rename from src/main/kotlin/com/viartemev/requestmapper/contributor/RequestMappingByNameContributor.kt rename to src/main/kotlin/com/viartemev/requestmapper/contributor/RequestMappingByNameFinder.kt index 60051366..a85bf3bf 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/contributor/RequestMappingByNameContributor.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/contributor/RequestMappingByNameFinder.kt @@ -1,34 +1,21 @@ package com.viartemev.requestmapper.contributor -import com.intellij.navigation.ChooseByNameContributor -import com.intellij.navigation.NavigationItem import com.intellij.openapi.project.Project import com.intellij.psi.PsiAnnotation +import com.intellij.psi.search.GlobalSearchScope import com.viartemev.requestmapper.RequestMappingItem import com.viartemev.requestmapper.annotations.MappingAnnotation.Companion.mappingAnnotation import com.viartemev.requestmapper.annotations.MappingAnnotation.Companion.supportedAnnotations import com.viartemev.requestmapper.utils.isMethodAnnotation -abstract class RequestMappingByNameContributor( - private var navigationItems: List = emptyList() -) : ChooseByNameContributor { +abstract class RequestMappingByNameFinder { abstract fun getAnnotationSearchers(annotationName: String, project: Project): Sequence - override fun getNames(project: Project, includeNonProjectItems: Boolean): Array { - navigationItems = supportedAnnotations + fun findItems(scope: GlobalSearchScope): List { + val project = scope.project ?: return emptyList() + return supportedAnnotations .flatMap { annotation -> findRequestMappingItems(project, annotation) } - - return navigationItems - .map { it.name } - .distinct() - .toTypedArray() - } - - override fun getItemsByName(name: String, pattern: String, project: Project, includeNonProjectItems: Boolean): Array { - return navigationItems - .filter { it.name == name } - .toTypedArray() } private fun findRequestMappingItems(project: Project, annotationName: String): List { diff --git a/src/main/kotlin/com/viartemev/requestmapper/extensions/Extensions.kt b/src/main/kotlin/com/viartemev/requestmapper/extensions/Extensions.kt index 1d8c7de3..6eb0be38 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/extensions/Extensions.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/extensions/Extensions.kt @@ -1,14 +1,14 @@ package com.viartemev.requestmapper.extensions -import com.intellij.navigation.ChooseByNameContributor import com.intellij.openapi.extensions.ExtensionPointName +import com.viartemev.requestmapper.contributor.RequestMappingByNameFinder object Extensions { private const val EXTENSION_POINT_NAME = "com.viartemev.requestmapper.requestMappingContributor" - private val extensionPoints = ExtensionPointName.create(EXTENSION_POINT_NAME) + private val extensionPoints = ExtensionPointName.create(EXTENSION_POINT_NAME) - fun getExtensions(): List { + fun getContributors(): List { return extensionPoints.extensionList } } diff --git a/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt b/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt index ebf1b818..2b4727db 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt @@ -6,10 +6,12 @@ data class Path(private val pathElements: List) { constructor(string: String) : this(string.split("/").map { PathElement(it) }) fun addPathVariablesTypes(parametersNameWithType: Map): Path { - return Path(pathElements.map { - val key = it.value.unquoteCurlyBrackets().substringBefore(':') - it.addPathVariableType(parametersNameWithType.getOrDefault(key, "Object")) - }) + return Path( + pathElements.map { + val key = it.value.unquoteCurlyBrackets().substringBefore(':') + it.addPathVariableType(parametersNameWithType.getOrDefault(key, "Object")) + } + ) } fun toFullPath() = pathElements.joinToString("/") { it.value } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 910c6176..6b7de4bd 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -1,7 +1,7 @@ com.viartemev.requestmapper Request mapper - 1.0 + 1.1 Vyacheslav Artemyev - + + + + - + - + + + + + - + diff --git a/src/main/resources/META-INF/pluginKotlin.xml b/src/main/resources/META-INF/pluginKotlin.xml index f5414706..c18b008b 100644 --- a/src/main/resources/META-INF/pluginKotlin.xml +++ b/src/main/resources/META-INF/pluginKotlin.xml @@ -1,5 +1,5 @@ - + diff --git a/src/test/kotlin/com/viartemev/requestmapper/RequestMappingContributorSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/RequestMappingContributorSpek.kt index 5a8fd4f6..916d8244 100644 --- a/src/test/kotlin/com/viartemev/requestmapper/RequestMappingContributorSpek.kt +++ b/src/test/kotlin/com/viartemev/requestmapper/RequestMappingContributorSpek.kt @@ -1,106 +1,93 @@ package com.viartemev.requestmapper -import com.intellij.openapi.command.impl.DummyProject -import com.intellij.openapi.project.Project -import com.intellij.psi.PsiAnnotation -import com.intellij.psi.PsiAnnotationMemberValue -import com.intellij.psi.PsiClass -import com.intellij.psi.PsiElement -import com.intellij.psi.PsiMethod -import com.intellij.psi.PsiModifierList -import com.intellij.psi.PsiParameter -import com.intellij.psi.PsiParameterList -import com.nhaarman.mockito_kotlin.doReturn -import com.nhaarman.mockito_kotlin.mock -import com.viartemev.requestmapper.contributor.RequestMappingByNameContributor -import org.amshove.kluent.shouldBeEqualTo import org.spekframework.spek2.Spek -import org.spekframework.spek2.style.specification.describe +// todo - разбить на 2 - один по finder, второй - contributor, добавить тест, что работает фильтр +// добавить тесты на feign - 3 шт и на bound - 2 шт object RequestMappingContributorSpek : Spek({ - describe("RequestMappingContributor") { - context("getItemsByName on empty navigationItems list") { - it("should return empty list") { - val contributor = object : RequestMappingByNameContributor() { - override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = - emptySequence() - } - contributor.getItemsByName("name", "pattern", DummyProject.getInstance(), false).size shouldBeEqualTo 0 - } - } - context("getItemsByName with 2 mapping items") { - it("should return item a particular name") { - val psiElement = mock {} - val navigationItems = listOf( - RequestMappingItem(psiElement, "/api/v1/users", "GET"), - RequestMappingItem(psiElement, "/api/v2/users", "GET") - ) - val contributor = object : RequestMappingByNameContributor(navigationItems) { - override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = - emptySequence() - } - val itemsByName = contributor.getItemsByName("GET /api/v1/users", "pattern", DummyProject.getInstance(), false) - itemsByName.size shouldBeEqualTo 1 - itemsByName[0].name shouldBeEqualTo "GET /api/v1/users" - } - } - context("getNames on empty navigationItems list") { - it("should return empty list") { - val contributor = object : RequestMappingByNameContributor() { - override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = - emptySequence() - } - contributor.getNames(DummyProject.getInstance(), false).size shouldBeEqualTo 0 - } - } - context("getNames on not method annotations") { - it("should return empty list") { - val annotationParent = mock {} - val psiAnnotation = mock { - on { parent } doReturn annotationParent - } - val contributor = object : RequestMappingByNameContributor() { - override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = - sequenceOf(psiAnnotation) - } - contributor.getNames(DummyProject.getInstance(), false).size shouldBeEqualTo 0 - } - } - context("getNames with one RequestMapping annotation") { - it("should return one name of mapping") { - val psiParameterList = mock { - on { parameters } doReturn emptyArray() - } - val memberValue = mock { - on { text } doReturn "api" - } - val mappingAnnotation = mock { - on { qualifiedName } doReturn "org.springframework.web.bind.annotation.RequestMapping" - on { findAttributeValue("path") } doReturn memberValue - } - val psiModifierList = mock { - on { annotations } doReturn arrayOf(mappingAnnotation) - } - val clazz = mock { - on { modifierList } doReturn psiModifierList - } - val psiMethod = mock { - on { parameterList } doReturn psiParameterList - on { containingClass } doReturn clazz - } - val annotation = mock { - on { parent } doReturn psiMethod - } - val annotationSearcher: (String, Project) -> Sequence = { name: String, _ -> if (name == "RequestMapping") sequenceOf(annotation) else emptySequence() } - val contributor = object : RequestMappingByNameContributor() { - override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = - annotationSearcher(annotationName, project) - } - val names = contributor.getNames(DummyProject.getInstance(), false) - names.size shouldBeEqualTo 1 - names[0] shouldBeEqualTo "GET /api" - } - } - } +// describe("RequestMappingContributor") { +// context("getItemsByName on empty navigationItems list") { +// it("should return empty list") { +// val contributor = object : RequestMappingByNameFinder() { +// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = +// emptySequence() +// } +// contributor.getItemsByName("name", "pattern", DummyProject.getInstance(), false).size shouldBeEqualTo 0 +// } +// } +// context("getItemsByName with 2 mapping items") { +// it("should return item a particular name") { +// val psiElement = mock {} +// val navigationItems = listOf( +// RequestMappingItem(psiElement, "/api/v1/users", "GET"), +// RequestMappingItem(psiElement, "/api/v2/users", "GET") +// ) +// val contributor = object : RequestMappingByNameFinder(navigationItems) { +// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = +// emptySequence() +// } +// val itemsByName = contributor.getItemsByName("GET /api/v1/users", "pattern", DummyProject.getInstance(), false) +// itemsByName.size shouldBeEqualTo 1 +// itemsByName[0].name shouldBeEqualTo "GET /api/v1/users" +// } +// } +// context("getNames on empty navigationItems list") { +// it("should return empty list") { +// val contributor = object : RequestMappingByNameFinder() { +// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = +// emptySequence() +// } +// contributor.getNames(DummyProject.getInstance(), false).size shouldBeEqualTo 0 +// } +// } +// context("getNames on not method annotations") { +// it("should return empty list") { +// val annotationParent = mock {} +// val psiAnnotation = mock { +// on { parent } doReturn annotationParent +// } +// val contributor = object : RequestMappingByNameFinder() { +// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = +// sequenceOf(psiAnnotation) +// } +// contributor.getNames(DummyProject.getInstance(), false).size shouldBeEqualTo 0 +// } +// } +// context("getNames with one RequestMapping annotation") { +// it("should return one name of mapping") { +// val psiParameterList = mock { +// on { parameters } doReturn emptyArray() +// } +// val memberValue = mock { +// on { text } doReturn "api" +// } +// val mappingAnnotation = mock { +// on { qualifiedName } doReturn "org.springframework.web.bind.annotation.RequestMapping" +// on { findAttributeValue("path") } doReturn memberValue +// } +// val psiModifierList = mock { +// on { annotations } doReturn arrayOf(mappingAnnotation) +// } +// val clazz = mock { +// on { modifierList } doReturn psiModifierList +// } +// val psiMethod = mock { +// on { parameterList } doReturn psiParameterList +// on { containingClass } doReturn clazz +// } +// val annotation = mock { +// on { parent } doReturn psiMethod +// } +// val annotationSearcher: (String, Project) -> Sequence = { name: String, _ -> if (name == "RequestMapping") sequenceOf(annotation) else emptySequence() } +// val contributor = object : RequestMappingByNameFinder() { +// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = +// annotationSearcher(annotationName, project) +// } +// val names = contributor.getNames(DummyProject.getInstance(), false) +// names.size shouldBeEqualTo 1 +// names[0] shouldBeEqualTo "GET /api" +// } +// } +// } }) diff --git a/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt index db80be7f..e6819061 100644 --- a/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt +++ b/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt @@ -1,12 +1,12 @@ package com.viartemev.requestmapper.model -import java.math.BigInteger import org.amshove.kluent.shouldBeEqualTo import org.amshove.kluent.shouldBeFalse import org.amshove.kluent.shouldBeTrue import org.amshove.kluent.shouldNotBeEqualTo import org.spekframework.spek2.Spek import org.spekframework.spek2.style.specification.describe +import java.math.BigInteger object PathElementSpek : Spek({ describe("PathElement") { From 82676120c584c9e1259344245a202cff9abbb870 Mon Sep 17 00:00:00 2001 From: pyltsin Date: Sun, 19 Jul 2020 22:16:58 +0300 Subject: [PATCH 2/8] add tests --- .../actions/GoToInRequestMappingAction.kt | 2 +- .../actions/GoToOutRequestMappingAction.kt | 2 +- .../CustomFilterWrapperMappingContributor.kt | 6 +- .../JavaRequestMappingFinder.kt | 4 +- .../KotlinRequestMappingFinder.kt | 4 +- ...questMappingByRequestMappingItemFinder.kt} | 9 +- .../contributors/RequestMappingItemFinder.kt | 8 ++ .../requestmapper/extensions/Extensions.kt | 6 +- src/main/resources/META-INF/plugin.xml | 4 +- src/main/resources/META-INF/pluginKotlin.xml | 2 +- .../RequestMappingContributorSpek.kt | 93 -------------- ...stomFilterWrapperMappingContributorSpek.kt | 115 ++++++++++++++++++ .../contributors/RequestMappingFinderSpek.kt | 81 ++++++++++++ 13 files changed, 223 insertions(+), 113 deletions(-) rename src/main/kotlin/com/viartemev/requestmapper/{contributor => contributors}/CustomFilterWrapperMappingContributor.kt (88%) rename src/main/kotlin/com/viartemev/requestmapper/{contributor => contributors}/JavaRequestMappingFinder.kt (79%) rename src/main/kotlin/com/viartemev/requestmapper/{contributor => contributors}/KotlinRequestMappingFinder.kt (82%) rename src/main/kotlin/com/viartemev/requestmapper/{contributor/RequestMappingByNameFinder.kt => contributors/RequestMappingByRequestMappingItemFinder.kt} (79%) create mode 100644 src/main/kotlin/com/viartemev/requestmapper/contributors/RequestMappingItemFinder.kt delete mode 100644 src/test/kotlin/com/viartemev/requestmapper/RequestMappingContributorSpek.kt create mode 100644 src/test/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributorSpek.kt create mode 100644 src/test/kotlin/com/viartemev/requestmapper/contributors/RequestMappingFinderSpek.kt diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt index b138fbe6..7dce2e9e 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt @@ -2,7 +2,7 @@ package com.viartemev.requestmapper.actions import com.intellij.navigation.ChooseByNameContributor import com.viartemev.requestmapper.BoundType -import com.viartemev.requestmapper.contributor.CustomFilterWrapperMappingContributor +import com.viartemev.requestmapper.contributors.CustomFilterWrapperMappingContributor import com.viartemev.requestmapper.extensions.Extensions class GoToInRequestMappingAction : AbstractGoToRequestMappingAction() { diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt index b886bd61..f3a60c7f 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt @@ -2,7 +2,7 @@ package com.viartemev.requestmapper.actions import com.intellij.navigation.ChooseByNameContributor import com.viartemev.requestmapper.BoundType -import com.viartemev.requestmapper.contributor.CustomFilterWrapperMappingContributor +import com.viartemev.requestmapper.contributors.CustomFilterWrapperMappingContributor import com.viartemev.requestmapper.extensions.Extensions class GoToOutRequestMappingAction : AbstractGoToRequestMappingAction() { diff --git a/src/main/kotlin/com/viartemev/requestmapper/contributor/CustomFilterWrapperMappingContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributor.kt similarity index 88% rename from src/main/kotlin/com/viartemev/requestmapper/contributor/CustomFilterWrapperMappingContributor.kt rename to src/main/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributor.kt index 0aca8353..122c49e2 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/contributor/CustomFilterWrapperMappingContributor.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributor.kt @@ -1,4 +1,4 @@ -package com.viartemev.requestmapper.contributor +package com.viartemev.requestmapper.contributors import com.intellij.navigation.ChooseByNameContributorEx import com.intellij.navigation.NavigationItem @@ -10,12 +10,12 @@ import com.intellij.util.indexing.IdFilter import com.viartemev.requestmapper.RequestMappingItem class CustomFilterWrapperMappingContributor( - private var finder: RequestMappingByNameFinder, + private var finder: RequestMappingItemFinder, private val customFilter: (RequestMappingItem) -> Boolean = { true }, private var navigationItems: List = emptyList() ) : ChooseByNameContributorEx { override fun processNames(processor: Processor, scope: GlobalSearchScope, filter: IdFilter?) { - navigationItems = finder.findItems(scope) + navigationItems = finder.findItems(scope.project) .filter(customFilter) val names = navigationItems diff --git a/src/main/kotlin/com/viartemev/requestmapper/contributor/JavaRequestMappingFinder.kt b/src/main/kotlin/com/viartemev/requestmapper/contributors/JavaRequestMappingFinder.kt similarity index 79% rename from src/main/kotlin/com/viartemev/requestmapper/contributor/JavaRequestMappingFinder.kt rename to src/main/kotlin/com/viartemev/requestmapper/contributors/JavaRequestMappingFinder.kt index c67e456d..16b0a6ee 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/contributor/JavaRequestMappingFinder.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/contributors/JavaRequestMappingFinder.kt @@ -1,11 +1,11 @@ -package com.viartemev.requestmapper.contributor +package com.viartemev.requestmapper.contributors import com.intellij.openapi.project.Project import com.intellij.psi.PsiAnnotation import com.intellij.psi.impl.java.stubs.index.JavaAnnotationIndex import com.intellij.psi.search.GlobalSearchScope -class JavaRequestMappingFinder : RequestMappingByNameFinder() { +class JavaRequestMappingFinder : RequestMappingByRequestMappingItemFinder() { override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence { return JavaAnnotationIndex diff --git a/src/main/kotlin/com/viartemev/requestmapper/contributor/KotlinRequestMappingFinder.kt b/src/main/kotlin/com/viartemev/requestmapper/contributors/KotlinRequestMappingFinder.kt similarity index 82% rename from src/main/kotlin/com/viartemev/requestmapper/contributor/KotlinRequestMappingFinder.kt rename to src/main/kotlin/com/viartemev/requestmapper/contributors/KotlinRequestMappingFinder.kt index 0397de18..e862c504 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/contributor/KotlinRequestMappingFinder.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/contributors/KotlinRequestMappingFinder.kt @@ -1,4 +1,4 @@ -package com.viartemev.requestmapper.contributor +package com.viartemev.requestmapper.contributors import com.intellij.openapi.project.Project import com.intellij.psi.PsiAnnotation @@ -6,7 +6,7 @@ import com.intellij.psi.search.GlobalSearchScope.projectScope import org.jetbrains.kotlin.asJava.toLightAnnotation import org.jetbrains.kotlin.idea.stubindex.KotlinAnnotationsIndex -class KotlinRequestMappingFinder : RequestMappingByNameFinder() { +class KotlinRequestMappingFinder : RequestMappingByRequestMappingItemFinder() { override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence { return KotlinAnnotationsIndex diff --git a/src/main/kotlin/com/viartemev/requestmapper/contributor/RequestMappingByNameFinder.kt b/src/main/kotlin/com/viartemev/requestmapper/contributors/RequestMappingByRequestMappingItemFinder.kt similarity index 79% rename from src/main/kotlin/com/viartemev/requestmapper/contributor/RequestMappingByNameFinder.kt rename to src/main/kotlin/com/viartemev/requestmapper/contributors/RequestMappingByRequestMappingItemFinder.kt index a85bf3bf..7a32af04 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/contributor/RequestMappingByNameFinder.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/contributors/RequestMappingByRequestMappingItemFinder.kt @@ -1,19 +1,18 @@ -package com.viartemev.requestmapper.contributor +package com.viartemev.requestmapper.contributors import com.intellij.openapi.project.Project import com.intellij.psi.PsiAnnotation -import com.intellij.psi.search.GlobalSearchScope import com.viartemev.requestmapper.RequestMappingItem import com.viartemev.requestmapper.annotations.MappingAnnotation.Companion.mappingAnnotation import com.viartemev.requestmapper.annotations.MappingAnnotation.Companion.supportedAnnotations import com.viartemev.requestmapper.utils.isMethodAnnotation -abstract class RequestMappingByNameFinder { +abstract class RequestMappingByRequestMappingItemFinder : RequestMappingItemFinder { abstract fun getAnnotationSearchers(annotationName: String, project: Project): Sequence - fun findItems(scope: GlobalSearchScope): List { - val project = scope.project ?: return emptyList() + override fun findItems(project: Project?): List { + if (project == null) return emptyList() return supportedAnnotations .flatMap { annotation -> findRequestMappingItems(project, annotation) } } diff --git a/src/main/kotlin/com/viartemev/requestmapper/contributors/RequestMappingItemFinder.kt b/src/main/kotlin/com/viartemev/requestmapper/contributors/RequestMappingItemFinder.kt new file mode 100644 index 00000000..b85b2ce9 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/contributors/RequestMappingItemFinder.kt @@ -0,0 +1,8 @@ +package com.viartemev.requestmapper.contributors + +import com.intellij.openapi.project.Project +import com.viartemev.requestmapper.RequestMappingItem + +interface RequestMappingItemFinder { + fun findItems(project: Project?): List +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/extensions/Extensions.kt b/src/main/kotlin/com/viartemev/requestmapper/extensions/Extensions.kt index 6eb0be38..4cb60609 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/extensions/Extensions.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/extensions/Extensions.kt @@ -1,14 +1,14 @@ package com.viartemev.requestmapper.extensions import com.intellij.openapi.extensions.ExtensionPointName -import com.viartemev.requestmapper.contributor.RequestMappingByNameFinder +import com.viartemev.requestmapper.contributors.RequestMappingByRequestMappingItemFinder object Extensions { private const val EXTENSION_POINT_NAME = "com.viartemev.requestmapper.requestMappingContributor" - private val extensionPoints = ExtensionPointName.create(EXTENSION_POINT_NAME) + private val extensionPoints = ExtensionPointName.create(EXTENSION_POINT_NAME) - fun getContributors(): List { + fun getContributors(): List { return extensionPoints.extensionList } } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 6b7de4bd..01db77ce 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -50,7 +50,7 @@ - + @@ -62,6 +62,6 @@ - + diff --git a/src/main/resources/META-INF/pluginKotlin.xml b/src/main/resources/META-INF/pluginKotlin.xml index c18b008b..8db250c3 100644 --- a/src/main/resources/META-INF/pluginKotlin.xml +++ b/src/main/resources/META-INF/pluginKotlin.xml @@ -1,5 +1,5 @@ - + diff --git a/src/test/kotlin/com/viartemev/requestmapper/RequestMappingContributorSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/RequestMappingContributorSpek.kt deleted file mode 100644 index 916d8244..00000000 --- a/src/test/kotlin/com/viartemev/requestmapper/RequestMappingContributorSpek.kt +++ /dev/null @@ -1,93 +0,0 @@ -package com.viartemev.requestmapper - -import org.spekframework.spek2.Spek - -// todo - разбить на 2 - один по finder, второй - contributor, добавить тест, что работает фильтр -// добавить тесты на feign - 3 шт и на bound - 2 шт -object RequestMappingContributorSpek : Spek({ - -// describe("RequestMappingContributor") { -// context("getItemsByName on empty navigationItems list") { -// it("should return empty list") { -// val contributor = object : RequestMappingByNameFinder() { -// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = -// emptySequence() -// } -// contributor.getItemsByName("name", "pattern", DummyProject.getInstance(), false).size shouldBeEqualTo 0 -// } -// } -// context("getItemsByName with 2 mapping items") { -// it("should return item a particular name") { -// val psiElement = mock {} -// val navigationItems = listOf( -// RequestMappingItem(psiElement, "/api/v1/users", "GET"), -// RequestMappingItem(psiElement, "/api/v2/users", "GET") -// ) -// val contributor = object : RequestMappingByNameFinder(navigationItems) { -// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = -// emptySequence() -// } -// val itemsByName = contributor.getItemsByName("GET /api/v1/users", "pattern", DummyProject.getInstance(), false) -// itemsByName.size shouldBeEqualTo 1 -// itemsByName[0].name shouldBeEqualTo "GET /api/v1/users" -// } -// } -// context("getNames on empty navigationItems list") { -// it("should return empty list") { -// val contributor = object : RequestMappingByNameFinder() { -// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = -// emptySequence() -// } -// contributor.getNames(DummyProject.getInstance(), false).size shouldBeEqualTo 0 -// } -// } -// context("getNames on not method annotations") { -// it("should return empty list") { -// val annotationParent = mock {} -// val psiAnnotation = mock { -// on { parent } doReturn annotationParent -// } -// val contributor = object : RequestMappingByNameFinder() { -// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = -// sequenceOf(psiAnnotation) -// } -// contributor.getNames(DummyProject.getInstance(), false).size shouldBeEqualTo 0 -// } -// } -// context("getNames with one RequestMapping annotation") { -// it("should return one name of mapping") { -// val psiParameterList = mock { -// on { parameters } doReturn emptyArray() -// } -// val memberValue = mock { -// on { text } doReturn "api" -// } -// val mappingAnnotation = mock { -// on { qualifiedName } doReturn "org.springframework.web.bind.annotation.RequestMapping" -// on { findAttributeValue("path") } doReturn memberValue -// } -// val psiModifierList = mock { -// on { annotations } doReturn arrayOf(mappingAnnotation) -// } -// val clazz = mock { -// on { modifierList } doReturn psiModifierList -// } -// val psiMethod = mock { -// on { parameterList } doReturn psiParameterList -// on { containingClass } doReturn clazz -// } -// val annotation = mock { -// on { parent } doReturn psiMethod -// } -// val annotationSearcher: (String, Project) -> Sequence = { name: String, _ -> if (name == "RequestMapping") sequenceOf(annotation) else emptySequence() } -// val contributor = object : RequestMappingByNameFinder() { -// override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = -// annotationSearcher(annotationName, project) -// } -// val names = contributor.getNames(DummyProject.getInstance(), false) -// names.size shouldBeEqualTo 1 -// names[0] shouldBeEqualTo "GET /api" -// } -// } -// } -}) diff --git a/src/test/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributorSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributorSpek.kt new file mode 100644 index 00000000..b78a2ff6 --- /dev/null +++ b/src/test/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributorSpek.kt @@ -0,0 +1,115 @@ +package com.viartemev.requestmapper.contributors + +import com.intellij.navigation.NavigationItem +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiElement +import com.intellij.psi.search.GlobalSearchScope +import com.intellij.util.indexing.FindSymbolParameters +import com.nhaarman.mockito_kotlin.mock +import com.viartemev.requestmapper.BoundType +import com.viartemev.requestmapper.RequestMappingItem +import org.amshove.kluent.shouldBeEqualTo +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.specification.describe + +// todo добавить тесты на class mapping - 3 шт и на bound +object CustomFilterWrapperMappingContributorSpek : Spek({ + + describe("RequestMappingContributor") { + context("processNames on empty navigationItems list") { + it("should return empty list") { + val contributor = CustomFilterWrapperMappingContributor( + finder = object : RequestMappingItemFinder { + override fun findItems(project: Project?): List { + return emptyList() + } + }, + navigationItems = emptyList() + ) + val itemsByName = mutableListOf() + contributor.processElementsWithName("name", itemsByName::add, FindSymbolParameters.wrap("pattern", GlobalSearchScope.EMPTY_SCOPE)) + itemsByName.size shouldBeEqualTo 0 + } + } + context("processNames with 2 mapping items") { + it("should return item a particular name") { + val psiElement = mock {} + val navigationItems = listOf( + RequestMappingItem(psiElement, "/api/v1/users", "GET"), + RequestMappingItem(psiElement, "/api/v2/users", "GET") + ) + val contributor = CustomFilterWrapperMappingContributor( + finder = object : RequestMappingItemFinder { + override fun findItems(project: Project?): List { + return emptyList() + } + }, + navigationItems = navigationItems + ) + val itemsByName = mutableListOf() + contributor.processElementsWithName("GET /api/v1/users", itemsByName::add, FindSymbolParameters.wrap("pattern", GlobalSearchScope.EMPTY_SCOPE)) + itemsByName.size shouldBeEqualTo 1 + itemsByName[0].name shouldBeEqualTo "GET /api/v1/users" + } + } + context("getNames on empty navigationItems list") { + it("should return empty list") { + val contributor = CustomFilterWrapperMappingContributor( + finder = object : RequestMappingItemFinder { + override fun findItems(project: Project?): List { + return emptyList() + } + }, + navigationItems = emptyList() + ) + val names = mutableListOf() + contributor.processNames(names::add, GlobalSearchScope.EMPTY_SCOPE, null) + names.size shouldBeEqualTo 0 + } + } + context("getNames with one RequestMapping annotation") { + it("should return one name of mapping") { + val psiElement = mock {} + val navigationItems = listOf( + RequestMappingItem(psiElement, "/api", "GET") + ) + + val contributor = CustomFilterWrapperMappingContributor( + finder = object : RequestMappingItemFinder { + override fun findItems(project: Project?): List { + return navigationItems + } + }, + navigationItems = emptyList() + ) + val names = mutableListOf() + contributor.processNames(names::add, GlobalSearchScope.EMPTY_SCOPE, null) + names.size shouldBeEqualTo 1 + names[0] shouldBeEqualTo "GET /api" + } + } + context("filter with one RequestMapping annotation") { + it("should return one name of mapping") { + val psiElement = mock {} + val navigationItems = listOf( + RequestMappingItem(psiElement, "/api/v1", "GET", setOf(BoundType.INBOUND)), + RequestMappingItem(psiElement, "/api/v2", "GET", setOf(BoundType.OUTBOUND)) + ) + + val contributor = CustomFilterWrapperMappingContributor( + finder = object : RequestMappingItemFinder { + override fun findItems(project: Project?): List { + return navigationItems + } + }, + navigationItems = emptyList(), + customFilter = { item -> item.boundType.contains(BoundType.INBOUND) } + ) + val names = mutableListOf() + contributor.processNames(names::add, GlobalSearchScope.EMPTY_SCOPE, null) + names.size shouldBeEqualTo 1 + names[0] shouldBeEqualTo "GET /api/v1" + } + } + } +}) diff --git a/src/test/kotlin/com/viartemev/requestmapper/contributors/RequestMappingFinderSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/contributors/RequestMappingFinderSpek.kt new file mode 100644 index 00000000..2effd748 --- /dev/null +++ b/src/test/kotlin/com/viartemev/requestmapper/contributors/RequestMappingFinderSpek.kt @@ -0,0 +1,81 @@ +package com.viartemev.requestmapper + +import com.intellij.openapi.command.impl.DummyProject +import com.intellij.openapi.project.Project +import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiAnnotationMemberValue +import com.intellij.psi.PsiClass +import com.intellij.psi.PsiElement +import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiModifierList +import com.intellij.psi.PsiParameter +import com.intellij.psi.PsiParameterList +import com.nhaarman.mockito_kotlin.doReturn +import com.nhaarman.mockito_kotlin.mock +import com.viartemev.requestmapper.contributors.RequestMappingByRequestMappingItemFinder +import org.amshove.kluent.shouldBeEqualTo +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.specification.describe + +object RequestMappingFinderSpek : Spek({ + + describe("RequestMappingByNameFinder") { + context("findItems on empty navigationItems list") { + it("should return empty list") { + val contributor = object : RequestMappingByRequestMappingItemFinder() { + override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = + emptySequence() + } + contributor.findItems(DummyProject.getInstance()).size shouldBeEqualTo 0 + } + } + context("findItems on not method annotations") { + it("should return empty list") { + val annotationParent = mock {} + val psiAnnotation = mock { + on { parent } doReturn annotationParent + } + val contributor = object : RequestMappingByRequestMappingItemFinder() { + override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = + sequenceOf(psiAnnotation) + } + contributor.findItems(DummyProject.getInstance()).size shouldBeEqualTo 0 + } + } + context("findItems with one RequestMapping annotation") { + it("should return one name of mapping") { + val psiParameterList = mock { + on { parameters } doReturn emptyArray() + } + val memberValue = mock { + on { text } doReturn "api" + } + val mappingAnnotation = mock { + on { qualifiedName } doReturn "org.springframework.web.bind.annotation.RequestMapping" + on { findAttributeValue("path") } doReturn memberValue + } + val psiModifierList = mock { + on { annotations } doReturn arrayOf(mappingAnnotation) + } + val clazz = mock { + on { modifierList } doReturn psiModifierList + } + val psiMethod = mock { + on { parameterList } doReturn psiParameterList + on { containingClass } doReturn clazz + } + val annotation = mock { + on { parent } doReturn psiMethod + } + val annotationSearcher: (String, Project) -> Sequence = { name: String, _ -> if (name == "RequestMapping") sequenceOf(annotation) else emptySequence() } + val contributor = object : RequestMappingByRequestMappingItemFinder() { + override fun getAnnotationSearchers(annotationName: String, project: Project): Sequence = + annotationSearcher(annotationName, project) + } + val names = contributor.findItems(DummyProject.getInstance()) + names.size shouldBeEqualTo 1 + names[0].name shouldBeEqualTo "GET /api" + } + } + } +}) From 5e9a6a5ae2f1f61c781952020f8e90095fd1a483 Mon Sep 17 00:00:00 2001 From: mpyltsin Date: Mon, 20 Jul 2020 15:35:31 +0300 Subject: [PATCH 3/8] add tests --- ...tMapping.kt => ClassFeignClientMapping.kt} | 12 ++--- .../SpringClassMappingAnnotation.kt | 10 ++-- .../requestmapper/RequestMappingItemSpek.kt | 7 +++ .../ClassFeignRequestMappingSpek.kt | 51 +++++++++++++++++++ .../classmapping/ClassRequestMappingSpek.kt | 42 +++++++++++++++ .../classmapping/ClassUnknownMappingSpek.kt | 18 +++++++ .../SpringClassMappingAnnotationSpek.kt | 47 +++++++++++++++++ .../contributors/RequestMappingFinderSpek.kt | 3 +- 8 files changed, 175 insertions(+), 15 deletions(-) rename src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/{FeignClientMapping.kt => ClassFeignClientMapping.kt} (69%) create mode 100644 src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignRequestMappingSpek.kt create mode 100644 src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMappingSpek.kt create mode 100644 src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassUnknownMappingSpek.kt create mode 100644 src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotationSpek.kt diff --git a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/FeignClientMapping.kt b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignClientMapping.kt similarity index 69% rename from src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/FeignClientMapping.kt rename to src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignClientMapping.kt index fc0e3205..0e904660 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/FeignClientMapping.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignClientMapping.kt @@ -8,11 +8,11 @@ const val URL = "url" const val PATH = "path" const val NAME = "name" -class FeignClientMapping(val annotation: PsiAnnotation) : SpringClassMappingAnnotation { +class ClassFeignClientMapping(val annotation: PsiAnnotation) : SpringClassMappingAnnotation { override fun fetchClassMapping(): List { - val name = getString(PathAnnotation(annotation).fetchMappings(NAME)) - var url = getString(PathAnnotation(annotation).fetchMappings(URL)) - val path = getString(PathAnnotation(annotation).fetchMappings(PATH)) + val name = PathAnnotation(annotation).fetchMappings(NAME).firstOrNull() ?: "" + var url = PathAnnotation(annotation).fetchMappings(URL).firstOrNull() ?: "" + val path = PathAnnotation(annotation).fetchMappings(PATH).firstOrNull() ?: "" // analogue of org.springframework.cloud.openfeign.FeignClientFactoryBean#getTarget if (url.isBlank()) { @@ -28,10 +28,6 @@ class FeignClientMapping(val annotation: PsiAnnotation) : SpringClassMappingAnno return normalizedPath } - private fun getString(fetchMappings: List): String { - return if (fetchMappings.isEmpty()) "" else fetchMappings[0] - } - override fun fetchBoundMappingFromClass(): Set { return setOf(BoundType.OUTBOUND) } diff --git a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotation.kt b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotation.kt index a101ee1d..f28320dd 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotation.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotation.kt @@ -15,26 +15,26 @@ interface SpringClassMappingAnnotation { private fun mappingAnnotation(psiAnnotation: PsiAnnotation): SpringClassMappingAnnotation { return when (psiAnnotation.qualifiedName) { SPRING_REQUEST_MAPPING_CLASS -> ClassRequestMapping(psiAnnotation) - SPRING_OPEN_FEIGN_CLASS -> FeignClientMapping(psiAnnotation) - SPRING_NETFLIX_FEIGN_CLASS -> FeignClientMapping(psiAnnotation) + SPRING_OPEN_FEIGN_CLASS -> ClassFeignClientMapping(psiAnnotation) + SPRING_NETFLIX_FEIGN_CLASS -> ClassFeignClientMapping(psiAnnotation) else -> ClassUnknownAnnotation() } } fun fetchMappingsFromClass(psiMethod: PsiMethod): List { - val classMapping = getAnnotations(psiMethod) + val classMapping = findClassAnnotations(psiMethod) ?.flatMap { mappingAnnotation(it).fetchClassMapping() } ?: emptyList() return if (classMapping.isEmpty()) listOf("") else classMapping } fun fetchBoundMappingFromClass(psiMethod: PsiMethod): Set { - val classMapping = getAnnotations(psiMethod) + val classMapping = findClassAnnotations(psiMethod) ?.flatMap { mappingAnnotation(it).fetchBoundMappingFromClass() } ?.toSet() ?: emptySet() return if (classMapping.isEmpty()) setOf(BoundType.INBOUND) else classMapping } - private fun getAnnotations(psiMethod: PsiMethod): List? { + private fun findClassAnnotations(psiMethod: PsiMethod): List? { return psiMethod .containingClass ?.modifierList diff --git a/src/test/kotlin/com/viartemev/requestmapper/RequestMappingItemSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/RequestMappingItemSpek.kt index fd0efe19..1df41342 100644 --- a/src/test/kotlin/com/viartemev/requestmapper/RequestMappingItemSpek.kt +++ b/src/test/kotlin/com/viartemev/requestmapper/RequestMappingItemSpek.kt @@ -12,6 +12,13 @@ import org.spekframework.spek2.style.specification.describe object RequestMappingItemSpek : Spek({ describe("RequestMappingItem") { + context("by defaults settings") { + val psiElement = mock {} + val item = RequestMappingItem(psiElement, "/api/v1/users", "POST") + it("should return INBOUND type") { + item.boundType shouldBeEqualTo setOf(BoundType.INBOUND) + } + } context("getPresentation on class PsiElement") { val psiFile = mock { on { name } doReturn "Controller" diff --git a/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignRequestMappingSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignRequestMappingSpek.kt new file mode 100644 index 00000000..d7ba815e --- /dev/null +++ b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignRequestMappingSpek.kt @@ -0,0 +1,51 @@ +package com.viartemev.requestmapper.annotations.spring.classmapping + +import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiLiteralExpression +import com.nhaarman.mockito_kotlin.doReturn +import com.nhaarman.mockito_kotlin.mock +import com.viartemev.requestmapper.BoundType +import org.amshove.kluent.shouldBeEqualTo +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.specification.describe + +object ClassFeignRequestMappingSpek : Spek({ + describe("FeignRequestMapping") { + context("extract properties") { + it("should return one mapping used path and name properties with outbound type") { + val pathMemberText = mock { + on { text } doReturn "/api" + } + val nameMemberText = mock { + on { text } doReturn "v2" + } + val classMappingAnnotation = mock { + on { qualifiedName } doReturn "org.springframework.web.bind.annotation.RequestMapping" + on { findAttributeValue("path") } doReturn pathMemberText + on { findAttributeValue("name") } doReturn nameMemberText + } + val classRequestMapping = ClassFeignClientMapping(classMappingAnnotation) + + classRequestMapping.fetchBoundMappingFromClass() shouldBeEqualTo setOf(BoundType.OUTBOUND) + classRequestMapping.fetchClassMapping() shouldBeEqualTo listOf("v2/api") + } + it("should return one mapping used path and name properties with outbound type") { + val pathMemberText = mock { + on { text } doReturn "api" + } + val urlMemberText = mock { + on { text } doReturn "v2" + } + val classMappingAnnotation = mock { + on { qualifiedName } doReturn "org.springframework.web.bind.annotation.RequestMapping" + on { findAttributeValue("path") } doReturn pathMemberText + on { findAttributeValue("url") } doReturn urlMemberText + } + val classRequestMapping = ClassFeignClientMapping(classMappingAnnotation) + + classRequestMapping.fetchBoundMappingFromClass() shouldBeEqualTo setOf(BoundType.OUTBOUND) + classRequestMapping.fetchClassMapping() shouldBeEqualTo listOf("v2/api") + } + } + } +}) diff --git a/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMappingSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMappingSpek.kt new file mode 100644 index 00000000..cad6a23c --- /dev/null +++ b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMappingSpek.kt @@ -0,0 +1,42 @@ +package com.viartemev.requestmapper.annotations.spring.classmapping + +import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiLiteralExpression +import com.nhaarman.mockito_kotlin.doReturn +import com.nhaarman.mockito_kotlin.mock +import com.viartemev.requestmapper.BoundType +import org.amshove.kluent.shouldBeEqualTo +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.specification.describe + +object ClassRequestMappingSpek : Spek({ + describe("ClassRequestMapping") { + context("extract properties") { + it("should return one mapping used path property with default bound type") { + val classMappingMemberValue = mock { + on { text } doReturn "api" + } + val classMappingAnnotation = mock { + on { qualifiedName } doReturn "org.springframework.web.bind.annotation.RequestMapping" + on { findAttributeValue("path") } doReturn classMappingMemberValue + } + val classRequestMapping = ClassRequestMapping(classMappingAnnotation) + + classRequestMapping.fetchBoundMappingFromClass() shouldBeEqualTo setOf(BoundType.INBOUND) + classRequestMapping.fetchClassMapping() shouldBeEqualTo listOf("api") + } + it("should return one mapping used value property ") { + val classMappingMemberValue = mock { + on { text } doReturn "api" + } + val classMappingAnnotation = mock { + on { qualifiedName } doReturn "org.springframework.web.bind.annotation.RequestMapping" + on { findAttributeValue("value") } doReturn classMappingMemberValue + } + val classRequestMapping = ClassRequestMapping(classMappingAnnotation) + + classRequestMapping.fetchBoundMappingFromClass() shouldBeEqualTo setOf(BoundType.INBOUND) + } + } + } +}) diff --git a/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassUnknownMappingSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassUnknownMappingSpek.kt new file mode 100644 index 00000000..2d4f35e9 --- /dev/null +++ b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassUnknownMappingSpek.kt @@ -0,0 +1,18 @@ +package com.viartemev.requestmapper.annotations.spring.classmapping + +import org.amshove.kluent.shouldBeEqualTo +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.specification.describe + +object ClassUnknownMappingSpek : Spek({ + describe("ClassUnknownMapping") { + context("extract properties") { + it("should return empty class mapping") { + ClassUnknownAnnotation().fetchClassMapping() shouldBeEqualTo listOf() + } + it("should return empty bound type") { + ClassUnknownAnnotation().fetchBoundMappingFromClass() shouldBeEqualTo emptySet() + } + } + } +}) diff --git a/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotationSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotationSpek.kt new file mode 100644 index 00000000..c588b284 --- /dev/null +++ b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/SpringClassMappingAnnotationSpek.kt @@ -0,0 +1,47 @@ +package com.viartemev.requestmapper.annotations.spring.classmapping + +import com.intellij.psi.PsiAnnotation +import com.intellij.psi.PsiClass +import com.intellij.psi.PsiLiteralExpression +import com.intellij.psi.PsiMethod +import com.intellij.psi.PsiModifierList +import com.nhaarman.mockito_kotlin.doReturn +import com.nhaarman.mockito_kotlin.mock +import com.viartemev.requestmapper.BoundType +import org.amshove.kluent.shouldBeEqualTo +import org.amshove.kluent.shouldHaveSize +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.specification.describe + +object SpringClassMappingAnnotationSpek : Spek({ + + describe("RequestMapping") { + context("values on annotation with annotated class") { + val memberValue = mock { + on { text } doReturn "api" + } + val mappingAnnotation = mock { + on { qualifiedName } doReturn "org.springframework.web.bind.annotation.RequestMapping" + on { findAttributeValue("path") } doReturn memberValue + } + val psiModifierList = mock { + on { annotations } doReturn arrayOf(mappingAnnotation) + } + val clazz = mock { + on { modifierList } doReturn psiModifierList + } + val psiMethod = mock { + on { containingClass } doReturn clazz + } + + it("should return one path") { + SpringClassMappingAnnotation.fetchMappingsFromClass(psiMethod) shouldBeEqualTo listOf("api") + } + it("should return default INBOUND request type") { + val boundMappingFromClass = SpringClassMappingAnnotation.fetchBoundMappingFromClass(psiMethod) + boundMappingFromClass shouldHaveSize 1 + boundMappingFromClass.first() shouldBeEqualTo BoundType.INBOUND + } + } + } +}) diff --git a/src/test/kotlin/com/viartemev/requestmapper/contributors/RequestMappingFinderSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/contributors/RequestMappingFinderSpek.kt index 2effd748..08852c87 100644 --- a/src/test/kotlin/com/viartemev/requestmapper/contributors/RequestMappingFinderSpek.kt +++ b/src/test/kotlin/com/viartemev/requestmapper/contributors/RequestMappingFinderSpek.kt @@ -1,4 +1,4 @@ -package com.viartemev.requestmapper +package com.viartemev.requestmapper.contributors import com.intellij.openapi.command.impl.DummyProject import com.intellij.openapi.project.Project @@ -12,7 +12,6 @@ import com.intellij.psi.PsiParameter import com.intellij.psi.PsiParameterList import com.nhaarman.mockito_kotlin.doReturn import com.nhaarman.mockito_kotlin.mock -import com.viartemev.requestmapper.contributors.RequestMappingByRequestMappingItemFinder import org.amshove.kluent.shouldBeEqualTo import org.spekframework.spek2.Spek import org.spekframework.spek2.style.specification.describe From baaa53654c1cb2730a466e58b411e810ee40a5ea Mon Sep 17 00:00:00 2001 From: mpyltsin Date: Tue, 28 Jul 2020 13:41:11 +0300 Subject: [PATCH 4/8] small changes in names and messages --- .../RequestMappingItemProvider.kt | 19 ++++++++----------- .../actions/GoToInRequestMappingAction.kt | 3 +-- .../actions/GoToOutRequestMappingAction.kt | 3 +-- .../classmapping/ClassFeignClientMapping.kt | 4 ++-- .../com/viartemev/requestmapper/model/Path.kt | 10 ++++------ .../ClassFeignRequestMappingSpek.kt | 4 ++-- .../classmapping/ClassRequestMappingSpek.kt | 4 ++-- ...stomFilterWrapperMappingContributorSpek.kt | 5 ++--- .../requestmapper/model/PathElementSpek.kt | 2 +- 9 files changed, 23 insertions(+), 31 deletions(-) diff --git a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt index 570f41e3..d511c4a1 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt @@ -57,17 +57,14 @@ open class RequestMappingItemProvider : ChooseByNameItemProvider { val model = base.model if (model is ChooseByNameModelEx) { indicator.checkCanceled() - model.processNames( - { sequence: String? -> - indicator.checkCanceled() - if (matches(sequence, pattern)) { - collect.consume(sequence) - return@processNames true - } - return@processNames false - }, - parameters - ) + model.processNames({ sequence: String? -> + indicator.checkCanceled() + if (matches(sequence, pattern)) { + collect.consume(sequence) + return@processNames true + } + return@processNames false + }, parameters) } namesList.sortWith(compareBy { PopupPath(it) }) diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt index 7dce2e9e..e6293aca 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt @@ -8,8 +8,7 @@ import com.viartemev.requestmapper.extensions.Extensions class GoToInRequestMappingAction : AbstractGoToRequestMappingAction() { override fun getContributors(): List { return Extensions.getContributors().map { - CustomFilterWrapperMappingContributor( - it, + CustomFilterWrapperMappingContributor(it, { requestMappingItem -> requestMappingItem.boundType.contains(BoundType.INBOUND) } ) } diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt index f3a60c7f..e1fd9df3 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt @@ -8,8 +8,7 @@ import com.viartemev.requestmapper.extensions.Extensions class GoToOutRequestMappingAction : AbstractGoToRequestMappingAction() { override fun getContributors(): List { return Extensions.getContributors().map { - CustomFilterWrapperMappingContributor( - it, + CustomFilterWrapperMappingContributor(it, { requestMappingItem -> requestMappingItem.boundType.contains(BoundType.OUTBOUND) } ) } diff --git a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignClientMapping.kt b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignClientMapping.kt index 0e904660..45b312c6 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignClientMapping.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignClientMapping.kt @@ -14,14 +14,14 @@ class ClassFeignClientMapping(val annotation: PsiAnnotation) : SpringClassMappin var url = PathAnnotation(annotation).fetchMappings(URL).firstOrNull() ?: "" val path = PathAnnotation(annotation).fetchMappings(PATH).firstOrNull() ?: "" - // analogue of org.springframework.cloud.openfeign.FeignClientFactoryBean#getTarget + // analogue from org.springframework.cloud.openfeign.FeignClientFactoryBean#getTarget if (url.isBlank()) { url = name } return listOf(url + getCleanPath(path)) } - // analogue of org.springframework.cloud.openfeign.FeignClientFactoryBean#cleanPath + // analogue from org.springframework.cloud.openfeign.FeignClientFactoryBean#cleanPath private fun getCleanPath(path: String): String { var normalizedPath = if (!path.startsWith("/")) "/$path" else path normalizedPath = if (normalizedPath.endsWith("/")) normalizedPath.substring(0, normalizedPath.length - 1) else normalizedPath diff --git a/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt b/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt index 2b4727db..ebf1b818 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt @@ -6,12 +6,10 @@ data class Path(private val pathElements: List) { constructor(string: String) : this(string.split("/").map { PathElement(it) }) fun addPathVariablesTypes(parametersNameWithType: Map): Path { - return Path( - pathElements.map { - val key = it.value.unquoteCurlyBrackets().substringBefore(':') - it.addPathVariableType(parametersNameWithType.getOrDefault(key, "Object")) - } - ) + return Path(pathElements.map { + val key = it.value.unquoteCurlyBrackets().substringBefore(':') + it.addPathVariableType(parametersNameWithType.getOrDefault(key, "Object")) + }) } fun toFullPath() = pathElements.joinToString("/") { it.value } diff --git a/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignRequestMappingSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignRequestMappingSpek.kt index d7ba815e..c2c2b975 100644 --- a/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignRequestMappingSpek.kt +++ b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassFeignRequestMappingSpek.kt @@ -12,7 +12,7 @@ import org.spekframework.spek2.style.specification.describe object ClassFeignRequestMappingSpek : Spek({ describe("FeignRequestMapping") { context("extract properties") { - it("should return one mapping used path and name properties with outbound type") { + it("should return one mapping using path and name properties with outbound type") { val pathMemberText = mock { on { text } doReturn "/api" } @@ -29,7 +29,7 @@ object ClassFeignRequestMappingSpek : Spek({ classRequestMapping.fetchBoundMappingFromClass() shouldBeEqualTo setOf(BoundType.OUTBOUND) classRequestMapping.fetchClassMapping() shouldBeEqualTo listOf("v2/api") } - it("should return one mapping used path and name properties with outbound type") { + it("should return one mapping using path and name properties with outbound type") { val pathMemberText = mock { on { text } doReturn "api" } diff --git a/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMappingSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMappingSpek.kt index cad6a23c..8984229b 100644 --- a/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMappingSpek.kt +++ b/src/test/kotlin/com/viartemev/requestmapper/annotations/spring/classmapping/ClassRequestMappingSpek.kt @@ -12,7 +12,7 @@ import org.spekframework.spek2.style.specification.describe object ClassRequestMappingSpek : Spek({ describe("ClassRequestMapping") { context("extract properties") { - it("should return one mapping used path property with default bound type") { + it("should return one mapping using path property with default bound type") { val classMappingMemberValue = mock { on { text } doReturn "api" } @@ -25,7 +25,7 @@ object ClassRequestMappingSpek : Spek({ classRequestMapping.fetchBoundMappingFromClass() shouldBeEqualTo setOf(BoundType.INBOUND) classRequestMapping.fetchClassMapping() shouldBeEqualTo listOf("api") } - it("should return one mapping used value property ") { + it("should return one mapping using value property ") { val classMappingMemberValue = mock { on { text } doReturn "api" } diff --git a/src/test/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributorSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributorSpek.kt index b78a2ff6..725ccf71 100644 --- a/src/test/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributorSpek.kt +++ b/src/test/kotlin/com/viartemev/requestmapper/contributors/CustomFilterWrapperMappingContributorSpek.kt @@ -12,7 +12,6 @@ import org.amshove.kluent.shouldBeEqualTo import org.spekframework.spek2.Spek import org.spekframework.spek2.style.specification.describe -// todo добавить тесты на class mapping - 3 шт и на bound object CustomFilterWrapperMappingContributorSpek : Spek({ describe("RequestMappingContributor") { @@ -31,7 +30,7 @@ object CustomFilterWrapperMappingContributorSpek : Spek({ itemsByName.size shouldBeEqualTo 0 } } - context("processNames with 2 mapping items") { + context("processNames on 2 mapping items") { it("should return item a particular name") { val psiElement = mock {} val navigationItems = listOf( @@ -88,7 +87,7 @@ object CustomFilterWrapperMappingContributorSpek : Spek({ names[0] shouldBeEqualTo "GET /api" } } - context("filter with one RequestMapping annotation") { + context("processNames with filter on one RequestMapping annotation") { it("should return one name of mapping") { val psiElement = mock {} val navigationItems = listOf( diff --git a/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt index e6819061..db80be7f 100644 --- a/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt +++ b/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt @@ -1,12 +1,12 @@ package com.viartemev.requestmapper.model +import java.math.BigInteger import org.amshove.kluent.shouldBeEqualTo import org.amshove.kluent.shouldBeFalse import org.amshove.kluent.shouldBeTrue import org.amshove.kluent.shouldNotBeEqualTo import org.spekframework.spek2.Spek import org.spekframework.spek2.style.specification.describe -import java.math.BigInteger object PathElementSpek : Spek({ describe("PathElement") { From 149b2208b8502940f3815d7e5aa0bfac3462683a Mon Sep 17 00:00:00 2001 From: pyltsin Date: Sun, 2 Aug 2020 13:21:22 +0300 Subject: [PATCH 5/8] add new fields --- README.md | 15 +++-- build.gradle | 2 +- .../RequestMappingItemProvider.kt | 65 ++++++++++--------- .../requestmapper/RequestMappingModel.kt | 2 +- .../AbstractGoToRequestMappingAction.kt | 30 --------- .../actions/GoToInRequestMappingAction.kt | 16 ----- .../actions/GoToOutRequestMappingAction.kt | 16 ----- .../actions/InboundRequestMappingAction.kt | 10 +++ ...kt => InboundRequestMappingContributor.kt} | 19 +++++- .../actions/OutBoundRequestMappingAction.kt | 10 +++ ...t => OutboundRequestMappingContributor.kt} | 19 +++++- .../com/viartemev/requestmapper/model/Path.kt | 10 +-- src/main/resources/META-INF/plugin.xml | 14 ++-- .../requestmapper/model/PathElementSpek.kt | 2 +- 14 files changed, 113 insertions(+), 117 deletions(-) delete mode 100644 src/main/kotlin/com/viartemev/requestmapper/actions/AbstractGoToRequestMappingAction.kt delete mode 100644 src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt delete mode 100644 src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt create mode 100644 src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingAction.kt rename src/main/kotlin/com/viartemev/requestmapper/actions/{InRequestMappingGoToContributor.kt => InboundRequestMappingContributor.kt} (55%) create mode 100644 src/main/kotlin/com/viartemev/requestmapper/actions/OutBoundRequestMappingAction.kt rename src/main/kotlin/com/viartemev/requestmapper/actions/{OutRequestMappingGoToContributor.kt => OutboundRequestMappingContributor.kt} (55%) diff --git a/README.md b/README.md index 781e5906..871f361a 100644 --- a/README.md +++ b/README.md @@ -38,11 +38,16 @@ ## Usage - Search everywhere (```Shift``` twice) -- Keyboard shortcuts: - - MacOS: ```Cmd + Shift + Back slash``` - - Linux: ```Ctrl + Shift + Back slash``` - - Windows: ```Ctrl + Shift + Back slash``` -- Navigate (menu bar) -> Request mapping +- Keyboard shortcuts + - for Inbound requests: + - MacOS: ```Cmd + Shift + Back slash``` + - Linux: ```Ctrl + Shift + Back slash``` + - Windows: ```Ctrl + Shift + Back slash``` + - for Outbound requests: + - MacOS: ```Cmd + Shift + o``` + - Linux: ```Ctrl + Shift + o``` + - Windows: ```Ctrl + Shift + o``` +- Navigate (menu bar) -> ```Inbound requests``` or ```Outbound requests``` ## Contributors diff --git a/build.gradle b/build.gradle index 9d8d6f98..6fab99a9 100644 --- a/build.gradle +++ b/build.gradle @@ -78,7 +78,7 @@ test { intellij { pluginName "Request mapper" type 'IC' - version = '2020.1.1' + version = '2020.2' plugins = ["java", "org.jetbrains.kotlin:$kotlin_version-release-IJ2020.1-1"] } diff --git a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt index d511c4a1..8ed6dec9 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingItemProvider.kt @@ -1,12 +1,14 @@ package com.viartemev.requestmapper -import com.intellij.ide.util.gotoByName.ChooseByNameBase -import com.intellij.ide.util.gotoByName.ChooseByNameItemProvider +import com.intellij.ide.actions.searcheverywhere.FoundItemDescriptor import com.intellij.ide.util.gotoByName.ChooseByNameModelEx import com.intellij.ide.util.gotoByName.ChooseByNamePopup import com.intellij.ide.util.gotoByName.ChooseByNameViewModel import com.intellij.ide.util.gotoByName.ContributorsBasedGotoByModel +import com.intellij.ide.util.gotoByName.DefaultChooseByNameItemProvider import com.intellij.openapi.progress.ProgressIndicator +import com.intellij.openapi.progress.ProgressManager +import com.intellij.psi.PsiElement import com.intellij.util.CollectConsumer import com.intellij.util.Processor import com.intellij.util.SmartList @@ -18,28 +20,28 @@ import com.viartemev.requestmapper.model.Path import com.viartemev.requestmapper.model.PopupPath import com.viartemev.requestmapper.model.RequestedUserPath -open class RequestMappingItemProvider : ChooseByNameItemProvider { - override fun filterElements( - base: ChooseByNameBase, - pattern: String, - everywhere: Boolean, +open class RequestMappingItemProvider(context: PsiElement?) : DefaultChooseByNameItemProvider(context) { + + override fun filterElementsWithWeights( + base: ChooseByNameViewModel, + parameters: FindSymbolParameters, indicator: ProgressIndicator, - consumer: Processor + consumer: Processor?> ): Boolean { + return ProgressManager.getInstance().computePrioritized { filter(base, parameters.completePattern, indicator, consumer) } + } + + private fun filter(base: ChooseByNameViewModel, pattern: String, indicator: ProgressIndicator, consumer: Processor?>): Boolean { if (base.project != null) { base.project!!.putUserData(ChooseByNamePopup.CURRENT_SEARCH_PATTERN, pattern) } val idFilter: IdFilter? = null - val searchScope = FindSymbolParameters.searchScopeFor(base.project, everywhere) + val searchScope = FindSymbolParameters.searchScopeFor(base.project, false) val parameters = FindSymbolParameters(pattern, pattern, searchScope, idFilter) val namesList = getSortedResults(base, pattern, indicator, parameters) indicator.checkCanceled() - return processByNames(base, everywhere, indicator, consumer, namesList, parameters) - } - - override fun filterNames(base: ChooseByNameBase, names: Array, pattern: String): List { - return emptyList() + return processByNames(base, indicator, consumer, namesList, parameters) } companion object { @@ -57,14 +59,17 @@ open class RequestMappingItemProvider : ChooseByNameItemProvider { val model = base.model if (model is ChooseByNameModelEx) { indicator.checkCanceled() - model.processNames({ sequence: String? -> - indicator.checkCanceled() - if (matches(sequence, pattern)) { - collect.consume(sequence) - return@processNames true - } - return@processNames false - }, parameters) + model.processNames( + { sequence: String? -> + indicator.checkCanceled() + if (matches(sequence, pattern)) { + collect.consume(sequence) + return@processNames true + } + return@processNames false + }, + parameters + ) } namesList.sortWith(compareBy { PopupPath(it) }) @@ -75,35 +80,35 @@ open class RequestMappingItemProvider : ChooseByNameItemProvider { private fun processByNames( base: ChooseByNameViewModel, - everywhere: Boolean, indicator: ProgressIndicator, - consumer: Processor, + consumer: Processor?>, namesList: List, parameters: FindSymbolParameters ): Boolean { val sameNameElements: MutableList = SmartList() - val qualifierMatchResults: MutableMap = ContainerUtil.newIdentityTroveMap() val model = base.model for (name in namesList) { indicator.checkCanceled() - val elements = if (model is ContributorsBasedGotoByModel) model.getElementsByName(name, parameters, indicator) else model.getElementsByName(name, everywhere, parameters.completePattern) + val elements = if (model is ContributorsBasedGotoByModel) model.getElementsByName(name, parameters, indicator) else model.getElementsByName(name, false, parameters.completePattern) if (elements.size > 1) { sameNameElements.clear() - qualifierMatchResults.clear() for (element in elements) { indicator.checkCanceled() sameNameElements.add(element) } - if (!ContainerUtil.process(sameNameElements, consumer)) return false + val processedItems: List> = ContainerUtil.map(sameNameElements) { + FoundItemDescriptor(it, 0) + } + + if (!ContainerUtil.process(processedItems, consumer)) return false } else if (elements.size == 1) { - if (!consumer.process(elements[0])) return false + if (!consumer.process(FoundItemDescriptor(elements[0], 0))) return false } } return true } fun matches(name: String?, pattern: String): Boolean { - if (name == null) { return false } diff --git a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingModel.kt b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingModel.kt index 4a983826..2819a1ff 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/RequestMappingModel.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/RequestMappingModel.kt @@ -12,7 +12,7 @@ import com.intellij.psi.PsiElement class RequestMappingModel(project: Project, contributors: List) : FilteringGotoByModel(project, contributors), DumbAware { override fun getItemProvider(context: PsiElement?): ChooseByNameItemProvider { - return RequestMappingItemProvider() + return RequestMappingItemProvider(context) } override fun filterValueFor(item: NavigationItem): FileType? = null diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/AbstractGoToRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/AbstractGoToRequestMappingAction.kt deleted file mode 100644 index 3b071ae4..00000000 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/AbstractGoToRequestMappingAction.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.viartemev.requestmapper.actions - -import com.intellij.ide.actions.GotoActionBase -import com.intellij.ide.util.gotoByName.ChooseByNamePopup -import com.intellij.navigation.ChooseByNameContributor -import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.actionSystem.CommonDataKeys.PROJECT -import com.intellij.openapi.project.DumbAware -import com.viartemev.requestmapper.RequestMappingItem -import com.viartemev.requestmapper.RequestMappingModel - -abstract class AbstractGoToRequestMappingAction : GotoActionBase(), DumbAware { - - override fun gotoActionPerformed(e: AnActionEvent) { - val project = e.getData(PROJECT) ?: return - val requestMappingModel = RequestMappingModel(project, getContributors()) - showNavigationPopup(e, requestMappingModel, GoToRequestMappingActionCallback(), null, true, false) - } - - abstract fun getContributors(): List - - private class GoToRequestMappingActionCallback : GotoActionBase.GotoActionCallback() { - - override fun elementChosen(popup: ChooseByNamePopup, element: Any) { - if (element is RequestMappingItem && element.canNavigate()) { - element.navigate(true) - } - } - } -} diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt deleted file mode 100644 index e6293aca..00000000 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToInRequestMappingAction.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.viartemev.requestmapper.actions - -import com.intellij.navigation.ChooseByNameContributor -import com.viartemev.requestmapper.BoundType -import com.viartemev.requestmapper.contributors.CustomFilterWrapperMappingContributor -import com.viartemev.requestmapper.extensions.Extensions - -class GoToInRequestMappingAction : AbstractGoToRequestMappingAction() { - override fun getContributors(): List { - return Extensions.getContributors().map { - CustomFilterWrapperMappingContributor(it, - { requestMappingItem -> requestMappingItem.boundType.contains(BoundType.INBOUND) } - ) - } - } -} diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt deleted file mode 100644 index e1fd9df3..00000000 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/GoToOutRequestMappingAction.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.viartemev.requestmapper.actions - -import com.intellij.navigation.ChooseByNameContributor -import com.viartemev.requestmapper.BoundType -import com.viartemev.requestmapper.contributors.CustomFilterWrapperMappingContributor -import com.viartemev.requestmapper.extensions.Extensions - -class GoToOutRequestMappingAction : AbstractGoToRequestMappingAction() { - override fun getContributors(): List { - return Extensions.getContributors().map { - CustomFilterWrapperMappingContributor(it, - { requestMappingItem -> requestMappingItem.boundType.contains(BoundType.OUTBOUND) } - ) - } - } -} diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingAction.kt new file mode 100644 index 00000000..ec0e177a --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingAction.kt @@ -0,0 +1,10 @@ +package com.viartemev.requestmapper.actions + +import com.intellij.ide.actions.SearchEverywhereBaseAction +import com.intellij.openapi.actionSystem.AnActionEvent + +class InboundRequestMappingAction : SearchEverywhereBaseAction() { + override fun actionPerformed(e: AnActionEvent) { + showInSearchEverywherePopup(InboundRequestMappingContributor::class.java.simpleName, e, true, false) + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/InRequestMappingGoToContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingContributor.kt similarity index 55% rename from src/main/kotlin/com/viartemev/requestmapper/actions/InRequestMappingGoToContributor.kt rename to src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingContributor.kt index 51bd9775..2f455919 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/InRequestMappingGoToContributor.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingContributor.kt @@ -4,14 +4,27 @@ import com.intellij.ide.actions.searcheverywhere.AbstractGotoSEContributor import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributor import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributorFactory import com.intellij.ide.util.gotoByName.FilteringGotoByModel +import com.intellij.navigation.ChooseByNameContributor import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.project.Project +import com.viartemev.requestmapper.BoundType import com.viartemev.requestmapper.RequestMappingModel +import com.viartemev.requestmapper.contributors.CustomFilterWrapperMappingContributor +import com.viartemev.requestmapper.extensions.Extensions -class InRequestMappingGoToContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { +class InboundRequestMappingContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { override fun createModel(project: Project): FilteringGotoByModel<*> { - return RequestMappingModel(project, GoToInRequestMappingAction().getContributors()) + return RequestMappingModel(project, getContributors()) + } + + private fun getContributors(): List { + return Extensions.getContributors().map { + CustomFilterWrapperMappingContributor( + it, + { requestMappingItem -> requestMappingItem.boundType.contains(BoundType.INBOUND) } + ) + } } override fun getSortWeight(): Int { @@ -28,7 +41,7 @@ class InRequestMappingGoToContributor(event: AnActionEvent) : AbstractGotoSECont class Factory : SearchEverywhereContributorFactory { override fun createContributor(initEvent: AnActionEvent): SearchEverywhereContributor { - return InRequestMappingGoToContributor(initEvent) + return InboundRequestMappingContributor(initEvent) } } } diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/OutBoundRequestMappingAction.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/OutBoundRequestMappingAction.kt new file mode 100644 index 00000000..29130a4c --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/OutBoundRequestMappingAction.kt @@ -0,0 +1,10 @@ +package com.viartemev.requestmapper.actions + +import com.intellij.ide.actions.SearchEverywhereBaseAction +import com.intellij.openapi.actionSystem.AnActionEvent + +class OutBoundRequestMappingAction : SearchEverywhereBaseAction() { + override fun actionPerformed(e: AnActionEvent) { + showInSearchEverywherePopup(OutboundRequestMappingContributor::class.java.simpleName, e, true, false) + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/OutRequestMappingGoToContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/OutboundRequestMappingContributor.kt similarity index 55% rename from src/main/kotlin/com/viartemev/requestmapper/actions/OutRequestMappingGoToContributor.kt rename to src/main/kotlin/com/viartemev/requestmapper/actions/OutboundRequestMappingContributor.kt index 3abe0c90..616bb580 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/OutRequestMappingGoToContributor.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/OutboundRequestMappingContributor.kt @@ -4,14 +4,27 @@ import com.intellij.ide.actions.searcheverywhere.AbstractGotoSEContributor import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributor import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributorFactory import com.intellij.ide.util.gotoByName.FilteringGotoByModel +import com.intellij.navigation.ChooseByNameContributor import com.intellij.openapi.actionSystem.AnActionEvent import com.intellij.openapi.project.Project +import com.viartemev.requestmapper.BoundType import com.viartemev.requestmapper.RequestMappingModel +import com.viartemev.requestmapper.contributors.CustomFilterWrapperMappingContributor +import com.viartemev.requestmapper.extensions.Extensions -class OutRequestMappingGoToContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { +class OutboundRequestMappingContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { override fun createModel(project: Project): FilteringGotoByModel<*> { - return RequestMappingModel(project, GoToOutRequestMappingAction().getContributors()) + return RequestMappingModel(project, getContributors()) + } + + private fun getContributors(): List { + return Extensions.getContributors().map { + CustomFilterWrapperMappingContributor( + it, + { requestMappingItem -> requestMappingItem.boundType.contains(BoundType.OUTBOUND) } + ) + } } override fun getSortWeight(): Int { @@ -28,7 +41,7 @@ class OutRequestMappingGoToContributor(event: AnActionEvent) : AbstractGotoSECon class Factory : SearchEverywhereContributorFactory { override fun createContributor(initEvent: AnActionEvent): SearchEverywhereContributor { - return OutRequestMappingGoToContributor(initEvent) + return OutboundRequestMappingContributor(initEvent) } } } diff --git a/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt b/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt index ebf1b818..2b4727db 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/model/Path.kt @@ -6,10 +6,12 @@ data class Path(private val pathElements: List) { constructor(string: String) : this(string.split("/").map { PathElement(it) }) fun addPathVariablesTypes(parametersNameWithType: Map): Path { - return Path(pathElements.map { - val key = it.value.unquoteCurlyBrackets().substringBefore(':') - it.addPathVariableType(parametersNameWithType.getOrDefault(key, "Object")) - }) + return Path( + pathElements.map { + val key = it.value.unquoteCurlyBrackets().substringBefore(':') + it.addPathVariableType(parametersNameWithType.getOrDefault(key, "Object")) + } + ) } fun toFullPath() = pathElements.joinToString("/") { it.value } diff --git a/src/main/resources/META-INF/plugin.xml b/src/main/resources/META-INF/plugin.xml index 01db77ce..31a5943a 100644 --- a/src/main/resources/META-INF/plugin.xml +++ b/src/main/resources/META-INF/plugin.xml @@ -34,16 +34,16 @@ org.jetbrains.kotlin - + - + - + @@ -54,11 +54,11 @@ - + - + diff --git a/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt b/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt index db80be7f..e6819061 100644 --- a/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt +++ b/src/test/kotlin/com/viartemev/requestmapper/model/PathElementSpek.kt @@ -1,12 +1,12 @@ package com.viartemev.requestmapper.model -import java.math.BigInteger import org.amshove.kluent.shouldBeEqualTo import org.amshove.kluent.shouldBeFalse import org.amshove.kluent.shouldBeTrue import org.amshove.kluent.shouldNotBeEqualTo import org.spekframework.spek2.Spek import org.spekframework.spek2.style.specification.describe +import java.math.BigInteger object PathElementSpek : Spek({ describe("PathElement") { From 4096b3f9179cfefa46c85285c9de5b851f01c716 Mon Sep 17 00:00:00 2001 From: pyltsin Date: Sun, 2 Aug 2020 18:05:09 +0300 Subject: [PATCH 6/8] add highligths --- .../AbstractRequestMappingContributor.kt | 27 +++++++++++++++++++ .../InboundRequestMappingContributor.kt | 18 +++---------- .../OutboundRequestMappingContributor.kt | 18 +++---------- 3 files changed, 33 insertions(+), 30 deletions(-) create mode 100644 src/main/kotlin/com/viartemev/requestmapper/actions/AbstractRequestMappingContributor.kt diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/AbstractRequestMappingContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/AbstractRequestMappingContributor.kt new file mode 100644 index 00000000..7f42e954 --- /dev/null +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/AbstractRequestMappingContributor.kt @@ -0,0 +1,27 @@ +package com.viartemev.requestmapper.actions + +import com.intellij.ide.actions.searcheverywhere.AbstractGotoSEContributor +import com.intellij.ide.util.NavigationItemListCellRenderer +import com.intellij.ide.util.gotoByName.FilteringGotoByModel +import com.intellij.navigation.ChooseByNameContributor +import com.intellij.openapi.actionSystem.AnActionEvent +import com.intellij.openapi.project.Project +import com.viartemev.requestmapper.RequestMappingModel +import javax.swing.ListCellRenderer + +abstract class AbstractRequestMappingContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { + + override fun createModel(project: Project): FilteringGotoByModel<*> { + return RequestMappingModel(project, getContributors()) + } + + abstract fun getContributors(): List + + override fun showInFindResults(): Boolean { + return false + } + + override fun getElementsRenderer(): ListCellRenderer { + return NavigationItemListCellRenderer() + } +} diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingContributor.kt index 2f455919..232b1ca9 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingContributor.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/InboundRequestMappingContributor.kt @@ -1,24 +1,16 @@ package com.viartemev.requestmapper.actions -import com.intellij.ide.actions.searcheverywhere.AbstractGotoSEContributor import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributor import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributorFactory -import com.intellij.ide.util.gotoByName.FilteringGotoByModel import com.intellij.navigation.ChooseByNameContributor import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.project.Project import com.viartemev.requestmapper.BoundType -import com.viartemev.requestmapper.RequestMappingModel import com.viartemev.requestmapper.contributors.CustomFilterWrapperMappingContributor import com.viartemev.requestmapper.extensions.Extensions -class InboundRequestMappingContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { +class InboundRequestMappingContributor(event: AnActionEvent) : AbstractRequestMappingContributor(event) { - override fun createModel(project: Project): FilteringGotoByModel<*> { - return RequestMappingModel(project, getContributors()) - } - - private fun getContributors(): List { + override fun getContributors(): List { return Extensions.getContributors().map { CustomFilterWrapperMappingContributor( it, @@ -32,11 +24,7 @@ class InboundRequestMappingContributor(event: AnActionEvent) : AbstractGotoSECon } override fun getGroupName(): String { - return "Inbound requests" - } - - override fun showInFindResults(): Boolean { - return false + return "In-requests" } class Factory : SearchEverywhereContributorFactory { diff --git a/src/main/kotlin/com/viartemev/requestmapper/actions/OutboundRequestMappingContributor.kt b/src/main/kotlin/com/viartemev/requestmapper/actions/OutboundRequestMappingContributor.kt index 616bb580..57aef344 100644 --- a/src/main/kotlin/com/viartemev/requestmapper/actions/OutboundRequestMappingContributor.kt +++ b/src/main/kotlin/com/viartemev/requestmapper/actions/OutboundRequestMappingContributor.kt @@ -1,24 +1,16 @@ package com.viartemev.requestmapper.actions -import com.intellij.ide.actions.searcheverywhere.AbstractGotoSEContributor import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributor import com.intellij.ide.actions.searcheverywhere.SearchEverywhereContributorFactory -import com.intellij.ide.util.gotoByName.FilteringGotoByModel import com.intellij.navigation.ChooseByNameContributor import com.intellij.openapi.actionSystem.AnActionEvent -import com.intellij.openapi.project.Project import com.viartemev.requestmapper.BoundType -import com.viartemev.requestmapper.RequestMappingModel import com.viartemev.requestmapper.contributors.CustomFilterWrapperMappingContributor import com.viartemev.requestmapper.extensions.Extensions -class OutboundRequestMappingContributor(event: AnActionEvent) : AbstractGotoSEContributor(event) { +class OutboundRequestMappingContributor(event: AnActionEvent) : AbstractRequestMappingContributor(event) { - override fun createModel(project: Project): FilteringGotoByModel<*> { - return RequestMappingModel(project, getContributors()) - } - - private fun getContributors(): List { + override fun getContributors(): List { return Extensions.getContributors().map { CustomFilterWrapperMappingContributor( it, @@ -32,11 +24,7 @@ class OutboundRequestMappingContributor(event: AnActionEvent) : AbstractGotoSECo } override fun getGroupName(): String { - return "Outbound requests" - } - - override fun showInFindResults(): Boolean { - return false + return "Out-requests" } class Factory : SearchEverywhereContributorFactory { From e9fd10c3b87f2a36703bbc851301b4d00a46a257 Mon Sep 17 00:00:00 2001 From: pyltsin Date: Sun, 2 Aug 2020 18:07:53 +0300 Subject: [PATCH 7/8] add feign in README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 871f361a..e9def88f 100644 --- a/README.md +++ b/README.md @@ -27,6 +27,7 @@ | Spring | JAX-RS | Micronaut | |:-:|:-:|:-:| | ```@RequestMapping``` | | | +| ```@FeignClient``` | | | | ```@GetMapping``` | ```@GET``` | ```@Get``` | | ```@PostMapping``` | ```@POST``` | ```@Post``` | | ```@PutMapping``` | ```@PUT``` | ```@Put``` | From 550d1c9fa0f08e3bdd0b1ebc499187fdbe2efc18 Mon Sep 17 00:00:00 2001 From: mpyltsin Date: Tue, 25 Aug 2020 17:52:34 +0300 Subject: [PATCH 8/8] change version idea and plugins --- build.gradle | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 11b5415d..6b3ddddb 100644 --- a/build.gradle +++ b/build.gradle @@ -10,7 +10,7 @@ buildscript { log4j_version = '2.11.1' commons_lang3_version = '3.11' - kotlinter_gradle_plugin = '2.4.1' + kotlinter_gradle_plugin = '3.0.0' gradle_intellij_plugin = '0.4.21' } @@ -78,8 +78,8 @@ test { intellij { pluginName "Request mapper" type 'IC' - version = '2020.2' - plugins = ["java", "org.jetbrains.kotlin:$kotlin_version-release-IJ2020.1-1"] + version = '2020.2.1' + plugins = ["java", "org.jetbrains.kotlin:$kotlin_version-release-IJ2020.2-1"] } jacoco { @@ -105,5 +105,4 @@ kotlinter { reporters = ['checkstyle', 'plain'] experimentalRules = false disabledRules = [] - fileBatchSize = 30 }