diff --git a/src/plugins/trackCodeFlow/varTracking.ts b/src/plugins/trackCodeFlow/varTracking.ts index cdc4227..3ba2ec8 100644 --- a/src/plugins/trackCodeFlow/varTracking.ts +++ b/src/plugins/trackCodeFlow/varTracking.ts @@ -1,4 +1,4 @@ -import { BscFile, FunctionExpression, BsDiagnostic, Range, isForStatement, isForEachStatement, isIfStatement, isAssignmentStatement, Expression, isVariableExpression, isBinaryExpression, TokenKind, Scope, CallableContainerMap, DiagnosticSeverity, isLiteralInvalid } from 'brighterscript'; +import { BscFile, FunctionExpression, BsDiagnostic, Range, isForStatement, isForEachStatement, isIfStatement, isAssignmentStatement, Expression, isVariableExpression, isBinaryExpression, TokenKind, Scope, CallableContainerMap, DiagnosticSeverity, isLiteralInvalid, isWhileStatement } from 'brighterscript'; import { LintState, StatementInfo, NarrowingInfo, VarInfo } from '.'; import { BsLintRules } from '../..'; @@ -209,6 +209,7 @@ export function createVarLinter( parent.locals = locals; } else { const isParentIf = isIfStatement(parent.stat); + const isLoop = isForStatement(closed.stat) || isForEachStatement(closed.stat) || isWhileStatement(closed.stat); locals.forEach((local, name) => { const parentLocal = parent.locals.get(name); // if var is an iterator var, flag as partial @@ -227,6 +228,13 @@ export function createVarLinter( if (parentLocal?.isIterator) { local.isIterator = parentLocal.isIterator; } + if (!local.isUsed && isLoop) { + // avoid false positive if a local set in a loop isn't used + const someParentLocal = findLocal(local.name); + if (someParentLocal?.isUsed) { + local.isUsed = true; + } + } parent.locals.set(name, local); }); } diff --git a/test/project1/source/unused-variable.brs b/test/project1/source/unused-variable.brs index 910cb9c..3c8fe66 100644 --- a/test/project1/source/unused-variable.brs +++ b/test/project1/source/unused-variable.brs @@ -29,3 +29,22 @@ sub ok3() print a end if end sub + +sub ok4() + a = false + b = false + list = ["A", "B"] + for i = 0 to list.count() - 1 + if list[i] = "A" + a = true + if b + exit for + end if + else if list[i] = "B" + b = true 'assume used because `b` could have been used in another branch of the loop + if a + exit for + end if + end if + end for +end sub