-
Notifications
You must be signed in to change notification settings - Fork 22
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #231 from viartemev/add-micronaut-support
Add micronaut support
- Loading branch information
Showing
15 changed files
with
218 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
12 changes: 12 additions & 0 deletions
12
src/main/kotlin/com/viartemev/requestmapper/annotations/micronaut/Delete.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.viartemev.requestmapper.annotations.micronaut | ||
|
||
import com.intellij.psi.PsiAnnotation | ||
|
||
class Delete(psiAnnotation: PsiAnnotation) : MicronautMappingAnnotation(psiAnnotation) { | ||
|
||
override fun extractMethod() = METHOD | ||
|
||
companion object { | ||
private const val METHOD = "DELETE" | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/kotlin/com/viartemev/requestmapper/annotations/micronaut/Get.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.viartemev.requestmapper.annotations.micronaut | ||
|
||
import com.intellij.psi.PsiAnnotation | ||
|
||
class Get(psiAnnotation: PsiAnnotation) : MicronautMappingAnnotation(psiAnnotation) { | ||
|
||
override fun extractMethod() = METHOD | ||
|
||
companion object { | ||
private const val METHOD = "GET" | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/kotlin/com/viartemev/requestmapper/annotations/micronaut/Head.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.viartemev.requestmapper.annotations.micronaut | ||
|
||
import com.intellij.psi.PsiAnnotation | ||
|
||
class Head(psiAnnotation: PsiAnnotation) : MicronautMappingAnnotation(psiAnnotation) { | ||
|
||
override fun extractMethod() = METHOD | ||
|
||
companion object { | ||
private const val METHOD = "HEAD" | ||
} | ||
} |
84 changes: 84 additions & 0 deletions
84
...in/kotlin/com/viartemev/requestmapper/annotations/micronaut/MicronautMappingAnnotation.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,84 @@ | ||
package com.viartemev.requestmapper.annotations.micronaut | ||
|
||
import com.intellij.psi.PsiAnnotation | ||
import com.intellij.psi.PsiLiteralExpression | ||
import com.intellij.psi.PsiMethod | ||
import com.intellij.psi.PsiReferenceExpression | ||
|
||
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.extractExpression | ||
import com.viartemev.requestmapper.model.Path | ||
import com.viartemev.requestmapper.model.PathParameter | ||
import com.viartemev.requestmapper.utils.fetchAnnotatedMethod | ||
import com.viartemev.requestmapper.utils.unquote | ||
|
||
abstract class MicronautMappingAnnotation( | ||
val psiAnnotation: PsiAnnotation, | ||
private val urlFormatter: UrlFormatter = MicronautUrlFormatter | ||
) : MappingAnnotation { | ||
|
||
override fun values(): List<RequestMappingItem> { | ||
return fetchRequestMappingItem(psiAnnotation, psiAnnotation.fetchAnnotatedMethod(), extractMethod()) | ||
} | ||
|
||
abstract fun extractMethod(): String | ||
|
||
private fun fetchRequestMappingItem(annotation: PsiAnnotation, psiMethod: PsiMethod, method: String): List<RequestMappingItem> { | ||
val classMapping = fetchMappingFromClass(psiMethod) | ||
val methodMapping = fetchMappingFromMethod(annotation, psiMethod) | ||
return listOf(RequestMappingItem(psiMethod, urlFormatter.format(classMapping, methodMapping), method)) | ||
} | ||
|
||
private fun fetchMappingFromClass(psiMethod: PsiMethod): String { | ||
return psiMethod | ||
.containingClass | ||
?.modifierList | ||
?.annotations | ||
?.flatMap { extractPathFromMicronautPsiAnnotations(it) } | ||
?.firstOrNull() ?: "" | ||
} | ||
|
||
private fun extractPathFromMicronautPsiAnnotations(psiAnnotation: PsiAnnotation) = when (psiAnnotation.qualifiedName) { | ||
CONTROLLER_ANNOTATION -> PathAnnotation(psiAnnotation).fetchMappings(ATTRIBUTE_NAME) | ||
else -> emptyList() | ||
} | ||
|
||
private fun fetchMappingFromMethod(annotation: PsiAnnotation, method: PsiMethod): String { | ||
val parametersNameWithType = method | ||
.parameterList | ||
.parameters | ||
.mapNotNull { | ||
PathParameter(it).extractParameterNameWithType(PATH_VARIABLE_ANNOTATION, ::extractParameterNameFromAnnotation) | ||
?: Pair(it.name!!, it.type.presentableText.unquote()) | ||
} | ||
.toMap() | ||
|
||
return PathAnnotation(annotation).fetchMappings(ATTRIBUTE_NAME) | ||
.map { Path(it).addPathVariablesTypes(parametersNameWithType).toFullPath() } | ||
.firstOrNull() ?: "" | ||
} | ||
|
||
private fun extractParameterNameFromAnnotation(annotation: PsiAnnotation, defaultValue: String): String { | ||
return when (val pathVariableValue = annotation.findAttributeValue(ATTRIBUTE_NAME)) { | ||
is PsiLiteralExpression -> { | ||
val expression = extractExpression(pathVariableValue) | ||
if (expression.isNotBlank()) expression else defaultValue | ||
} | ||
is PsiReferenceExpression -> { | ||
val expression = extractExpression(pathVariableValue) | ||
if (expression.isNotBlank()) expression else defaultValue | ||
} | ||
else -> defaultValue | ||
} | ||
} | ||
|
||
companion object { | ||
private const val CONTROLLER_ANNOTATION = "io.micronaut.http.annotation.Controller" | ||
private const val ATTRIBUTE_NAME = "value" | ||
private const val PATH_VARIABLE_ANNOTATION = "io.micronaut.http.annotation.PathVariable" | ||
} | ||
|
||
} |
13 changes: 13 additions & 0 deletions
13
src/main/kotlin/com/viartemev/requestmapper/annotations/micronaut/MicronautUrlFormatter.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.viartemev.requestmapper.annotations.micronaut | ||
|
||
import com.viartemev.requestmapper.annotations.UrlFormatter | ||
import com.viartemev.requestmapper.utils.dropFirstEmptyStringIfExists | ||
|
||
object MicronautUrlFormatter : UrlFormatter { | ||
|
||
override fun format(classMapping: String, methodMapping: String, param: String): String { | ||
val classPathSeq = classMapping.splitToSequence('/').filterNot { it.isBlank() } | ||
val methodPathList = methodMapping.split('/').dropFirstEmptyStringIfExists() | ||
return (classPathSeq + methodPathList).joinToString(separator = "/", prefix = "/") | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/kotlin/com/viartemev/requestmapper/annotations/micronaut/Options.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.viartemev.requestmapper.annotations.micronaut | ||
|
||
import com.intellij.psi.PsiAnnotation | ||
|
||
class Options(psiAnnotation: PsiAnnotation) : MicronautMappingAnnotation(psiAnnotation) { | ||
|
||
override fun extractMethod() = METHOD | ||
|
||
companion object { | ||
private const val METHOD = "OPTIONS" | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/kotlin/com/viartemev/requestmapper/annotations/micronaut/Patch.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.viartemev.requestmapper.annotations.micronaut | ||
|
||
import com.intellij.psi.PsiAnnotation | ||
|
||
class Patch(psiAnnotation: PsiAnnotation) : MicronautMappingAnnotation(psiAnnotation) { | ||
|
||
override fun extractMethod() = METHOD | ||
|
||
companion object { | ||
private const val METHOD = "PATCH" | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/kotlin/com/viartemev/requestmapper/annotations/micronaut/Post.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.viartemev.requestmapper.annotations.micronaut | ||
|
||
import com.intellij.psi.PsiAnnotation | ||
|
||
class Post(psiAnnotation: PsiAnnotation) : MicronautMappingAnnotation(psiAnnotation) { | ||
|
||
override fun extractMethod() = METHOD | ||
|
||
companion object { | ||
private const val METHOD = "POST" | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/kotlin/com/viartemev/requestmapper/annotations/micronaut/Put.kt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package com.viartemev.requestmapper.annotations.micronaut | ||
|
||
import com.intellij.psi.PsiAnnotation | ||
|
||
class Put(psiAnnotation: PsiAnnotation) : MicronautMappingAnnotation(psiAnnotation) { | ||
|
||
override fun extractMethod() = METHOD | ||
|
||
companion object { | ||
private const val METHOD = "PUT" | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters