mirror of
https://github.com/QB64Official/qb64.git
synced 2024-08-22 11:25:08 +00:00
Implements unused variables indicator
An arrow to the left of the line where a variable was defined will be shown after compilation to indicate that variable hasn't been used throughout the program.
This commit is contained in:
parent
eab36fc4aa
commit
47685d82b0
2 changed files with 138 additions and 4 deletions
|
@ -1255,8 +1255,17 @@ FUNCTION ide2 (ignore)
|
||||||
QuickNavHover = -1
|
QuickNavHover = -1
|
||||||
LOCATE 2, 4
|
LOCATE 2, 4
|
||||||
COLOR 15, 3
|
COLOR 15, 3
|
||||||
PRINT " " + CHR$(17) + " back to line "; str2$(QuickNavHistory(QuickNavTotal)); " ";
|
popup$ = " " + CHR$(17) + " back to line " + str2$(QuickNavHistory(QuickNavTotal)) + " "
|
||||||
|
PRINT popup$;
|
||||||
|
|
||||||
|
'shadow
|
||||||
|
COLOR 2, 0
|
||||||
|
FOR x2 = 6 TO 4 + LEN(popup$)
|
||||||
|
LOCATE 3, x2: PRINT CHR$(SCREEN(3, x2));
|
||||||
|
NEXT
|
||||||
|
|
||||||
PCOPY 3, 0
|
PCOPY 3, 0
|
||||||
|
|
||||||
IF mB THEN
|
IF mB THEN
|
||||||
ideselect = 0
|
ideselect = 0
|
||||||
idecy = QuickNavHistory(QuickNavTotal)
|
idecy = QuickNavHistory(QuickNavTotal)
|
||||||
|
@ -1269,6 +1278,7 @@ FUNCTION ide2 (ignore)
|
||||||
QuickNavHover = 0
|
QuickNavHover = 0
|
||||||
GOSUB UpdateTitleOfMainWindow
|
GOSUB UpdateTitleOfMainWindow
|
||||||
GOSUB DrawQuickNav
|
GOSUB DrawQuickNav
|
||||||
|
ideshowtext
|
||||||
PCOPY 3, 0
|
PCOPY 3, 0
|
||||||
END IF
|
END IF
|
||||||
END IF
|
END IF
|
||||||
|
@ -1277,11 +1287,44 @@ FUNCTION ide2 (ignore)
|
||||||
QuickNavHover = 0
|
QuickNavHover = 0
|
||||||
GOSUB UpdateTitleOfMainWindow
|
GOSUB UpdateTitleOfMainWindow
|
||||||
GOSUB DrawQuickNav
|
GOSUB DrawQuickNav
|
||||||
|
ideshowtext
|
||||||
PCOPY 3, 0
|
PCOPY 3, 0
|
||||||
END IF
|
END IF
|
||||||
END IF
|
END IF
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
IF mX > 0 AND mY > 0 THEN
|
||||||
|
IF showingUnusedVariableWarning = 0 THEN
|
||||||
|
IF mX = 1 AND SCREEN(mY, mX) = 26 THEN
|
||||||
|
unusedVariableWarningX = mX
|
||||||
|
unusedVariableWarningY = mY
|
||||||
|
findItem = INSTR(usedVariableList$, CHR$(1) + MKL$((mY - 3) + idesy) + CHR$(2))
|
||||||
|
unusedVariableName$ = MID$(usedVariableList$, findItem + 6, INSTR(findItem, usedVariableList$, CHR$(10)) - findItem - 6)
|
||||||
|
findItem = INSTR(unusedVariableName$, CHR$(3))
|
||||||
|
unusedVariableName$ = LEFT$(unusedVariableName$, findItem - 1) + " (" + MID$(unusedVariableName$, findItem + 1) + ") "
|
||||||
|
unusedVariableWarning$ = LEFT$(" Variable hasn't yet been used: " + unusedVariableName$, idewx - 2)
|
||||||
|
LOCATE mY, mX
|
||||||
|
COLOR 0, 3
|
||||||
|
PRINT CHR$(26) + unusedVariableWarning$
|
||||||
|
|
||||||
|
'shadow
|
||||||
|
COLOR 2, 0
|
||||||
|
FOR x2 = mX + 2 TO mX + LEN(unusedVariableWarning$) + 1
|
||||||
|
LOCATE mY + 1, x2: PRINT CHR$(SCREEN(mY + 1, x2));
|
||||||
|
NEXT
|
||||||
|
|
||||||
|
PCOPY 3, 0
|
||||||
|
showingUnusedVariableWarning = -1
|
||||||
|
END IF
|
||||||
|
ELSE
|
||||||
|
IF unusedVariableWarningX <> mX OR unusedVariableWarningY <> mY THEN
|
||||||
|
ideshowtext
|
||||||
|
PCOPY 3, 0
|
||||||
|
showingUnusedVariableWarning = 0
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
IF _WINDOWHASFOCUS THEN
|
IF _WINDOWHASFOCUS THEN
|
||||||
LOCATE , , 1
|
LOCATE , , 1
|
||||||
_PALETTECOLOR 5, IDEBracketHighlightColor, 0
|
_PALETTECOLOR 5, IDEBracketHighlightColor, 0
|
||||||
|
@ -8498,6 +8541,14 @@ SUB ideshowtext
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
IF l <= iden THEN
|
IF l <= iden THEN
|
||||||
|
IF idecompiling = 0 AND INSTR(usedVariableList$, CHR$(1) + MKL$(l) + CHR$(2)) > 0 THEN
|
||||||
|
LOCATE y + 3, 1
|
||||||
|
prevBG% = _BACKGROUNDCOLOR
|
||||||
|
COLOR 13, 1
|
||||||
|
PRINT CHR$(26); 'indicate there's an unused variable defined on this line
|
||||||
|
COLOR , prevBG%
|
||||||
|
END IF
|
||||||
|
|
||||||
a$ = idegetline(l)
|
a$ = idegetline(l)
|
||||||
link_idecx = 0
|
link_idecx = 0
|
||||||
rgb_idecx = 0
|
rgb_idecx = 0
|
||||||
|
@ -8878,8 +8929,10 @@ SUB ideshowtext
|
||||||
FOR b = 1 TO IdeBmkN
|
FOR b = 1 TO IdeBmkN
|
||||||
y = IdeBmk(b).y
|
y = IdeBmk(b).y
|
||||||
IF y >= idesy AND y <= idesy + (idewy - 9) THEN
|
IF y >= idesy AND y <= idesy + (idewy - 9) THEN
|
||||||
|
IF INSTR(usedVariableList$, CHR$(1) + MKL$(y) + CHR$(2)) = 0 THEN
|
||||||
LOCATE 3 + y - idesy, 1: PRINT CHR$(197);
|
LOCATE 3 + y - idesy, 1: PRINT CHR$(197);
|
||||||
END IF
|
END IF
|
||||||
|
END IF
|
||||||
NEXT
|
NEXT
|
||||||
|
|
||||||
q = idevbar(idewx, 3, (idewy - 8), idecy, iden)
|
q = idevbar(idewx, 3, (idewy - 8), idecy, iden)
|
||||||
|
|
|
@ -111,6 +111,8 @@ IF OS_BITS = 32 THEN _TITLE "QB64 x32" ELSE _TITLE "QB64 x64"
|
||||||
DIM SHARED ConsoleMode, No_C_Compile_Mode, Cloud, NoIDEMode
|
DIM SHARED ConsoleMode, No_C_Compile_Mode, Cloud, NoIDEMode
|
||||||
DIM SHARED CMDLineFile AS STRING
|
DIM SHARED CMDLineFile AS STRING
|
||||||
|
|
||||||
|
DIM SHARED totalUnusedVariables AS LONG, usedVariableList$, bypassNextVariable AS _BYTE
|
||||||
|
DIM SHARED warning$(100), totalWarnings AS LONG
|
||||||
DIM SHARED ExeIconSet AS LONG
|
DIM SHARED ExeIconSet AS LONG
|
||||||
DIM SHARED VersionInfoSet AS _BYTE
|
DIM SHARED VersionInfoSet AS _BYTE
|
||||||
|
|
||||||
|
@ -1429,7 +1431,9 @@ subfunc = ""
|
||||||
SelectCaseCounter = 0
|
SelectCaseCounter = 0
|
||||||
ExecCounter = 0
|
ExecCounter = 0
|
||||||
UserDefineCount = 6
|
UserDefineCount = 6
|
||||||
|
usedVariableList$ = ""
|
||||||
|
totalUnusedVariables = 0
|
||||||
|
totalWarnings = 0
|
||||||
|
|
||||||
''create a type for storing memory blocks
|
''create a type for storing memory blocks
|
||||||
''UDT
|
''UDT
|
||||||
|
@ -7280,6 +7284,7 @@ DO
|
||||||
'create variable
|
'create variable
|
||||||
IF LEN(s$) THEN typ$ = s$ ELSE typ$ = t$
|
IF LEN(s$) THEN typ$ = s$ ELSE typ$ = t$
|
||||||
IF optionexplicit THEN a$ = "Variable '" + n$ + "' (" + symbol2fulltypename$(typ$) + ") not defined": GOTO errmes
|
IF optionexplicit THEN a$ = "Variable '" + n$ + "' (" + symbol2fulltypename$(typ$) + ") not defined": GOTO errmes
|
||||||
|
bypassNextVariable = -1
|
||||||
retval = dim2(n$, typ$, method, "")
|
retval = dim2(n$, typ$, method, "")
|
||||||
IF Error_Happened THEN GOTO errmes
|
IF Error_Happened THEN GOTO errmes
|
||||||
'note: variable created!
|
'note: variable created!
|
||||||
|
@ -14725,6 +14730,11 @@ FUNCTION dim2 (varname$, typ2$, method, elements$)
|
||||||
Give_Error "Unknown type": EXIT FUNCTION
|
Give_Error "Unknown type": EXIT FUNCTION
|
||||||
dim2exitfunc:
|
dim2exitfunc:
|
||||||
|
|
||||||
|
IF bypassNextVariable = 0 THEN
|
||||||
|
manageVariableList cvarname$, n$, 0
|
||||||
|
END IF
|
||||||
|
bypassNextVariable = 0
|
||||||
|
|
||||||
IF dimsfarray THEN
|
IF dimsfarray THEN
|
||||||
ids(idn).sfid = glinkid
|
ids(idn).sfid = glinkid
|
||||||
ids(idn).sfarg = glinkarg
|
ids(idn).sfarg = glinkarg
|
||||||
|
@ -15116,6 +15126,7 @@ FUNCTION evaluate$ (a2$, typ AS LONG)
|
||||||
END IF 'varname
|
END IF 'varname
|
||||||
NEXT
|
NEXT
|
||||||
END IF 'subfuncn
|
END IF 'subfuncn
|
||||||
|
bypassNextVariable = -1
|
||||||
ignore = dim2(l$, dtyp$, method, fakee$)
|
ignore = dim2(l$, dtyp$, method, fakee$)
|
||||||
IF Error_Happened THEN EXIT FUNCTION
|
IF Error_Happened THEN EXIT FUNCTION
|
||||||
dimstatic = olddimstatic
|
dimstatic = olddimstatic
|
||||||
|
@ -15310,6 +15321,7 @@ FUNCTION evaluate$ (a2$, typ AS LONG)
|
||||||
|
|
||||||
IF Debug THEN PRINT #9, "CREATING VARIABLE:" + x$
|
IF Debug THEN PRINT #9, "CREATING VARIABLE:" + x$
|
||||||
IF optionexplicit THEN Give_Error "Variable '" + x$ + "' (" + symbol2fulltypename$(typ$) + ") not defined": EXIT FUNCTION
|
IF optionexplicit THEN Give_Error "Variable '" + x$ + "' (" + symbol2fulltypename$(typ$) + ") not defined": EXIT FUNCTION
|
||||||
|
bypassNextVariable = -1
|
||||||
retval = dim2(x$, typ$, 1, "")
|
retval = dim2(x$, typ$, 1, "")
|
||||||
IF Error_Happened THEN EXIT FUNCTION
|
IF Error_Happened THEN EXIT FUNCTION
|
||||||
|
|
||||||
|
@ -17736,6 +17748,32 @@ FUNCTION findid& (n2$)
|
||||||
|
|
||||||
id = ids(i)
|
id = ids(i)
|
||||||
|
|
||||||
|
t = id.t
|
||||||
|
IF t = 0 THEN
|
||||||
|
t = id.arraytype
|
||||||
|
IF t AND ISUDT THEN
|
||||||
|
manageVariableList "", scope$ + "ARRAY_UDT_" + RTRIM$(id.n), 2
|
||||||
|
ELSE
|
||||||
|
n$ = id2fulltypename$
|
||||||
|
IF LEFT$(n$, 1) = "_" THEN
|
||||||
|
manageVariableList "", scope$ + "ARRAY" + n$ + "_" + RTRIM$(id.n), 2
|
||||||
|
ELSE
|
||||||
|
manageVariableList "", scope$ + "ARRAY_" + n$ + "_" + RTRIM$(id.n), 2
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
ELSE
|
||||||
|
IF t AND ISUDT THEN
|
||||||
|
manageVariableList "", scope$ + "UDT_" + RTRIM$(id.n), 2
|
||||||
|
ELSE
|
||||||
|
n$ = id2fulltypename$
|
||||||
|
IF LEFT$(n$, 1) = "_" THEN
|
||||||
|
manageVariableList "", scope$ + MID$(n$, 2) + "_" + RTRIM$(id.n), 2
|
||||||
|
ELSE
|
||||||
|
manageVariableList "", scope$ + n$ + "_" + RTRIM$(id.n), 2
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
END IF
|
||||||
|
|
||||||
currentid = i
|
currentid = i
|
||||||
EXIT FUNCTION
|
EXIT FUNCTION
|
||||||
|
|
||||||
|
@ -21255,7 +21293,6 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
|
||||||
getid idnumber
|
getid idnumber
|
||||||
IF Error_Happened THEN EXIT SUB
|
IF Error_Happened THEN EXIT SUB
|
||||||
|
|
||||||
|
|
||||||
'UDT?
|
'UDT?
|
||||||
IF typ AND ISUDT THEN
|
IF typ AND ISUDT THEN
|
||||||
|
|
||||||
|
@ -21345,6 +21382,8 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
|
||||||
|
|
||||||
'print "setUDTrefer:"+r$,e$
|
'print "setUDTrefer:"+r$,e$
|
||||||
tlayout$ = tl$
|
tlayout$ = tl$
|
||||||
|
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
|
||||||
|
manageVariableList "", scope$ + n$, 1
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
@ -21378,6 +21417,8 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
|
||||||
END IF
|
END IF
|
||||||
PRINT #12, cleanupstringprocessingcall$ + "0);"
|
PRINT #12, cleanupstringprocessingcall$ + "0);"
|
||||||
tlayout$ = tl$
|
tlayout$ = tl$
|
||||||
|
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
|
||||||
|
manageVariableList "", r$, 1
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
@ -21452,6 +21493,8 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
|
||||||
PRINT #12, cleanupstringprocessingcall$ + "0);"
|
PRINT #12, cleanupstringprocessingcall$ + "0);"
|
||||||
IF arrayprocessinghappened THEN arrayprocessinghappened = 0
|
IF arrayprocessinghappened THEN arrayprocessinghappened = 0
|
||||||
tlayout$ = tl$
|
tlayout$ = tl$
|
||||||
|
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
|
||||||
|
manageVariableList "", r$, 1
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
@ -21482,6 +21525,8 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
|
||||||
IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);": stringprocessinghappened = 0
|
IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);": stringprocessinghappened = 0
|
||||||
IF arrayprocessinghappened THEN arrayprocessinghappened = 0
|
IF arrayprocessinghappened THEN arrayprocessinghappened = 0
|
||||||
tlayout$ = tl$
|
tlayout$ = tl$
|
||||||
|
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
|
||||||
|
manageVariableList "", r$, 1
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
END IF
|
END IF
|
||||||
|
|
||||||
|
@ -21508,6 +21553,10 @@ SUB setrefer (a2$, typ2 AS LONG, e2$, method AS LONG)
|
||||||
IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);": stringprocessinghappened = 0
|
IF stringprocessinghappened THEN PRINT #12, cleanupstringprocessingcall$ + "0);": stringprocessinghappened = 0
|
||||||
IF arrayprocessinghappened THEN arrayprocessinghappened = 0
|
IF arrayprocessinghappened THEN arrayprocessinghappened = 0
|
||||||
tlayout$ = tl$
|
tlayout$ = tl$
|
||||||
|
|
||||||
|
IF LEFT$(r$, 1) = "*" THEN r$ = MID$(r$, 2)
|
||||||
|
manageVariableList "", r$, 1
|
||||||
|
|
||||||
EXIT SUB
|
EXIT SUB
|
||||||
END IF 'variable
|
END IF 'variable
|
||||||
|
|
||||||
|
@ -24789,6 +24838,38 @@ SUB dump_udts
|
||||||
CLOSE #f
|
CLOSE #f
|
||||||
END SUB
|
END SUB
|
||||||
|
|
||||||
|
SUB manageVariableList (name$, __cname$, action AS _BYTE)
|
||||||
|
DIM findItem AS LONG, s$, cname$
|
||||||
|
cname$ = __cname$
|
||||||
|
|
||||||
|
findItem = INSTR(cname$, "[")
|
||||||
|
IF findItem THEN
|
||||||
|
cname$ = LEFT$(cname$, findItem - 1)
|
||||||
|
END IF
|
||||||
|
|
||||||
|
SELECT CASE action
|
||||||
|
CASE 0 'add
|
||||||
|
usedVariableList$ = usedVariableList$ + CHR$(1) + MKL$(linenumber) + CHR$(2)
|
||||||
|
usedVariableList$ = usedVariableList$ + name$ + CHR$(3) + cname$ + CHR$(10)
|
||||||
|
totalUnusedVariables = totalUnusedVariables + 1
|
||||||
|
'usedVariableList$ = usedVariableList$ + "Adding " + cname$ + " at line" + STR$(linenumber) + CHR$(10)
|
||||||
|
CASE ELSE 'find and remove
|
||||||
|
s$ = CHR$(3) + cname$ + CHR$(10)
|
||||||
|
findItem = INSTR(usedVariableList$, s$)
|
||||||
|
IF findItem THEN
|
||||||
|
FOR i = findItem TO 1 STEP -1
|
||||||
|
IF ASC(usedVariableList$, i) = 1 THEN
|
||||||
|
findItem = INSTR(findItem, usedVariableList$, CHR$(10))
|
||||||
|
usedVariableList$ = LEFT$(usedVariableList$, i - 1) + MID$(usedVariableList$, findItem + 1)
|
||||||
|
totalUnusedVariables = totalUnusedVariables - 1
|
||||||
|
EXIT FOR
|
||||||
|
END IF
|
||||||
|
NEXT
|
||||||
|
END IF
|
||||||
|
'usedVariableList$ = usedVariableList$ + STR$(action) + " Searching " + cname$ + " at line" + STR$(linenumber) + CHR$(10)
|
||||||
|
END SELECT
|
||||||
|
END SUB
|
||||||
|
|
||||||
'$INCLUDE:'utilities\strings.bas'
|
'$INCLUDE:'utilities\strings.bas'
|
||||||
|
|
||||||
'$INCLUDE:'subs_functions\extensions\opengl\opengl_methods.bas'
|
'$INCLUDE:'subs_functions\extensions\opengl\opengl_methods.bas'
|
||||||
|
|
Loading…
Reference in a new issue