[cfe][InternalNodes] Move for-in lowering to inference visitor

This adds internal nodes for the encoding of various versions of for-in loops and moves the lowering to be performed as part of the inference. This avoids the need to create lowered and external AST nodes directly during body building.

Change-Id: If559bc19ff9e6aacb457413c71956c18eae2a4b1
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/499542
Reviewed-by: Paul Berry <paulberry@google.com>
This commit is contained in:
Johnni Winther
2026-05-07 00:15:24 -07:00
committed by dart-scoped@luci-project-accounts.iam.gserviceaccount.com
parent 3ecf2aa096
commit 6a6f59f715
89 changed files with 10696 additions and 2386 deletions
@@ -9924,6 +9924,15 @@ const MessageCode nonExtensionTypeMemberOneOfContext = const MessageCode(
"""This is one of the inherited non-extension type members.""",
);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const MessageCode nonIdentifierForInElement = const MessageCode(
"NonIdentifierForInElement",
problemMessage:
"""The element in a for-in loop must be an identifier or a local variable declaration.""",
correctionMessage:
"""Try using an existing variable or a variable declaration.""",
);
// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
const Template<Message Function({required DartType spreadType})>
nonNullAwareSpreadIsNull = const Template(
@@ -57,7 +57,6 @@ class MixinFragment extends DeclarationFragmentImpl implements Fragment {
modifiers.isAugment;
@override
// Coverage-ignore(suite): Not run.
DeclarationFragmentKind get kind => DeclarationFragmentKind.mixinDeclaration;
@override
+101 -171
View File
@@ -2642,6 +2642,7 @@ class BodyBuilderImpl extends StackListenerImpl
nameToken,
memberName,
thisVariable: thisVariable,
isThisExplicit: false,
);
} else {
// [name] is unresolved.
@@ -2782,6 +2783,7 @@ class BodyBuilderImpl extends StackListenerImpl
nameToken,
memberName,
thisVariable: thisVariable,
isThisExplicit: false,
);
} else {
// [name] is an instance member but this is not an instance context.
@@ -2835,6 +2837,7 @@ class BodyBuilderImpl extends StackListenerImpl
nameToken,
getable,
setable as MemberBuilder?,
isQualifiedAccess: false,
);
} else if (getable is PrefixBuilder) {
// Wildcard import prefixes are non-binding and cannot be used.
@@ -2903,6 +2906,7 @@ class BodyBuilderImpl extends StackListenerImpl
nameToken,
memberName,
thisVariable: thisVariable,
isThisExplicit: false,
);
} else {
// [name] is an instance member but this is not an instance context.
@@ -2926,6 +2930,7 @@ class BodyBuilderImpl extends StackListenerImpl
nameToken,
null,
setable,
isQualifiedAccess: false,
);
}
}
@@ -8269,59 +8274,50 @@ class BodyBuilderImpl extends StackListenerImpl
Object? lvalue = pop(); // lvalue
exitLocalScope();
ForInElements elements = _computeForInElements(
forToken,
inToken,
lvalue,
null,
InternalForInElement element = _computeForInElement(
forToken: forToken,
inToken: inToken,
lvalue: lvalue,
);
assignedVariables.pushNode(assignedVariablesNodeInfo);
VariableDeclaration variable = elements.variable;
Expression? problem = elements.expressionProblem;
if (entry is MapLiteralEntry) {
ForInMapEntry result = intern.createForInMapEntry(
offsetForToken(forToken),
variable,
element,
iterable,
elements.syntheticAssignment,
elements.expressionEffects,
entry,
problem,
isAsync: awaitToken != null,
fileOffset: awaitToken?.charOffset ?? forToken.charOffset,
forOffset: forToken.charOffset,
);
assignedVariables.endNode(result);
push(result);
} else {
ForInElement result = intern.createForInElement(
offsetForToken(forToken),
variable,
element,
iterable,
elements.syntheticAssignment,
elements.expressionEffects,
toValue(entry),
problem,
isAsync: awaitToken != null,
fileOffset: awaitToken?.charOffset ?? forToken.charOffset,
forOffset: forToken.charOffset,
);
assignedVariables.endNode(result);
push(result);
}
}
ForInElements _computeForInElements(
Token forToken,
Token inToken,
Object? lvalue,
Statement? body,
) {
ForInElements elements = new ForInElements();
InternalForInElement _computeForInElement({
required Token forToken,
required Token inToken,
required Object? lvalue,
}) {
if (lvalue is VariableInitialization) {
// Late for-in variables are not supported. An error has already been
// reported by the parser.
lvalue.isLate = false;
elements.explicitVariableDeclaration = lvalue.variable;
InvalidExpression? error;
if (lvalue.isConst) {
// Coverage-ignore-block(suite): Not run.
elements.expressionProblem = buildProblem(
error = buildProblem(
message: diag.forInLoopWithConstVariable,
fileUri: uri,
fileOffset: lvalue.fileOffset,
@@ -8331,13 +8327,17 @@ class BodyBuilderImpl extends StackListenerImpl
// constant evaluator further in the pipeline.
lvalue.isConst = false;
}
return new VariableInitializationForInElement(
variableInitialization: lvalue,
error: error,
);
} else if (lvalue is VariableDeclaration) {
// Late for-in variables are not supported. An error has already been
// reported by the parser.
lvalue.isLate = false;
elements.explicitVariableDeclaration = lvalue;
InvalidExpression? error;
if (lvalue.isConst) {
elements.expressionProblem = buildProblem(
error = buildProblem(
message: diag.forInLoopWithConstVariable,
fileUri: uri,
fileOffset: lvalue.fileOffset,
@@ -8347,117 +8347,73 @@ class BodyBuilderImpl extends StackListenerImpl
// constant evaluator further in the pipeline.
lvalue.isConst = false;
}
} else {
VariableDeclaration astVariable;
VariableDeclaration variable;
if (isClosureContextLoweringEnabled) {
SyntheticVariable syntheticAstVariable = new SyntheticVariable(
type: const DynamicType(),
);
astVariable = syntheticAstVariable;
variable = new InternalSyntheticVariable(
astVariable: syntheticAstVariable,
isImplicitlyTyped: false,
);
} else {
variable = astVariable = intern.createVariableDeclaration(
offsetForToken(forToken),
null,
isFinal: true,
isSynthesized: true,
);
}
elements.syntheticVariableDeclaration = variable;
if (lvalue is Generator) {
/// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
///
/// for (lvalue in expression) body
///
/// This is normalized to:
///
/// for (final #t in expression) {
/// lvalue = #t;
/// body;
/// }
///
/// The value of [forOutput] is `true`, since the synthetic assignment
/// will not be inferred, but will present in the output directly as
/// generated.
elements.syntheticAssignment = lvalue.buildAssignment(
new VariableGet(astVariable)..fileOffset = inToken.offset,
voidContext: true,
forOutput: true,
);
} else if (lvalue is Pattern) {
/// We are in the case where `lvalue` is a pattern:
///
/// for (pattern in expression) body
///
/// This is normalized to:
///
/// for (final #t in expression) {
/// pattern = #t;
/// body;
/// }
elements.syntheticAssignment = null;
elements.expressionEffects = intern.createPatternVariableDeclaration(
inToken.offset,
lvalue,
new VariableGet(variable),
isFinal: false,
);
} else if (lvalue is InvalidExpression) {
// Coverage-ignore-block(suite): Not run.
elements.expressionProblem = lvalue;
} else if (lvalue is ParserRecovery) {
elements.expressionProblem = buildProblem(
return new SingleVariableDeclarationForInElement(
variableDeclaration: lvalue,
error: error,
);
} else if (lvalue is Generator) {
/// We are in this case, where `lvalue` isn't a [VariableDeclaration]:
///
/// for (lvalue in expression) body
///
/// This is normalized to:
///
/// for (final #t in expression) {
/// lvalue = #t;
/// body;
/// }
///
return lvalue.buildForInElement(inOffset: inToken.offset);
} else if (lvalue is Pattern) {
/// We are in the case where `lvalue` is a pattern:
///
/// for (pattern in expression) body
///
/// This is normalized to:
///
/// for (final #t in expression) {
/// pattern = #t;
/// body;
/// }
return new PatternForInElement(pattern: lvalue, inOffset: inToken.offset);
} else if (lvalue is InvalidExpression) {
// Coverage-ignore-block(suite): Not run.
return new InvalidForInElement(error: lvalue, inOffset: inToken.offset);
} else if (lvalue is ParserRecovery) {
return new InvalidForInElement(
error: buildProblem(
message: diag.syntheticToken,
fileUri: uri,
fileOffset: lvalue.charOffset,
length: noLength,
);
} else {
Message message = intern.isVariablesDeclaration(lvalue)
? diag.forInLoopExactlyOneVariable
: diag.forInLoopNotAssignable;
Token token = forToken.next!.next!;
elements.expressionProblem = buildProblem(
message: message,
fileUri: uri,
fileOffset: offsetForToken(token),
length: lengthForToken(token),
);
Statement effects;
if (intern.isVariablesDeclaration(lvalue)) {
effects = intern.createBlock(
noLocation,
noLocation,
// New list because the declarations are not a growable list.
new List<Statement>.of(
intern.variablesDeclarationExtractDeclarations(lvalue),
),
);
} else {
effects = intern.createExpressionStatement(
noLocation,
lvalue as Expression,
);
}
elements.expressionEffects = combineStatements(
intern.createExpressionStatement(
noLocation,
buildProblem(
message: message,
fileUri: uri,
fileOffset: offsetForToken(token),
length: lengthForToken(token),
),
),
effects,
);
}
),
inOffset: inToken.offset,
);
} else if (intern.isVariablesDeclaration(lvalue)) {
Token token = forToken.next!.next!;
InvalidExpression error = buildProblem(
message: diag.forInLoopExactlyOneVariable,
fileUri: uri,
fileOffset: offsetForToken(token),
length: lengthForToken(token),
);
return new MultiVariableDeclarationForInElement(
variableDeclarations: intern.variablesDeclarationExtractDeclarations(
lvalue,
),
error: error,
);
} else {
lvalue as Expression;
Token token = forToken.next!.next!;
InvalidExpression error = buildProblem(
message: diag.forInLoopNotAssignable,
fileUri: uri,
fileOffset: offsetForToken(token),
length: lengthForToken(token),
);
return new UnassignableForInElement(expression: lvalue, error: error);
}
return elements;
}
@override
@@ -8506,39 +8462,19 @@ class BodyBuilderImpl extends StackListenerImpl
continueStatements = continueTarget.resolveContinues(labeledStatement);
body = labeledStatement;
}
ForInElements elements = _computeForInElements(
forToken,
inKeyword,
lvalue,
Statement forInStatement = new InternalForInStatement(
_computeForInElement(
forToken: forToken,
inToken: inKeyword,
lvalue: lvalue,
),
expression,
body,
isAsync: awaitToken != null,
fileOffset: awaitToken?.charOffset ?? forToken.charOffset,
bodyOffset: body.fileOffset,
);
VariableDeclaration variable = elements.variable;
Expression? problem = elements.expressionProblem;
Statement forInStatement;
if (elements.explicitVariableDeclaration != null) {
forInStatement =
new ForInStatement(
variable,
expression,
body,
isAsync: awaitToken != null,
)
..fileOffset = awaitToken?.charOffset ?? forToken.charOffset
..bodyOffset = body.fileOffset; // TODO(ahe): Isn't this redundant?
} else {
forInStatement =
new ForInStatementWithSynthesizedVariable(
variable,
expression,
elements.syntheticAssignment,
elements.expressionEffects,
body,
isAsync: awaitToken != null,
hasProblem: problem != null,
)
..fileOffset = awaitToken?.charOffset ?? forToken.charOffset
..bodyOffset = body.fileOffset; // TODO(ahe): Isn't this redundant?
}
assignedVariables.storeInfo(forInStatement, assignedVariablesNodeInfo);
if (continueStatements != null) {
for (BreakStatementImpl continueStatement in continueStatements) {
@@ -8551,12 +8487,6 @@ class BodyBuilderImpl extends StackListenerImpl
breakTarget.resolveBreaks(labeledStatement, forInStatement);
result = labeledStatement;
}
if (problem != null) {
result = combineStatements(
intern.createExpressionStatement(noLocation, problem),
result,
);
}
exitLoopOrSwitch(result);
}
@@ -362,32 +362,6 @@ class CatchParameters extends Parameters {
}
}
/// Returns a block like this:
///
/// {
/// statement;
/// body;
/// }
///
/// If [body] is a [Block], it's returned with [statement] prepended to it.
Block combineStatements(Statement statement, Statement body) {
if (body is Block) {
if (statement is Block) {
body.statements.insertAll(0, statement.statements);
setParents(statement.statements, body);
} else {
body.statements.insert(0, statement);
statement.parent = body;
}
return body;
} else {
return new Block(<Statement>[
if (statement is Block) ...statement.statements else statement,
body,
])..fileOffset = statement.fileOffset;
}
}
/// DartDocTest(
/// debugName("myClassName", "myName"),
/// "myClassName.myName"
@@ -416,17 +390,6 @@ class Label {
String toString() => "label($name)";
}
class ForInElements {
VariableDeclaration? explicitVariableDeclaration;
VariableDeclaration? syntheticVariableDeclaration;
Expression? syntheticAssignment;
Expression? expressionProblem;
Statement? expressionEffects;
VariableDeclaration get variable =>
(explicitVariableDeclaration ?? syntheticVariableDeclaration)!;
}
class Condition {
final Expression expression;
final PatternGuard? patternGuard;
+81 -406
View File
@@ -70,7 +70,8 @@ mixin ControlFlowElementMixin on AuxiliaryExpression {
}
/// A spread element in a list or set literal.
class SpreadElement extends ControlFlowElement with ControlFlowElementMixin {
class SpreadElement extends ControlFlowElement
with InternalTreeNode, ControlFlowElementMixin {
Expression expression;
bool isNullAware;
@@ -128,7 +129,8 @@ class SpreadElement extends ControlFlowElement with ControlFlowElementMixin {
}
}
class NullAwareElement extends ControlFlowElement with ControlFlowElementMixin {
class NullAwareElement extends ControlFlowElement
with InternalTreeNode, ControlFlowElementMixin {
Expression expression;
NullAwareElement(this.expression);
@@ -148,26 +150,6 @@ class NullAwareElement extends ControlFlowElement with ControlFlowElementMixin {
printer.writeExpression(expression);
}
@override
// Coverage-ignore(suite): Not run.
void transformChildren(Transformer v) {
expression = v.transform(expression);
expression.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void transformOrRemoveChildren(RemovingTransformer v) {
expression = v.transform(expression);
expression.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void visitChildren(Visitor v) {
expression.accept(v);
}
@override
String toString() {
return "NullAwareElement(${toStringInternal()})";
@@ -175,7 +157,8 @@ class NullAwareElement extends ControlFlowElement with ControlFlowElementMixin {
}
/// An 'if' element in a list or set literal.
class IfElement extends ControlFlowElement with ControlFlowElementMixin {
class IfElement extends ControlFlowElement
with InternalTreeNode, ControlFlowElementMixin {
Expression condition;
Expression then;
Expression? otherwise;
@@ -186,40 +169,6 @@ class IfElement extends ControlFlowElement with ControlFlowElementMixin {
otherwise?.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void visitChildren(Visitor v) {
condition.accept(v);
then.accept(v);
otherwise?.accept(v);
}
@override
// Coverage-ignore(suite): Not run.
void transformChildren(Transformer v) {
condition = v.transform(condition);
condition.parent = this;
then = v.transform(then);
then.parent = this;
if (otherwise != null) {
otherwise = v.transform(otherwise!);
otherwise?.parent = this;
}
}
@override
// Coverage-ignore(suite): Not run.
void transformOrRemoveChildren(RemovingTransformer v) {
condition = v.transform(condition);
condition.parent = this;
then = v.transform(then);
then.parent = this;
if (otherwise != null) {
otherwise = v.transformOrRemoveExpression(otherwise!);
otherwise?.parent = this;
}
}
@override
MapLiteralEntry? toMapLiteralEntry(
void onConvertElement(TreeNode from, TreeNode to),
@@ -268,7 +217,7 @@ class IfElement extends ControlFlowElement with ControlFlowElementMixin {
/// A 'for' element in a list or set literal.
class ForElement extends ControlFlowElement
with ControlFlowElementMixin
with InternalTreeNode, ControlFlowElementMixin
implements ForElementBase {
// May be empty, but not null.
@override
@@ -298,41 +247,6 @@ class ForElement extends ControlFlowElement
body.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void visitChildren(Visitor v) {
visitList(variableInitializations, v);
condition?.accept(v);
visitList(updates, v);
body.accept(v);
}
@override
// Coverage-ignore(suite): Not run.
void transformChildren(Transformer v) {
v.transformList(variableInitializations, this);
if (condition != null) {
condition = v.transform(condition!);
condition?.parent = this;
}
v.transformList(updates, this);
body = v.transform(body);
body.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void transformOrRemoveChildren(RemovingTransformer v) {
v.transformVariableInitializationList(variableInitializations, this);
if (condition != null) {
condition = v.transformOrRemoveExpression(condition!);
condition?.parent = this;
}
v.transformExpressionList(updates, this);
body = v.transform(body);
body.parent = this;
}
@override
MapLiteralEntry? toMapLiteralEntry(
void onConvertElement(TreeNode from, TreeNode to),
@@ -384,15 +298,15 @@ class ForElement extends ControlFlowElement
}
/// A 'for-in' element in a list or set literal.
class ForInElement extends ControlFlowElement with ControlFlowElementMixin {
// Has no initializer.
VariableDeclaration variable;
class ForInElement extends ControlFlowElement
with InternalTreeNode, ControlFlowElementMixin {
final InternalForInElement element;
Expression iterable;
Expression? syntheticAssignment; // May be null.
Statement? expressionEffects; // May be null.
Expression body;
Expression? problem; // May be null.
bool isAsync; // True if this is an 'await for' loop.
final bool isAsync; // True if this is an 'await for' loop.
/// File offset for the `for` keyword.
final int forOffset;
/// Variable [Scope] of this [ForInElement].
///
@@ -400,109 +314,29 @@ class ForInElement extends ControlFlowElement with ControlFlowElementMixin {
/// [ScopeProvider] nodes in the output.
Scope? scope;
VariableDeclaration? variable;
ForInEncoding? encoding;
ForInElement(
this.variable,
this.element,
this.iterable,
this.syntheticAssignment,
this.expressionEffects,
this.body,
this.problem, {
this.isAsync = false,
this.body, {
required this.isAsync,
required int fileOffset,
required this.forOffset,
this.variable,
this.encoding,
}) {
variable.parent = this;
this.fileOffset = fileOffset;
iterable.parent = this;
syntheticAssignment?.parent = this;
expressionEffects?.parent = this;
body.parent = this;
problem
// Coverage-ignore(suite): Not run.
?.parent =
this;
}
Statement? get prologue => syntheticAssignment != null
? (new ExpressionStatement(syntheticAssignment!)
..fileOffset = syntheticAssignment!.fileOffset)
: expressionEffects;
@override
// Coverage-ignore(suite): Not run.
void visitChildren(Visitor v) {
variable.accept(v);
iterable.accept(v);
syntheticAssignment?.accept(v);
expressionEffects?.accept(v);
body.accept(v);
problem?.accept(v);
}
@override
// Coverage-ignore(suite): Not run.
void transformChildren(Transformer v) {
variable = v.transform(variable);
variable.parent = this;
iterable = v.transform(iterable);
iterable.parent = this;
if (syntheticAssignment != null) {
syntheticAssignment = v.transform(syntheticAssignment!);
syntheticAssignment?.parent = this;
}
if (expressionEffects != null) {
expressionEffects = v.transform(expressionEffects!);
expressionEffects?.parent = this;
}
body = v.transform(body);
body.parent = this;
if (problem != null) {
problem = v.transform(problem!);
problem?.parent = this;
}
}
@override
// Coverage-ignore(suite): Not run.
void transformOrRemoveChildren(RemovingTransformer v) {
variable = v.transform(variable);
variable.parent = this;
iterable = v.transform(iterable);
iterable.parent = this;
if (syntheticAssignment != null) {
syntheticAssignment = v.transformOrRemoveExpression(syntheticAssignment!);
syntheticAssignment?.parent = this;
}
if (expressionEffects != null) {
expressionEffects = v.transformOrRemoveStatement(expressionEffects!);
expressionEffects?.parent = this;
}
body = v.transform(body);
body.parent = this;
if (problem != null) {
problem = v.transformOrRemoveExpression(problem!);
problem?.parent = this;
}
}
@override
MapLiteralEntry? toMapLiteralEntry(
void onConvertElement(TreeNode from, TreeNode to),
) {
MapLiteralEntry? bodyEntry;
Expression body = this.body;
if (body is ControlFlowElement) {
bodyEntry = body.toMapLiteralEntry(onConvertElement);
}
if (bodyEntry == null) return null;
ForInMapEntry result = new ForInMapEntry(
variable,
iterable,
syntheticAssignment,
expressionEffects,
bodyEntry,
problem,
isAsync: isAsync,
)..fileOffset = fileOffset;
onConvertElement(this, result);
return result;
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
@override
@@ -511,9 +345,27 @@ class ForInElement extends ControlFlowElement with ControlFlowElementMixin {
}
@override
// Coverage-ignore(suite): Not run.
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
MapLiteralEntry? toMapLiteralEntry(
void Function(TreeNode from, TreeNode to) onConvertElement,
) {
MapLiteralEntry? bodyEntry;
Expression body = this.body;
if (body is ControlFlowElement) {
bodyEntry = body.toMapLiteralEntry(onConvertElement);
}
if (bodyEntry == null) return null;
ForInMapEntry result = new ForInMapEntry(
element,
iterable,
bodyEntry,
isAsync: isAsync,
fileOffset: fileOffset,
forOffset: forOffset,
variable: variable,
encoding: encoding,
);
onConvertElement(this, result);
return result;
}
}
@@ -736,7 +588,7 @@ mixin ControlFlowMapEntryMixin implements MapLiteralEntry {
/// A null-aware entry in a map literal.
class NullAwareMapEntry extends TreeNode
with ControlFlowMapEntryMixin
with InternalTreeNode, ControlFlowMapEntryMixin
implements ControlFlowMapEntry {
/// `true` if the key expression is null-aware, that is, marked with `?`.
bool isKeyNullAware;
@@ -770,36 +622,11 @@ class NullAwareMapEntry extends TreeNode
}
value.toTextInternal(printer);
}
@override
// Coverage-ignore(suite): Not run.
void transformChildren(Transformer v) {
key = v.transform(key);
key.parent = this;
value = v.transform(value);
value.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void transformOrRemoveChildren(RemovingTransformer v) {
key = v.transform(key);
key.parent = this;
value = v.transform(value);
value.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void visitChildren(Visitor v) {
key.accept(v);
value.accept(v);
}
}
/// A spread element in a map literal.
class SpreadMapEntry extends TreeNode
with ControlFlowMapEntryMixin
with InternalTreeNode, ControlFlowMapEntryMixin
implements ControlFlowMapEntry {
Expression expression;
bool isNullAware;
@@ -814,26 +641,6 @@ class SpreadMapEntry extends TreeNode
expression.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void visitChildren(Visitor v) {
expression.accept(v);
}
@override
// Coverage-ignore(suite): Not run.
void transformChildren(Transformer v) {
expression = v.transform(expression);
expression.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void transformOrRemoveChildren(RemovingTransformer v) {
expression = v.transform(expression);
expression.parent = this;
}
@override
String toString() {
return "SpreadMapEntry(${toStringInternal()})";
@@ -849,7 +656,7 @@ class SpreadMapEntry extends TreeNode
/// An 'if' element in a map literal.
class IfMapEntry extends TreeNode
with ControlFlowMapEntryMixin
with InternalTreeNode, ControlFlowMapEntryMixin
implements ControlFlowMapEntry {
Expression condition;
MapLiteralEntry then;
@@ -861,40 +668,6 @@ class IfMapEntry extends TreeNode
otherwise?.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void visitChildren(Visitor v) {
condition.accept(v);
then.accept(v);
otherwise?.accept(v);
}
@override
// Coverage-ignore(suite): Not run.
void transformChildren(Transformer v) {
condition = v.transform(condition);
condition.parent = this;
then = v.transform(then);
then.parent = this;
if (otherwise != null) {
otherwise = v.transform(otherwise!);
otherwise?.parent = this;
}
}
@override
// Coverage-ignore(suite): Not run.
void transformOrRemoveChildren(RemovingTransformer v) {
condition = v.transform(condition);
condition.parent = this;
then = v.transform(then);
then.parent = this;
if (otherwise != null) {
otherwise = v.transformOrRemove(otherwise!, dummyMapLiteralEntry);
otherwise?.parent = this;
}
}
@override
String toString() {
return "IfMapEntry(${toStringInternal()})";
@@ -926,7 +699,7 @@ abstract interface class ForMapEntryBase implements TreeNode, MapLiteralEntry {
/// A 'for' element in a map literal.
class ForMapEntry extends TreeNode
with ControlFlowMapEntryMixin
with InternalTreeNode, ControlFlowMapEntryMixin
implements ForMapEntryBase, ControlFlowMapEntry {
// May be empty, but not null.
@override
@@ -948,41 +721,6 @@ class ForMapEntry extends TreeNode
body.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void visitChildren(Visitor v) {
visitList(variables, v);
condition?.accept(v);
visitList(updates, v);
body.accept(v);
}
@override
// Coverage-ignore(suite): Not run.
void transformChildren(Transformer v) {
v.transformList(variables, this);
if (condition != null) {
condition = v.transform(condition!);
condition?.parent = this;
}
v.transformList(updates, this);
body = v.transform(body);
body.parent = this;
}
@override
// Coverage-ignore(suite): Not run.
void transformOrRemoveChildren(RemovingTransformer v) {
v.transformVariableInitializationList(variables, this);
if (condition != null) {
condition = v.transformOrRemoveExpression(condition!);
condition?.parent = this;
}
v.transformExpressionList(updates, this);
body = v.transform(body);
body.parent = this;
}
@override
String toString() {
return "ForMapEntry(${toStringInternal()})";
@@ -1071,16 +809,15 @@ class PatternForMapEntry extends TreeNode
/// A 'for-in' element in a map literal.
class ForInMapEntry extends TreeNode
with ControlFlowMapEntryMixin
with InternalTreeNode, ControlFlowMapEntryMixin
implements ControlFlowMapEntry {
// Has no initializer.
VariableDeclaration variable;
final InternalForInElement element;
Expression iterable;
Expression? syntheticAssignment; // May be null.
Statement? expressionEffects; // May be null.
MapLiteralEntry body;
Expression? problem; // May be null.
bool isAsync; // True if this is an 'await for' loop.
final bool isAsync; // True if this is an 'await for' loop.
/// File offset for the `for` keyword.
final int forOffset;
/// Variable [Scope] of this [ForInMapEntry].
///
@@ -1088,91 +825,23 @@ class ForInMapEntry extends TreeNode
/// [ScopeProvider] nodes in the output.
Scope? scope;
VariableDeclaration? variable;
ForInEncoding? encoding;
ForInMapEntry(
this.variable,
this.element,
this.iterable,
this.syntheticAssignment,
this.expressionEffects,
this.body,
this.problem, {
this.body, {
required this.isAsync,
required int fileOffset,
required this.forOffset,
this.variable,
this.encoding,
}) {
variable.parent = this;
this.fileOffset = fileOffset;
iterable.parent = this;
syntheticAssignment?.parent = this;
expressionEffects?.parent = this;
body.parent = this;
problem
// Coverage-ignore(suite): Not run.
?.parent =
this;
}
Statement? get prologue => syntheticAssignment != null
? (new ExpressionStatement(syntheticAssignment!)
..fileOffset = syntheticAssignment!.fileOffset)
: expressionEffects;
@override
// Coverage-ignore(suite): Not run.
void visitChildren(Visitor v) {
variable.accept(v);
iterable.accept(v);
syntheticAssignment?.accept(v);
expressionEffects?.accept(v);
body.accept(v);
problem?.accept(v);
}
@override
// Coverage-ignore(suite): Not run.
void transformChildren(Transformer v) {
variable = v.transform(variable);
variable.parent = this;
iterable = v.transform(iterable);
iterable.parent = this;
if (syntheticAssignment != null) {
syntheticAssignment = v.transform(syntheticAssignment!);
syntheticAssignment?.parent = this;
}
if (expressionEffects != null) {
expressionEffects = v.transform(expressionEffects!);
expressionEffects?.parent = this;
}
body = v.transform(body);
body.parent = this;
if (problem != null) {
problem = v.transform(problem!);
problem?.parent = this;
}
}
@override
// Coverage-ignore(suite): Not run.
void transformOrRemoveChildren(RemovingTransformer v) {
variable = v.transform(variable);
variable.parent = this;
iterable = v.transform(iterable);
iterable.parent = this;
if (syntheticAssignment != null) {
syntheticAssignment = v.transformOrRemoveExpression(syntheticAssignment!);
syntheticAssignment?.parent = this;
}
if (expressionEffects != null) {
expressionEffects = v.transformOrRemoveStatement(expressionEffects!);
expressionEffects?.parent = this;
}
body = v.transform(body);
body.parent = this;
if (problem != null) {
problem = v.transformOrRemoveExpression(problem!);
problem?.parent = this;
}
}
@override
String toString() {
return "ForInMapEntry(${toStringInternal()})";
}
@override
@@ -1180,6 +849,11 @@ class ForInMapEntry extends TreeNode
void toTextInternal(AstPrinter state) {
// TODO(johnniwinther): Implement this.
}
@override
String toString() {
return "ForInMapEntry(${toStringInternal()})";
}
}
class IfCaseMapEntry extends TreeNode
@@ -1375,10 +1049,8 @@ MapLiteralEntry convertToMapEntry(
case ForInElement():
ForInMapEntry result = new ForInMapEntry(
element.variable,
element.element,
element.iterable,
element.syntheticAssignment,
element.expressionEffects,
convertToMapEntry(
element.body,
problemReporting,
@@ -1386,9 +1058,12 @@ MapLiteralEntry convertToMapEntry(
fileUri,
onConvertElement,
),
element.problem,
fileOffset: element.fileOffset,
forOffset: element.forOffset,
isAsync: element.isAsync,
)..fileOffset = element.fileOffset;
variable: element.variable,
encoding: element.encoding,
);
onConvertElement(element, result);
return result;
}
@@ -107,15 +107,11 @@ abstract class Generator {
///
/// The returned expression evaluates to the assigned value, unless
/// [voidContext] is true, in which case it may evaluate to anything.
///
/// If [forOutput] is true, the assignment is emitted in the form it will be
/// given to the backends, skipping the internal representation stage, which
/// might be required, for example, by type inference.
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
});
Expression buildAssignment(Expression value, {bool voidContext = false});
/// Builds a [InternalForInElement] for the use of this generator as the
/// element in a for-in loop.
InternalForInElement buildForInElement({required int inOffset});
/// Returns an [Expression] representing a null-aware assignment (`??=`) with
/// the generator on the LHS and [value] on the RHS.
@@ -181,7 +177,7 @@ abstract class Generator {
/// Returns an [Expression] representing a compile-time error.
///
/// At runtime, an exception will be thrown.
Expression _makeInvalidRead({
InvalidExpression _makeInvalidRead({
required UnresolvedKind unresolvedKind,
bool errorHasBeenReported = false,
}) {
@@ -197,7 +193,7 @@ abstract class Generator {
/// [value].
///
/// At runtime, [value] will be evaluated before throwing an exception.
Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
return _helper.buildUnresolvedError(
_plainNameForRead,
fileOffset,
@@ -465,12 +461,8 @@ class VariableUseGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
return _createWrite(fileOffset, value, forOutput: forOutput);
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _createWrite(fileOffset, value);
}
void _checkAssignment(int offset) {
@@ -484,18 +476,21 @@ class VariableUseGenerator extends Generator {
}
}
Expression _createWrite(
int offset,
Expression value, {
bool forOutput = false,
}) {
Expression _createWrite(int offset, Expression value) {
_checkAssignment(offset);
_helper.registerVariableAssignment(variable);
if (variable case InternalVariable(:var astVariable) when forOutput) {
return new VariableSet(astVariable, value)..fileOffset = offset;
} else {
return new VariableSet(variable, value)..fileOffset = offset;
}
return new VariableSet(variable, value)..fileOffset = offset;
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
_checkAssignment(fileOffset);
_helper.registerVariableAssignment(variable);
return new ExistingVariableForInElement(
variable: variable,
nameOffset: fileOffset,
inOffset: inOffset,
);
}
@override
@@ -653,19 +648,22 @@ class ForInLateFinalVariableUseGenerator extends VariableUseGenerator {
String get _debugName => "ForInLateFinalVariableUseGenerator";
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
InvalidExpression error = _helper.buildProblem(
InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
return _helper.buildProblem(
message: diag.cannotAssignToFinalVariable.withArguments(
variableName: variable.cosmeticName!,
),
fileUri: _helper.uri,
fileOffset: fileOffset,
length: lengthForToken(token),
)..parent = variable;
errorHasBeenReported: errorHasBeenReported,
);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildAssignment(Expression value, {bool voidContext = false}) {
InvalidExpression error = _makeInvalidWrite()..parent = variable;
Expression assignment = super.buildAssignment(
value,
voidContext: voidContext,
@@ -675,6 +673,16 @@ class ForInLateFinalVariableUseGenerator extends VariableUseGenerator {
}
return assignment;
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new ExistingVariableForInElement(
variable: variable,
nameOffset: fileOffset,
error: _makeInvalidWrite(),
inOffset: inOffset,
);
}
}
/// A [PropertyAccessGenerator] represents a subexpression whose prefix is
@@ -755,11 +763,7 @@ class PropertyAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return intern.createPropertySet(
fileOffset,
receiver,
@@ -770,6 +774,20 @@ class PropertyAccessGenerator extends Generator {
);
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -888,6 +906,7 @@ class PropertyAccessGenerator extends Generator {
thisVariable: helper.thisVariable,
thisOffset: receiver.fileOffset,
isNullAware: isNullAware,
isThisExplicit: true,
);
} else {
return isNullAware
@@ -935,6 +954,8 @@ class ThisPropertyAccessGenerator extends Generator {
final int? thisOffset;
final bool isNullAware;
final bool isThisExplicit;
/// The synthetic variable used for 'this' in instance extension members
/// and instance extension type members/constructor bodies.
VariableDeclaration? thisVariable;
@@ -946,6 +967,7 @@ class ThisPropertyAccessGenerator extends Generator {
this.thisVariable,
this.thisOffset,
this.isNullAware = false,
required this.isThisExplicit,
}) : super(helper, nameToken);
@override
@@ -978,11 +1000,7 @@ class ThisPropertyAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _createWrite(fileOffset, value, forEffect: voidContext);
}
@@ -1002,6 +1020,28 @@ class ThisPropertyAccessGenerator extends Generator {
);
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
if (isThisExplicit) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
return new PropertyForInElement(
receiver: _thisExpression,
name: name,
nameOffset: _nameOffset,
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -1156,11 +1196,7 @@ class NullAwarePropertyAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return intern.createPropertySet(
fileOffset,
receiver,
@@ -1171,6 +1207,20 @@ class NullAwarePropertyAccessGenerator extends Generator {
);
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -1341,11 +1391,7 @@ class SuperPropertyAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _createWrite(fileOffset, value);
}
@@ -1365,6 +1411,20 @@ class SuperPropertyAccessGenerator extends Generator {
}
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
@override
Expression buildCompoundAssignment(
Name binaryOperator,
@@ -1567,11 +1627,7 @@ class IndexedAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return intern.createIndexSet(
fileOffset,
receiver,
@@ -1582,6 +1638,20 @@ class IndexedAccessGenerator extends Generator {
);
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -1748,11 +1818,7 @@ class ThisIndexedAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
_helper.readInternalThisVariable();
Expression receiver = intern.createThisExpression(fileOffset);
return intern.createIndexSet(
@@ -1765,6 +1831,20 @@ class ThisIndexedAccessGenerator extends Generator {
);
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -1920,11 +2000,7 @@ class SuperIndexedAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
Procedure? setter = this.setter;
if (setter == null) {
return _helper.buildUnresolvedError(
@@ -1959,6 +2035,20 @@ class SuperIndexedAccessGenerator extends Generator {
}
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -2134,6 +2224,8 @@ class StaticAccessGenerator extends Generator {
final int? typeOffset;
final bool isNullAware;
final bool isQualifiedAccess;
StaticAccessGenerator(
ExpressionGeneratorHelper helper,
Token nameToken,
@@ -2143,6 +2235,7 @@ class StaticAccessGenerator extends Generator {
this.writeTarget, {
this.typeOffset,
this.isNullAware = false,
required this.isQualifiedAccess,
}) : assert(
readTarget != null || invokeTarget != null || writeTarget != null,
"No targets for $targetName.",
@@ -2157,6 +2250,7 @@ class StaticAccessGenerator extends Generator {
MemberBuilder? setterBuilder, {
int? typeOffset,
bool isNullAware = false,
required bool isQualifiedAccess,
}) {
// If both [getterBuilder] and [setterBuilder] exist, they must both be
// either top level (potentially from different libraries) or from the same
@@ -2176,6 +2270,7 @@ class StaticAccessGenerator extends Generator {
setterBuilder?.writeTarget,
typeOffset: typeOffset,
isNullAware: isNullAware,
isQualifiedAccess: isQualifiedAccess,
);
}
@@ -2209,22 +2304,45 @@ class StaticAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _createWrite(fileOffset, value);
}
Expression _createWrite(int offset, Expression value) {
Expression write;
if (writeTarget == null) {
write = _makeInvalidWrite();
Member? target = writeTarget;
if (target == null) {
return _makeInvalidWrite();
} else {
write = new StaticSet(writeTarget!, value)..fileOffset = offset;
return new StaticSet(target, value)..fileOffset = offset;
}
return write;
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
if (isQualifiedAccess) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
Member? target = writeTarget;
if (target == null) {
return new InvalidForInElement(
error: _makeInvalidWrite(),
inOffset: inOffset,
);
}
return new StaticForInElement(
target: target,
nameOffset: _nameOffset,
inOffset: inOffset,
);
}
@override
@@ -2576,11 +2694,7 @@ class ExtensionInstanceAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _createWrite(fileOffset, value, forEffect: voidContext);
}
@@ -2605,6 +2719,26 @@ class ExtensionInstanceAccessGenerator extends Generator {
}
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
Procedure? setter = writeTarget;
if (setter == null) {
return new InvalidForInElement(
error: _makeInvalidWrite(),
inOffset: inOffset,
);
}
return new ExtensionForInElement(
extension: extension,
thisTypeArguments: _createThisTypeArguments(),
thisAccess: _createThisAccess(),
name: targetName,
setter: setter,
nameOffset: fileOffset,
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -3010,11 +3144,7 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _createWrite(
fileOffset,
receiver,
@@ -3050,6 +3180,20 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
}
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -3364,11 +3508,7 @@ class ExplicitExtensionIndexedAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
Procedure? setter = writeTarget;
if (setter == null) {
// Coverage-ignore-block(suite): Not run.
@@ -3387,6 +3527,20 @@ class ExplicitExtensionIndexedAccessGenerator extends Generator {
)..fileOffset = fileOffset;
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -3576,14 +3730,19 @@ class ExplicitExtensionAccessGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _makeInvalidWrite();
}
@override
// Coverage-ignore(suite): Not run.
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _makeInvalidWrite(),
inOffset: inOffset,
);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildIfNullAssignment(
@@ -3750,7 +3909,7 @@ class ExplicitExtensionAccessGenerator extends Generator {
}
@override
Expression _makeInvalidRead({
InvalidExpression _makeInvalidRead({
UnresolvedKind? unresolvedKind,
bool errorHasBeenReported = false,
}) {
@@ -3765,7 +3924,7 @@ class ExplicitExtensionAccessGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
return _helper.buildProblem(
message: diag.explicitExtensionAsLvalue,
fileUri: _helper.uri,
@@ -3856,14 +4015,19 @@ class LoadLibraryGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _makeInvalidWrite();
}
@override
// Coverage-ignore(suite): Not run.
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _makeInvalidWrite(),
inOffset: inOffset,
);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildIfNullAssignment(
@@ -3972,11 +4136,7 @@ class DeferredAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _helper.wrapInDeferredCheck(
suffixGenerator.buildAssignment(value, voidContext: voidContext),
prefixGenerator.prefix,
@@ -3984,6 +4144,20 @@ class DeferredAccessGenerator extends Generator {
);
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _helper.buildProblem(
message: diag.nonIdentifierForInElement,
fileUri: _helper.uri,
fileOffset: fileOffset,
length: noLength,
errorHasBeenReported: true,
),
inOffset: inOffset,
);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildIfNullAssignment(
@@ -4717,6 +4891,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
memberLookupResult.setable,
typeOffset: fileOffset,
isNullAware: isNullAware,
isQualifiedAccess: true,
);
}
} else {
@@ -4777,6 +4952,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
memberLookupResult.setable,
typeOffset: fileOffset,
isNullAware: isNullAware,
isQualifiedAccess: true,
);
}
} else {
@@ -4806,6 +4982,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
setable is MemberBuilder ? setable : null,
typeOffset: fileOffset,
isNullAware: isNullAware,
isQualifiedAccess: true,
);
}
} else {
@@ -4817,6 +4994,7 @@ class TypeUseGenerator extends AbstractReadOnlyAccessGenerator {
setable is MemberBuilder ? setable : null,
typeOffset: fileOffset,
isNullAware: isNullAware,
isQualifiedAccess: true,
);
}
}
@@ -4995,7 +5173,7 @@ abstract class AbstractReadOnlyAccessGenerator extends Generator {
Expression _createRead() => expression;
@override
Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
switch (kind) {
case ReadOnlyAccessKind.ConstVariable:
return _helper.buildProblem(
@@ -5057,14 +5235,18 @@ abstract class AbstractReadOnlyAccessGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _makeInvalidWrite();
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _makeInvalidWrite(),
inOffset: inOffset,
);
}
@override
Expression buildIfNullAssignment(
Expression value,
@@ -5207,14 +5389,18 @@ abstract class ErroneousExpressionGenerator extends Generator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return buildError(kind: UnresolvedKind.Setter);
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: buildError(kind: UnresolvedKind.Setter),
inOffset: inOffset,
);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildCompoundAssignment(
@@ -5264,7 +5450,7 @@ abstract class ErroneousExpressionGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression _makeInvalidRead({
InvalidExpression _makeInvalidRead({
required UnresolvedKind unresolvedKind,
bool errorHasBeenReported = false,
}) {
@@ -5276,7 +5462,7 @@ abstract class ErroneousExpressionGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
return buildError(
kind: UnresolvedKind.Setter,
errorHasBeenReported: errorHasBeenReported,
@@ -5364,7 +5550,7 @@ class DuplicateDeclarationGenerator extends ErroneousExpressionGenerator {
@override
// Coverage-ignore(suite): Not run.
Expression _makeInvalidRead({
InvalidExpression _makeInvalidRead({
UnresolvedKind? unresolvedKind,
bool errorHasBeenReported = false,
}) {
@@ -5373,7 +5559,7 @@ class DuplicateDeclarationGenerator extends ErroneousExpressionGenerator {
@override
// Coverage-ignore(suite): Not run.
Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
return _createInvalidExpression();
}
@@ -5511,12 +5697,16 @@ class UnresolvedNameGenerator extends ErroneousExpressionGenerator {
}
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
return _buildUnresolvedVariableAssignment(false, value);
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _buildUnresolvedVariableAssignment(isCompound: false);
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _buildUnresolvedVariableAssignment(isCompound: false),
inOffset: inOffset,
);
}
@override
@@ -5528,7 +5718,7 @@ class UnresolvedNameGenerator extends ErroneousExpressionGenerator {
bool isPreIncDec = false,
bool isPostIncDec = false,
}) {
return _buildUnresolvedVariableAssignment(true, value);
return _buildUnresolvedVariableAssignment(isCompound: true);
}
@override
@@ -5546,10 +5736,9 @@ class UnresolvedNameGenerator extends ErroneousExpressionGenerator {
sink.write(name.text);
}
Expression _buildUnresolvedVariableAssignment(
bool isCompound,
Expression value,
) {
InvalidExpression _buildUnresolvedVariableAssignment({
required bool isCompound,
}) {
return buildError(
kind: UnresolvedKind.Setter,
errorHasBeenReported: errorHasBeenReported,
@@ -5601,14 +5790,19 @@ abstract class ContextAwareGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _makeInvalidWrite();
}
@override
// Coverage-ignore(suite): Not run.
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _makeInvalidWrite(),
inOffset: inOffset,
);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildIfNullAssignment(
@@ -5664,7 +5858,7 @@ abstract class ContextAwareGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression _makeInvalidWrite({bool errorHasBeenReported = false}) {
InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) {
return _helper.buildProblem(
message: diag.illegalAssignmentToNonAssignable,
fileUri: _helper.uri,
@@ -5916,14 +6110,19 @@ class PrefixUseGenerator extends Generator {
Expression buildSimpleRead() => _makeInvalidRead();
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
// Coverage-ignore(suite): Not run.
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _makeInvalidWrite();
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _makeInvalidWrite(),
inOffset: inOffset,
);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildIfNullAssignment(
@@ -6046,7 +6245,7 @@ class PrefixUseGenerator extends Generator {
}
@override
Expression _makeInvalidRead({
InvalidExpression _makeInvalidRead({
UnresolvedKind? unresolvedKind,
bool errorHasBeenReported = false,
}) {
@@ -6060,7 +6259,7 @@ class PrefixUseGenerator extends Generator {
}
@override
Expression _makeInvalidWrite({bool errorHasBeenReported = false}) =>
InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) =>
_makeInvalidRead(errorHasBeenReported: errorHasBeenReported);
@override
@@ -6118,14 +6317,19 @@ class UnexpectedQualifiedUseGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return _makeInvalidWrite(errorHasBeenReported: errorHasBeenReported);
}
@override
// Coverage-ignore(suite): Not run.
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: _makeInvalidWrite(errorHasBeenReported: errorHasBeenReported),
inOffset: inOffset,
);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildIfNullAssignment(
@@ -6309,14 +6513,15 @@ class ParserErrorGenerator extends Generator {
Expression buildSimpleRead() => buildProblem();
@override
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return buildProblem();
}
@override
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(error: buildProblem(), inOffset: inOffset);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildIfNullAssignment(
@@ -6363,14 +6568,14 @@ class ParserErrorGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression _makeInvalidRead({
InvalidExpression _makeInvalidRead({
UnresolvedKind? unresolvedKind,
bool errorHasBeenReported = false,
}) => buildProblem();
@override
// Coverage-ignore(suite): Not run.
Expression _makeInvalidWrite({bool errorHasBeenReported = false}) =>
InvalidExpression _makeInvalidWrite({bool errorHasBeenReported = false}) =>
buildProblem();
@override
@@ -6652,6 +6857,7 @@ class ThisAccessGenerator extends Generator {
thisVariable: _helper.thisVariable,
thisOffset: fileOffset,
isNullAware: isNullAware,
isThisExplicit: true,
);
}
}
@@ -6829,14 +7035,19 @@ class ThisAccessGenerator extends Generator {
@override
// Coverage-ignore(suite): Not run.
Expression buildAssignment(
Expression value, {
bool voidContext = false,
bool forOutput = false,
}) {
Expression buildAssignment(Expression value, {bool voidContext = false}) {
return buildAssignmentError();
}
@override
// Coverage-ignore(suite): Not run.
InternalForInElement buildForInElement({required int inOffset}) {
return new InvalidForInElement(
error: buildAssignmentError(),
inOffset: inOffset,
);
}
@override
// Coverage-ignore(suite): Not run.
Expression buildIfNullAssignment(
@@ -6907,7 +7118,7 @@ class ThisAccessGenerator extends Generator {
}
// Coverage-ignore(suite): Not run.
Expression buildAssignmentError() {
InvalidExpression buildAssignmentError() {
return _helper.buildProblem(
message: isSuper ? diag.cannotAssignToSuper : diag.notAnLvalue,
fileUri: _helper.uri,
@@ -126,9 +126,14 @@ VariableDeclaration createVariableCache(Expression expression, DartType type) {
VariableDeclaration createUninitializedVariable(
DartType type, {
required int fileOffset,
bool isFinal = false,
}) {
return new VariableDeclaration(null, type: type, isSynthesized: true)
..fileOffset = fileOffset;
return new VariableDeclaration(
null,
type: type,
isSynthesized: true,
isFinal: isFinal,
)..fileOffset = fileOffset;
}
/// Creates an initialized (but mutable) [VariableDeclaration] of the static
@@ -161,9 +166,10 @@ VariableDeclaration createVariable(Expression expression, DartType type) {
VariableGet createVariableGet(
VariableDeclaration variable, {
DartType? promotedType,
int? fileOffset,
}) {
return new VariableGet(variable)
..fileOffset = variable.fileOffset
..fileOffset = fileOffset ?? variable.fileOffset
..promotedType = promotedType != variable.type ? promotedType : null;
}
@@ -378,3 +384,29 @@ InvalidInitializer createInvalidInitializer(
..isSuperInitializer = isSuperInitializer
..isRedirectingInitializer = isRedirectingInitializer;
}
/// Returns a block like this:
///
/// {
/// statement;
/// body;
/// }
///
/// If [body] is a [Block], it's returned with [statement] prepended to it.
Block combineStatements(Statement statement, Statement body) {
if (body is Block) {
if (statement is Block) {
body.statements.insertAll(0, statement.statements);
setParents(statement.statements, body);
} else {
body.statements.insert(0, statement);
statement.parent = body;
}
return body;
} else {
return new Block(<Statement>[
if (statement is Block) ...statement.statements else statement,
body,
])..fileOffset = statement.fileOffset;
}
}
File diff suppressed because it is too large Load Diff
@@ -2,8 +2,8 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:kernel/ast.dart';
import 'package:kernel/ast.dart' as ast_helper show isThisExpression;
import 'package:kernel/ast.dart';
import 'package:kernel/src/printer.dart';
import '../base/problems.dart' show unsupported;
@@ -340,45 +340,39 @@ PatternForMapEntry createPatternForMapEntry(
}
ForInElement createForInElement(
int fileOffset,
VariableDeclaration variable,
InternalForInElement element,
Expression iterable,
Expression? synthesizedAssignment,
Statement? expressionEffects,
Expression body,
Expression? problem, {
bool isAsync = false,
Expression body, {
required bool isAsync,
required int forOffset,
required int fileOffset,
}) {
return new ForInElement(
variable,
element,
iterable,
synthesizedAssignment,
expressionEffects,
body,
problem,
isAsync: isAsync,
)..fileOffset = fileOffset;
forOffset: forOffset,
fileOffset: fileOffset,
);
}
ForInMapEntry createForInMapEntry(
int fileOffset,
VariableDeclaration variable,
InternalForInElement element,
Expression iterable,
Expression? synthesizedAssignment,
Statement? expressionEffects,
MapLiteralEntry body,
Expression? problem, {
bool isAsync = false,
MapLiteralEntry body, {
required bool isAsync,
required int forOffset,
required int fileOffset,
}) {
return new ForInMapEntry(
variable,
element,
iterable,
synthesizedAssignment,
expressionEffects,
body,
problem,
isAsync: isAsync,
)..fileOffset = fileOffset;
forOffset: forOffset,
fileOffset: fileOffset,
);
}
/// Return a representation of an assert that appears in a constructor's
@@ -1,360 +0,0 @@
// Copyright (c) 2022, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'package:_fe_analyzer_shared/src/types/shared_type.dart';
import 'package:front_end/src/codes/diagnostic.dart' as diag;
import 'package:kernel/ast.dart';
import '../kernel/hierarchy/class_member.dart';
import '../kernel/internal_ast.dart';
import 'inference_results.dart';
import 'inference_visitor.dart';
import 'inference_visitor_base.dart';
import 'object_access_target.dart';
import 'type_schema.dart' show UnknownType;
class ForInResult {
final VariableDeclaration variable;
final Expression iterable;
final Expression? syntheticAssignment;
final Statement? expressionSideEffects;
ForInResult(
this.variable,
this.iterable,
this.syntheticAssignment,
this.expressionSideEffects,
);
@override
String toString() =>
'ForInResult($variable,$iterable,'
'$syntheticAssignment,$expressionSideEffects)';
}
abstract class ForInVariable {
/// Computes the type of the elements expected for this for-in variable.
DartType computeElementType(InferenceVisitorBase visitor);
/// Infers the assignment to this for-in variable with a value of type
/// [rhsType]. The resulting expression is returned.
Expression? inferAssignment(InferenceVisitorBase visitor, DartType rhsType);
}
class LocalForInVariable implements ForInVariable {
VariableSet variableSet;
LocalForInVariable(this.variableSet);
@override
DartType computeElementType(InferenceVisitorBase visitor) {
VariableDeclaration variable = variableSet.variable;
DartType? promotedType = visitor.flowAnalysis
.promotedType(variable)
// Coverage-ignore(suite): Not run.
?.unwrapTypeView();
return promotedType ?? variable.type;
}
@override
Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
DartType variableType = visitor.computeGreatestClosure(
variableSet.variable.type,
);
Expression rhs = visitor.ensureAssignable(
variableType,
rhsType,
variableSet.value,
errorTemplate: diag.forInLoopElementTypeNotAssignable,
isVoidAllowed: true,
);
variableSet.value = rhs..parent = variableSet;
visitor.flowAnalysis.storeExpressionInfo(
variableSet,
visitor.flowAnalysis.write(
variableSet,
variableSet.variable,
new SharedTypeView(rhsType),
null,
),
);
return variableSet;
}
}
class PatternVariableDeclarationForInVariable implements ForInVariable {
PatternVariableDeclaration patternVariableDeclaration;
PatternVariableDeclarationForInVariable(this.patternVariableDeclaration);
@override
// Coverage-ignore(suite): Not run.
DartType computeElementType(InferenceVisitorBase visitor) {
return (patternVariableDeclaration.initializer as VariableGet)
.variable
.type;
}
@override
Expression? inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
return null;
}
}
class PropertyForInVariable implements ForInVariable {
final PropertySet propertySet;
DartType? _writeType;
Expression? _rhs;
PropertyForInVariable(this.propertySet);
@override
DartType computeElementType(InferenceVisitorBase visitor) {
ExpressionInferenceResult receiverResult = visitor.inferExpression(
propertySet.receiver,
const UnknownType(),
);
propertySet.receiver = receiverResult.expression..parent = propertySet;
DartType receiverType = receiverResult.inferredType;
ObjectAccessTarget writeTarget = visitor.findInterfaceMember(
receiverType,
propertySet.name,
propertySet.fileOffset,
isSetter: true,
instrumented: true,
includeExtensionMethods: true,
);
DartType elementType = _writeType = writeTarget.getSetterType(visitor);
Expression? error = visitor.reportMissingInterfaceMember(
writeTarget,
receiverType,
propertySet.name,
propertySet.fileOffset,
);
if (error != null) {
_rhs = error;
} else {
_rhs = propertySet.value;
}
return elementType;
}
@override
Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
Expression rhs = visitor.ensureAssignable(
visitor.computeGreatestClosure(_writeType!),
rhsType,
_rhs!,
errorTemplate: diag.forInLoopElementTypeNotAssignable,
isVoidAllowed: true,
);
propertySet.value = rhs..parent = propertySet;
ExpressionInferenceResult result = visitor.inferExpression(
propertySet,
const UnknownType(),
isVoidAllowed: true,
);
return result.expression;
}
}
// Coverage-ignore(suite): Not run.
class AbstractSuperPropertyForInVariable implements ForInVariable {
final AbstractSuperPropertySet superPropertySet;
DartType? _writeType;
AbstractSuperPropertyForInVariable(this.superPropertySet);
@override
DartType computeElementType(InferenceVisitorBase visitor) {
DartType receiverType = visitor.thisType!;
ObjectAccessTarget writeTarget = visitor.findInterfaceMember(
receiverType,
superPropertySet.name,
superPropertySet.fileOffset,
isSetter: true,
instrumented: true,
);
assert(writeTarget.isInstanceMember || writeTarget.isObjectMember);
return _writeType = writeTarget.getSetterType(visitor);
}
@override
Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
Expression rhs = visitor.ensureAssignable(
visitor.computeGreatestClosure(_writeType!),
rhsType,
superPropertySet.value,
errorTemplate: diag.forInLoopElementTypeNotAssignable,
isVoidAllowed: true,
);
superPropertySet.value = rhs..parent = superPropertySet;
ExpressionInferenceResult result = visitor.inferExpression(
superPropertySet,
const UnknownType(),
isVoidAllowed: true,
);
return result.expression;
}
}
class SuperPropertyForInVariable implements ForInVariable {
final SuperPropertySet superPropertySet;
DartType? _writeType;
SuperPropertyForInVariable(this.superPropertySet);
@override
DartType computeElementType(InferenceVisitorBase visitor) {
DartType receiverType = visitor.thisType!;
ObjectAccessTarget writeTarget = visitor.findInterfaceMember(
receiverType,
superPropertySet.name,
superPropertySet.fileOffset,
isSetter: true,
instrumented: true,
);
assert(
writeTarget.isInstanceMember ||
// Coverage-ignore(suite): Not run.
writeTarget.isObjectMember,
);
return _writeType = writeTarget.getSetterType(visitor);
}
@override
Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
Expression rhs = visitor.ensureAssignable(
visitor.computeGreatestClosure(_writeType!),
rhsType,
superPropertySet.value,
errorTemplate: diag.forInLoopElementTypeNotAssignable,
isVoidAllowed: true,
);
superPropertySet.value = rhs..parent = superPropertySet;
ExpressionInferenceResult result = visitor.inferExpression(
superPropertySet,
const UnknownType(),
isVoidAllowed: true,
);
return result.expression;
}
}
class StaticForInVariable implements ForInVariable {
final StaticSet staticSet;
StaticForInVariable(this.staticSet);
@override
DartType computeElementType(InferenceVisitorBase visitor) =>
staticSet.target.setterType;
@override
Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
DartType setterType = visitor.computeGreatestClosure(
staticSet.target.setterType,
);
Expression rhs = visitor.ensureAssignable(
setterType,
rhsType,
staticSet.value,
errorTemplate: diag.forInLoopElementTypeNotAssignable,
isVoidAllowed: true,
);
staticSet.value = rhs..parent = staticSet;
ExpressionInferenceResult result = visitor.inferExpression(
staticSet,
const UnknownType(),
isVoidAllowed: true,
);
return result.expression;
}
}
class ExtensionSetForInVariable implements ForInVariable {
final ExtensionSet extensionSet;
DartType? setterType;
ExtensionSetForInVariable(this.extensionSet);
@override
DartType computeElementType(InferenceVisitorBase visitor) {
DartType receiverContextType = visitor
.computeExplicitExtensionReceiverContextType(
extensionSet.extension,
extensionSet.knownTypeArguments,
);
ExpressionInferenceResult receiverResult = visitor.inferExpression(
extensionSet.receiver,
receiverContextType,
isVoidAllowed: false,
);
List<DartType> extensionTypeArguments = visitor
.computeExtensionTypeArgument(
extensionSet.extension,
extensionSet.knownTypeArguments,
receiverResult.inferredType,
treeNodeForTesting: extensionSet,
);
DartType receiverType = visitor.getExtensionReceiverType(
extensionSet.extension,
extensionTypeArguments,
);
ObjectAccessTarget target = new ExtensionAccessTarget(
receiverType,
extensionSet.setter,
null,
ClassMemberKind.Setter,
extensionTypeArguments,
);
setterType = target.getSetterType(visitor);
return setterType!;
}
@override
Expression inferAssignment(InferenceVisitorBase visitor, DartType rhsType) {
assert(setterType != null);
Expression rhs = visitor.ensureAssignable(
setterType!,
rhsType,
extensionSet.value,
errorTemplate: diag.forInLoopElementTypeNotAssignable,
isVoidAllowed: true,
);
extensionSet.value = rhs..parent = extensionSet;
ExpressionInferenceResult result = visitor.inferExpression(
extensionSet,
const UnknownType(),
isVoidAllowed: true,
);
return result.expression;
}
}
class InvalidForInVariable implements ForInVariable {
final Expression? expression;
InvalidForInVariable(this.expression);
@override
DartType computeElementType(InferenceVisitor visitor) => const UnknownType();
@override
Expression? inferAssignment(InferenceVisitor visitor, DartType rhsType) =>
expression;
}
File diff suppressed because it is too large Load Diff
@@ -1016,6 +1016,28 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
);
}
/// Computes [ExtensionSetData] used for explicit writes to extension setter
/// as an expression or as a for-in element.
ExtensionSetData computeExtensionSetData({
required Extension extension,
required List<DartType>? knownTypeArguments,
required Expression receiver,
required int? extensionTypeArgumentOffset,
required Procedure setter,
required bool isNullAware,
required int fileOffset,
TreeNode? nodeForTesting,
});
/// Infers a write to an extension setter using the [ExtensionSetData]
/// computed in [computeExtensionSetData] with the inferred [valueResult].
ExpressionInferenceResult inferExtensionSet({
required ExtensionSetData data,
required ExpressionInferenceResult valueResult,
required bool forEffect,
required int fileOffset,
});
/// Computes the type arguments for an access to an extension instance member
/// on [extension] with the static [receiverType]. If [explicitTypeArguments]
/// are provided, these are returned, otherwise type arguments are inferred
@@ -1053,7 +1075,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
Extension extension,
List<DartType>? explicitTypeArguments,
DartType receiverType, {
required TreeNode treeNodeForTesting,
required TreeNode? treeNodeForTesting,
}) {
if (explicitTypeArguments != null) {
assert(explicitTypeArguments.length == extension.typeParameters.length);
@@ -1526,35 +1548,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
}
}
/// If target is missing on a non-dynamic receiver, an error is reported
/// using [diag.undefinedSetter] and an invalid expression is returned.
Expression? reportMissingInterfaceMember(
ObjectAccessTarget target,
DartType receiverType,
Name name,
int fileOffset,
) {
assert(isKnown(receiverType));
if (target.isMissing) {
int length = name.text.length;
if (identical(name.text, callName.text) ||
identical(name.text, unaryMinusName.text)) {
length = 1;
}
return problemReporting.buildProblem(
compilerContext: compilerContext,
message: diag.undefinedSetter.withArguments(
name: name.text,
type: receiverType.nonTypeParameterBound,
),
fileUri: fileUri,
fileOffset: fileOffset,
length: length,
);
}
return null;
}
/// Returns the getter type of [interfaceMember] on a receiver of type
/// [receiverType].
///
@@ -4456,6 +4449,198 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
return new ExpressionInferenceResult(resultType, resultExpression);
}
/// Computes [PropertySetData] used for writes to an instance setter as an
/// expression or as a for-in element.
PropertySetData computePropertySetData({
required Expression receiver,
required Name name,
required bool isNullAware,
required int fileOffset,
});
/// Creates a property set operation of [writeTarget] on [receiver] using
/// [valueResult] as the right-hand side. [valueResult] is created for
/// assignability to [writeContext].
///
/// [fileOffset] is used as the file offset for created nodes. [propertyName]
/// is used for error reporting. [receiverType] is the already inferred type
/// of the [receiver] expression. The inferred type of [value] must already
/// have been computed.
///
/// If [forEffect] the resulting expression is ensured to return the assigned
/// value. This is needed for extension setters which are encoded as static
/// method calls that do not implicitly return the value.
///
/// The returned [ExpressionInferenceResult] holds the generated expression
/// and the type of this expression.
ExpressionInferenceResult inferPropertySet({
required int fileOffset,
required Expression receiver,
required DartType receiverType,
required Name propertyName,
required ObjectAccessTarget writeTarget,
required DartType writeContext,
required ExpressionInferenceResult valueResult,
required bool forEffect,
}) {
valueResult = ensureAssignableResult(
writeContext,
valueResult,
fileOffset: fileOffset,
isVoidAllowed: writeContext is VoidType,
);
Expression value = valueResult.expression;
DartType valueType = valueResult.inferredType;
if (expressionEvaluationHelper != null) {
// Coverage-ignore-block(suite): Not run.
OverwrittenInterfaceMember? overWritten = expressionEvaluationHelper
?.overwriteFindInterfaceMember(
target: writeTarget,
name: propertyName,
receiverType: receiverType,
setter: true,
);
if (overWritten != null) {
writeTarget = overWritten.target;
propertyName = overWritten.name;
}
}
Expression write;
switch (writeTarget.kind) {
case ObjectAccessTargetKind.missing:
write = createMissingPropertySet(
fileOffset,
receiver,
receiverType,
propertyName,
value,
forEffect: forEffect,
);
break;
case ObjectAccessTargetKind.ambiguous:
write = createMissingPropertySet(
fileOffset,
receiver,
receiverType,
propertyName,
value,
forEffect: forEffect,
extensionAccessCandidates: writeTarget.candidates,
);
break;
case ObjectAccessTargetKind.extensionMember:
case ObjectAccessTargetKind.nullableExtensionMember:
case ObjectAccessTargetKind.extensionTypeMember:
case ObjectAccessTargetKind.nullableExtensionTypeMember:
if (forEffect) {
write = new StaticInvocation(
writeTarget.member as Procedure,
new Arguments(
<Expression>[receiver, value],
types: writeTarget.receiverTypeArguments,
)..fileOffset = fileOffset,
)..fileOffset = fileOffset;
} else {
VariableDeclaration valueVariable = createVariable(value, valueType);
VariableDeclaration assignmentVariable = createVariable(
new StaticInvocation(
writeTarget.member as Procedure,
new Arguments(
<Expression>[receiver, createVariableGet(valueVariable)],
types: writeTarget.receiverTypeArguments,
)..fileOffset = fileOffset,
)..fileOffset = fileOffset,
const VoidType(),
);
write = createLet(
valueVariable,
createLet(assignmentVariable, createVariableGet(valueVariable)),
)..fileOffset = fileOffset;
}
break;
case ObjectAccessTargetKind.invalid:
write = new DynamicSet(
DynamicAccessKind.Invalid,
receiver,
propertyName,
value,
)..fileOffset = fileOffset;
break;
case ObjectAccessTargetKind.never:
write = new DynamicSet(
DynamicAccessKind.Never,
receiver,
propertyName,
value,
)..fileOffset = fileOffset;
break;
case ObjectAccessTargetKind.callFunction:
case ObjectAccessTargetKind.nullableCallFunction:
case ObjectAccessTargetKind.dynamic:
write = new DynamicSet(
DynamicAccessKind.Dynamic,
receiver,
propertyName,
value,
)..fileOffset = fileOffset;
break;
case ObjectAccessTargetKind.instanceMember:
case ObjectAccessTargetKind.objectMember:
case ObjectAccessTargetKind.nullableInstanceMember:
// Coverage-ignore(suite): Not run.
case ObjectAccessTargetKind.superMember:
InstanceAccessKind kind;
switch (writeTarget.kind) {
case ObjectAccessTargetKind.instanceMember:
kind = InstanceAccessKind.Instance;
break;
case ObjectAccessTargetKind.nullableInstanceMember:
kind = InstanceAccessKind.Nullable;
break;
// Coverage-ignore(suite): Not run.
case ObjectAccessTargetKind.objectMember:
kind = InstanceAccessKind.Object;
break;
// Coverage-ignore(suite): Not run.
default:
throw new UnsupportedError('Unexpected target kind $writeTarget');
}
write = new InstanceSet(
kind,
receiver,
propertyName,
value,
interfaceTarget: writeTarget.classMember!,
)..fileOffset = fileOffset;
break;
// Coverage-ignore(suite): Not run.
case ObjectAccessTargetKind.recordIndexed:
case ObjectAccessTargetKind.recordNamed:
case ObjectAccessTargetKind.extensionTypeRepresentation:
case ObjectAccessTargetKind.nullableRecordIndexed:
case ObjectAccessTargetKind.nullableRecordNamed:
case ObjectAccessTargetKind.nullableExtensionTypeRepresentation:
throw new UnsupportedError('Unexpected write target ${writeTarget}');
}
Expression result;
if (writeTarget.isNullable) {
result = problemReporting.wrapInProblem(
compilerContext: compilerContext,
expression: write,
message: diag.nullablePropertyAccessError.withArguments(
propertyName: propertyName.text,
receiverType: receiverType,
),
fileUri: fileUri,
fileOffset: write.fileOffset,
length: propertyName.text.length,
);
} else {
result = write;
}
return new ExpressionInferenceResult(valueType, result);
}
/// Computes the implicit instantiation from an expression of [tearOffType]
/// to the [context] type. Return `null` if an implicit instantiation is not
/// necessary or possible.
@@ -4514,6 +4699,24 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
return null;
}
/// Infers [iterable] as the iterable of a for-in loop with the given
/// [elementType].
ExpressionInferenceResult inferForInIterable(
Expression iterable,
DartType elementType, {
required bool isAsync,
});
/// Infers the [pattern] occurring as the element in for-in header with the
/// given [iterable].
PatternForInData inferPatternForInHeader({
required TreeNode node,
required Pattern pattern,
required Expression iterable,
required bool isAsync,
required int inOffset,
});
ExpressionInferenceResult _applyImplicitInstantiation(
ImplicitInstantiation? implicitInstantiation,
DartType tearOffType,
@@ -6183,3 +6386,48 @@ class _ObjectAccessDescriptor {
}
}
}
/// Data needed for the inference of a write to an instance property.
class PropertySetData {
final Expression receiver;
final DartType receiverType;
final DartType writeContext;
final ObjectAccessTarget target;
PropertySetData({
required this.receiver,
required this.receiverType,
required this.writeContext,
required this.target,
});
}
/// Data needed for the inference of a write to an extension setter.
class ExtensionSetData {
final Expression receiver;
final DartType inferredReceiverType;
final DartType valueType;
final List<DartType> extensionTypeArguments;
final Procedure setter;
ExtensionSetData({
required this.receiver,
required this.inferredReceiverType,
required this.valueType,
required this.extensionTypeArguments,
required this.setter,
});
}
/// Data resulting from the inference of a pattern in a for-in element.
class PatternForInData {
final VariableDeclaration loopVariable;
final Expression iterable;
final PatternVariableDeclaration Function() computePatternVariableDeclaration;
PatternForInData({
required this.loopVariable,
required this.iterable,
required this.computePatternVariableDeclaration,
});
}
+1
View File
@@ -136,6 +136,7 @@ front_end/NeverReachableSwitchDefaultError/example: missingExample # Probably on
front_end/NeverReachableSwitchExpressionError/example: missingExample # No coverage.
front_end/NeverReachableSwitchStatementError/example: missingExample # No coverage.
front_end/NeverValueError/example: missingExample # No coverage.
front_end/NonIdentifierForInElement/example: missingExample # TODO(johnniwinther): Use this error in the parser.
front_end/NonPartOfDirectiveInPart/script1: hasOnlyUnrelatedMessages # Specifically ignored in `isIgnoredParserError`?!?
front_end/NoUnnamedConstructorInObject/example: missingExample # No coverage.
front_end/PatchClassTypeParametersMismatch/example: missingExample # Patching.
+5
View File
@@ -7768,6 +7768,11 @@ anonymousMethodWrongParameterTypeCfe:
statement:
- '"".(int i) => 1;'
nonIdentifierForInElement:
parameters: none
problemMessage: "The element in a for-in loop must be an identifier or a local variable declaration."
correctionMessage: "Try using an existing variable or a variable declaration."
dartExternalEffectNotMethod:
parameters: none
problemMessage: "The 'external-effect' pragma can only be applied to methods."
@@ -257,7 +257,12 @@ Future<void> main() async {
);
check(
"ThisPropertyAccessGenerator(offset: 4, name: bar)",
new ThisPropertyAccessGenerator(helper, token, name),
new ThisPropertyAccessGenerator(
helper,
token,
name,
isThisExplicit: false,
),
);
check(
"NullAwarePropertyAccessGenerator(offset: 4,"
@@ -300,6 +305,7 @@ Future<void> main() async {
getter,
null,
setter,
isQualifiedAccess: true,
),
);
check(
@@ -7,10 +7,9 @@ class Class {}
main() {
var o;
/*current: dynamic*/
/*as: Class!*/
for (
// ignore: UNUSED_LOCAL_VARIABLE
Class c
Class /*as: Class!*/ c
in
/*as: Iterable<dynamic>!*/
/*dynamic|dynamic*/ o?. /*dynamic*/ iterable) {}
@@ -123,7 +123,7 @@ void main() {
) async {
_testVariableDeclarations();
_testTryStatement();
_testForInStatementWithSynthesizedVariable();
_testInternalForInStatement();
_testSwitchCaseImpl();
_testBreakStatementImpl();
_testCascade();
@@ -344,8 +344,214 @@ try { return; } on void catch (e) { return; } catch (e) { return; } finally { re
);
}
void _testForInStatementWithSynthesizedVariable() {
// TODO(johnniwinther): Test ForInStatementWithSynthesizedVariable
void _testInternalForInStatement() {
testStatement(
new InternalForInStatement(
new SingleVariableDeclarationForInElement(
variableDeclaration: new VariableDeclarationImpl('e'),
error: null,
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (var e in null) {}''',
);
testStatement(
new InternalForInStatement(
new SingleVariableDeclarationForInElement(
variableDeclaration: new VariableDeclarationImpl(
'e',
type: const VoidType(),
),
error: null,
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (void e in null) {}''',
);
testStatement(
new InternalForInStatement(
new PatternForInElement(
pattern: new RecordPattern([
new VariablePattern(
const VoidType(),
new VariableDeclarationImpl('a'),
),
new VariablePattern(null, new VariableDeclarationImpl('b')),
]),
inOffset: -1,
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (var (void a, var b) in null) {}''',
);
testStatement(
new InternalForInStatement(
new ExistingVariableForInElement(
variable: new VariableDeclarationImpl('a'),
nameOffset: -1,
inOffset: -1,
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (a in null) {}''',
);
// TODO(johnniwinther,cstefantsova): Test toTextInternal for
// [VariableInitializationForInElement].
testStatement(
new InternalForInStatement(
new InvalidForInElement(
error: new InvalidExpression('error'),
inOffset: -1,
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (<invalid:error> in null) {}''',
);
testStatement(
new InternalForInStatement(
new StaticForInElement(
target: new Field.mutable(new Name('a'), fileUri: dummyUri),
nameOffset: -1,
inOffset: -1,
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (a in null) {}''',
);
testStatement(
new InternalForInStatement(
new PropertyForInElement(
receiver: new ThisExpression(),
name: new Name('a'),
nameOffset: -1,
inOffset: -1,
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (a in null) {}''',
);
testStatement(
new InternalForInStatement(
new UnassignableForInElement(
expression: new NullLiteral(),
error: new InvalidExpression('error'),
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (null in null) {}''',
);
testStatement(
new InternalForInStatement(
new MultiVariableDeclarationForInElement(
variableDeclarations: [
new VariableDeclarationImpl('a'),
new VariableDeclarationImpl('b'),
],
error: new InvalidExpression('error'),
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (var a, b in null) {}''',
);
testStatement(
new InternalForInStatement(
new MultiVariableDeclarationForInElement(
variableDeclarations: [
new VariableDeclarationImpl('a', type: const VoidType()),
new VariableDeclarationImpl('b'),
],
error: new InvalidExpression('error'),
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (void a, b in null) {}''',
);
testStatement(
new InternalForInStatement(
new ExtensionForInElement(
extension: new Extension(name: 'Extension', fileUri: dummyUri),
thisTypeArguments: null,
thisAccess: new ThisExpression(),
name: new Name('a'),
setter: new Procedure(
new Name('Extension|a'),
ProcedureKind.Method,
new FunctionNode(null),
fileUri: dummyUri,
),
nameOffset: -1,
inOffset: -1,
),
new NullLiteral(),
new Block([]),
isAsync: false,
fileOffset: -1,
bodyOffset: -1,
),
'''
for (a in null) {}''',
);
}
void _testSwitchCaseImpl() {
@@ -14,15 +14,12 @@ import self as self;
import "dart:core" as core;
static method foo() → void {
#L1:
{
invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
var x, // Error
^^^";
#L1:
for (final core::String #t1 in core::List::filled<core::String>(10, "")) {
invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
var x, // Error
^^^";
dynamic x;
dynamic y;
break #L1;
@@ -14,15 +14,12 @@ import self as self;
import "dart:core" as core;
static method foo() → void {
#L1:
{
invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
var x, // Error
^^^";
#L1:
for (final core::String #t1 in core::List::filled<core::String>(10, "")) {
invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
var x, // Error
^^^";
dynamic x;
dynamic y;
break #L1;
@@ -14,19 +14,16 @@ import self as self;
import "dart:core" as core;
static method foo() → void {
#L1:
{
invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
var x, // Error
^^^";
#L1:
{
synthesized core::Iterator<core::String> :sync-for-iterator = core::_List::filled<core::String>(10, "").{core::Iterable::iterator}{core::Iterator<core::String>};
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final core::String #t1 = :sync-for-iterator.{core::Iterator::current}{core::String};
{
invalid-expression "pkg/front_end/testcases/coverage/from_co19/for_syntax_t09.dart:9:5: Error: A for-in loop can't have more than one loop variable.
var x, // Error
^^^";
dynamic x;
dynamic y;
break #L1;
@@ -159,9 +159,9 @@ static method test(self::Class c, self::Class? cn) → dynamic {
self::expect(5, let final self::Class? #t56 = cn in #t56 == null ?{core::int?} null : #t56{self::Class}.{self::Class::field}{core::int});
self::expect(6, let final self::Class #t57 = c in let final core::int #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
self::expect(7, let final self::Class? #t60 = cn in #t60 == null ?{core::int?} null : #t60{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t61 = cn in #t61 == null ?{void} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
let final self::Class? #t61 = cn in #t61 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
self::expect(1, let final self::Class? #t62 = cn in #t62 == null ?{core::int?} null : #t62{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t63 = cn in #t63 == null ?{void} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
let final self::Class? #t63 = cn in #t63 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
self::expect(2, let final self::Class? #t64 = cn in #t64 == null ?{core::int?} null : #t64{self::Class}.{self::Class::field}{core::int});
self::expect(3, let final self::Class? #t65 = cn in #t65 == null ?{core::int?} null : let final core::int #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65{self::Class}, #t66) in #t66);
self::expect(3, let final self::Class? #t68 = cn in #t68 == null ?{core::int?} null : #t68{self::Class}.{self::Class::field}{core::int});
@@ -175,9 +175,9 @@ static method test(self::Class c, self::Class? cn) → dynamic {
self::expect(7, let final self::Class? #t78 = cn in #t78 == null ?{core::int?} null : #t78{self::Class}.{self::Class::field}{core::int});
self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t79 = c in let final core::int #t80 = 8.{core::int::unary-}(){() → core::int} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
self::expect(8, let final self::Class? #t82 = cn in #t82 == null ?{core::int?} null : #t82{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t83 = cn in #t83 == null ?{void} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
let final self::Class? #t83 = cn in #t83 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
self::expect(1, let final self::Class? #t84 = cn in #t84 == null ?{core::int?} null : #t84{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t85 = cn in #t85 == null ?{void} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
let final self::Class? #t85 = cn in #t85 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
self::expect(2, let final self::Class? #t86 = cn in #t86 == null ?{core::int?} null : #t86{self::Class}.{self::Class::field}{core::int});
self::expect(3, let final self::Class? #t87 = cn in #t87 == null ?{core::int?} null : let final core::int #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87{self::Class}, #t88) in #t88);
self::expect(3, let final self::Class? #t90 = cn in #t90 == null ?{core::int?} null : #t90{self::Class}.{self::Class::field}{core::int});
@@ -159,9 +159,9 @@ static method test(self::Class c, self::Class? cn) → dynamic {
self::expect(5, let final self::Class? #t56 = cn in #t56 == null ?{core::int?} null : #t56{self::Class}.{self::Class::field}{core::int});
self::expect(6, let final self::Class #t57 = c in let final core::int #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
self::expect(7, let final self::Class? #t60 = cn in #t60 == null ?{core::int?} null : #t60{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t61 = cn in #t61 == null ?{void} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
let final self::Class? #t61 = cn in #t61 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
self::expect(1, let final self::Class? #t62 = cn in #t62 == null ?{core::int?} null : #t62{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t63 = cn in #t63 == null ?{void} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
let final self::Class? #t63 = cn in #t63 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
self::expect(2, let final self::Class? #t64 = cn in #t64 == null ?{core::int?} null : #t64{self::Class}.{self::Class::field}{core::int});
self::expect(3, let final self::Class? #t65 = cn in #t65 == null ?{core::int?} null : let final core::int #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65{self::Class}, #t66) in #t66);
self::expect(3, let final self::Class? #t68 = cn in #t68 == null ?{core::int?} null : #t68{self::Class}.{self::Class::field}{core::int});
@@ -175,9 +175,9 @@ static method test(self::Class c, self::Class? cn) → dynamic {
self::expect(7, let final self::Class? #t78 = cn in #t78 == null ?{core::int?} null : #t78{self::Class}.{self::Class::field}{core::int});
self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t79 = c in let final core::int #t80 = 8.{core::int::unary-}(){() → core::int} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
self::expect(8, let final self::Class? #t82 = cn in #t82 == null ?{core::int?} null : #t82{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t83 = cn in #t83 == null ?{void} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
let final self::Class? #t83 = cn in #t83 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
self::expect(1, let final self::Class? #t84 = cn in #t84 == null ?{core::int?} null : #t84{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t85 = cn in #t85 == null ?{void} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
let final self::Class? #t85 = cn in #t85 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
self::expect(2, let final self::Class? #t86 = cn in #t86 == null ?{core::int?} null : #t86{self::Class}.{self::Class::field}{core::int});
self::expect(3, let final self::Class? #t87 = cn in #t87 == null ?{core::int?} null : let final core::int #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87{self::Class}, #t88) in #t88);
self::expect(3, let final self::Class? #t90 = cn in #t90 == null ?{core::int?} null : #t90{self::Class}.{self::Class::field}{core::int});
@@ -159,9 +159,9 @@ static method test(self::Class c, self::Class? cn) → dynamic {
self::expect(5, let final self::Class? #t56 = cn in #t56 == null ?{core::int?} null : #t56{self::Class}.{self::Class::field}{core::int});
self::expect(6, let final self::Class #t57 = c in let final core::int #t58 = 6 in let final void #t59 = self::Extension|set#mutatingSetter(#t57, #t58) in #t58);
self::expect(7, let final self::Class? #t60 = cn in #t60 == null ?{core::int?} null : #t60{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t61 = cn in #t61 == null ?{void} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
let final self::Class? #t61 = cn in #t61 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t61{self::Class}, 1);
self::expect(1, let final self::Class? #t62 = cn in #t62 == null ?{core::int?} null : #t62{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t63 = cn in #t63 == null ?{void} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
let final self::Class? #t63 = cn in #t63 == null ?{core::int?} null : self::Extension|set#setterWithReturn(#t63{self::Class}, 2.{core::int::unary-}(){() → core::int});
self::expect(2, let final self::Class? #t64 = cn in #t64 == null ?{core::int?} null : #t64{self::Class}.{self::Class::field}{core::int});
self::expect(3, let final self::Class? #t65 = cn in #t65 == null ?{core::int?} null : let final core::int #t66 = 3 in let final void #t67 = self::Extension|set#setterWithReturn(#t65{self::Class}, #t66) in #t66);
self::expect(3, let final self::Class? #t68 = cn in #t68 == null ?{core::int?} null : #t68{self::Class}.{self::Class::field}{core::int});
@@ -175,9 +175,9 @@ static method test(self::Class c, self::Class? cn) → dynamic {
self::expect(7, let final self::Class? #t78 = cn in #t78 == null ?{core::int?} null : #t78{self::Class}.{self::Class::field}{core::int});
self::expect(8.{core::int::unary-}(){() → core::int}, let final self::Class #t79 = c in let final core::int #t80 = 8.{core::int::unary-}(){() → core::int} in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
self::expect(8, let final self::Class? #t82 = cn in #t82 == null ?{core::int?} null : #t82{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t83 = cn in #t83 == null ?{void} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
let final self::Class? #t83 = cn in #t83 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t83{self::Class}, 1);
self::expect(1, let final self::Class? #t84 = cn in #t84 == null ?{core::int?} null : #t84{self::Class}.{self::Class::field}{core::int});
let final self::Class? #t85 = cn in #t85 == null ?{void} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
let final self::Class? #t85 = cn in #t85 == null ?{core::int?} null : self::Extension|set#setterWithClosure(#t85{self::Class}, 2.{core::int::unary-}(){() → core::int});
self::expect(2, let final self::Class? #t86 = cn in #t86 == null ?{core::int?} null : #t86{self::Class}.{self::Class::field}{core::int});
self::expect(3, let final self::Class? #t87 = cn in #t87 == null ?{core::int?} null : let final core::int #t88 = 3 in let final void #t89 = self::Extension|set#setterWithClosure(#t87{self::Class}, #t88) in #t88);
self::expect(3, let final self::Class? #t90 = cn in #t90 == null ?{core::int?} null : #t90{self::Class}.{self::Class::field}{core::int});
@@ -34,7 +34,7 @@ static get value() → core::int?
static method test(self::Class? c) → dynamic {
let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
let final self::Class? #t6 = c in #t6 == null ?{void} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
@@ -34,7 +34,7 @@ static get value() → core::int?
static method test(self::Class? c) → dynamic {
let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
let final self::Class? #t6 = c in #t6 == null ?{void} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
@@ -34,7 +34,7 @@ static get value() → core::int?
static method test(self::Class? c) → dynamic {
let final core::int? #t2 = let final self::Class? #t3 = c in #t3 == null ?{core::int?} null : self::Extension|get#property(#t3{self::Class}) in #t2 == null ?{core::int} 0 : #t2{core::int};
let final core::int? #t4 = let final self::Class? #t5 = c in #t5 == null ?{core::int?} null : self::Extension|get#property(#t5{self::Class}) in #t4 == null ?{core::int} 0 : #t4{core::int};
let final self::Class? #t6 = c in #t6 == null ?{void} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
let final self::Class? #t6 = c in #t6 == null ?{core::int?} null : self::Extension|set#property(#t6{self::Class}, let final core::int? #t7 = self::value in #t7 == null ?{core::int} 0 : #t7{core::int});
let final self::Class? #t8 = c in #t8 == null ?{core::int?} null : self::Extension|set#property(#t8{self::Class}, let final core::int? #t9 = self::value in #t9 == null ?{core::int} 0 : #t9{core::int});
let final core::int? #t10 = let final self::Class? #t11 = c in #t11 == null ?{core::int?} null : let final core::int #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11{self::Class}, #t12) in #t12 in #t10 == null ?{core::int} 0 : #t10{core::int};
let final core::int? #t14 = let final self::Class? #t15 = c in #t15 == null ?{core::int?} null : let final core::int? #t16 = self::value in let final void #t17 = self::Extension|set#property(#t15{self::Class}, #t16) in #t16 in #t14 == null ?{core::int} 0 : #t14{core::int};
@@ -52,7 +52,7 @@ static method test2(self::Class? c) → dynamic {
self::expect(42, tearOff{() → core::int?}(){() → core::int?});
self::expect(null, let final self::Class? #t23 = c in #t23 == null ?{Null} null : let final has-declared-initializer Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23{self::Class}, #t24) in #t24);
self::expect(42, let final self::Class? #t26 = c in #t26 == null ?{core::int?} null : let final core::int #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26{self::Class}, #t27) in #t27);
let final self::Class? #t29 = c in #t29 == null ?{void} null : self::Extension|set#property(#t29{self::Class}, null);
let final self::Class? #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29{self::Class}, null);
self::expect(null, let final self::Class? #t30 = c in #t30 == null ?{core::int?} null : self::Extension|get#property(#t30{self::Class}));
self::expect(42, let final self::Class? #t31 = c in #t31 == null ?{core::int?} null : let final core::int? #t32 = self::Extension|get#property(#t31{self::Class}) in #t32 == null ?{core::int} let final core::int #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31{self::Class}, #t33) in #t33 : #t32{core::int});
self::expect(42, let final self::Class? #t35 = c in #t35 == null ?{core::int?} null : let final core::int? #t36 = self::Extension|get#property(#t35{self::Class}) in #t36 == null ?{core::int} let final core::int #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35{self::Class}, #t37) in #t37 : #t36{core::int});
@@ -61,17 +61,17 @@ static method test2(self::Class? c) → dynamic {
self::expect(42, let final self::Class? #t43 = c in #t43 == null ?{core::int?} null : self::Extension|get#property(#t43{self::Class}));
let final self::Class? #t44 = c in #t44 == null ?{core::int?} null : self::Extension|get#property(#t44{self::Class}) == null ?{core::int?} self::Extension|set#property(#t44{self::Class}, 87) : null;
self::expect(42, let final self::Class? #t45 = c in #t45 == null ?{core::int?} null : self::Extension|get#property(#t45{self::Class}));
let final self::Class? #t46 = c in #t46 == null ?{void} null : self::Extension|set#property(#t46{self::Class}, null);
let final self::Class? #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46{self::Class}, null);
self::expect(null, let final self::Class? #t47 = c in #t47 == null ?{core::int?} null : self::Extension|get#property(#t47{self::Class}));
self::expect(42, let final self::Class? #t48 = c in #t48 == null ?{core::int?} null : let final core::int? #t49 = self::Extension|get#property(#t48{self::Class}) in #t49 == null ?{core::int} let final core::int #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48{self::Class}, #t50) in #t50 : #t49{core::int});
self::expect(42, let final self::Class? #t52 = c in #t52 == null ?{core::int?} null : let final core::int? #t53 = self::Extension|get#property(#t52{self::Class}) in #t53 == null ?{core::int} let final core::int #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52{self::Class}, #t54) in #t54 : #t53{core::int});
let final self::Class? #t56 = c in #t56 == null ?{void} null : self::Extension|set#property(#t56{self::Class}, null);
let final self::Class? #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56{self::Class}, null);
self::expect(null, let final self::Class? #t57 = c in #t57 == null ?{core::int?} null : self::Extension|get#property(#t57{self::Class}));
let final self::Class? #t58 = c in #t58 == null ?{core::int?} null : self::Extension|get#property(#t58{self::Class}) == null ?{core::int?} self::Extension|set#property(#t58{self::Class}, 42) : null;
self::expect(42, let final self::Class? #t59 = c in #t59 == null ?{core::int?} null : self::Extension|get#property(#t59{self::Class}));
let final self::Class? #t60 = c in #t60 == null ?{core::int?} null : self::Extension|get#property(#t60{self::Class}) == null ?{core::int?} self::Extension|set#property(#t60{self::Class}, 87) : null;
self::expect(42, let final self::Class? #t61 = c in #t61 == null ?{core::int?} null : self::Extension|get#property(#t61{self::Class}));
let final self::Class? #t62 = c in #t62 == null ?{void} null : self::Extension|set#property(#t62{self::Class}, null);
let final self::Class? #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62{self::Class}, null);
let final self::Class? #t63 = c in #t63 == null ?{dynamic} null : self::Extension|testImplicitThis(#t63{self::Class});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
@@ -52,7 +52,7 @@ static method test2(self::Class? c) → dynamic {
self::expect(42, tearOff{() → core::int?}(){() → core::int?});
self::expect(null, let final self::Class? #t23 = c in #t23 == null ?{Null} null : let final has-declared-initializer Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23{self::Class}, #t24) in #t24);
self::expect(42, let final self::Class? #t26 = c in #t26 == null ?{core::int?} null : let final core::int #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26{self::Class}, #t27) in #t27);
let final self::Class? #t29 = c in #t29 == null ?{void} null : self::Extension|set#property(#t29{self::Class}, null);
let final self::Class? #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29{self::Class}, null);
self::expect(null, let final self::Class? #t30 = c in #t30 == null ?{core::int?} null : self::Extension|get#property(#t30{self::Class}));
self::expect(42, let final self::Class? #t31 = c in #t31 == null ?{core::int?} null : let final core::int? #t32 = self::Extension|get#property(#t31{self::Class}) in #t32 == null ?{core::int} let final core::int #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31{self::Class}, #t33) in #t33 : #t32{core::int});
self::expect(42, let final self::Class? #t35 = c in #t35 == null ?{core::int?} null : let final core::int? #t36 = self::Extension|get#property(#t35{self::Class}) in #t36 == null ?{core::int} let final core::int #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35{self::Class}, #t37) in #t37 : #t36{core::int});
@@ -61,17 +61,17 @@ static method test2(self::Class? c) → dynamic {
self::expect(42, let final self::Class? #t43 = c in #t43 == null ?{core::int?} null : self::Extension|get#property(#t43{self::Class}));
let final self::Class? #t44 = c in #t44 == null ?{core::int?} null : self::Extension|get#property(#t44{self::Class}) == null ?{core::int?} self::Extension|set#property(#t44{self::Class}, 87) : null;
self::expect(42, let final self::Class? #t45 = c in #t45 == null ?{core::int?} null : self::Extension|get#property(#t45{self::Class}));
let final self::Class? #t46 = c in #t46 == null ?{void} null : self::Extension|set#property(#t46{self::Class}, null);
let final self::Class? #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46{self::Class}, null);
self::expect(null, let final self::Class? #t47 = c in #t47 == null ?{core::int?} null : self::Extension|get#property(#t47{self::Class}));
self::expect(42, let final self::Class? #t48 = c in #t48 == null ?{core::int?} null : let final core::int? #t49 = self::Extension|get#property(#t48{self::Class}) in #t49 == null ?{core::int} let final core::int #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48{self::Class}, #t50) in #t50 : #t49{core::int});
self::expect(42, let final self::Class? #t52 = c in #t52 == null ?{core::int?} null : let final core::int? #t53 = self::Extension|get#property(#t52{self::Class}) in #t53 == null ?{core::int} let final core::int #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52{self::Class}, #t54) in #t54 : #t53{core::int});
let final self::Class? #t56 = c in #t56 == null ?{void} null : self::Extension|set#property(#t56{self::Class}, null);
let final self::Class? #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56{self::Class}, null);
self::expect(null, let final self::Class? #t57 = c in #t57 == null ?{core::int?} null : self::Extension|get#property(#t57{self::Class}));
let final self::Class? #t58 = c in #t58 == null ?{core::int?} null : self::Extension|get#property(#t58{self::Class}) == null ?{core::int?} self::Extension|set#property(#t58{self::Class}, 42) : null;
self::expect(42, let final self::Class? #t59 = c in #t59 == null ?{core::int?} null : self::Extension|get#property(#t59{self::Class}));
let final self::Class? #t60 = c in #t60 == null ?{core::int?} null : self::Extension|get#property(#t60{self::Class}) == null ?{core::int?} self::Extension|set#property(#t60{self::Class}, 87) : null;
self::expect(42, let final self::Class? #t61 = c in #t61 == null ?{core::int?} null : self::Extension|get#property(#t61{self::Class}));
let final self::Class? #t62 = c in #t62 == null ?{void} null : self::Extension|set#property(#t62{self::Class}, null);
let final self::Class? #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62{self::Class}, null);
let final self::Class? #t63 = c in #t63 == null ?{dynamic} null : self::Extension|testImplicitThis(#t63{self::Class});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
@@ -52,7 +52,7 @@ static method test2(self::Class? c) → dynamic {
self::expect(42, tearOff{() → core::int?}(){() → core::int?});
self::expect(null, let final self::Class? #t23 = c in #t23 == null ?{Null} null : let final has-declared-initializer Null #t24 = null in let final void #t25 = self::Extension|set#property(#t23{self::Class}, #t24) in #t24);
self::expect(42, let final self::Class? #t26 = c in #t26 == null ?{core::int?} null : let final core::int #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26{self::Class}, #t27) in #t27);
let final self::Class? #t29 = c in #t29 == null ?{void} null : self::Extension|set#property(#t29{self::Class}, null);
let final self::Class? #t29 = c in #t29 == null ?{Null} null : self::Extension|set#property(#t29{self::Class}, null);
self::expect(null, let final self::Class? #t30 = c in #t30 == null ?{core::int?} null : self::Extension|get#property(#t30{self::Class}));
self::expect(42, let final self::Class? #t31 = c in #t31 == null ?{core::int?} null : let final core::int? #t32 = self::Extension|get#property(#t31{self::Class}) in #t32 == null ?{core::int} let final core::int #t33 = 42 in let final void #t34 = self::Extension|set#property(#t31{self::Class}, #t33) in #t33 : #t32{core::int});
self::expect(42, let final self::Class? #t35 = c in #t35 == null ?{core::int?} null : let final core::int? #t36 = self::Extension|get#property(#t35{self::Class}) in #t36 == null ?{core::int} let final core::int #t37 = 87 in let final void #t38 = self::Extension|set#property(#t35{self::Class}, #t37) in #t37 : #t36{core::int});
@@ -61,17 +61,17 @@ static method test2(self::Class? c) → dynamic {
self::expect(42, let final self::Class? #t43 = c in #t43 == null ?{core::int?} null : self::Extension|get#property(#t43{self::Class}));
let final self::Class? #t44 = c in #t44 == null ?{core::int?} null : self::Extension|get#property(#t44{self::Class}) == null ?{core::int?} self::Extension|set#property(#t44{self::Class}, 87) : null;
self::expect(42, let final self::Class? #t45 = c in #t45 == null ?{core::int?} null : self::Extension|get#property(#t45{self::Class}));
let final self::Class? #t46 = c in #t46 == null ?{void} null : self::Extension|set#property(#t46{self::Class}, null);
let final self::Class? #t46 = c in #t46 == null ?{Null} null : self::Extension|set#property(#t46{self::Class}, null);
self::expect(null, let final self::Class? #t47 = c in #t47 == null ?{core::int?} null : self::Extension|get#property(#t47{self::Class}));
self::expect(42, let final self::Class? #t48 = c in #t48 == null ?{core::int?} null : let final core::int? #t49 = self::Extension|get#property(#t48{self::Class}) in #t49 == null ?{core::int} let final core::int #t50 = 42 in let final void #t51 = self::Extension|set#property(#t48{self::Class}, #t50) in #t50 : #t49{core::int});
self::expect(42, let final self::Class? #t52 = c in #t52 == null ?{core::int?} null : let final core::int? #t53 = self::Extension|get#property(#t52{self::Class}) in #t53 == null ?{core::int} let final core::int #t54 = 87 in let final void #t55 = self::Extension|set#property(#t52{self::Class}, #t54) in #t54 : #t53{core::int});
let final self::Class? #t56 = c in #t56 == null ?{void} null : self::Extension|set#property(#t56{self::Class}, null);
let final self::Class? #t56 = c in #t56 == null ?{Null} null : self::Extension|set#property(#t56{self::Class}, null);
self::expect(null, let final self::Class? #t57 = c in #t57 == null ?{core::int?} null : self::Extension|get#property(#t57{self::Class}));
let final self::Class? #t58 = c in #t58 == null ?{core::int?} null : self::Extension|get#property(#t58{self::Class}) == null ?{core::int?} self::Extension|set#property(#t58{self::Class}, 42) : null;
self::expect(42, let final self::Class? #t59 = c in #t59 == null ?{core::int?} null : self::Extension|get#property(#t59{self::Class}));
let final self::Class? #t60 = c in #t60 == null ?{core::int?} null : self::Extension|get#property(#t60{self::Class}) == null ?{core::int?} self::Extension|set#property(#t60{self::Class}, 87) : null;
self::expect(42, let final self::Class? #t61 = c in #t61 == null ?{core::int?} null : self::Extension|get#property(#t61{self::Class}));
let final self::Class? #t62 = c in #t62 == null ?{void} null : self::Extension|set#property(#t62{self::Class}, null);
let final self::Class? #t62 = c in #t62 == null ?{Null} null : self::Extension|set#property(#t62{self::Class}, null);
let final self::Class? #t63 = c in #t63 == null ?{dynamic} null : self::Extension|testImplicitThis(#t63{self::Class});
}
static method expect(dynamic expected, dynamic actual) → dynamic {
@@ -7,5 +7,5 @@ extension Foo on core::Object {
}
static extension-member method Foo|set#f(lowered final core::Object #this, core::int x) → void {}
static method fun(core::String? s) → void {
let final core::String? #t1 = s in #t1 == null ?{void} null : self::Foo|set#f(#t1{core::String}, 1);
let final core::String? #t1 = s in #t1 == null ?{core::int?} null : self::Foo|set#f(#t1{core::String}, 1);
}
@@ -7,5 +7,5 @@ extension Foo on core::Object {
}
static extension-member method Foo|set#f(lowered final core::Object #this, core::int x) → void {}
static method fun(core::String? s) → void {
let final core::String? #t1 = s in #t1 == null ?{void} null : self::Foo|set#f(#t1{core::String}, 1);
let final core::String? #t1 = s in #t1 == null ?{core::int?} null : self::Foo|set#f(#t1{core::String}, 1);
}
@@ -7,5 +7,5 @@ extension Foo on core::Object {
}
static extension-member method Foo|set#f(lowered final core::Object #this, core::int x) → void {}
static method fun(core::String? s) → void {
let final core::String? #t1 = s in #t1 == null ?{void} null : self::Foo|set#f(#t1{core::String}, 1);
let final core::String? #t1 = s in #t1 == null ?{core::int?} null : self::Foo|set#f(#t1{core::String}, 1);
}
+615
View File
@@ -0,0 +1,615 @@
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'for_in.dart' deferred as defer hide Extension, IndexExtension;
int intTopLevel = 0;
final int finalTopLevel = 0;
const int constTopLevel = 0;
late int lateTopLevel;
late final int lateFinalTopLevel;
num numTopLevel = 0;
String stringTopLevel = '';
test() {
for (const constLocal in [1]) { // Error
print(constLocal);
}
for (late int lateLocal in [1]) { // Error
print(lateLocal);
}
for (String stringLocal in [1]) { // Error
print(stringLocal);
}
for (String stringLocal in <int>[1]) { // Error
print(stringLocal);
}
print([
for (const constLocal in [1]) constLocal // Error
]);
print([
for (late int lateLocal in [1]) lateLocal // Error
]);
print([
for (String stringLocal in [1]) stringLocal // Error
]);
print([
for (String stringLocal in <int>[1]) stringLocal // Error
]);
print({
for (const constLocal in [1]) 0: constLocal // Error
});
print({
for (late int lateLocal in [1]) 0: lateLocal // Error
});
print({
for (String stringLocal in [1]) 0: stringLocal // Error
});
print({
for (String stringLocal in <int>[1]) 0: stringLocal // Error
});
for (int? multiLocal1, multiLocal2 in [1]) { // Error
print(multiLocal1);
print(multiLocal2);
}
for (var varMultiLocal1, varMultiLocal2 in [1]) { // Error
print(varMultiLocal1);
print(varMultiLocal2);
}
for (num numMultiLocal1, numMultiLocal2 in [1]) { // Error
print(numMultiLocal1);
print(numMultiLocal2);
}
for (1 in [1]) { // Error
}
for (main() in [1]) { // Error
}
final int existingFinalLocal;
for (existingFinalLocal in [1]) { // Error
print(existingFinalLocal);
}
String existingStringLocal;
for (existingStringLocal in [1]) { // Error
print(existingStringLocal);
}
for (existingStringLocal in <int>[1]) { // Error
print(existingStringLocal);
}
Class c = Class();
for (c.intField in [1]) { // Error
print(c.intField);
}
for (c.numField in [1]) { // Error
print(c.numField);
}
for (c.lateField in [1]) { // Error
print(c.lateField);
}
for (c?.intField in [1]) { // Error
print(c?.intField);
}
for (c?.numField in [1]) { // Error
print(c?.numField);
}
for (c?.lateField in [1]) { // Error
print(c?.lateField);
}
for (c.stringField in [1]) { // Error
print(c.stringField);
}
for (c.stringField in <int>[1]) { // Error
print(c.stringField);
}
for (c?.stringField in [1]) { // Error
print(c?.stringField);
}
for (c?.stringField in <int>[1]) { // Error
print(c?.stringField);
}
for (c.finalField in [1]) { // Error
print(c.finalField);
}
for (c?.finalField in [1]) { // Error
print(c?.finalField);
}
for (c.lateFinalField in [1]) { // Error
print(c.lateFinalField);
}
for (c?.lateFinalField in [1]) { // Error
print(c?.lateFinalField);
}
for (c[0] in [1]) { // Error
print(c[0]);
}
for (c?[0] in [1]) { // Error
print(c[0]);
}
for (finalTopLevel in [1]) { // Error
print(finalTopLevel);
}
for (constTopLevel in [1]) { // Error
print(constTopLevel);
}
for (stringTopLevel in [1]) { // Error
print(stringTopLevel);
}
for (stringTopLevel in <int>[1]) { // Error
print(stringTopLevel);
}
for (defer.intTopLevel in [1]) { // Error
print(defer.intTopLevel);
}
for (defer.numTopLevel in [1]) { // Error
print(defer.numTopLevel);
}
for (defer.lateTopLevel in [1]) { // Error
print(defer.lateTopLevel);
}
for (defer.lateFinalTopLevel in [1]) { // Error
print(defer.lateFinalTopLevel);
}
for (defer.finalTopLevel in [1]) { // Error
print(defer.finalTopLevel);
}
for (defer.constTopLevel in [1]) { // Error
print(defer.constTopLevel);
}
for (defer.stringTopLevel in [1]) { // Error
print(defer.stringTopLevel);
}
for (defer.stringTopLevel in <int>[1]) { // Error
print(defer.stringTopLevel);
}
for (Class.stringStaticField in [1]) { // Error
print(Class.stringStaticField);
}
for (Class.stringStaticField in <int>[1]) { // Error
print(Class.stringStaticField);
}
for (Class.finalStaticField in [1]) { // Error
print(Class.finalStaticField);
}
for (Class.lateFinalStaticField in [1]) { // Error
print(Class.lateFinalStaticField);
}
for (Extension.stringStaticField in [1]) { // Error
print(Extension.stringStaticField);
}
for (Extension.stringStaticField in <int>[1]) { // Error
print(Extension.stringStaticField);
}
for (Extension.finalStaticField in [1]) { // Error
print(Extension.finalStaticField);
}
for (Extension.lateFinalStaticField in [1]) { // Error
print(Extension.lateFinalStaticField);
}
for (Class.intStaticField in [1]) { // Error
print(Class.intStaticField);
}
for (Class.numStaticField in [1]) { // Error
print(Class.numStaticField);
}
for (Class.lateStaticField in [1]) { // Error
print(Class.lateStaticField);
}
for (Extension.intStaticField in [1]) { // Error
print(Extension.intStaticField);
}
for (Extension.numStaticField in [1]) { // Error
print(Extension.numStaticField);
}
for (Extension.lateStaticField in [1]) { // Error
print(Extension.lateStaticField);
}
}
main() {
for (int intLocal in [1]) { // Ok
print(intLocal);
}
for (num numLocal in [1]) { // Ok
print(numLocal);
}
for (var varLocal in [1]) { // Ok
print(varLocal);
}
for (final finalLocal in [1]) { // Ok
print(finalLocal);
}
print([
for (int intLocal in [1]) intLocal // Ok
]);
print([
for (num numLocal in [1]) numLocal // Ok
]);
print([
for (var varLocal in [1]) varLocal // Ok
]);
print([
for (final finalLocal in [1]) finalLocal // Ok
]);
print({
for (int intLocal in [1]) 0: intLocal // Ok
});
print({
for (num numLocal in [1]) 0: numLocal // Ok
});
print({
for (var varLocal in [1]) 0: varLocal // Ok
});
print({
for (final finalLocal in [1]) 0: finalLocal // Ok
});
for (var (a, b) in [(1, 2)]) { // Ok
print(a);
print(b);
}
int existingIntLocal;
for (existingIntLocal in [1]) { // Ok
print(existingIntLocal);
}
num existingNumLocal;
for (existingNumLocal in [1]) { // Ok
print(existingNumLocal);
}
Class().method();
for (intTopLevel in [1]) { // Ok
print(intTopLevel);
}
for (numTopLevel in [1]) { // Ok
print(numTopLevel);
}
for (lateTopLevel in [1]) { // Ok
print(lateTopLevel);
}
for (lateFinalTopLevel in [1]) { // Ok
print(lateFinalTopLevel);
}
Class().extensionMethod();
}
class Class {
int intField = 0;
num numField = 0;
String stringField = '';
final int finalField = 0;
late int lateField;
late final int lateFinalField;
static int intStaticField = 0;
static num numStaticField = 0;
static String stringStaticField = '';
static final int finalStaticField = 0;
static late int lateStaticField;
static late final int lateFinalStaticField;
operator[]=(int index, int value) {}
int operator[](int index) => 0;
test() {
for (this.intField in [1]) { // Error
print(this.intField);
}
for (this?.intField in [1]) { // Error
print(this?.intField);
}
for (this.numField in [1]) { // Error
print(this.numField);
}
for (this?.numField in [1]) { // Error
print(this?.numField);
}
for (this.lateField in [1]) { // Error
print(this.lateField);
}
for (this?.lateField in [1]) { // Error
print(this?.lateField);
}
for (stringField in [1]) { // Error
print(stringField);
}
for (stringField in <int>[1]) { // Error
print(stringField);
}
for (this.stringField in [1]) { // Error
print(this.stringField);
}
for (this.stringField in <int>[1]) { // Error
print(this.stringField);
}
for (this?.stringField in [1]) { // Error
print(this.stringField);
}
for (this?.stringField in <int>[1]) { // Error
print(this.stringField);
}
for (this[0] in [1]) { // Error
print(this[0]);
}
for (this?[0] in [1]) { // Error
print(this[0]);
}
for (finalField in [1]) { // Error
print(finalField);
}
for (finalField in <int>[1]) { // Error
print(finalField);
}
for (this.finalField in [1]) { // Error
print(this.finalField);
}
for (this.finalField in <int>[1]) { // Error
print(this.finalField);
}
for (this?.finalField in [1]) { // Error
print(this.finalField);
}
for (this?.finalField in <int>[1]) { // Error
print(this.finalField);
}
for (lateFinalField in [1]) { // Ok
print(lateFinalField);
}
for (this.lateFinalField in [1]) { // Error
print(this.lateFinalField);
}
for (this?.lateFinalField in [1]) { // Error
print(this.lateFinalField);
}
for (finalStaticField in [1]) { // Error
print(finalStaticField);
}
for (stringStaticField in [1]) { // Error
print(stringStaticField);
}
for (stringStaticField in <int>[1]) { // Error
print(stringStaticField);
}
for (lateFinalStaticField in [1]) { // Ok
print(lateFinalStaticField);
}
for (this.extensionIntProperty in [1]) { // Error
print(this.extensionIntProperty);
}
for (this?.extensionIntProperty in [1]) { // Error
print(this?.extensionIntProperty);
}
for (this.extensionNumProperty in [1]) { // Error
print(this.extensionNumProperty);
}
for (this?.extensionNumProperty in [1]) { // Error
print(this?.extensionNumProperty);
}
for (Extension(this).extensionIntProperty in [1]) { // Error
print(Extension(this).extensionIntProperty);
}
for (Extension(this)?.extensionIntProperty in [1]) { // Error
print(Extension(this)?.extensionIntProperty);
}
for (Extension(this).extensionNumProperty in [1]) { // Error
print(Extension(this).extensionNumProperty);
}
for (Extension(this)?.extensionNumProperty in [1]) { // Error
print(Extension(this)?.extensionNumProperty);
}
for (Extension(this).extensionStringProperty in [1]) { // Error
print(Extension(this).extensionStringProperty);
}
for (Extension(this)?.extensionStringProperty in [1]) { // Error
print(Extension(this)?.extensionStringProperty);
}
for (Extension(this).extensionStringProperty in <int>[1]) { // Error
print(Extension(this).extensionStringProperty);
}
for (Extension(this)?.extensionStringProperty in <int>[1]) { // Error
print(Extension(this)?.extensionStringProperty);
}
for (Extension(this).extensionReadOnlyProperty in [1]) { // Error
print(Extension(this).extensionReadOnlyProperty);
}
for (Extension(this)?.extensionReadOnlyProperty in [1]) { // Error
print(Extension(this)?.extensionReadOnlyProperty);
}
for (0[0] in [1]) { // Error
print(0[0]);
}
for (0?[0] in [1]) { // Error
print(0?[0]);
}
for (IndexExtension(0)[0] in [1]) { // Error
print(IndexExtension(0)[0]);
}
for (IndexExtension(0)?[0] in [1]) { // Error
print(IndexExtension(0)?[0]);
}
}
method() {
for (intField in [1]) { // Ok
print(intField);
}
for (numField in [1]) { // Ok
print(numField);
}
for (lateField in [1]) { // Ok
print(lateField);
}
for (intStaticField in [1]) { // Ok
print(intStaticField);
}
for (numStaticField in [1]) { // Ok
print(numStaticField);
}
for (lateStaticField in [1]) { // Ok
print(lateStaticField);
}
for (extensionIntProperty in [1]) { // Ok
print(extensionIntProperty);
}
for (extensionNumProperty in [1]) { // Ok
print(extensionNumProperty);
}
}
}
class Subclass extends Class {
test() {
for (super.stringField in [1]) { // Error
print(super.stringField);
}
for (super.stringField in <int>[1]) { // Error
print(super.stringField);
}
for (super.intField in [1]) { // Error
print(super.intField);
}
for (super.numField in [1]) { // Error
print(super.numField);
}
for (super.lateField in [1]) { // Error
print(super.lateField);
}
for (super[0] in [1]) { // Error
print(super[0]);
}
for (super?[0] in [1]) { // Error
print(super[0]);
}
}
}
extension Extension on Class {
int get extensionIntProperty => 0;
void set extensionIntProperty(int value) {}
num get extensionNumProperty => 0;
void set extensionNumProperty(num value) {}
String get extensionStringProperty => '';
void set extensionStringProperty(String value) {}
int get extensionReadOnlyProperty => 0;
static int intStaticField = 0;
static num numStaticField = 0;
static String stringStaticField = '';
static final int finalStaticField = 0;
static late int lateStaticField;
static late final int lateFinalStaticField;
test() {
for (this.intField in [1]) { // Error
print(this.intField);
}
for (this?.intField in [1]) { // Error
print(this?.intField);
}
for (this.numField in [1]) { // Error
print(this.numField);
}
for (this?.numField in [1]) { // Error
print(this?.numField);
}
for (this.lateField in [1]) { // Error
print(this.lateField);
}
for (this?.lateField in [1]) { // Error
print(this?.lateField);
}
for (this.extensionIntProperty in [1]) { // Error
print(this.extensionIntProperty);
}
for (this?.extensionIntProperty in [1]) { // Error
print(this?.extensionIntProperty);
}
for (this.extensionNumProperty in [1]) { // Error
print(this.extensionNumProperty);
}
for (this?.extensionNumProperty in [1]) { // Error
print(this?.extensionNumProperty);
}
for (extensionStringProperty in [1]) { // Error
print(extensionStringProperty);
}
for (this.extensionStringProperty in [1]) { // Error
print(this.extensionStringProperty);
}
for (this?.extensionStringProperty in [1]) { // Error
print(this?.extensionStringProperty);
}
for (extensionStringProperty in <int>[1]) { // Error
print(extensionStringProperty);
}
for (this.extensionStringProperty in <int>[1]) { // Error
print(this.extensionStringProperty);
}
for (this?.extensionStringProperty in <int>[1]) { // Error
print(this?.extensionStringProperty);
}
for (extensionReadOnlyProperty in [1]) { // Error
print(extensionReadOnlyProperty);
}
for (this.extensionReadOnlyProperty in [1]) { // Error
print(this.extensionReadOnlyProperty);
}
for (this?.extensionReadOnlyProperty in [1]) { // Error
print(this?.extensionReadOnlyProperty);
}
for (finalStaticField in [1]) { // Error
print(finalStaticField);
}
for (stringStaticField in [1]) { // Error
print(stringStaticField);
}
for (stringStaticField in <int>[1]) { // Error
print(stringStaticField);
}
for (lateFinalStaticField in [1]) { // Ok
print(lateFinalStaticField);
}
}
extensionMethod() {
for (intField in [1]) { // Ok
print(intField);
}
for (numField in [1]) { // Ok
print(numField);
}
for (lateField in [1]) { // Ok
print(lateField);
}
for (extensionIntProperty in [1]) { // Ok
print(extensionIntProperty);
}
for (extensionNumProperty in [1]) { // Ok
print(extensionNumProperty);
}
for (intStaticField in [1]) { // Ok
print(intStaticField);
}
for (numStaticField in [1]) { // Ok
print(numStaticField);
}
for (lateStaticField in [1]) { // Ok
print(lateStaticField);
}
}
}
extension IndexExtension on int {
operator[]=(int index, int value) {}
int operator[](int index) => 0;
extensionMethod() {
for (this[0] in [1]) { // Error
print(this[0]);
}
for (this?[0] in [1]) { // Error
print(this?[0]);
}
}
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,108 @@
library;
import self as self;
import "dart:core" as core;
import "org-dartlang-testcase:///for_in.dart" deferred as defer hide Extension, IndexExtension;
class Class extends core::Object {
field core::int intField;
field core::num numField;
field core::String stringField;
final field core::int finalField;
late field core::int lateField;
late final [setter] field core::int lateFinalField;
static field core::int intStaticField;
static field core::num numStaticField;
static field core::String stringStaticField;
static final field core::int finalStaticField;
late static field core::int lateStaticField;
late static final [setter] field core::int lateFinalStaticField;
synthetic constructor •() → self::Class
;
operator []=(core::int index, core::int value) → void
;
operator [](core::int index) → core::int
;
method test() → dynamic
;
method method() → dynamic
;
}
class Subclass extends self::Class {
synthetic constructor •() → self::Subclass
;
method test() → dynamic
;
}
extension Extension on self::Class {
get extensionIntProperty = self::Extension|get#extensionIntProperty;
set extensionIntProperty = self::Extension|set#extensionIntProperty;
get extensionNumProperty = self::Extension|get#extensionNumProperty;
set extensionNumProperty = self::Extension|set#extensionNumProperty;
get extensionStringProperty = self::Extension|get#extensionStringProperty;
set extensionStringProperty = self::Extension|set#extensionStringProperty;
get extensionReadOnlyProperty = self::Extension|get#extensionReadOnlyProperty;
static field intStaticField = self::Extension|intStaticField;
static field numStaticField = self::Extension|numStaticField;
static field stringStaticField = self::Extension|stringStaticField;
static field finalStaticField = self::Extension|finalStaticField;
static field lateStaticField = self::Extension|lateStaticField;
static field lateFinalStaticField = self::Extension|lateFinalStaticField;
method test = self::Extension|test;
method tearoff test = self::Extension|get#test;
method extensionMethod = self::Extension|extensionMethod;
method tearoff extensionMethod = self::Extension|get#extensionMethod;
}
extension IndexExtension on core::int {
operator []= = self::IndexExtension|[]=;
operator [] = self::IndexExtension|[];
method extensionMethod = self::IndexExtension|extensionMethod;
method tearoff extensionMethod = self::IndexExtension|get#extensionMethod;
}
static field core::int intTopLevel;
static final field core::int finalTopLevel;
static const field core::int constTopLevel = 0;
late static field core::int lateTopLevel;
late static final [setter] field core::int lateFinalTopLevel;
static field core::num numTopLevel;
static field core::String stringTopLevel;
static field core::int Extension|intStaticField;
static field core::num Extension|numStaticField;
static field core::String Extension|stringStaticField;
static final field core::int Extension|finalStaticField;
late static field core::int Extension|lateStaticField;
late static final [setter] field core::int Extension|lateFinalStaticField;
static method test() → dynamic
;
static method main() → dynamic
;
static extension-member method Extension|get#extensionIntProperty(lowered final self::Class #this) → core::int
;
static extension-member method Extension|set#extensionIntProperty(lowered final self::Class #this, core::int value) → void
;
static extension-member method Extension|get#extensionNumProperty(lowered final self::Class #this) → core::num
;
static extension-member method Extension|set#extensionNumProperty(lowered final self::Class #this, core::num value) → void
;
static extension-member method Extension|get#extensionStringProperty(lowered final self::Class #this) → core::String
;
static extension-member method Extension|set#extensionStringProperty(lowered final self::Class #this, core::String value) → void
;
static extension-member method Extension|get#extensionReadOnlyProperty(lowered final self::Class #this) → core::int
;
static extension-member method Extension|test(lowered final self::Class #this) → dynamic
;
static extension-member method Extension|get#test(lowered final self::Class #this) → () → dynamic
return () → dynamic => self::Extension|test(#this);
static extension-member method Extension|extensionMethod(lowered final self::Class #this) → dynamic
;
static extension-member method Extension|get#extensionMethod(lowered final self::Class #this) → () → dynamic
return () → dynamic => self::Extension|extensionMethod(#this);
static extension-member method IndexExtension|[]=(lowered final core::int #this, core::int index, core::int value) → void
;
static extension-member method IndexExtension|[](lowered final core::int #this, core::int index) → core::int
;
static extension-member method IndexExtension|extensionMethod(lowered final core::int #this) → dynamic
;
static extension-member method IndexExtension|get#extensionMethod(lowered final core::int #this) → () → dynamic
return () → dynamic => self::IndexExtension|extensionMethod(#this);
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,66 @@
import 'for_in.dart' deferred as defer hide Extension, IndexExtension;
int intTopLevel = 0;
final int finalTopLevel = 0;
const int constTopLevel = 0;
late int lateTopLevel;
late final int lateFinalTopLevel;
num numTopLevel = 0;
String stringTopLevel = '';
test() {}
main() {}
class Class {
int intField = 0;
num numField = 0;
String stringField = '';
final int finalField = 0;
late int lateField;
late final int lateFinalField;
static int intStaticField = 0;
static num numStaticField = 0;
static String stringStaticField = '';
static final int finalStaticField = 0;
static late int lateStaticField;
static late final int lateFinalStaticField;
operator []=(int index, int value) {}
int operator [](int index) => 0;
test() {}
method() {}
}
class Subclass extends Class {
test() {}
}
extension Extension on Class {
int get extensionIntProperty => 0;
void set extensionIntProperty(int value) {}
num get extensionNumProperty => 0;
void set extensionNumProperty(num value) {}
String get extensionStringProperty => '';
void set extensionStringProperty(String value) {}
int get extensionReadOnlyProperty => 0;
static int intStaticField = 0;
static num numStaticField = 0;
static String stringStaticField = '';
static final int finalStaticField = 0;
static late int lateStaticField;
static late final int lateFinalStaticField;
test() {}
extensionMethod() {}
}
extension IndexExtension on int {
operator []=(int index, int value) {}
int operator [](int index) => 0;
extensionMethod() {}
}
@@ -0,0 +1,66 @@
import 'for_in.dart' deferred as defer hide Extension, IndexExtension;
String stringTopLevel = '';
class Class {
String stringField = '';
final int finalField = 0;
int intField = 0;
int operator [](int index) => 0;
late final int lateFinalField;
late int lateField;
method() {}
num numField = 0;
operator []=(int index, int value) {}
static String stringStaticField = '';
static final int finalStaticField = 0;
static int intStaticField = 0;
static late final int lateFinalStaticField;
static late int lateStaticField;
static num numStaticField = 0;
test() {}
}
class Subclass extends Class {
test() {}
}
const int constTopLevel = 0;
extension Extension on Class {
String get extensionStringProperty => '';
extensionMethod() {}
int get extensionIntProperty => 0;
int get extensionReadOnlyProperty => 0;
num get extensionNumProperty => 0;
static String stringStaticField = '';
static final int finalStaticField = 0;
static int intStaticField = 0;
static late final int lateFinalStaticField;
static late int lateStaticField;
static num numStaticField = 0;
test() {}
void set extensionIntProperty(int value) {}
void set extensionNumProperty(num value) {}
void set extensionStringProperty(String value) {}
}
extension IndexExtension on int {
extensionMethod() {}
int operator [](int index) => 0;
operator []=(int index, int value) {}
}
final int finalTopLevel = 0;
int intTopLevel = 0;
late final int lateFinalTopLevel;
late int lateTopLevel;
main() {}
num numTopLevel = 0;
test() {}
@@ -0,0 +1,29 @@
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
List makeList(List list) => list;
Stream makeStream(List list) async* {
for (var e in list) {
yield e;
}
}
test() async {
for (String i in makeList([1, 2, 3])) {
print(i);
}
await for (String i in makeStream([1, 2, 3])) {
print(i);
}
}
main() async {
for (int i in makeList([1, 2, 3])) {
print(i);
}
await for (int i in makeStream([1, 2, 3])) {
print(i);
}
}
@@ -0,0 +1,32 @@
library;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;
static method makeList(core::List<dynamic> list) → core::List<dynamic>
return list;
static method makeStream(core::List<dynamic> list) → asy::Stream<dynamic> async* /* emittedValueType= dynamic */ {
for (dynamic e in list) {
yield e;
}
}
static method test() → dynamic async /* emittedValueType= dynamic */ {
for (final dynamic #t1 in self::makeList(<dynamic>[1, 2, 3])) {
core::String i = #t1 as{TypeError,ForDynamic} core::String;
core::print(i);
}
await for (final dynamic #t2 in self::makeStream(<dynamic>[1, 2, 3])) {
core::String i = #t2 as{TypeError,ForDynamic} core::String;
core::print(i);
}
}
static method main() → dynamic async /* emittedValueType= dynamic */ {
for (final dynamic #t3 in self::makeList(<dynamic>[1, 2, 3])) {
core::int i = #t3 as{TypeError,ForDynamic} core::int;
core::print(i);
}
await for (final dynamic #t4 in self::makeStream(<dynamic>[1, 2, 3])) {
core::int i = #t4 as{TypeError,ForDynamic} core::int;
core::print(i);
}
}
@@ -0,0 +1,32 @@
library;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;
static method makeList(core::List<dynamic> list) → core::List<dynamic>
return list;
static method makeStream(core::List<dynamic> list) → asy::Stream<dynamic> async* /* emittedValueType= dynamic */ {
for (dynamic e in list) {
yield e;
}
}
static method test() → dynamic async /* emittedValueType= dynamic */ {
for (final dynamic #t1 in self::makeList(<dynamic>[1, 2, 3])) {
core::String i = #t1 as{TypeError,ForDynamic} core::String;
core::print(i);
}
await for (final dynamic #t2 in self::makeStream(<dynamic>[1, 2, 3])) {
core::String i = #t2 as{TypeError,ForDynamic} core::String;
core::print(i);
}
}
static method main() → dynamic async /* emittedValueType= dynamic */ {
for (final dynamic #t3 in self::makeList(<dynamic>[1, 2, 3])) {
core::int i = #t3 as{TypeError,ForDynamic} core::int;
core::print(i);
}
await for (final dynamic #t4 in self::makeStream(<dynamic>[1, 2, 3])) {
core::int i = #t4 as{TypeError,ForDynamic} core::int;
core::print(i);
}
}
@@ -0,0 +1,13 @@
library;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;
static method makeList(core::List<dynamic> list) → core::List<dynamic>
;
static method makeStream(core::List<dynamic> list) → asy::Stream<dynamic> async*
;
static method test() → dynamic async
;
static method main() → dynamic async
;
@@ -0,0 +1,72 @@
library;
import self as self;
import "dart:core" as core;
import "dart:async" as asy;
static method makeList(core::List<dynamic> list) → core::List<dynamic>
return list;
static method makeStream(core::List<dynamic> list) → asy::Stream<dynamic> async* /* emittedValueType= dynamic */ {
{
synthesized core::Iterator<dynamic> :sync-for-iterator = list.{core::Iterable::iterator}{core::Iterator<dynamic>};
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
dynamic e = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
yield e;
}
}
}
}
static method test() → dynamic async /* emittedValueType= dynamic */ {
{
synthesized core::Iterator<dynamic> :sync-for-iterator = self::makeList(core::_GrowableList::_literal3<dynamic>(1, 2, 3)).{core::Iterable::iterator}{core::Iterator<dynamic>};
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t1 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
core::String i = #t1 as{TypeError,ForDynamic} core::String;
core::print(i);
}
}
}
{
synthesized asy::Stream<dynamic> :stream = self::makeStream(core::_GrowableList::_literal3<dynamic>(1, 2, 3));
synthesized asy::_StreamIterator<dynamic>? :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
try
while (let dynamic #t2 = asy::_asyncStarMoveNextHelper(:stream) in await :for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}) {
final dynamic #t3 = :for-iterator.{asy::_StreamIterator::current}{dynamic};
{
core::String i = #t3 as{TypeError,ForDynamic} core::String;
core::print(i);
}
}
finally
if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<dynamic>?} == null))
await :for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>};
}
}
static method main() → dynamic async /* emittedValueType= dynamic */ {
{
synthesized core::Iterator<dynamic> :sync-for-iterator = self::makeList(core::_GrowableList::_literal3<dynamic>(1, 2, 3)).{core::Iterable::iterator}{core::Iterator<dynamic>};
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t4 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
core::int i = #t4 as{TypeError,ForDynamic} core::int;
core::print(i);
}
}
}
{
synthesized asy::Stream<dynamic> :stream = self::makeStream(core::_GrowableList::_literal3<dynamic>(1, 2, 3));
synthesized asy::_StreamIterator<dynamic>? :for-iterator = new asy::_StreamIterator::•<dynamic>(:stream);
try
while (let dynamic #t5 = asy::_asyncStarMoveNextHelper(:stream) in await :for-iterator.{asy::_StreamIterator::moveNext}(){() → asy::Future<core::bool>}) {
final dynamic #t6 = :for-iterator.{asy::_StreamIterator::current}{dynamic};
{
core::int i = #t6 as{TypeError,ForDynamic} core::int;
core::print(i);
}
}
finally
if(!(:for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<dynamic>?} == null))
await :for-iterator.{asy::_StreamIterator::cancel}(){() → asy::Future<dynamic>};
}
}
@@ -0,0 +1,7 @@
List makeList(List list) => list;
Stream makeStream(List list) async* {}
test() async {}
main() async {}
@@ -0,0 +1,7 @@
List makeList(List list) => list;
Stream makeStream(List list) async* {}
main() async {}
test() async {}
@@ -0,0 +1,15 @@
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
main() {
for (void Function() e in <A>[A()]) {
e();
}
}
class A {
void call() {
print('A');
}
}
@@ -0,0 +1,18 @@
library;
import self as self;
import "dart:core" as core;
class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
method call() → void {
core::print("A");
}
}
static method main() → dynamic {
for (final self::A #t1 in <self::A>[new self::A::•()]) {
() → void e = let final self::A #t2 = #t1 in #t2 == null ?{() → void} null : #t2.{self::A::call}{() → void};
e(){() → void};
}
}
@@ -0,0 +1,18 @@
library;
import self as self;
import "dart:core" as core;
class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
method call() → void {
core::print("A");
}
}
static method main() → dynamic {
for (final self::A #t1 in <self::A>[new self::A::•()]) {
() → void e = let final self::A #t2 = #t1 in #t2 == null ?{() → void} null : #t2.{self::A::call}{() → void};
e(){() → void};
}
}
@@ -0,0 +1,12 @@
library;
import self as self;
import "dart:core" as core;
class A extends core::Object {
synthetic constructor •() → self::A
;
method call() → void
;
}
static method main() → dynamic
;
@@ -0,0 +1,24 @@
library;
import self as self;
import "dart:core" as core;
class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
method call() → void {
core::print("A");
}
}
static method main() → dynamic {
{
synthesized core::Iterator<self::A> :sync-for-iterator = core::_GrowableList::_literal1<self::A>(new self::A::•()).{core::Iterable::iterator}{core::Iterator<self::A>};
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final self::A #t1 = :sync-for-iterator.{core::Iterator::current}{self::A};
{
() → void e = let final self::A #t2 = #t1 in #t2 == null ?{() → void} null : #t2.{self::A::call}{() → void};
e(){() → void};
}
}
}
}
@@ -0,0 +1,5 @@
main() {}
class A {
void call() {}
}
@@ -0,0 +1,5 @@
class A {
void call() {}
}
main() {}
@@ -0,0 +1,19 @@
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Derived from co19/TypeSystem/flow-analysis/reachability_for_in_A02_t07
test(int? n) {
if (n != null) /* n promoted to `int` */ {
for (n in [42]) /* n is not promoted not demoted here */ {
n.isEven; // n is still `int`
}
n.isEven;
}
}
main() {
test(42);
test(null);
}
@@ -0,0 +1,17 @@
library;
import self as self;
import "dart:core" as core;
static method test(core::int? n) → dynamic {
if(!(n == null)) {
for (final core::int #t1 in <core::int>[42]) {
n = #t1;
n{core::int}.{core::int::isEven}{core::bool};
}
n{core::int}.{core::int::isEven}{core::bool};
}
}
static method main() → dynamic {
self::test(42);
self::test(null);
}
@@ -0,0 +1,17 @@
library;
import self as self;
import "dart:core" as core;
static method test(core::int? n) → dynamic {
if(!(n == null)) {
for (final core::int #t1 in <core::int>[42]) {
n = #t1;
n{core::int}.{core::int::isEven}{core::bool};
}
n{core::int}.{core::int::isEven}{core::bool};
}
}
static method main() → dynamic {
self::test(42);
self::test(null);
}
@@ -0,0 +1,8 @@
library;
import self as self;
import "dart:core" as core;
static method test(core::int? n) → dynamic
;
static method main() → dynamic
;
@@ -0,0 +1,23 @@
library;
import self as self;
import "dart:core" as core;
static method test(core::int? n) → dynamic {
if(!(n == null)) {
{
synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::_literal1<core::int>(42).{core::Iterable::iterator}{core::Iterator<core::int>};
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final core::int #t1 = :sync-for-iterator.{core::Iterator::current}{core::int};
{
n = #t1;
n{core::int}.{core::int::isEven}{core::bool};
}
}
}
n{core::int}.{core::int::isEven}{core::bool};
}
}
static method main() → dynamic {
self::test(42);
self::test(null);
}
@@ -0,0 +1,3 @@
test(int? n) {}
main() {}
@@ -0,0 +1,3 @@
main() {}
test(int? n) {}
@@ -54,18 +54,6 @@ library;
// for (unresolved in []) {}
// ^^^^^^^^^^
//
// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
// - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
// for (unresolved.foo in []) {}
// ^^^^^^^^^^
//
// pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
// - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
// for (c.unresolved in []) {}
// ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -111,56 +99,55 @@ class C extends self::Super {
for (final dynamic #t8 in <dynamic>[]) {
self::untypedTopLevelField = #t8;
}
for (final core::int #t9 in <core::int>[]) {
super.{self::Super::superInstanceField} = #t9;
for (final dynamic #t9 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:32:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (super.superInstanceField in []) {}
^";
}
for (final dynamic #t10 in <dynamic>[]) {
super.{self::Super::untypedSuperInstanceField} = #t10;
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:33:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (super.untypedSuperInstanceField in []) {}
^";
}
self::C c = new self::C::•();
for (final core::int #t11 in <core::int>[]) {
c.{self::C::instanceField} = #t11;
for (final dynamic #t11 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:35:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (c.instanceField in []) {}
^";
}
for (final dynamic #t12 in <dynamic>[]) {
c.{self::Super::untypedSuperInstanceField} = #t12;
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:36:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (c.untypedSuperInstanceField in []) {}
^";
}
for (final dynamic #t13 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
for (unresolved in []) {}
^^^^^^^^^^" in this.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
for (unresolved in []) {}
^^^^^^^^^^";
^^^^^^^^^^" in this.{<unresolved>}unresolved = #t13;
}
for (final dynamic #t14 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:21: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (unresolved.foo in []) {}
^^^^^^^^^^" in this{<unresolved>}.unresolved.{<invalid>}foo = #t14;
^";
}
for (final dynamic #t15 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (c.unresolved in []) {}
^^^^^^^^^^" in c.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
for (c.unresolved in []) {}
^^^^^^^^^^";
^";
}
{
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
for (main() in []) {}
^^^^";
for (final dynamic #t16 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
for (main() in []) {}
^^^^";
self::main();
}
}
@@ -169,9 +156,6 @@ Try correcting the name to the name of an existing setter, or defining a setter
for (var x, y in <int>[]) {
^^^";
for (final core::int #t17 in <core::int>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
for (var x, y in <int>[]) {
^^^";
dynamic x;
dynamic y;
core::print(x);
@@ -54,18 +54,6 @@ library;
// for (unresolved in []) {}
// ^^^^^^^^^^
//
// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
// - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
// for (unresolved.foo in []) {}
// ^^^^^^^^^^
//
// pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
// - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
// for (c.unresolved in []) {}
// ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -111,56 +99,55 @@ class C extends self::Super {
for (final dynamic #t8 in <dynamic>[]) {
self::untypedTopLevelField = #t8;
}
for (final core::int #t9 in <core::int>[]) {
super.{self::Super::superInstanceField} = #t9;
for (final dynamic #t9 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:32:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (super.superInstanceField in []) {}
^";
}
for (final dynamic #t10 in <dynamic>[]) {
super.{self::Super::untypedSuperInstanceField} = #t10;
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:33:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (super.untypedSuperInstanceField in []) {}
^";
}
self::C c = new self::C::•();
for (final core::int #t11 in <core::int>[]) {
c.{self::C::instanceField} = #t11;
for (final dynamic #t11 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:35:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (c.instanceField in []) {}
^";
}
for (final dynamic #t12 in <dynamic>[]) {
c.{self::Super::untypedSuperInstanceField} = #t12;
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:36:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (c.untypedSuperInstanceField in []) {}
^";
}
for (final dynamic #t13 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
for (unresolved in []) {}
^^^^^^^^^^" in this.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
for (unresolved in []) {}
^^^^^^^^^^";
^^^^^^^^^^" in this.{<unresolved>}unresolved = #t13;
}
for (final dynamic #t14 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:21: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (unresolved.foo in []) {}
^^^^^^^^^^" in this{<unresolved>}.unresolved.{<invalid>}foo = #t14;
^";
}
for (final dynamic #t15 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (c.unresolved in []) {}
^^^^^^^^^^" in c.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
for (c.unresolved in []) {}
^^^^^^^^^^";
^";
}
{
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
for (main() in []) {}
^^^^";
for (final dynamic #t16 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
for (main() in []) {}
^^^^";
self::main();
}
}
@@ -169,9 +156,6 @@ Try correcting the name to the name of an existing setter, or defining a setter
for (var x, y in <int>[]) {
^^^";
for (final core::int #t17 in <core::int>[]) {
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
for (var x, y in <int>[]) {
^^^";
dynamic x;
dynamic y;
core::print(x);
@@ -54,18 +54,6 @@ library;
// for (unresolved in []) {}
// ^^^^^^^^^^
//
// pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
// - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
// Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
// for (unresolved.foo in []) {}
// ^^^^^^^^^^
//
// pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
// - 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
// Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
// for (c.unresolved in []) {}
// ^^^^^^^^^^
//
import self as self;
import "dart:core" as core;
@@ -160,11 +148,14 @@ class C extends self::Super {
}
}
{
synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::•<core::int>(0).{core::Iterable::iterator}{core::Iterator<core::int>};
synthesized core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::•<dynamic>(0).{core::Iterable::iterator}{core::Iterator<dynamic>};
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final core::int #t9 = :sync-for-iterator.{core::Iterator::current}{core::int};
final dynamic #t9 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
super.{self::Super::superInstanceField} = #t9;
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:32:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (super.superInstanceField in []) {}
^";
}
}
}
@@ -173,17 +164,23 @@ class C extends self::Super {
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t10 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
super.{self::Super::untypedSuperInstanceField} = #t10;
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:33:16: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (super.untypedSuperInstanceField in []) {}
^";
}
}
}
self::C c = new self::C::•();
{
synthesized core::Iterator<core::int> :sync-for-iterator = core::_GrowableList::•<core::int>(0).{core::Iterable::iterator}{core::Iterator<core::int>};
synthesized core::Iterator<dynamic> :sync-for-iterator = core::_GrowableList::•<dynamic>(0).{core::Iterable::iterator}{core::Iterator<dynamic>};
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final core::int #t11 = :sync-for-iterator.{core::Iterator::current}{core::int};
final dynamic #t11 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
c.{self::C::instanceField} = #t11;
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:35:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (c.instanceField in []) {}
^";
}
}
}
@@ -192,7 +189,10 @@ class C extends self::Super {
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t12 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
c.{self::Super::untypedSuperInstanceField} = #t12;
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:36:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (c.untypedSuperInstanceField in []) {}
^";
}
}
}
@@ -205,11 +205,7 @@ class C extends self::Super {
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
for (unresolved in []) {}
^^^^^^^^^^" in this.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:37:10: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
for (unresolved in []) {}
^^^^^^^^^^";
^^^^^^^^^^" in this.{<unresolved>}unresolved = #t13;
}
}
}
@@ -218,11 +214,10 @@ Try correcting the name to the name of an existing setter, or defining a setter
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t14 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:10: Error: The getter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'unresolved'.
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:38:21: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (unresolved.foo in []) {}
^^^^^^^^^^" in this{<unresolved>}.unresolved.{<invalid>}foo = #t14;
^";
}
}
}
@@ -231,15 +226,10 @@ Try correcting the name to the name of an existing getter, or defining a getter
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t15 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The element in a for-in loop must be an identifier or a local variable declaration.
Try using an existing variable or a variable declaration.
for (c.unresolved in []) {}
^^^^^^^^^^" in c.{<unresolved>}unresolved = invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:39:12: Error: The setter 'unresolved' isn't defined for the type 'C'.
- 'C' is from 'pkg/front_end/testcases/general/for_in_without_declaration.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'unresolved'.
for (c.unresolved in []) {}
^^^^^^^^^^";
^";
}
}
}
@@ -252,9 +242,6 @@ Try correcting the name to the name of an existing setter, or defining a setter
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t16 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:40:10: Error: Can't assign to this, so it can't be used in a for-in loop.
for (main() in []) {}
^^^^";
self::main();
}
}
@@ -269,9 +256,6 @@ Try correcting the name to the name of an existing setter, or defining a setter
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final core::int #t17 = :sync-for-iterator.{core::Iterator::current}{core::int};
{
invalid-expression "pkg/front_end/testcases/general/for_in_without_declaration.dart:41:10: Error: A for-in loop can't have more than one loop variable.
for (var x, y in <int>[]) {
^^^";
dynamic x;
dynamic y;
core::print(x);
@@ -4,13 +4,11 @@ library test;
//
// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
// - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
// Try changing the type of the variable.
// for (i in iterable) {}
// ^
//
// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
// - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
// Try changing the type of the variable.
// await for (i in stream) {}
// ^
//
@@ -48,14 +46,12 @@ static method test(core::Iterable<self::B> iterable, asy::Stream<self::B> stream
for (final self::B #t5 in iterable) {
i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
- 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
Try changing the type of the variable.
for (i in iterable) {}
^" in #t5 as{TypeError} core::int;
}
await for (final self::B #t6 in stream) {
i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
- 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
Try changing the type of the variable.
await for (i in stream) {}
^" in #t6 as{TypeError} core::int;
}
@@ -4,13 +4,11 @@ library test;
//
// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
// - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
// Try changing the type of the variable.
// for (i in iterable) {}
// ^
//
// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
// - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
// Try changing the type of the variable.
// await for (i in stream) {}
// ^
//
@@ -48,14 +46,12 @@ static method test(core::Iterable<self::B> iterable, asy::Stream<self::B> stream
for (final self::B #t5 in iterable) {
i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
- 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
Try changing the type of the variable.
for (i in iterable) {}
^" in #t5 as{TypeError} core::int;
}
await for (final self::B #t6 in stream) {
i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
- 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
Try changing the type of the variable.
await for (i in stream) {}
^" in #t6 as{TypeError} core::int;
}
@@ -4,13 +4,11 @@ library test;
//
// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
// - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
// Try changing the type of the variable.
// for (i in iterable) {}
// ^
//
// pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
// - 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
// Try changing the type of the variable.
// await for (i in stream) {}
// ^
//
@@ -86,7 +84,6 @@ static method test(core::Iterable<self::B> iterable, asy::Stream<self::B> stream
{
i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:20:10: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
- 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
Try changing the type of the variable.
for (i in iterable) {}
^" in #t7 as{TypeError} core::int;
}
@@ -101,7 +98,6 @@ Try changing the type of the variable.
{
i = invalid-expression "pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart:21:16: Error: A value of type 'B' can't be assigned to a variable of type 'int'.
- 'B' is from 'pkg/front_end/testcases/inference_new/for_each_outer_var_type.dart'.
Try changing the type of the variable.
await for (i in stream) {}
^" in #t9 as{TypeError} core::int;
}
@@ -135,9 +135,9 @@ static method propertyAccess(self::Class1? n1) → void {
let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
- 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
@@ -160,10 +160,10 @@ Try accessing using ?. instead.
let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
@@ -173,13 +173,13 @@ Try accessing using ?. instead.
let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
@@ -187,14 +187,14 @@ Try accessing using ?. instead.
nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
@@ -204,7 +204,7 @@ Try accessing using ?. instead.
let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
}
@@ -135,9 +135,9 @@ static method propertyAccess(self::Class1? n1) → void {
let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
- 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
@@ -160,10 +160,10 @@ Try accessing using ?. instead.
let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
@@ -173,13 +173,13 @@ Try accessing using ?. instead.
let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
@@ -187,14 +187,14 @@ Try accessing using ?. instead.
nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
@@ -204,7 +204,7 @@ Try accessing using ?. instead.
let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
}
@@ -135,9 +135,9 @@ static method propertyAccess(self::Class1? n1) → void {
let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart:93:59: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
- 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_explicit_extension.dart'.
@@ -160,10 +160,10 @@ Try accessing using ?. instead.
let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
@@ -173,13 +173,13 @@ Try accessing using ?. instead.
let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
@@ -187,14 +187,14 @@ Try accessing using ?. instead.
nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
@@ -204,7 +204,7 @@ Try accessing using ?. instead.
let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
}
@@ -129,15 +129,15 @@ static method main() → dynamic {
static method propertyAccess(self::Class1? n1) → void {
self::Class1? nullable1 = n1;
let final self::Class1? #t1 = n1 in #t1 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t1{self::Class1});
let final self::Class1? #t2 = n1 in #t2 == null ?{void} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
let final self::Class1? #t2 = n1 in #t2 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
nullable1 = let final self::Class1? #t3 = n1 in #t3 == null ?{self::Class1?} null : let final self::Class1 #t4 = new self::Class1::•() in let final void #t5 = self::Extension1|set#nullable1(#t3{self::Class1}, #t4) in #t4;
let final self::Class1? #t6 = n1 in #t6 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t6{self::Class1});
let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
- 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
@@ -153,58 +153,58 @@ Try accessing using ?. instead.
nullable1 = let final self::Class1? #t26 = n1 in #t26 == null ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27 == null ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
nullable1 = let final self::Class1? #t30 = n1 in #t30 == null ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31 == null ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
let final self::Class1? #t34 = n1 in #t34 == null ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
let final self::Class1? #t36 = n1 in #t36 == null ?{void} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t36 = n1 in #t36 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t37 = n1 in #t37 == null ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
let final self::Class1? #t40 = n1 in #t40 == null ?{void} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
let final self::Class1? #t40 = n1 in #t40 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
nullable1 = let final self::Class1? #t43 = n1 in #t43 == null ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
let final self::Class1? #t48 = n1 in #t48 == null ?{void} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
let final self::Class1? #t62 = n1 in #t62 == null ?{void} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
nullable1 = let final self::Class1? #t63 = n1 in #t63 == null ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
let final self::Class1? #t66 = n1 in #t66 == null ?{void} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
let final self::Class1? #t66 = n1 in #t66 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
nullable1 = let final self::Class1? #t69 = n1 in #t69 == null ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
let final self::Class1? #t74 = n1 in #t74 == null ?{void} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
let final self::Class1? #t97 = n1 in #t97 == null ?{void} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
let final self::Class1? #t105 = n1 in #t105 == null ?{void} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
let final self::Class1? #t105 = n1 in #t105 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
let final self::Class1? #t117 = n1 in #t117 == null ?{void} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
let final self::Class1? #t147 = n1 in #t147 == null ?{void} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
nullable1 = let final self::Class1? #t148 = n1 in #t148 == null ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
let final self::Class1? #t151 = n1 in #t151 == null ?{void} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
let final self::Class1? #t151 = n1 in #t151 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
nullable1 = let final self::Class1? #t154 = n1 in #t154 == null ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
let final self::Class1? #t159 = n1 in #t159 == null ?{void} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
}
@@ -129,15 +129,15 @@ static method main() → dynamic {
static method propertyAccess(self::Class1? n1) → void {
self::Class1? nullable1 = n1;
let final self::Class1? #t1 = n1 in #t1 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t1{self::Class1});
let final self::Class1? #t2 = n1 in #t2 == null ?{void} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
let final self::Class1? #t2 = n1 in #t2 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
nullable1 = let final self::Class1? #t3 = n1 in #t3 == null ?{self::Class1?} null : let final self::Class1 #t4 = new self::Class1::•() in let final void #t5 = self::Extension1|set#nullable1(#t3{self::Class1}, #t4) in #t4;
let final self::Class1? #t6 = n1 in #t6 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t6{self::Class1});
let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
- 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
@@ -153,58 +153,58 @@ Try accessing using ?. instead.
nullable1 = let final self::Class1? #t26 = n1 in #t26 == null ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27 == null ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
nullable1 = let final self::Class1? #t30 = n1 in #t30 == null ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31 == null ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
let final self::Class1? #t34 = n1 in #t34 == null ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
let final self::Class1? #t36 = n1 in #t36 == null ?{void} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t36 = n1 in #t36 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t37 = n1 in #t37 == null ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
let final self::Class1? #t40 = n1 in #t40 == null ?{void} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
let final self::Class1? #t40 = n1 in #t40 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
nullable1 = let final self::Class1? #t43 = n1 in #t43 == null ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
let final self::Class1? #t48 = n1 in #t48 == null ?{void} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
let final self::Class1? #t62 = n1 in #t62 == null ?{void} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
nullable1 = let final self::Class1? #t63 = n1 in #t63 == null ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
let final self::Class1? #t66 = n1 in #t66 == null ?{void} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
let final self::Class1? #t66 = n1 in #t66 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
nullable1 = let final self::Class1? #t69 = n1 in #t69 == null ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
let final self::Class1? #t74 = n1 in #t74 == null ?{void} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
let final self::Class1? #t97 = n1 in #t97 == null ?{void} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
let final self::Class1? #t105 = n1 in #t105 == null ?{void} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
let final self::Class1? #t105 = n1 in #t105 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
let final self::Class1? #t117 = n1 in #t117 == null ?{void} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
let final self::Class1? #t147 = n1 in #t147 == null ?{void} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
nullable1 = let final self::Class1? #t148 = n1 in #t148 == null ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
let final self::Class1? #t151 = n1 in #t151 == null ?{void} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
let final self::Class1? #t151 = n1 in #t151 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
nullable1 = let final self::Class1? #t154 = n1 in #t154 == null ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
let final self::Class1? #t159 = n1 in #t159 == null ?{void} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
}
@@ -129,15 +129,15 @@ static method main() → dynamic {
static method propertyAccess(self::Class1? n1) → void {
self::Class1? nullable1 = n1;
let final self::Class1? #t1 = n1 in #t1 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t1{self::Class1});
let final self::Class1? #t2 = n1 in #t2 == null ?{void} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
let final self::Class1? #t2 = n1 in #t2 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t2{self::Class1}, new self::Class1::•());
nullable1 = let final self::Class1? #t3 = n1 in #t3 == null ?{self::Class1?} null : let final self::Class1 #t4 = new self::Class1::•() in let final void #t5 = self::Extension1|set#nullable1(#t3{self::Class1}, #t4) in #t4;
let final self::Class1? #t6 = n1 in #t6 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t6{self::Class1});
let final self::Class1? #t7 = n1 in #t7 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t7{self::Class1}));
let final self::Class1? #t8 = n1 in #t8 == null ?{self::Class1?} null : let final self::Class1? #t9 = self::Extension1|get#nullable1(#t8{self::Class1}) in #t9 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t9{self::Class1});
let final self::Class1? #t10 = n1 in #t10 == null ?{self::Class1?} null : let final self::Class1? #t11 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t10{self::Class1})) in #t11 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t11{self::Class1});
let final self::Class1? #t12 = n1 in #t12 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{void} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{void} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{void} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{void} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t12 = n1 in #t12 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t12{self::Class1}), new self::Class1::•());
let final self::Class1? #t13 = n1 in #t13 == null ?{self::Class1?} null : let final self::Class1? #t14 = self::Extension1|get#nullable1(#t13{self::Class1}) in #t14 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t14{self::Class1}, new self::Class1::•());
let final self::Class1? #t15 = n1 in #t15 == null ?{self::Class1?} null : let final self::Class1? #t16 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t15{self::Class1})) in #t16 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t16{self::Class1}, new self::Class1::•());
let final self::Class1? #t17 = let final self::Class1? #t18 = n1 in #t18 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t18{self::Class1}) in #t17 == null ?{self::Class1?} null : self::Extension1|get#nullable1(#t17{self::Class1});
self::throws(() → void => invalid-expression "pkg/front_end/testcases/nnbd/null_shorting_extension.dart:93:47: Error: Property 'nullable1' cannot be accessed on 'Class1?' because it is potentially null.
- 'Class1' is from 'pkg/front_end/testcases/nnbd/null_shorting_extension.dart'.
@@ -153,58 +153,58 @@ Try accessing using ?. instead.
nullable1 = let final self::Class1? #t26 = n1 in #t26 == null ?{self::Class1?} null : let final self::Class1? #t27 = self::Extension1|get#nullable1(#t26{self::Class1}) in #t27 == null ?{self::Class1?} null : let final self::Class1 #t28 = new self::Class1::•() in let final void #t29 = self::Extension1|set#nullable1(#t27{self::Class1}, #t28) in #t28;
nullable1 = let final self::Class1? #t30 = n1 in #t30 == null ?{self::Class1?} null : let final self::Class1? #t31 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t30{self::Class1})) in #t31 == null ?{self::Class1?} null : let final self::Class1 #t32 = new self::Class1::•() in let final void #t33 = self::Extension1|set#nullable1(#t31{self::Class1}, #t32) in #t32;
let final self::Class1? #t34 = n1 in #t34 == null ?{self::Class1?} null : let final self::Class1? #t35 = self::Extension1|get#nullable1(#t34{self::Class1}) in #t35 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t35{self::Class1});
let final self::Class1? #t36 = n1 in #t36 == null ?{void} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t36 = n1 in #t36 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t36{self::Class1}, self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t37 = n1 in #t37 == null ?{self::Class1?} null : let final self::Class1? #t38 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t39 = self::Extension1|set#nullable1(#t37{self::Class1}, #t38) in #t38;
let final self::Class1? #t40 = n1 in #t40 == null ?{void} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
let final self::Class1? #t40 = n1 in #t40 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t40{self::Class1}, let final self::Class1 #t41 = new self::Class1::•() in let final void #t42 = self::Extension1|set#nullable1(new self::Class1::•(), #t41) in #t41);
nullable1 = let final self::Class1? #t43 = n1 in #t43 == null ?{self::Class1?} null : let final self::Class1 #t44 = let final self::Class1 #t45 = new self::Class1::•() in let final void #t46 = self::Extension1|set#nullable1(new self::Class1::•(), #t45) in #t45 in let final void #t47 = self::Extension1|set#nullable1(#t43{self::Class1}, #t44) in #t44;
let final self::Class1? #t48 = n1 in #t48 == null ?{void} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t48 = n1 in #t48 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t48{self::Class1}, self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t49 = n1 in #t49 == null ?{self::Class1?} null : let final self::Class1 #t50 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t51 = self::Extension1|set#nullable1(#t49{self::Class1}, #t50) in #t50;
let final self::Class1? #t52 = n1 in #t52 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(#t52{self::Class1}));
let final self::Class1? #t53 = n1 in #t53 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t53 = n1 in #t53 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t53{self::Class1}), new self::Class1::•());
let final self::Class1? #t54 = n1 in #t54 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t54{self::Class1}));
let final self::Class1? #t55 = n1 in #t55 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t55{self::Class1})));
let final self::Class1? #t56 = n1 in #t56 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
let final self::Class1? #t56 = n1 in #t56 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t56{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t57 = n1 in #t57 == null ?{self::Class1?} null : let final self::Class1 #t58 = new self::Class1::•() in let final void #t59 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|get#nonNullable1(#t57{self::Class1})), #t58) in #t58;
let final self::Class1? #t60 = n1 in #t60 == null ?{self::Class1?} null : let final self::Class1? #t61 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(#t60{self::Class1})) in #t61 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t61{self::Class1});
let final self::Class1? #t62 = n1 in #t62 == null ?{void} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
let final self::Class1? #t62 = n1 in #t62 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t62{self::Class1}, self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())));
nullable1 = let final self::Class1? #t63 = n1 in #t63 == null ?{self::Class1?} null : let final self::Class1? #t64 = self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t65 = self::Extension1|set#nullable1(#t63{self::Class1}, #t64) in #t64;
let final self::Class1? #t66 = n1 in #t66 == null ?{void} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
let final self::Class1? #t66 = n1 in #t66 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t66{self::Class1}, let final self::Class1 #t67 = new self::Class1::•() in let final void #t68 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t67) in #t67);
nullable1 = let final self::Class1? #t69 = n1 in #t69 == null ?{self::Class1?} null : let final self::Class1 #t70 = let final self::Class1 #t71 = new self::Class1::•() in let final void #t72 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(new self::Class1::•()), #t71) in #t71 in let final void #t73 = self::Extension1|set#nullable1(#t69{self::Class1}, #t70) in #t70;
let final self::Class1? #t74 = n1 in #t74 == null ?{void} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
let final self::Class1? #t74 = n1 in #t74 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t74{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())));
nullable1 = let final self::Class1? #t75 = n1 in #t75 == null ?{self::Class1?} null : let final self::Class1 #t76 = self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(new self::Class1::•())) in let final void #t77 = self::Extension1|set#nullable1(#t75{self::Class1}, #t76) in #t76;
let final self::Class1? #t78 = n1 in #t78 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t78{self::Class1})));
let final self::Class1? #t79 = n1 in #t79 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t79 = n1 in #t79 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t79{self::Class1})), new self::Class1::•());
let final self::Class1? #t80 = n1 in #t80 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(self::Extension1|nonNullable1Method(#t80{self::Class1})));
let final self::Class1? #t81 = n1 in #t81 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t81 = n1 in #t81 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t81{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t82 = n1 in #t82 == null ?{self::Class1?} null : let final self::Class1? #t83 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t84 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t82{self::Class1}), #t83) in #t83;
let final self::Class1? #t85 = n1 in #t85 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
let final self::Class1? #t85 = n1 in #t85 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t85{self::Class1}), let final self::Class1 #t86 = new self::Class1::•() in let final void #t87 = self::Extension1|set#nullable1(new self::Class1::•(), #t86) in #t86);
nullable1 = let final self::Class1? #t88 = n1 in #t88 == null ?{self::Class1?} null : let final self::Class1 #t89 = let final self::Class1 #t90 = new self::Class1::•() in let final void #t91 = self::Extension1|set#nullable1(new self::Class1::•(), #t90) in #t90 in let final void #t92 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t88{self::Class1}), #t89) in #t89;
let final self::Class1? #t93 = n1 in #t93 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t93 = n1 in #t93 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t93{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t94 = n1 in #t94 == null ?{self::Class1?} null : let final self::Class1 #t95 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t96 = self::Extension1|set#nullable1(self::Extension1|get#nonNullable1(#t94{self::Class1}), #t95) in #t95;
let final self::Class1? #t97 = n1 in #t97 == null ?{void} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
let final self::Class1? #t97 = n1 in #t97 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t97{self::Class1}, let final self::Class1? #t98 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t99 = self::Extension1|set#nullable1(new self::Class1::•(), #t98) in #t98);
nullable1 = let final self::Class1? #t100 = n1 in #t100 == null ?{self::Class1?} null : let final self::Class1? #t101 = let final self::Class1? #t102 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t103 = self::Extension1|set#nullable1(new self::Class1::•(), #t102) in #t102 in let final void #t104 = self::Extension1|set#nullable1(#t100{self::Class1}, #t101) in #t101;
let final self::Class1? #t105 = n1 in #t105 == null ?{void} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
let final self::Class1? #t105 = n1 in #t105 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t105{self::Class1}, let final self::Class1 #t106 = let final self::Class1 #t107 = new self::Class1::•() in let final void #t108 = self::Extension1|set#nullable1(new self::Class1::•(), #t107) in #t107 in let final void #t109 = self::Extension1|set#nullable1(new self::Class1::•(), #t106) in #t106);
nullable1 = let final self::Class1? #t110 = n1 in #t110 == null ?{self::Class1?} null : let final self::Class1 #t111 = let final self::Class1 #t112 = let final self::Class1 #t113 = new self::Class1::•() in let final void #t114 = self::Extension1|set#nullable1(new self::Class1::•(), #t113) in #t113 in let final void #t115 = self::Extension1|set#nullable1(new self::Class1::•(), #t112) in #t112 in let final void #t116 = self::Extension1|set#nullable1(#t110{self::Class1}, #t111) in #t111;
let final self::Class1? #t117 = n1 in #t117 == null ?{void} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
let final self::Class1? #t117 = n1 in #t117 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t117{self::Class1}, let final self::Class1 #t118 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t119 = self::Extension1|set#nullable1(new self::Class1::•(), #t118) in #t118);
nullable1 = let final self::Class1? #t120 = n1 in #t120 == null ?{self::Class1?} null : let final self::Class1 #t121 = let final self::Class1 #t122 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t123 = self::Extension1|set#nullable1(new self::Class1::•(), #t122) in #t122 in let final void #t124 = self::Extension1|set#nullable1(#t120{self::Class1}, #t121) in #t121;
let final self::Class1? #t125 = n1 in #t125 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
let final self::Class1? #t125 = n1 in #t125 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t125{self::Class1}), self::Extension1|get#nullable1(new self::Class1::•()));
nullable1 = let final self::Class1? #t126 = n1 in #t126 == null ?{self::Class1?} null : let final self::Class1? #t127 = self::Extension1|get#nullable1(new self::Class1::•()) in let final void #t128 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t126{self::Class1}), #t127) in #t127;
let final self::Class1? #t129 = n1 in #t129 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
let final self::Class1? #t129 = n1 in #t129 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t129{self::Class1}), let final self::Class1 #t130 = new self::Class1::•() in let final void #t131 = self::Extension1|set#nullable1(new self::Class1::•(), #t130) in #t130);
nullable1 = let final self::Class1? #t132 = n1 in #t132 == null ?{self::Class1?} null : let final self::Class1 #t133 = let final self::Class1 #t134 = new self::Class1::•() in let final void #t135 = self::Extension1|set#nullable1(new self::Class1::•(), #t134) in #t134 in let final void #t136 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t132{self::Class1}), #t133) in #t133;
let final self::Class1? #t137 = n1 in #t137 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
let final self::Class1? #t137 = n1 in #t137 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t137{self::Class1}), self::Extension1|nonNullable1Method(new self::Class1::•()));
nullable1 = let final self::Class1? #t138 = n1 in #t138 == null ?{self::Class1?} null : let final self::Class1 #t139 = self::Extension1|nonNullable1Method(new self::Class1::•()) in let final void #t140 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(#t138{self::Class1}), #t139) in #t139;
let final self::Class1? #t141 = n1 in #t141 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t141{self::Class1})));
let final self::Class1? #t142 = n1 in #t142 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
let final self::Class1? #t142 = n1 in #t142 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t142{self::Class1})), new self::Class1::•());
nullable1 = let final self::Class1? #t143 = n1 in #t143 == null ?{self::Class1?} null : let final self::Class1 #t144 = new self::Class1::•() in let final void #t145 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t143{self::Class1})), #t144) in #t144;
let final self::Class1? #t146 = n1 in #t146 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|get#nonNullable1(#t146{self::Class1})));
let final self::Class1? #t147 = n1 in #t147 == null ?{void} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
let final self::Class1? #t147 = n1 in #t147 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t147{self::Class1}, self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())));
nullable1 = let final self::Class1? #t148 = n1 in #t148 == null ?{self::Class1?} null : let final self::Class1? #t149 = self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t150 = self::Extension1|set#nullable1(#t148{self::Class1}, #t149) in #t149;
let final self::Class1? #t151 = n1 in #t151 == null ?{void} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
let final self::Class1? #t151 = n1 in #t151 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t151{self::Class1}, let final self::Class1 #t152 = new self::Class1::•() in let final void #t153 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t152) in #t152);
nullable1 = let final self::Class1? #t154 = n1 in #t154 == null ?{self::Class1?} null : let final self::Class1 #t155 = let final self::Class1 #t156 = new self::Class1::•() in let final void #t157 = self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(new self::Class1::•()), #t156) in #t156 in let final void #t158 = self::Extension1|set#nullable1(#t154{self::Class1}, #t155) in #t155;
let final self::Class1? #t159 = n1 in #t159 == null ?{void} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
let final self::Class1? #t159 = n1 in #t159 == null ?{self::Class1?} null : self::Extension1|set#nullable1(#t159{self::Class1}, self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())));
nullable1 = let final self::Class1? #t160 = n1 in #t160 == null ?{self::Class1?} null : let final self::Class1 #t161 = self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(new self::Class1::•())) in let final void #t162 = self::Extension1|set#nullable1(#t160{self::Class1}, #t161) in #t161;
let final self::Class1? #t163 = n1 in #t163 == null ?{self::Class1?} null : self::Extension1|get#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t163{self::Class1})));
let final self::Class1? #t164 = n1 in #t164 == null ?{void} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t164 = n1 in #t164 == null ?{self::Class1?} null : self::Extension1|set#nullable1(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t164{self::Class1})), new self::Class1::•());
let final self::Class1? #t165 = n1 in #t165 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(self::Extension1|nonNullable1Method(#t165{self::Class1})));
let final self::Class1? #t166 = n1 in #t166 == null ?{self::Class1?} null : let final self::Class1 #t167 = self::Extension1|nonNullable1Method(#t166{self::Class1}) in #t167 == null ?{self::Class1?} null : self::Extension1|nonNullable1Method(#t167);
}
@@ -0,0 +1,19 @@
// Copyright (c) 2026, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
Stream<int> method0() async* {
yield 1;
yield 2;
}
Future<void> method1() async {
print('helper');
await for (var i in method0()) {
method2();
print('loop');
}
return;
}
void method2() {}
@@ -0,0 +1,18 @@
library;
import self as self;
import "dart:async" as asy;
import "dart:core" as core;
[229]static method [236] [270] method0() → asy::Stream<core::int> async* /* emittedValueType= core::int */ {
[250] yield [256] [256] 1;
[261] yield [267] [267] 2;
}
[286]static method [293] [406] method1() → asy::Future<void> async /* emittedValueType= void */ {
[306] [306] [306] core::print [311]([312] "helper");
[325] await for ([340] core::int i in [345] [345] self::method0 [352]()) {
[362] [362] [362] self::method2 [369]();
[377] [377] [377] core::print [382]([383] "loop");
}
[398] return;
}
[414]static method [421] [425] method2() → void {}
@@ -0,0 +1,18 @@
library;
import self as self;
import "dart:async" as asy;
import "dart:core" as core;
[229]static method [236] [270] method0() → asy::Stream<core::int> async* /* emittedValueType= core::int */ {
[250] yield [256] [256] 1;
[261] yield [267] [267] 2;
}
[286]static method [293] [406] method1() → asy::Future<void> async /* emittedValueType= void */ {
[306] [306] [306] core::print [311]([312] "helper");
[325] await for ([340] core::int i in [345] [345] self::method0 [352]()) {
[362] [362] [362] self::method2 [369]();
[377] [377] [377] core::print [382]([383] "loop");
}
[398] return;
}
[414]static method [421] [425] method2() → void {}
@@ -0,0 +1,11 @@
library;
import self as self;
import "dart:async" as asy;
import "dart:core" as core;
[229]static method [236] [270] method0() → asy::Stream<core::int> async*
[-1] ;
[286]static method [293] [406] method1() → asy::Future<void> async
[-1] ;
[414]static method [421] [425] method2() → void
[-1] ;
@@ -0,0 +1,29 @@
library;
import self as self;
import "dart:async" as asy;
import "dart:core" as core;
[229]static method [236] [270] method0() → asy::Stream<core::int> async* /* emittedValueType= core::int */ {
[250] yield [256] [256] 1;
[261] yield [267] [267] 2;
}
[286]static method [293] [406] method1() → asy::Future<void> async /* emittedValueType= void */ {
[306] [306] [306] core::print [311]([312] "helper");
[-1] {
[-1] [-1] synthesized asy::Stream<core::int> :stream = [345] [345] self::method0 [352]();
[-1] [-1] synthesized asy::_StreamIterator<core::int>? :for-iterator = [-1] [-1] new asy::_StreamIterator::• [-1]<core::int>([-1] :stream);
[-1] try
[325] while ([-1] [-1] let [-1] dynamic #t1 = [325] [325] asy::_asyncStarMoveNextHelper [-1]([-1] :stream) in [325] [325] await [-1] [-1] [-1] [-1] :for-iterator.{asy::_StreamIterator::moveNext}[-1](){() → asy::Future<core::bool>}) {
[340] [340] core::int i = [356] [356] [-1] [-1] :for-iterator.{asy::_StreamIterator::current}{core::int};
[356] {
[362] [362] [362] self::method2 [369]();
[377] [377] [377] core::print [382]([383] "loop");
}
}
finally
[-1] if([-1] [-1]![-1]([-1] [-1] [-1] [-1] [-1] :for-iterator.{asy::_StreamIterator::_subscription}{asy::StreamSubscription<core::int>?} == null))
[-1] [-1] [-1] await [-1] [-1] [-1] [-1] :for-iterator.{asy::_StreamIterator::cancel}[-1](){() → asy::Future<dynamic>};
}
[398] return;
}
[414]static method [421] [425] method2() → void {}
@@ -0,0 +1,5 @@
Stream<int> method0() async* {}
Future<void> method1() async {}
void method2() {}
@@ -0,0 +1,5 @@
Future<void> method1() async {}
Stream<int> method0() async* {}
void method2() {}
@@ -41,9 +41,6 @@ static method main() → dynamic {
for (var x, y in []) {}
^^^";
for (final dynamic #t1 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
for (var x, y in []) {}
^^^";
dynamic x;
dynamic y;
}
@@ -41,9 +41,6 @@ static method main() → dynamic {
for (var x, y in []) {}
^^^";
for (final dynamic #t1 in <dynamic>[]) {
invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
for (var x, y in []) {}
^^^";
dynamic x;
dynamic y;
}
@@ -45,9 +45,6 @@ static method main() → dynamic {
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t1 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
invalid-expression "pkg/front_end/testcases/rasta/issue_000042.dart:6:8: Error: A for-in loop can't have more than one loop variable.
for (var x, y in []) {}
^^^";
dynamic x;
dynamic y;
}
@@ -98,11 +98,7 @@ class Fisk extends core::Object {
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
for (key in x) {
^^^" in this.{<unresolved>}key = invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the type 'Fisk'.
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
for (key in x) {
^^^";
^^^" in this.{<unresolved>}key = #t1;
core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
@@ -134,9 +130,6 @@ Try correcting the name to the name of an existing getter, or defining a getter
for (1 in x) {
^";
for (final dynamic #t5 in x as{TypeError,ForDynamic} core::Iterable<dynamic>) {
invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
for (1 in x) {
^";
1;
core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
@@ -182,9 +175,6 @@ static method main(dynamic arguments) → dynamic {
for (1 in arguments) {
^";
for (final dynamic #t10 in arguments as{TypeError,ForDynamic} core::Iterable<dynamic>) {
invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
for (1 in arguments) {
^";
1;
core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Undefined name 'key'.
print(key);
@@ -98,11 +98,7 @@ class Fisk extends core::Object {
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
for (key in x) {
^^^" in this.{<unresolved>}key = invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the type 'Fisk'.
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
for (key in x) {
^^^";
^^^" in this.{<unresolved>}key = #t1;
core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
@@ -134,9 +130,6 @@ Try correcting the name to the name of an existing getter, or defining a getter
for (1 in x) {
^";
for (final dynamic #t5 in x as{TypeError,ForDynamic} core::Iterable<dynamic>) {
invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
for (1 in x) {
^";
1;
core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
@@ -182,9 +175,6 @@ static method main(dynamic arguments) → dynamic {
for (1 in arguments) {
^";
for (final dynamic #t10 in arguments as{TypeError,ForDynamic} core::Iterable<dynamic>) {
invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
for (1 in arguments) {
^";
1;
core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Undefined name 'key'.
print(key);
@@ -102,11 +102,7 @@ class Fisk extends core::Object {
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
for (key in x) {
^^^" in this.{<unresolved>}key = invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:11:10: Error: The setter 'key' isn't defined for the type 'Fisk'.
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
Try correcting the name to the name of an existing setter, or defining a setter or field named 'key'.
for (key in x) {
^^^";
^^^" in this.{<unresolved>}key = #t1;
core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:12:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
Try correcting the name to the name of an existing getter, or defining a getter or field named 'key'.
@@ -162,9 +158,6 @@ Try correcting the name to the name of an existing getter, or defining a getter
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t5 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:23:10: Error: Can't assign to this, so it can't be used in a for-in loop.
for (1 in x) {
^";
1;
core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:24:13: Error: The getter 'key' isn't defined for the type 'Fisk'.
- 'Fisk' is from 'pkg/front_end/testcases/rasta/unresolved_for_in.dart'.
@@ -240,9 +233,6 @@ static method main(dynamic arguments) → dynamic {
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t10 = :sync-for-iterator.{core::Iterator::current}{dynamic};
{
invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:43:8: Error: Can't assign to this, so it can't be used in a for-in loop.
for (1 in arguments) {
^";
1;
core::print(invalid-expression "pkg/front_end/testcases/rasta/unresolved_for_in.dart:44:11: Error: Undefined name 'key'.
print(key);
@@ -45,19 +45,17 @@ import "dart:core" as core;
static method foo() → void {
core::List<dynamic> repoPaths = <dynamic>[let final core::String #t1 = "a" in invalid-expression "This requires the experimental 'records' language feature to be enabled."];
{
for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
for (var (:user, :repo) in repoPaths) {
^^^^") {
invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:13: Error: This couldn't be parsed.
for (var (:user, :repo) in repoPaths) {
^";
for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
for (var (:user, :repo) in repoPaths) {
^^^^") {
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
print(user);
^^^^");
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
print(repo);
^^^^");
}
}
}
@@ -45,19 +45,17 @@ import "dart:core" as core;
static method foo() → void {
core::List<dynamic> repoPaths = <dynamic>[let final core::String #t1 = "a" in invalid-expression "This requires the experimental 'records' language feature to be enabled."];
{
for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
for (var (:user, :repo) in repoPaths) {
^^^^") {
invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:13: Error: This couldn't be parsed.
for (var (:user, :repo) in repoPaths) {
^";
for (final dynamic #t2 in invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
for (var (:user, :repo) in repoPaths) {
^^^^") {
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
print(user);
^^^^");
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
print(repo);
^^^^");
}
}
}
@@ -46,23 +46,21 @@ import "dart:core" as core;
static method foo() → void {
core::List<dynamic> repoPaths = core::_GrowableList::_literal1<dynamic>(let final core::String #t1 = "a" in invalid-expression "This requires the experimental 'records' language feature to be enabled.");
{
invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:13: Error: This couldn't be parsed.
for (var (:user, :repo) in repoPaths) {
^";
{
synthesized core::Iterator<Never> :sync-for-iterator = invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
synthesized core::Iterator<Never> :sync-for-iterator = invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:14: Error: Undefined name 'user'.
for (var (:user, :repo) in repoPaths) {
^^^^".{core::Iterable::iterator}{core::Iterator<Never>};
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{Never};
{
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
for (; :sync-for-iterator.{core::Iterator::moveNext}(){() → core::bool}; ) {
final dynamic #t2 = :sync-for-iterator.{core::Iterator::current}{Never};
{
invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:9:13: Error: This couldn't be parsed.
for (var (:user, :repo) in repoPaths) {
^";
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:10:11: Error: Undefined name 'user'.
print(user);
^^^^");
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
core::print(invalid-expression "pkg/front_end/testcases/regress/use_pattern_in_for_loop_when_language_version_is_too_low.dart:11:11: Error: Undefined name 'repo'.
print(repo);
^^^^");
}
}
}
}
+7 -2
View File
@@ -524,6 +524,7 @@ class AstPrinter {
bool? isLate,
DartType? type,
bool includeInitializer = true,
bool isImplicitlyTyped = false,
}) {
if (includeModifiersAndType) {
if (node.isRequired) {
@@ -538,8 +539,12 @@ class AstPrinter {
if (node.isConst) {
_sb.write('const ');
}
writeType(type ?? node.type);
_sb.write(' ');
if (isImplicitlyTyped) {
_sb.write('var ');
} else {
writeType(type ?? node.type);
_sb.write(' ');
}
}
_sb.write(getVariableName(node.variable));
if (includeInitializer && node.initializer != null && !node.isRequired) {