From b526e132a76655b69a4e46579ca73a78915d3151 Mon Sep 17 00:00:00 2001 From: Irmen de Jong Date: Sat, 24 Dec 2022 17:22:30 +0100 Subject: [PATCH] better warning + don't remove non-trivial initializer expression for unused variables --- .../src/prog8/optimizer/UnusedCodeRemover.kt | 26 ++++++++++++++----- 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/codeOptimizers/src/prog8/optimizer/UnusedCodeRemover.kt b/codeOptimizers/src/prog8/optimizer/UnusedCodeRemover.kt index 788b8ce0a..af8c56c59 100644 --- a/codeOptimizers/src/prog8/optimizer/UnusedCodeRemover.kt +++ b/codeOptimizers/src/prog8/optimizer/UnusedCodeRemover.kt @@ -120,12 +120,26 @@ class UnusedCodeRemover(private val program: Program, if(singleUse is AssignTarget) { val assignment = singleUse.parent as Assignment if(assignment.origin==AssignmentOrigin.VARINIT) { - if(!decl.definingModule.isLibrary) - errors.warn("removing unused variable '${decl.name}'", decl.position) - return listOf( - IAstModification.Remove(decl, parent as IStatementContainer), - IAstModification.Remove(assignment, assignment.parent as IStatementContainer) - ) + if(assignment.value.isSimple) { + // remove the vardecl + if(!decl.definingModule.isLibrary) + errors.warn("removing unused variable '${decl.name}'", decl.position) + return listOf( + IAstModification.Remove(decl, parent as IStatementContainer), + IAstModification.Remove(assignment, assignment.parent as IStatementContainer) + ) + } else if(assignment.value is IFunctionCall) { + // replace the unused variable's initializer function call by a void + errors.warn("replaced unused variable '${decl.name}' with void call, maybe this can be removed altogether", decl.position) + val fcall = assignment.value as IFunctionCall + val voidCall = FunctionCallStatement(fcall.target, fcall.args, true, fcall.position) + return listOf( + IAstModification.ReplaceNode(decl, voidCall, parent), + IAstModification.Remove(assignment, assignment.parent as IStatementContainer) + ) + } else { + errors.warn("variable '${decl.name}' is unused but has non-trivial initialization assignment. Leaving this in but maybe it can be removed altogether", decl.position) + } } } }