Skip to content

Commit 93f2d2b

Browse files
authored
Add variance results to tracing, capture variance verification on annotated type params (microsoft#49712)
* Add variance results to tracing * Tweak format, prohibit `results` on `E` events
1 parent bd11ce2 commit 93f2d2b

File tree

3 files changed

+25
-5
lines changed

3 files changed

+25
-5
lines changed

src/compiler/checker.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20785,7 +20785,7 @@ namespace ts {
2078520785
variances.push(variance);
2078620786
}
2078720787
links.variances = variances;
20788-
tracing?.pop();
20788+
tracing?.pop({ variances: variances.map(Debug.formatVariance) });
2078920789
}
2079020790
return links.variances;
2079120791
}
@@ -35055,12 +35055,14 @@ namespace ts {
3505535055
error(node, Diagnostics.Variance_annotations_are_only_supported_in_type_aliases_for_object_function_constructor_and_mapped_types);
3505635056
}
3505735057
else if (modifiers === ModifierFlags.In || modifiers === ModifierFlags.Out) {
35058+
tracing?.push(tracing.Phase.CheckTypes, "checkTypeParameterDeferred", { parent: getTypeId(getDeclaredTypeOfSymbol(symbol)), id: getTypeId(typeParameter) });
3505835059
const source = createMarkerType(symbol, typeParameter, modifiers === ModifierFlags.Out ? markerSubTypeForCheck : markerSuperTypeForCheck);
3505935060
const target = createMarkerType(symbol, typeParameter, modifiers === ModifierFlags.Out ? markerSuperTypeForCheck : markerSubTypeForCheck);
3506035061
const saveVarianceTypeParameter = typeParameter;
3506135062
varianceTypeParameter = typeParameter;
3506235063
checkTypeAssignableTo(source, target, node, Diagnostics.Type_0_is_not_assignable_to_type_1_as_implied_by_variance_annotation);
3506335064
varianceTypeParameter = saveVarianceTypeParameter;
35065+
tracing?.pop();
3506435066
}
3506535067
}
3506635068
}

src/compiler/debug.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -748,5 +748,22 @@ namespace ts {
748748
const deprecation = createDeprecation(options?.name ?? getFunctionName(func), options);
749749
return wrapFunction(deprecation, func);
750750
}
751+
752+
export function formatVariance(varianceFlags: VarianceFlags) {
753+
const variance = varianceFlags & VarianceFlags.VarianceMask;
754+
let result =
755+
variance === VarianceFlags.Invariant ? "in out" :
756+
variance === VarianceFlags.Bivariant ? "[bivariant]" :
757+
variance === VarianceFlags.Contravariant ? "in" :
758+
variance === VarianceFlags.Covariant ? "out" :
759+
variance === VarianceFlags.Independent ? "[independent]" : "";
760+
if (varianceFlags & VarianceFlags.Unmeasurable) {
761+
result += " (unmeasurable)";
762+
}
763+
else if (varianceFlags & VarianceFlags.Unreliable) {
764+
result += " (unreliable)";
765+
}
766+
return result;
767+
}
751768
}
752769
}

src/compiler/tracing.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,9 +131,9 @@ namespace ts { // eslint-disable-line one-namespace-per-file
131131
}
132132
eventStack.push({ phase, name, args, time: 1000 * timestamp(), separateBeginAndEnd });
133133
}
134-
export function pop() {
134+
export function pop(results?: Args) {
135135
Debug.assert(eventStack.length > 0);
136-
writeStackEvent(eventStack.length - 1, 1000 * timestamp());
136+
writeStackEvent(eventStack.length - 1, 1000 * timestamp(), results);
137137
eventStack.length--;
138138
}
139139
export function popAll() {
@@ -145,14 +145,15 @@ namespace ts { // eslint-disable-line one-namespace-per-file
145145
}
146146
// sample every 10ms
147147
const sampleInterval = 1000 * 10;
148-
function writeStackEvent(index: number, endTime: number) {
148+
function writeStackEvent(index: number, endTime: number, results?: Args) {
149149
const { phase, name, args, time, separateBeginAndEnd } = eventStack[index];
150150
if (separateBeginAndEnd) {
151+
Debug.assert(!results, "`results` are not supported for events with `separateBeginAndEnd`");
151152
writeEvent("E", phase, name, args, /*extras*/ undefined, endTime);
152153
}
153154
// test if [time,endTime) straddles a sampling point
154155
else if (sampleInterval - (time % sampleInterval) <= endTime - time) {
155-
writeEvent("X", phase, name, args, `"dur":${endTime - time}`, time);
156+
writeEvent("X", phase, name, { ...args, results }, `"dur":${endTime - time}`, time);
156157
}
157158
}
158159

0 commit comments

Comments
 (0)