Skip to content

Instantly share code, notes, and snippets.

View sasssass's full-sized avatar

Ali Shobeyri sasssass

View GitHub Profile
@sasssass
sasssass / ScreenWithOptionalArguments.kt
Created June 17, 2024 09:28
ScreenWithOptionalArguments.kt
@NavigationNode(route = "screen_with_optional_arguments", args = arrayOf("id", "name"),
optionalArgs = arrayOf("age","nickName")
)
@Composable
fun ScreenWithOptionalArguments(
id: String,
name: String,
nickName: String?,
age: String?
) {
@sasssass
sasssass / MainActivity.kt
Created June 17, 2024 09:26
MainActivity.kt
NavHost(navController, startDestination = SimpleScreenGraphNode.route) {
composable(SimpleScreenGraphNode.route) {
SimpleScreen(navController = navController)
}
composable(ScreenWithArgumentGraphNode.route) {backStackEntry ->
val id = checkNotNull(backStackEntry.arguments?.getString(ScreenWithArgumentGraphNode.ARG_id))
val name = checkNotNull(backStackEntry.arguments?.getString(ScreenWithArgumentGraphNode.ARG_name))
ScreenWithArgument(navController = navController, id, name)
@sasssass
sasssass / NodeProcessor.kt
Created June 17, 2024 09:19
NodeProcessor.kt
private fun generateFunction(): FunSpec {
val funBuilder = FunSpec.builder("testFunction")
funBuilder.addParameter("something", String::class.asTypeName())
val code = buildString {
append("val somethingelse = something {\n")
append("}\n")
append("return somethingElse")
}
@sasssass
sasssass / NodeProcessor.kt
Created June 17, 2024 09:13
NodeProcessor.kt
typeBuilder.addProperty(
PropertySpec.builder("rawRoute", String::class).initializer("%S", route).addModifiers(
KModifier.PUBLIC).build()
)
@sasssass
sasssass / NodeProcessor.kt
Last active June 17, 2024 08:45
NodeProcessor.kt
private fun generateCode(symbol: KSFunctionDeclaration, route: String, args: ArrayList<String>,
optionalArgs: ArrayList<String>) {
val functionName = symbol.simpleName.asString()
val packageName = symbol.packageName.asString()
val fileName = "${functionName}GraphNode"
val typeBuilder = TypeSpec.objectBuilder(fileName)
// add properties and functions to typeBuilder
@sasssass
sasssass / NodeProcessor.kt
Created June 17, 2024 08:04
NodeProcessor.kt
class NodeProcessor(
private val logger: KSPLogger,
private val codeGenerator: CodeGenerator
): SymbolProcessor {
override fun process(resolver: Resolver): List<KSAnnotated> {
logger.info("NodeProcessor was invoked.")
val symbols = resolver.getSymbolsWithAnnotation(NavigationNode::class.qualifiedName!!)
val ret = mutableListOf<KSAnnotated>()
symbols.forEach { symbol ->
if (symbol is KSFunctionDeclaration && symbol.validate()) {
@sasssass
sasssass / NodeProcessorProvider.kt
Created June 17, 2024 07:59
NodeProcessorProvider.kt
class NodeProcessorProvider : SymbolProcessorProvider {
override fun create(environment: SymbolProcessorEnvironment): SymbolProcessor {
return NodeProcessor(
logger = environment.logger,
codeGenerator = environment.codeGenerator
)
}
}
@sasssass
sasssass / AnnotationRetention.kt
Created June 17, 2024 07:40
AnnotationRetention.kt
public enum class AnnotationRetention {
/** Annotation isn't stored in binary output */
SOURCE,
/** Annotation is stored in binary output, but invisible for reflection */
BINARY,
/** Annotation is stored in binary output and visible for reflection (default retention) */
RUNTIME
}
@sasssass
sasssass / NavigationNode.kt
Last active June 17, 2024 07:42
NavigationNode.kt
@Target(AnnotationTarget.FUNCTION)
@Retention(AnnotationRetention.RUNTIME)
annotation class NavigationNode(
val route: String,
val args: Array<String>,
val optionalArgs: Array<String>
)
@sasssass
sasssass / lib.versions.toml
Last active June 17, 2024 07:23
lib.versions.toml
[versions]
navigationCompose = "2.7.7"
symbolProcessing = "2.0.0-1.0.21"
kotlinpoet = "1.16.0"
[libraries]
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "navigationCompose" }
symbol-processing = { group = "com.google.devtools.ksp" , name = "symbol-processing-api", version.ref = "symbolProcessing"}
kotlinpoet = { group = "com.squareup" , name = "kotlinpoet-ksp" , version.ref = "kotlinpoet"}