From 3af195fe11d7fb4555cb09f5b0de19dd27fa4eaa Mon Sep 17 00:00:00 2001 From: yairm210 Date: Fri, 8 Aug 2025 14:49:33 +0300 Subject: [PATCH] chore(purity): Removed suppressions --- build.gradle.kts | 7 +++++++ .../civilization/MotivationToAttackAutomation.kt | 16 +++++++++++++++- core/src/com/unciv/logic/map/mapunit/MapUnit.kt | 2 +- core/src/com/unciv/models/ruleset/Ruleset.kt | 6 +++--- .../models/ruleset/unique/expressions/Node.kt | 1 - .../ruleset/validation/ModCompatibility.kt | 4 ++-- 6 files changed, 28 insertions(+), 8 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 00648e0bf9..7a666617ce 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -54,6 +54,13 @@ allprojects { "com.badlogic.gdx.math.Vector2.len", "com.badlogic.gdx.math.Vector2.cpy", "com.badlogic.gdx.math.Vector2.hashCode", + + "com.badlogic.gdx.files.FileHandle.child", + "com.badlogic.gdx.files.FileHandle.list", + "com.badlogic.gdx.files.FileHandle.exists", + "com.badlogic.gdx.files.FileHandle.isDirectory", + "com.badlogic.gdx.files.FileHandle.isFile", + "com.badlogic.gdx.files.FileHandle.name", ) wellKnownPureClasses = setOf( ) diff --git a/core/src/com/unciv/logic/automation/civilization/MotivationToAttackAutomation.kt b/core/src/com/unciv/logic/automation/civilization/MotivationToAttackAutomation.kt index 8abc473a49..ba1480a7ec 100644 --- a/core/src/com/unciv/logic/automation/civilization/MotivationToAttackAutomation.kt +++ b/core/src/com/unciv/logic/automation/civilization/MotivationToAttackAutomation.kt @@ -16,13 +16,14 @@ import com.unciv.models.ruleset.nation.PersonalityValue import com.unciv.models.ruleset.unique.UniqueType import com.unciv.models.ruleset.unit.BaseUnit import com.unciv.ui.screens.victoryscreen.RankingType +import yairm210.purity.annotations.Pure import yairm210.purity.annotations.Readonly object MotivationToAttackAutomation { /** Will return the motivation to attack, but might short circuit if the value is guaranteed to * be lower than `atLeast`. So any values below `atLeast` should not be used for comparison. */ - @Readonly @Suppress("purity") + @Readonly @Suppress("purity") // requires changing dependents from mutating to readonly fun hasAtLeastMotivationToAttack(civInfo: Civilization, targetCiv: Civilization, atLeast: Float): Float { val diplomacyManager = civInfo.getDiplomacyManager(targetCiv)!! val personality = civInfo.getPersonality() @@ -156,6 +157,19 @@ object MotivationToAttackAutomation { if (civInfo.getCapital() != null) ourCombatStrength += CityCombatant(civInfo.getCapital()!!).getCityStrength() return ourCombatStrength } + + @Pure + fun addHelloWorld(@Pure add: (String) -> Unit){ + add("Hello") + add("World") + } + + @Pure + fun a(): MutableList { + val myList = mutableListOf() + addHelloWorld{myList.add(it)} + return myList + } private fun addWonderBasedMotivations(otherCiv: Civilization, modifiers: MutableList>) { var wonderCount = 0 diff --git a/core/src/com/unciv/logic/map/mapunit/MapUnit.kt b/core/src/com/unciv/logic/map/mapunit/MapUnit.kt index 331baf5fbe..637e7bf05c 100644 --- a/core/src/com/unciv/logic/map/mapunit/MapUnit.kt +++ b/core/src/com/unciv/logic/map/mapunit/MapUnit.kt @@ -605,7 +605,7 @@ class MapUnit : IsPartOfGameInfoSerialization { } /** Implements [UniqueParameterType.MapUnitFilter][com.unciv.models.ruleset.unique.UniqueParameterType.MapUnitFilter] */ - @Readonly @Suppress("purity") // allow passing functions like this + @Readonly fun matchesFilter(filter: String, multiFilter: Boolean = true): Boolean { return if (multiFilter) MultiFilter.multiFilter(filter, ::matchesSingleFilter) else matchesSingleFilter(filter) } diff --git a/core/src/com/unciv/models/ruleset/Ruleset.kt b/core/src/com/unciv/models/ruleset/Ruleset.kt index af405bf9fb..5b7ede0fa5 100644 --- a/core/src/com/unciv/models/ruleset/Ruleset.kt +++ b/core/src/com/unciv/models/ruleset/Ruleset.kt @@ -36,7 +36,6 @@ import com.unciv.utils.Log import org.jetbrains.annotations.VisibleForTesting import yairm210.purity.annotations.Readonly import kotlin.collections.set - enum class RulesetFile( val filename: String, @Readonly val getRulesetObjects: Ruleset.() -> Sequence = { emptySequence() }, @@ -292,9 +291,9 @@ class Ruleset { events.clear() } - @Readonly @Suppress("purity") + @Readonly fun allRulesetObjects(): Sequence = RulesetFile.entries.asSequence().flatMap { it.getRulesetObjects(this) } - @Readonly @Suppress("purity") + @Readonly fun allUniques(): Sequence = RulesetFile.entries.asSequence().flatMap { it.getUniques(this) } @Readonly fun allICivilopediaText(): Sequence = allRulesetObjects() + events.values.flatMap { it.choices } @@ -546,6 +545,7 @@ class Ruleset { else -> "Combined RuleSet ($mods)" } + @Readonly fun getSummary(): String { val stringList = ArrayList() if (modOptions.isBaseRuleset) stringList += "Base Ruleset" diff --git a/core/src/com/unciv/models/ruleset/unique/expressions/Node.kt b/core/src/com/unciv/models/ruleset/unique/expressions/Node.kt index 78cba4d812..24d54cb753 100644 --- a/core/src/com/unciv/models/ruleset/unique/expressions/Node.kt +++ b/core/src/com/unciv/models/ruleset/unique/expressions/Node.kt @@ -30,7 +30,6 @@ internal sealed interface Node { } class BinaryOperation(private val operator: Operator.Binary, private val left: Node, private val right: Node): Node { - @Suppress("purity") override fun eval(context: GameContext): Double = operator.implementation(left.eval(context), right.eval(context)) override fun toString() = "($left $operator $right)" override fun getErrors(ruleset: Ruleset): List { diff --git a/core/src/com/unciv/models/ruleset/validation/ModCompatibility.kt b/core/src/com/unciv/models/ruleset/validation/ModCompatibility.kt index 4a8377ac25..53d1ec2633 100644 --- a/core/src/com/unciv/models/ruleset/validation/ModCompatibility.kt +++ b/core/src/com/unciv/models/ruleset/validation/ModCompatibility.kt @@ -40,9 +40,10 @@ object ModCompatibility { } // If there's media (audio folders or any atlas), show the PAV choice... - @Readonly @Suppress("purity") // requies marking file functions + @Readonly private fun isAudioVisualGuessed(mod: Ruleset): Boolean { val folder = mod.folderLocation ?: return false // Also catches isBuiltin + @Readonly fun isSubFolderNotEmpty(modFolder: FileHandle, name: String): Boolean { val file = modFolder.child(name) if (!file.exists()) return false @@ -62,7 +63,6 @@ object ModCompatibility { && !mod.modOptions.hasUnique(UniqueType.ModIsAudioVisualOnly) @Readonly - @Suppress("purity") // requies marking file functions fun isConstantsOnly(mod: Ruleset): Boolean { val folder = mod.folderLocation ?: return false if (folder.list("atlas").isNotEmpty()) return false