@@ -15,8 +22,12 @@ ClientMethod toggleCovered(pVisible) [ Language = javascript ]
$("pre.coverage span.covered").toggleClass("hide",!pVisible);
}
-ClientMethod buildCodeHTML(codeLines) [ Language = javascript ]
+ClientMethod buildCodeHTML(targetElement, codeLines) [ Language = javascript ]
{
+ // Remove all children from the target to make the subsequent set of innerHTML faster.
+ while (targetElement.firstChild) {
+ targetElement.removeChild(targetElement.firstChild);
+ }
var html = new Array();
var showCovered = zen('markCovered').getValue()
html.push('\r\n');
@@ -31,7 +42,13 @@ ClientMethod buildCodeHTML(codeLines) [ Language = javascript ]
html.push(line);
}
html.push('
');
- return html.join('');
+ targetElement.innerHTML = html.join('');
+}
+
+ClientMethod renderCodeCoverage(providerID, htmlID) [ Language = javascript ]
+{
+ var code = zen(providerID).getContentObject().children;
+ zenPage.buildCodeHTML(document.getElementById(htmlID),code);
}
}
diff --git a/cls/TestCoverage/UI/Utils.cls b/cls/TestCoverage/UI/Utils.cls
index 9238700..f8af79a 100644
--- a/cls/TestCoverage/UI/Utils.cls
+++ b/cls/TestCoverage/UI/Utils.cls
@@ -1,16 +1,23 @@
Class TestCoverage.UI.Utils
{
-Query ColoredText(pTestIndex As %String, pCodeUnit As %String, pTestPath As %String = "") As %Query(ROWSPEC = "PlainText:%String,ColoredHTML:%String,Covered:%Boolean,Executable:%Boolean,RawLine:%String") [ SqlProc ]
+Query ColoredText(pTestIndex As %String, pCodeUnit As %String, pTestPath As %String = "") As %Query(ROWSPEC = "PlainText:%String,ColoredHTML:%String,Covered:%Boolean,Executable:%Boolean") [ SqlProc ]
{
}
ClassMethod ColoredTextExecute(ByRef qHandle As %Binary, pTestIndex As %String, pCodeUnit As %String, pTestPath As %String = "") As %Status
{
+ // The initial implementation of this class query used a process-private global.
+ // It is faster to use local variables, and memory constraints should always be well out-of-reach for these.
+ // Passing everything in qHandle also has a significant performance hit on method dispatch.
+ #def1arg TempStorage %TempColoredText
+
+ // Clean up TempStorage in case another query in the same process failed to.
+ Kill $$$TempStorage
+ Set qHandle = ""
Set tSC = $$$OK
Try {
If '##class(TestCoverage.Data.CodeUnit).%ExistsId(pCodeUnit) {
- Set qHandle = ""
Quit
}
@@ -46,91 +53,35 @@ ClassMethod ColoredTextExecute(ByRef qHandle As %Binary, pTestIndex As %String,
For tLineNumber=1:1:tCodeUnit.Lines.Count() {
Set tText = tCodeUnit.Lines.GetAt(tLineNumber)
Do tCodeStream.WriteLine(tText)
- Set qHandle($i(qHandle)) = $ListBuild(tText,tText,$Bit(tCoveredLines,tLineNumber),$Bit(tCodeUnit.ExecutableLines,tLineNumber))
+ Set $$$TempStorage($Increment($$$TempStorage)) = $ListBuild(tText,tText,$Bit(tCoveredLines,tLineNumber),$Bit(tCodeUnit.ExecutableLines,tLineNumber))
}
// Color the code stream.
Set tColoredStream = ##class(%GlobalCharacterStream).%New()
Set tColorer = ##class(%Library.SyntaxColor).%New()
Set tLanguage = $Case($ZConvert(tCodeUnit.Type,"L"),"cls":"CLS","int":"MAC","inc":"INC",:"COS")
- Set tFlags = "PFE"_$Case(tLanguage,"CLS":"X",:"")
+ Set tFlags = "PFES"_$Case(tLanguage,"CLS":"X",:"")
Set tGood = tColorer.Color(tCodeStream,tColoredStream,tLanguage,tFlags,,,,.tColoringErrors,.tErrorEnv,.tColoringWarnings)
If tGood {
- // TODO: Something with coloring/environment errors/warnings?
-
- // Extract colored lines (HTML) into qHandle subscripts
-
- // This code ensures that each line contains HTML that is valid in itself; for example, the output may have:
- // foo
bar
baz
-
- // This is normalized to three lines with:
- // foo
- // bar
- // baz
-
- // Care is taken to avoid leaving certain common tags (e.g., to denote errors) unmatched on a given line.
-
- For tColoredLineIndex=1:1 {
+ For tLineNumber=1:1 {
Set tColoredLine = tColoredStream.ReadLine(,.tSC)
- Set tOriginalColoredLine = tColoredLine
$$$ThrowOnError(tSC)
If (tColoredStream.AtEnd) {
Quit
}
- If $Extract(tColoredLine,1,7) = "