mirror of
https://github.com/boxgaming/qbjs.git
synced 2024-09-19 20:14:58 +00:00
updated to improve accuracy of runtime error line mapping
This commit is contained in:
parent
914212a564
commit
1a257e3e92
2 changed files with 456 additions and 555 deletions
109
tools/qb2js.bas
109
tools/qb2js.bas
|
@ -13,6 +13,7 @@ Const True = Not False
|
|||
' Additional Debugging output - should be set to false for final build
|
||||
Const PrintLineMapping = False
|
||||
Const PrintTokenizedLine = False
|
||||
Const PrintDataTypes = True
|
||||
|
||||
Type CodeLine
|
||||
line As Integer
|
||||
|
@ -299,10 +300,9 @@ Sub ConvertLines (firstLine As Integer, lastLine As Integer, functionName As Str
|
|||
Dim As String cleft, cright
|
||||
cleft = Left$(constParts(constIdx), eqi - 1)
|
||||
cright = Mid$(constParts(constIdx), eqi + 1)
|
||||
js = js + "const " + cleft + " = " + ConvertExpression(cright, i) + ";"
|
||||
js = js + "const " + cleft + " = " + ConvertExpression(cright, i) + "; "
|
||||
AddConst cleft
|
||||
End If
|
||||
If constIdx <> constCount Then js = js + CRLF
|
||||
Next constIdx
|
||||
|
||||
ElseIf first = "DIM" Or first = "REDIM" Or first = "STATIC" Then
|
||||
|
@ -311,13 +311,13 @@ Sub ConvertLines (firstLine As Integer, lastLine As Integer, functionName As Str
|
|||
|
||||
ElseIf first = "SELECT" Then
|
||||
caseVar = GenJSVar
|
||||
js = "var " + caseVar + " = " + ConvertExpression(Join(parts(), 3, -1, " "), i) + ";" + CRLF
|
||||
js = "var " + caseVar + " = " + ConvertExpression(Join(parts(), 3, -1, " "), i) + "; "
|
||||
js = js + "switch (" + caseVar + ") {"
|
||||
indent = 1
|
||||
caseCount = 0
|
||||
|
||||
ElseIf first = "CASE" Then
|
||||
If caseCount > 0 Then js = "break;" + LF
|
||||
If caseCount > 0 Then js = "break; "
|
||||
If UCase$(parts(2)) = "ELSE" Then
|
||||
js = js + "default:"
|
||||
ElseIf UCase$(parts(2)) = "IS" Then
|
||||
|
@ -328,8 +328,7 @@ Sub ConvertLines (firstLine As Integer, lastLine As Integer, functionName As Str
|
|||
cscount = ListSplit(Join(parts(), 2, -1, " "), caseParts())
|
||||
Dim ci As Integer
|
||||
For ci = 1 To cscount
|
||||
If ci > 1 Then js = js + CRLF
|
||||
js = js + "case " + ConvertExpression(caseParts(ci), i) + ":"
|
||||
js = js + "case " + ConvertExpression(caseParts(ci), i) + ": "
|
||||
Next ci
|
||||
End If
|
||||
caseCount = caseCount + 1
|
||||
|
@ -366,8 +365,6 @@ Sub ConvertLines (firstLine As Integer, lastLine As Integer, functionName As Str
|
|||
js = "for (" + fvar + "=" + sval + "; " + fvar + fcond + uval + "; " + fvar + "=" + fvar + " + " + fstep + ") {"
|
||||
js = js + " if (QB.halted()) { return; }"
|
||||
|
||||
'If UBound(parts) = 8 Then fstep = parts(8)
|
||||
'js = "for (" + parts(2) + "=" + parts(4) + "; " + parts(2) + " <= " + ConvertExpression(parts(6)) + "; " + parts(2) + "=" + parts(2) + "+" + fstep + ") {"
|
||||
indent = 1
|
||||
|
||||
ElseIf first = "IF" Then
|
||||
|
@ -875,10 +872,10 @@ Function ConvertRead$ (m As Method, args As String, lineNumber As Integer)
|
|||
vars(vcount) = p
|
||||
Next i
|
||||
vname = GenJSVar
|
||||
js = "var " + vname + " = new Array(" + Str$(UBound(vars)) + ");" + LF
|
||||
js = js + CallMethod(m) + "(" + vname + ");" + LF
|
||||
js = "var " + vname + " = new Array(" + Str$(UBound(vars)) + "); " '+ LF
|
||||
js = js + CallMethod(m) + "(" + vname + "); " '+ LF
|
||||
For i = 1 To UBound(vars)
|
||||
js = js + ConvertExpression(vars(i), lineNumber) + " = " + vname + "[" + Str$(i - 1) + "];" + LF
|
||||
js = js + ConvertExpression(vars(i), lineNumber) + " = " + vname + "[" + Str$(i - 1) + "]; " '+ LF
|
||||
Next i
|
||||
ConvertRead$ = js
|
||||
End Function
|
||||
|
@ -1048,11 +1045,11 @@ Function ConvertInput$ (m As Method, args As String, lineNumber As Integer)
|
|||
Next i
|
||||
|
||||
vname = GenJSVar
|
||||
js = "var " + vname + " = new Array(" + Str$(UBound(vars)) + ");" + LF
|
||||
js = js + CallMethod(m) + "(" + vname + ", " + preventNewline + ", " + addQuestionPrompt + ", " + prompt + ");" + LF
|
||||
js = "var " + vname + " = new Array(" + Str$(UBound(vars)) + "); "
|
||||
js = js + CallMethod(m) + "(" + vname + ", " + preventNewline + ", " + addQuestionPrompt + ", " + prompt + "); "
|
||||
For i = 1 To UBound(vars)
|
||||
If Not StartsWith(_Trim$(vars(i)), "#") Then ' special case to prevent file references from being output during self-compilation
|
||||
js = js + ConvertExpression(vars(i), lineNumber) + " = " + vname + "[" + Str$(i - 1) + "];" + LF
|
||||
js = js + ConvertExpression(vars(i), lineNumber) + " = " + vname + "[" + Str$(i - 1) + "]; "
|
||||
End If
|
||||
Next i
|
||||
ConvertInput = js
|
||||
|
@ -1068,9 +1065,9 @@ Function ConvertSwap$ (m As Method, args As String, lineNumber As Integer)
|
|||
Dim var2 As String
|
||||
var1 = ConvertExpression(swapArgs(1), lineNumber)
|
||||
var2 = ConvertExpression(swapArgs(2), lineNumber)
|
||||
js = "var " + swapArray + " = [" + var1 + "," + var2 + "];" + LF
|
||||
js = js + CallMethod(m) + "(" + swapArray + ");" + LF
|
||||
js = js + var1 + " = " + swapArray + "[0];" + LF
|
||||
js = "var " + swapArray + " = [" + var1 + "," + var2 + "]; "
|
||||
js = js + CallMethod(m) + "(" + swapArray + "); "
|
||||
js = js + var1 + " = " + swapArray + "[0]; "
|
||||
js = js + var2 + " = " + swapArray + "[1];"
|
||||
ConvertSwap = js
|
||||
End Function
|
||||
|
@ -1161,13 +1158,13 @@ Function DeclareVar$ (parts() As String, lineNumber As Integer)
|
|||
|
||||
' TODO: this code is in two places - refactor into a separate function
|
||||
If Not bvar.isArray Then
|
||||
js = js + "var " + bvar.name + " = " + InitTypeValue(bvar.type) + ";"
|
||||
js = js + "var " + bvar.name + " = " + InitTypeValue(bvar.type) + "; "
|
||||
|
||||
Else
|
||||
If FindVariable(bvar.name, findVar, True) Then
|
||||
js = js + "QB.resizeArray(" + bvar.name + ", [" + FormatArraySize(arraySize) + "], " + InitTypeValue(bvar.type) + ", " + preserve + ");"
|
||||
js = js + "QB.resizeArray(" + bvar.name + ", [" + FormatArraySize(arraySize) + "], " + InitTypeValue(bvar.type) + ", " + preserve + "); "
|
||||
Else
|
||||
js = js + "var " + bvar.name + " = QB.initArray([" + FormatArraySize(arraySize) + "], " + InitTypeValue(bvar.type) + ");"
|
||||
js = js + "var " + bvar.name + " = QB.initArray([" + FormatArraySize(arraySize) + "], " + InitTypeValue(bvar.type) + "); "
|
||||
End If
|
||||
End If
|
||||
|
||||
|
@ -1177,9 +1174,7 @@ Function DeclareVar$ (parts() As String, lineNumber As Integer)
|
|||
AddVariable bvar, localVars()
|
||||
End If
|
||||
|
||||
js = js + " // " + bvar.type
|
||||
|
||||
If i < vnamecount Then js = js + LF
|
||||
If PrintDataTypes Then js = js + " /* " + bvar.type + " */ "
|
||||
Next i
|
||||
|
||||
|
||||
|
@ -1221,20 +1216,19 @@ Function DeclareVar$ (parts() As String, lineNumber As Integer)
|
|||
Else
|
||||
bvar.isArray = False
|
||||
arraySize = ""
|
||||
'bvar.name = vname
|
||||
End If
|
||||
bvar.jsname = ""
|
||||
|
||||
|
||||
' TODO: this code is in two places - refactor into a separate function
|
||||
If Not bvar.isArray Then
|
||||
js = js + "var " + bvar.name + " = " + InitTypeValue(bvar.type) + ";"
|
||||
js = js + "var " + bvar.name + " = " + InitTypeValue(bvar.type) + "; "
|
||||
|
||||
Else
|
||||
If FindVariable(bvar.name, findVar, True) Then
|
||||
js = js + "QB.resizeArray(" + bvar.name + ", [" + FormatArraySize(arraySize) + "], " + InitTypeValue(bvar.type) + ", " + preserve + ");"
|
||||
js = js + "QB.resizeArray(" + bvar.name + ", [" + FormatArraySize(arraySize) + "], " + InitTypeValue(bvar.type) + ", " + preserve + "); "
|
||||
Else
|
||||
js = js + "var " + bvar.name + " = QB.initArray([" + FormatArraySize(arraySize) + "], " + InitTypeValue(bvar.type) + ");"
|
||||
js = js + "var " + bvar.name + " = QB.initArray([" + FormatArraySize(arraySize) + "], " + InitTypeValue(bvar.type) + "); "
|
||||
End If
|
||||
End If
|
||||
|
||||
|
@ -1244,9 +1238,7 @@ Function DeclareVar$ (parts() As String, lineNumber As Integer)
|
|||
AddVariable bvar, localVars()
|
||||
End If
|
||||
|
||||
js = js + " // " + bvar.type
|
||||
|
||||
If i < vnamecount Then js = js + LF
|
||||
If PrintDataTypes Then js = js + " /* " + bvar.type + " */ "
|
||||
Next i
|
||||
End If
|
||||
|
||||
|
@ -1356,9 +1348,6 @@ Function ConvertExpression$ (ex As String, lineNumber As Integer)
|
|||
ElseIf uword = "\" Then
|
||||
js = js + " / " ' Not fully compatible but will at least perform a division operation
|
||||
|
||||
'ElseIf uword = ">" Or uword = ">=" Or uword = "<" Or uword = "<=" Then
|
||||
' js = js + " " + word + " "
|
||||
|
||||
ElseIf StartsWith(uword, "&H") Or StartsWith(uword, "&O") Or StartsWith(uword, "&B") Then
|
||||
js = js + " QB.func_Val('" + uword + "') "
|
||||
|
||||
|
@ -1564,16 +1553,10 @@ Sub ConvertMethods ()
|
|||
' clear the local variables
|
||||
ReDim As Variable localVars(0)
|
||||
|
||||
' TODO: figure out how to make needed functions have the async modifier
|
||||
' at the moment just applying it to all subs
|
||||
Dim asyncModifier As String
|
||||
'If methods(i).type = "SUB" Then
|
||||
asyncModifier = "async "
|
||||
'Else
|
||||
'asyncModifier = ""
|
||||
'End If
|
||||
' All program methods are defined as async as we do not know whether
|
||||
' a synchronous wait will occur downstream
|
||||
Dim methodDec As String
|
||||
methodDec = asyncModifier + "function " + methods(i).jsname + "("
|
||||
methodDec = "async function " + methods(i).jsname + "("
|
||||
If methods(i).argc > 0 Then
|
||||
ReDim As String args(0)
|
||||
Dim c As Integer
|
||||
|
@ -1824,30 +1807,6 @@ Sub AddSubLines (lineIndex As Integer, fline As String)
|
|||
AddLine lineIndex, fline
|
||||
End Sub
|
||||
|
||||
'Sub AddSubLinesTop (lineIndex As Integer, fline As String)
|
||||
' Dim quoteDepth As Integer
|
||||
' quoteDepth = 0
|
||||
' Dim i As Integer
|
||||
' For i = 1 To Len(fline)
|
||||
' Dim c As String
|
||||
' c = Mid$(fline, i, 1)
|
||||
' If c = Chr$(34) Then
|
||||
' If quoteDepth = 0 Then
|
||||
' quoteDepth = 1
|
||||
' Else
|
||||
' quoteDepth = 0
|
||||
' End If
|
||||
' End If
|
||||
' If quoteDepth = 0 And c = ":" Then
|
||||
' AddLineTop lineIndex, Left$(fline, i - 1)
|
||||
' fline = Right$(fline, Len(fline) - i)
|
||||
' i = 0
|
||||
' End If
|
||||
' Next i
|
||||
|
||||
' AddLineTop lineIndex, fline
|
||||
'End Sub
|
||||
|
||||
Sub FindMethods
|
||||
Dim i As Integer
|
||||
Dim pcount As Integer
|
||||
|
@ -1873,7 +1832,6 @@ Sub FindMethods
|
|||
Dim pend
|
||||
mstr = Join(parts(), 2, -1, " ")
|
||||
pstart = InStr(mstr, "(")
|
||||
'AddJSLine 0, "//// " + Str$(pstart) + ":: " + mstr
|
||||
If pstart = 0 Then
|
||||
argstr = ""
|
||||
mname = mstr
|
||||
|
@ -1883,31 +1841,20 @@ Sub FindMethods
|
|||
pend = _InStrRev(mstr, ")")
|
||||
argstr = Left$(mstr, pend - 1)
|
||||
End If
|
||||
'AddJSLine 0, "//// pend: " + Str$(pend)
|
||||
'AddJSLine 0, "//// mname: " + mname
|
||||
'AddJSLine 0, "//// argstr: " + argstr
|
||||
|
||||
ReDim As String arga(0)
|
||||
|
||||
Dim m As Method
|
||||
m.line = i
|
||||
m.type = word 'UCase$(parts(1))
|
||||
m.name = mname 'parts(2)
|
||||
m.type = word
|
||||
m.name = mname
|
||||
m.argc = ListSplit(argstr, arga())
|
||||
m.args = ""
|
||||
ReDim As Argument args(0)
|
||||
|
||||
If UBound(arga) > 0 Then
|
||||
'If UBound(parts) > 2 Then
|
||||
Dim a As Integer
|
||||
Dim args As String
|
||||
'args = ""
|
||||
'For a = 3 To UBound(parts)
|
||||
' args = args + parts(a) + " "
|
||||
'Next a
|
||||
'args = Mid$(_Trim$(args), 2, Len(_Trim$(args)) - 2)
|
||||
'ReDim As String arga(0)
|
||||
'm.argc = ListSplit(args, arga())
|
||||
args = ""
|
||||
For a = 1 To m.argc
|
||||
ReDim As String aparts(0)
|
||||
|
@ -2518,7 +2465,7 @@ Function RemoveSuffix$ (vname As String)
|
|||
i = Len(vname)
|
||||
While Not done
|
||||
c = Mid$(vname, i, 1)
|
||||
If c = "`" Or c = "%" Or c = "&" Or c = "$" Or c = "~" Or c = "!" Then
|
||||
If c = "`" Or c = "%" Or c = "&" Or c = "$" Or c = "~" Or c = "!" Or c = "#" Then
|
||||
i = i - 1
|
||||
Else
|
||||
done = True
|
||||
|
|
Loading…
Reference in a new issue