1
0
mirror of https://github.com/SquidDev-CC/CC-Tweaked synced 2025-03-13 06:58:12 +00:00

Fix disk drives not setting/clearing removed flag

This was originally noticed on 1.21, as it causes disk drives to not be
detected as peripherals. However, things will still be broken (albeit
more subtly) on 1.20, so worth fixing here.
This commit is contained in:
Jonathan Coates 2024-08-15 09:03:33 +01:00
parent ed283155f7
commit 356c8e8aeb
No known key found for this signature in database
GPG Key ID: B9E431FF07C98D06
3 changed files with 78 additions and 0 deletions

View File

@ -96,11 +96,13 @@ public final class DiskDriveBlockEntity extends AbstractContainerBlockEntity {
@Override @Override
public void clearRemoved() { public void clearRemoved() {
super.clearRemoved();
updateMedia(); updateMedia();
} }
@Override @Override
public void setRemoved() { public void setRemoved() {
super.setRemoved();
if (recordPlaying) stopRecord(); if (recordPlaying) stopRecord();
} }

View File

@ -0,0 +1,75 @@
// SPDX-FileCopyrightText: 2024 The CC: Tweaked Developers
//
// SPDX-License-Identifier: MPL-2.0
@file:Suppress("JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE")
package cc.tweaked.linter
import com.google.errorprone.BugPattern
import com.google.errorprone.VisitorState
import com.google.errorprone.bugpatterns.BugChecker
import com.google.errorprone.matchers.Description
import com.google.errorprone.util.ASTHelpers
import com.sun.source.tree.*
import com.sun.source.util.TreeScanner
import com.sun.tools.javac.code.Symbol.MethodSymbol
import javax.lang.model.element.Modifier
@BugPattern(
summary = "Checks that a methods invoke their super method.",
explanation = """
This extends ErrorProne's built in "MustCallSuper" with several additional Minecraft-specific methods.
""",
severity = BugPattern.SeverityLevel.ERROR,
tags = [BugPattern.StandardTags.LIKELY_ERROR],
)
class ExtraMustCallSuper : BugChecker(), BugChecker.MethodTreeMatcher {
companion object {
private val REQUIRED_METHODS = setOf(
MethodReference("net.minecraft.world.level.block.entity.BlockEntity", "setRemoved"),
MethodReference("net.minecraft.world.level.block.entity.BlockEntity", "clearRemoved"),
)
}
override fun matchMethod(tree: MethodTree, state: VisitorState): Description {
val methodSym: MethodSymbol = ASTHelpers.getSymbol(tree)
if (methodSym.modifiers.contains(Modifier.ABSTRACT)) return Description.NO_MATCH
val superMethod: MethodReference = findRequiredSuper(methodSym, state) ?: return Description.NO_MATCH
val foundSuper = SuperScanner(superMethod.method).scan(tree, Unit) ?: false
if (foundSuper) return Description.NO_MATCH
return buildDescription(tree)
.setMessage("This method overrides %s#%s but does not call the super method.".format(superMethod.owner, superMethod.method))
.build()
}
private fun findRequiredSuper(method: MethodSymbol, state: VisitorState): MethodReference? {
for (superMethod in ASTHelpers.findSuperMethods(method, state.types)) {
val superName = MethodReference(superMethod.owner.qualifiedName.toString(), superMethod.name.toString())
if (REQUIRED_METHODS.contains(superName)) return superName
}
return null
}
private data class MethodReference(val owner: String, val method: String)
private class SuperScanner(private val methodName: String) : TreeScanner<Boolean?, Unit>() {
// Skip visiting other elements.
override fun visitClass(tree: ClassTree, state: Unit): Boolean = false
override fun visitLambdaExpression(tree: LambdaExpressionTree, state: Unit): Boolean = false
override fun visitMethodInvocation(tree: MethodInvocationTree, state: Unit): Boolean? {
val methodSelect: ExpressionTree = tree.methodSelect
if (methodSelect.kind == Tree.Kind.MEMBER_SELECT) {
val memberSelect = methodSelect as MemberSelectTree
if (ASTHelpers.isSuper(memberSelect.expression) && memberSelect.identifier.contentEquals(methodName)) return true
}
return super.visitMethodInvocation(tree, state)
}
override fun reduce(r1: Boolean?, r2: Boolean?): Boolean = (r1 ?: false) || (r2 ?: false)
}
}

View File

@ -1,6 +1,7 @@
# SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers # SPDX-FileCopyrightText: 2022 The CC: Tweaked Developers
# #
# SPDX-License-Identifier: MPL-2.0 # SPDX-License-Identifier: MPL-2.0
cc.tweaked.linter.ExtraMustCallSuper
cc.tweaked.linter.LoaderOverride cc.tweaked.linter.LoaderOverride
cc.tweaked.linter.MissingLoaderOverride cc.tweaked.linter.MissingLoaderOverride
cc.tweaked.linter.SideChecker cc.tweaked.linter.SideChecker