[cfe] Handle complex extension setters

Change-Id: Ic5753c70a13fed819df7aa6900a8191f9bed4195
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/118042
Reviewed-by: Dmitry Stefantsov <dmitryas@google.com>
This commit is contained in:
Johnni Winther 2019-09-24 07:55:45 +00:00
parent 2b3541da57
commit bf76e4b49c
44 changed files with 1367 additions and 592 deletions

View file

@ -485,60 +485,6 @@ class ProcedureBuilder extends FunctionBuilder {
return _body;
}
/// If this is an extension instance setter, wrap the setter body to return
/// the rhs value from the method.
///
/// That is, this setter
///
/// extension E on A {
/// void set property(B value) {
/// value++;
/// }
/// }
///
/// is converted into this top level method
///
/// B E|property(A #this, B value) {
/// final #t1 = value;
/// value++;
/// return #t1;
/// }
///
void _updateExtensionSetterBody() {
if (isExtensionInstanceMember && isSetter) {
// TODO(johnniwinther): Avoid the synthetic variable if the parameter is
// never modified.
// TODO(johnniwinther): Handle setter bodies with return statements.
VariableDeclaration value = procedure.function.positionalParameters[1];
procedure.function.returnType = value.type;
Statement body = procedure.function.body;
List<Statement> statements = [];
Block block = new Block(statements);
VariableDeclaration variableDeclaration =
new VariableDeclarationImpl.forValue(
new VariableGet(value)..fileOffset = procedure.fileOffset)
..type = value.type;
statements.add(variableDeclaration);
if (body is Block) {
statements.addAll(body.statements);
} else {
statements.add(body);
}
ReturnStatement returnStatement = new ReturnStatement(
new VariableGet(variableDeclaration)
..fileOffset = procedure.fileEndOffset);
statements.add(returnStatement);
setParents(block.statements, block);
procedure.function.body = block;
block.parent = procedure.function;
}
}
void set body(Statement newBody) {
super.body = newBody;
_updateExtensionSetterBody();
}
void set asyncModifier(AsyncMarker newModifier) {
actualAsyncModifier = newModifier;
if (function != null) {

View file

@ -82,6 +82,8 @@ import 'kernel_builder.dart'
import 'kernel_shadow_ast.dart';
import '../type_inference/type_inferrer.dart';
/// A generator represents a subexpression for which we can't yet build an
/// expression because we don't yet know the context in which it's used.
///
@ -494,8 +496,8 @@ class PropertyAccessGenerator extends Generator {
@override
Expression buildAssignment(Expression value, {bool voidContext: false}) {
return new PropertySet(receiver, name, value, setter)
..fileOffset = fileOffset;
return _helper.forest.createPropertySet(fileOffset, receiver, name, value,
interfaceTarget: setter, forEffect: voidContext);
}
@override
@ -506,9 +508,9 @@ class PropertyAccessGenerator extends Generator {
PropertyGet read = new PropertyGet(
_helper.createVariableGet(variable, receiver.fileOffset), name)
..fileOffset = fileOffset;
PropertySet write = new PropertySet(
_helper.createVariableGet(variable, receiver.fileOffset), name, value)
..fileOffset = fileOffset;
PropertySet write = _helper.forest.createPropertySet(fileOffset,
_helper.createVariableGet(variable, receiver.fileOffset), name, value,
forEffect: voidContext);
return new IfNullPropertySet(variable, read, write, forEffect: voidContext)
..fileOffset = offset;
}
@ -530,9 +532,9 @@ class PropertyAccessGenerator extends Generator {
binaryOperator,
_helper.forest.createArguments(offset, <Expression>[value]),
interfaceTarget: interfaceTarget);
PropertySet write = new PropertySet(
_helper.createVariableGet(variable, receiver.fileOffset), name, binary)
..fileOffset = fileOffset;
PropertySet write = _helper.forest.createPropertySet(fileOffset,
_helper.createVariableGet(variable, receiver.fileOffset), name, binary,
forEffect: voidContext);
return new CompoundPropertySet(variable, write)..fileOffset = offset;
}
@ -565,11 +567,12 @@ class PropertyAccessGenerator extends Generator {
VariableDeclaration write = _helper.forest
.createVariableDeclarationForValue(
offset,
new PropertySet(
_helper.forest.createPropertySet(
fileOffset,
_helper.createVariableGet(variable, receiver.fileOffset),
name,
binary)
..fileOffset = fileOffset);
binary,
forEffect: true));
return new PropertyPostIncDec(variable, read, write)..fileOffset = offset;
}
@ -668,19 +671,20 @@ class ThisPropertyAccessGenerator extends Generator {
@override
Expression buildAssignment(Expression value, {bool voidContext: false}) {
return _createWrite(fileOffset, value);
return _createWrite(fileOffset, value, forEffect: voidContext);
}
Expression _createWrite(int offset, Expression value) {
return new PropertySet(
_forest.createThisExpression(fileOffset), name, value, setter)
..fileOffset = fileOffset;
Expression _createWrite(int offset, Expression value, {bool forEffect}) {
return _helper.forest.createPropertySet(
fileOffset, _forest.createThisExpression(fileOffset), name, value,
interfaceTarget: setter, forEffect: forEffect);
}
@override
Expression buildIfNullAssignment(Expression value, DartType type, int offset,
{bool voidContext: false}) {
return new IfNullSet(_createRead(), _createWrite(offset, value),
return new IfNullSet(
_createRead(), _createWrite(offset, value, forEffect: voidContext),
forEffect: voidContext)
..fileOffset = offset;
}
@ -699,9 +703,7 @@ class ThisPropertyAccessGenerator extends Generator {
binaryOperator,
_helper.forest.createArguments(offset, <Expression>[value]),
interfaceTarget: interfaceTarget);
return new PropertySet(
_forest.createThisExpression(fileOffset), name, binary)
..fileOffset = fileOffset;
return _createWrite(fileOffset, binary, forEffect: voidContext);
}
@override
@ -729,10 +731,7 @@ class ThisPropertyAccessGenerator extends Generator {
interfaceTarget: interfaceTarget);
VariableDeclaration write = _helper.forest
.createVariableDeclarationForValue(
offset,
new PropertySet(
_forest.createThisExpression(fileOffset), name, binary)
..fileOffset = fileOffset);
offset, _createWrite(fileOffset, binary, forEffect: true));
return new PropertyPostIncDec.onReadOnly(read, write)..fileOffset = offset;
}
@ -811,11 +810,12 @@ class NullAwarePropertyAccessGenerator extends Generator {
VariableDeclaration variable = _helper.forest
.createVariableDeclarationForValue(
receiverExpression.fileOffset, receiverExpression);
PropertySet read = new PropertySet(
PropertySet read = _helper.forest.createPropertySet(
fileOffset,
_helper.createVariableGet(variable, receiverExpression.fileOffset),
name,
value)
..fileOffset = fileOffset;
value,
forEffect: voidContext);
return new NullAwarePropertySet(variable, read)
..fileOffset = receiverExpression.fileOffset;
}
@ -1677,14 +1677,14 @@ class ExtensionInstanceAccessGenerator extends Generator {
@override
Expression buildAssignment(Expression value, {bool voidContext: false}) {
return _createWrite(fileOffset, value);
return _createWrite(fileOffset, value, forEffect: voidContext);
}
Expression _createWrite(int offset, Expression value) {
Expression _createWrite(int offset, Expression value, {bool forEffect}) {
Expression write;
if (writeTarget == null) {
write = _makeInvalidWrite(value);
} else {
} else if (forEffect) {
write = _helper.buildExtensionMethodInvocation(
offset,
writeTarget,
@ -1695,6 +1695,13 @@ class ExtensionInstanceAccessGenerator extends Generator {
_helper.createVariableGet(extensionThis, fileOffset),
extensionTypeArguments: _createExtensionTypeArguments(),
positionalArguments: [value]));
} else {
write = new ExtensionSet(
_helper.createVariableGet(extensionThis, fileOffset),
new ExtensionAccessTarget(writeTarget, null, ProcedureKind.Setter,
_createExtensionTypeArguments()),
value,
readOnlyReceiver: true);
}
write.fileOffset = offset;
return write;
@ -1703,7 +1710,8 @@ class ExtensionInstanceAccessGenerator extends Generator {
@override
Expression buildIfNullAssignment(Expression value, DartType type, int offset,
{bool voidContext: false}) {
return new IfNullSet(_createRead(), _createWrite(fileOffset, value),
return new IfNullSet(
_createRead(), _createWrite(fileOffset, value, forEffect: voidContext),
forEffect: voidContext)
..fileOffset = offset;
}
@ -1721,7 +1729,7 @@ class ExtensionInstanceAccessGenerator extends Generator {
binaryOperator,
_helper.forest.createArguments(offset, <Expression>[value]),
interfaceTarget: interfaceTarget);
return _createWrite(fileOffset, binary);
return _createWrite(fileOffset, binary, forEffect: voidContext);
}
@override
@ -1747,7 +1755,7 @@ class ExtensionInstanceAccessGenerator extends Generator {
interfaceTarget: interfaceTarget);
VariableDeclaration write = _helper.forest
.createVariableDeclarationForValue(
offset, _createWrite(fileOffset, binary));
offset, _createWrite(fileOffset, binary, forEffect: true));
return new PropertyPostIncDec.onReadOnly(read, write)..fileOffset = offset;
}
@ -1930,14 +1938,16 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
@override
Expression buildAssignment(Expression value, {bool voidContext: false}) {
return _createWrite(fileOffset, receiver, value);
return _createWrite(fileOffset, receiver, value,
forEffect: voidContext, readOnlyReceiver: false);
}
Expression _createWrite(int offset, Expression receiver, Expression value) {
Expression _createWrite(int offset, Expression receiver, Expression value,
{bool readOnlyReceiver, bool forEffect}) {
Expression write;
if (writeTarget == null) {
write = _makeInvalidWrite(value);
} else {
} else if (forEffect) {
write = _helper.buildExtensionMethodInvocation(
offset,
writeTarget,
@ -1945,6 +1955,13 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
offset, extensionTypeParameterCount, 0, receiver,
extensionTypeArguments: _createExtensionTypeArguments(),
positionalArguments: [value]));
} else {
write = new ExtensionSet(
receiver,
new ExtensionAccessTarget(writeTarget, null, ProcedureKind.Setter,
_createExtensionTypeArguments()),
value,
readOnlyReceiver: readOnlyReceiver);
}
write.fileOffset = offset;
return write;
@ -1958,7 +1975,8 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
Expression read =
_createRead(_helper.createVariableGet(variable, receiver.fileOffset));
Expression write = _createWrite(fileOffset,
_helper.createVariableGet(variable, receiver.fileOffset), value);
_helper.createVariableGet(variable, receiver.fileOffset), value,
forEffect: voidContext, readOnlyReceiver: true);
return new IfNullPropertySet(variable, read, write, forEffect: voidContext)
..fileOffset = offset;
}
@ -1979,7 +1997,8 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
_helper.forest.createArguments(offset, <Expression>[value]),
interfaceTarget: interfaceTarget);
Expression write = _createWrite(fileOffset,
_helper.createVariableGet(variable, receiver.fileOffset), binary);
_helper.createVariableGet(variable, receiver.fileOffset), binary,
forEffect: voidContext, readOnlyReceiver: true);
return new CompoundPropertySet(variable, write)..fileOffset = offset;
}
@ -2013,7 +2032,9 @@ class ExplicitExtensionInstanceAccessGenerator extends Generator {
_createWrite(
fileOffset,
_helper.createVariableGet(variable, receiver.fileOffset),
binary)
binary,
forEffect: voidContext,
readOnlyReceiver: true)
..fileOffset = fileOffset);
return new PropertyPostIncDec(variable, read, write)..fileOffset = offset;
}
@ -2949,7 +2970,8 @@ class UnlinkedGenerator extends Generator {
@override
Expression buildAssignment(Expression value, {bool voidContext: false}) {
return new PropertySet(receiver, name, value)..fileOffset = fileOffset;
return _helper.forest.createPropertySet(fileOffset, receiver, name, value,
forEffect: voidContext);
}
@override
@ -2965,9 +2987,9 @@ class UnlinkedGenerator extends Generator {
PropertyGet read = new PropertyGet(
_helper.createVariableGet(variable, receiver.fileOffset), name)
..fileOffset = fileOffset;
PropertySet write = new PropertySet(
_helper.createVariableGet(variable, receiver.fileOffset), name, value)
..fileOffset = fileOffset;
PropertySet write = _helper.forest.createPropertySet(fileOffset,
_helper.createVariableGet(variable, receiver.fileOffset), name, value,
forEffect: voidContext);
return new IfNullPropertySet(variable, read, write, forEffect: voidContext)
..fileOffset = offset;
}
@ -2989,9 +3011,9 @@ class UnlinkedGenerator extends Generator {
binaryOperator,
_helper.forest.createArguments(offset, <Expression>[value]),
interfaceTarget: interfaceTarget);
PropertySet write = new PropertySet(
_helper.createVariableGet(variable, receiver.fileOffset), name, binary)
..fileOffset = fileOffset;
PropertySet write = _helper.forest.createPropertySet(fileOffset,
_helper.createVariableGet(variable, receiver.fileOffset), name, binary,
forEffect: voidContext);
return new CompoundPropertySet(variable, write)..fileOffset = offset;
}
@ -3024,11 +3046,12 @@ class UnlinkedGenerator extends Generator {
VariableDeclaration write = _helper.forest
.createVariableDeclarationForValue(
offset,
new PropertySet(
_helper.forest.createPropertySet(
fileOffset,
_helper.createVariableGet(variable, receiver.fileOffset),
name,
binary)
..fileOffset = fileOffset);
binary,
forEffect: true));
return new PropertyPostIncDec(variable, read, write)..fileOffset = offset;
}

View file

@ -26,15 +26,7 @@ import 'collections.dart'
IfMapEntry,
SpreadElement;
import 'kernel_shadow_ast.dart'
show
ArgumentsImpl,
IntJudgment,
LoadLibraryImpl,
MethodInvocationImpl,
ReturnStatementImpl,
ShadowLargeIntLiteral,
VariableDeclarationImpl;
import 'kernel_shadow_ast.dart';
/// A shadow tree factory.
class Forest {
@ -722,6 +714,14 @@ class Forest {
NullCheck createNullCheck(int fileOffset, Expression expression) {
return new NullCheck(expression)..fileOffset = fileOffset;
}
PropertySet createPropertySet(
int fileOffset, Expression receiver, Name name, Expression value,
{Member interfaceTarget, bool forEffect}) {
return new PropertySetImpl(receiver, name, value,
interfaceTarget: interfaceTarget, forEffect: forEffect)
..fileOffset = fileOffset;
}
}
class _VariablesDeclaration extends Statement {

View file

@ -49,6 +49,8 @@ class InferenceVisitor
return visitCompoundSuperIndexSet(node, typeContext);
case InternalExpressionKind.DeferredCheck:
return visitDeferredCheck(node, typeContext);
case InternalExpressionKind.ExtensionSet:
return visitExtensionSet(node, typeContext);
case InternalExpressionKind.IfNull:
return visitIfNull(node, typeContext);
case InternalExpressionKind.IfNullIndexSet:
@ -229,13 +231,15 @@ class InferenceVisitor
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.library.nonNullable);
DartType conditionType = inferrer
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel)
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel,
isVoidAllowed: true)
.inferredType;
inferrer.ensureAssignable(
expectedType, conditionType, node.condition, node.condition.fileOffset);
if (node.message != null) {
inferrer.inferExpression(
node.message, const UnknownType(), !inferrer.isTopLevel);
node.message, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: true);
}
}
@ -273,8 +277,9 @@ class InferenceVisitor
}
ExpressionInferenceResult visitCascade(Cascade node, DartType typeContext) {
ExpressionInferenceResult result =
inferrer.inferExpression(node.expression, typeContext, true);
ExpressionInferenceResult result = inferrer.inferExpression(
node.expression, typeContext, true,
isVoidAllowed: false);
node.variable.type = result.inferredType;
for (Expression judgment in node.cascades) {
inferrer.inferExpression(
@ -291,7 +296,8 @@ class InferenceVisitor
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.library.nonNullable);
DartType conditionType = inferrer
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel)
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel,
isVoidAllowed: true)
.inferredType;
inferrer.ensureAssignable(
expectedType, conditionType, node.condition, node.condition.fileOffset);
@ -373,6 +379,53 @@ class InferenceVisitor
// No inference needs to be done.
}
ExpressionInferenceResult visitExtensionSet(
ExtensionSet node, DartType typeContext) {
// Since the variable is not used in the body we don't need to type infer
// it. We can just type infer the body.
ExpressionInferenceResult receiverResult = inferrer.inferExpression(
node.receiver, const UnknownType(), true,
isVoidAllowed: false);
DartType valueType =
inferrer.getSetterType(node.target, receiverResult.inferredType);
ExpressionInferenceResult valueResult = inferrer.inferExpression(
node.value, const UnknownType(), true,
isVoidAllowed: false);
inferrer.ensureAssignable(
valueType, valueResult.inferredType, node.value, node.value.fileOffset);
VariableDeclaration valueVariable =
createVariable(node.value, valueResult.inferredType);
VariableDeclaration receiverVariable;
Expression receiver;
if (node.readOnlyReceiver) {
receiver = node.receiver;
} else {
receiverVariable =
createVariable(node.receiver, receiverResult.inferredType);
receiver = createVariableGet(receiverVariable);
}
Expression assignment = new StaticInvocation(
node.target.member,
new Arguments(<Expression>[receiver, createVariableGet(valueVariable)],
types: node.target.inferredExtensionTypeArguments)
..fileOffset = node.fileOffset)
..fileOffset = node.fileOffset;
VariableDeclaration assignmentVariable =
createVariable(assignment, const VoidType());
Expression replacement = createLet(valueVariable,
createLet(assignmentVariable, createVariableGet(valueVariable)));
if (receiverVariable != null) {
replacement = createLet(receiverVariable, replacement);
}
replacement.fileOffset = node.fileOffset;
node.replaceWith(replacement);
return new ExpressionInferenceResult(valueResult.inferredType, replacement);
}
ExpressionInferenceResult visitDeferredCheck(
DeferredCheck node, DartType typeContext) {
// Since the variable is not used in the body we don't need to type infer
@ -390,7 +443,8 @@ class InferenceVisitor
InterfaceType boolType =
inferrer.coreTypes.boolRawType(inferrer.library.nonNullable);
DartType conditionType = inferrer
.inferExpression(node.condition, boolType, !inferrer.isTopLevel)
.inferExpression(node.condition, boolType, !inferrer.isTopLevel,
isVoidAllowed: true)
.inferredType;
inferrer.ensureAssignable(
boolType, conditionType, node.condition, node.condition.fileOffset);
@ -503,8 +557,8 @@ class InferenceVisitor
? inferrer.coreTypes.streamClass
: inferrer.coreTypes.iterableClass;
DartType context = inferrer.wrapType(elementType, iterableClass);
ExpressionInferenceResult iterableResult =
inferrer.inferExpression(iterable, context, typeNeeded);
ExpressionInferenceResult iterableResult = inferrer
.inferExpression(iterable, context, typeNeeded, isVoidAllowed: false);
DartType iterableType = iterableResult.inferredType;
if (iterableResult.replacement != null) {
iterable = iterableResult.replacement;
@ -634,7 +688,8 @@ class InferenceVisitor
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.library.nonNullable);
DartType conditionType = inferrer
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel)
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel,
isVoidAllowed: true)
.inferredType;
inferrer.ensureAssignable(expectedType, conditionType, node.condition,
node.condition.fileOffset);
@ -690,8 +745,9 @@ class InferenceVisitor
IfNullExpression node, DartType typeContext) {
// To infer `e0 ?? e1` in context K:
// - Infer e0 in context K to get T0
DartType lhsType =
inferrer.inferExpression(node.left, typeContext, true).inferredType;
DartType lhsType = inferrer
.inferExpression(node.left, typeContext, true, isVoidAllowed: false)
.inferredType;
Member equalsMember = inferrer
.findInterfaceMember(lhsType, equalsName, node.fileOffset)
@ -730,7 +786,8 @@ class InferenceVisitor
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.library.nonNullable);
DartType conditionType = inferrer
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel)
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel,
isVoidAllowed: true)
.inferredType;
inferrer.ensureAssignable(
expectedType, conditionType, node.condition, node.condition.fileOffset);
@ -801,18 +858,21 @@ class InferenceVisitor
void visitShadowInvalidInitializer(ShadowInvalidInitializer node) {
inferrer.inferExpression(
node.variable.initializer, const UnknownType(), !inferrer.isTopLevel);
node.variable.initializer, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: false);
}
void visitShadowInvalidFieldInitializer(ShadowInvalidFieldInitializer node) {
inferrer.inferExpression(node.value, node.field.type, !inferrer.isTopLevel);
inferrer.inferExpression(node.value, node.field.type, !inferrer.isTopLevel,
isVoidAllowed: false);
}
@override
ExpressionInferenceResult visitIsExpression(
IsExpression node, DartType typeContext) {
inferrer.inferExpression(
node.operand, const UnknownType(), !inferrer.isTopLevel);
node.operand, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: false);
return new ExpressionInferenceResult(
inferrer.coreTypes.boolRawType(inferrer.library.nonNullable));
}
@ -1124,10 +1184,12 @@ class InferenceVisitor
InterfaceType boolType =
inferrer.coreTypes.boolRawType(inferrer.library.nonNullable);
DartType leftType = inferrer
.inferExpression(node.left, boolType, !inferrer.isTopLevel)
.inferExpression(node.left, boolType, !inferrer.isTopLevel,
isVoidAllowed: false)
.inferredType;
DartType rightType = inferrer
.inferExpression(node.right, boolType, !inferrer.isTopLevel)
.inferExpression(node.right, boolType, !inferrer.isTopLevel,
isVoidAllowed: false)
.inferredType;
inferrer.ensureAssignable(
boolType, leftType, node.left, node.left.fileOffset);
@ -1942,8 +2004,8 @@ class InferenceVisitor
ExpressionInferenceResult visitCompoundPropertySet(
CompoundPropertySet node, DartType typeContext) {
inferrer.inferStatement(node.variable);
ExpressionInferenceResult writeResult =
inferrer.inferExpression(node.write, typeContext, true);
ExpressionInferenceResult writeResult = inferrer
.inferExpression(node.write, typeContext, true, isVoidAllowed: true);
Expression replacement = node.replace();
return new ExpressionInferenceResult(writeResult.inferredType, replacement);
}
@ -1951,10 +2013,11 @@ class InferenceVisitor
ExpressionInferenceResult visitIfNullPropertySet(
IfNullPropertySet node, DartType typeContext) {
inferrer.inferStatement(node.variable);
ExpressionInferenceResult readResult =
inferrer.inferExpression(node.read, const UnknownType(), true);
ExpressionInferenceResult writeResult =
inferrer.inferExpression(node.write, typeContext, true);
ExpressionInferenceResult readResult = inferrer.inferExpression(
node.read, const UnknownType(), true,
isVoidAllowed: true);
ExpressionInferenceResult writeResult = inferrer
.inferExpression(node.write, typeContext, true, isVoidAllowed: true);
Member equalsMember = inferrer
.findInterfaceMember(
readResult.inferredType, equalsName, node.fileOffset)
@ -2004,8 +2067,8 @@ class InferenceVisitor
IfNullSet node, DartType typeContext) {
ExpressionInferenceResult readResult =
inferrer.inferExpression(node.read, const UnknownType(), true);
ExpressionInferenceResult writeResult =
inferrer.inferExpression(node.write, typeContext, true);
ExpressionInferenceResult writeResult = inferrer
.inferExpression(node.write, typeContext, true, isVoidAllowed: true);
Member equalsMember = inferrer
.findInterfaceMember(
readResult.inferredType, equalsName, node.fileOffset)
@ -2091,6 +2154,7 @@ class InferenceVisitor
node.fileOffset,
'[]='.length);
} else if (indexSetTarget.isExtensionMember) {
assert(indexSetTarget.extensionMethodKind != ProcedureKind.Setter);
assignment = new StaticInvocation(
indexSetTarget.member,
new Arguments(<Expression>[
@ -2309,6 +2373,7 @@ class InferenceVisitor
node.writeOffset,
'[]='.length);
} else if (writeTarget.isExtensionMember) {
assert(writeTarget.extensionMethodKind != ProcedureKind.Setter);
write = new StaticInvocation(
writeTarget.member,
new Arguments(
@ -2657,6 +2722,7 @@ class InferenceVisitor
node.binaryOffset,
node.binaryName.name.length);
} else if (binaryTarget.isExtensionMember) {
assert(binaryTarget.extensionMethodKind != ProcedureKind.Setter);
binary = new StaticInvocation(
binaryTarget.member,
new Arguments(<Expression>[
@ -2725,6 +2791,7 @@ class InferenceVisitor
node.writeOffset,
'[]='.length);
} else if (writeTarget.isExtensionMember) {
assert(writeTarget.extensionMethodKind != ProcedureKind.Setter);
write = new StaticInvocation(
writeTarget.member,
new Arguments(
@ -3277,15 +3344,11 @@ class InferenceVisitor
@override
ExpressionInferenceResult visitPropertySet(
PropertySet node, DartType typeContext) {
DartType receiverType;
if (node.receiver != null) {
receiverType = inferrer
.inferExpression(node.receiver, const UnknownType(), true)
.inferredType;
} else {
receiverType = inferrer.thisType;
}
covariant PropertySetImpl node, DartType typeContext) {
DartType receiverType = inferrer
.inferExpression(node.receiver, const UnknownType(), true,
isVoidAllowed: false)
.inferredType;
ObjectAccessTarget target =
inferrer.findPropertySetMember(receiverType, node);
DartType writeContext = inferrer.getSetterType(target, receiverType);
@ -3298,18 +3361,48 @@ class InferenceVisitor
isVoidAllowed: writeContext is VoidType);
Expression replacement;
if (target.isExtensionMember) {
node.parent.replaceChild(
node,
replacement = inferrer.helper.forest.createStaticInvocation(
node.fileOffset,
target.member,
inferrer.helper.forest.createArgumentsForExtensionMethod(
node.fileOffset,
target.inferredExtensionTypeArguments.length,
0,
node.receiver,
extensionTypeArguments: target.inferredExtensionTypeArguments,
positionalArguments: [node.value])));
if (node.forEffect) {
replacement = new StaticInvocation(
target.member,
new Arguments(<Expression>[node.receiver, node.value],
types: target.inferredExtensionTypeArguments)
..fileOffset = node.fileOffset)
..fileOffset = node.fileOffset;
} else {
VariableDeclaration receiverVariable =
createVariable(node.receiver, receiverType);
VariableDeclaration valueVariable = createVariable(node.value, rhsType);
VariableDeclaration assignmentVariable = createVariable(
new StaticInvocation(
target.member,
new Arguments(<Expression>[
createVariableGet(receiverVariable),
createVariableGet(valueVariable)
], types: target.inferredExtensionTypeArguments)
..fileOffset = node.fileOffset)
..fileOffset = node.fileOffset,
const VoidType());
replacement = createLet(
receiverVariable,
createLet(
valueVariable,
createLet(
assignmentVariable, createVariableGet(valueVariable))))
..fileOffset = node.fileOffset;
}
node.replaceWith(replacement);
/*node.replaceWith(replacement = inferrer.helper.forest
.createStaticInvocation(
node.fileOffset,
target.member,
inferrer.helper.forest.createArgumentsForExtensionMethod(
node.fileOffset,
target.inferredExtensionTypeArguments.length,
0,
node.receiver,
extensionTypeArguments:
target.inferredExtensionTypeArguments,
positionalArguments: [node.value])));*/
}
return new ExpressionInferenceResult(rhsType, replacement);
}
@ -3318,7 +3411,7 @@ class InferenceVisitor
NullAwareIfNullSet node, DartType typeContext) {
ExpressionInferenceResult receiverResult = inferrer.inferExpression(
node.receiver, const UnknownType(), true,
isVoidAllowed: true);
isVoidAllowed: false);
DartType receiverType = receiverResult.inferredType;
VariableDeclaration receiverVariable =
createVariable(node.receiver, receiverType);
@ -3396,12 +3489,30 @@ class InferenceVisitor
node.writeOffset,
node.name.name.length);
} else if (writeTarget.isExtensionMember) {
write = new StaticInvocation(
writeTarget.member,
new Arguments(<Expression>[writeReceiver, node.value],
types: writeTarget.inferredExtensionTypeArguments)
..fileOffset = node.writeOffset)
..fileOffset = node.writeOffset;
if (node.forEffect) {
write = new StaticInvocation(
writeTarget.member,
new Arguments(<Expression>[writeReceiver, node.value],
types: writeTarget.inferredExtensionTypeArguments)
..fileOffset = node.writeOffset)
..fileOffset = node.writeOffset;
} else {
VariableDeclaration valueVariable =
createVariable(node.value, valueResult.inferredType);
VariableDeclaration assignmentVariable = createVariable(
new StaticInvocation(
writeTarget.member,
new Arguments(<Expression>[
writeReceiver,
createVariableGet(valueVariable)
], types: writeTarget.inferredExtensionTypeArguments)
..fileOffset = node.writeOffset)
..fileOffset = node.writeOffset,
const VoidType());
write = createLet(valueVariable,
createLet(assignmentVariable, createVariableGet(valueVariable)))
..fileOffset = node.writeOffset;
}
} else {
write = new PropertySet(
writeReceiver, node.name, node.value, writeTarget.member)
@ -3656,7 +3767,8 @@ class InferenceVisitor
if (!inferrer.isTopLevel) {
for (Expression expression in node.expressions) {
inferrer.inferExpression(
expression, const UnknownType(), !inferrer.isTopLevel);
expression, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: false);
}
}
return new ExpressionInferenceResult(
@ -3743,13 +3855,15 @@ class InferenceVisitor
@override
void visitSwitchStatement(SwitchStatement node) {
DartType expressionType = inferrer
.inferExpression(node.expression, const UnknownType(), true)
.inferExpression(node.expression, const UnknownType(), true,
isVoidAllowed: false)
.inferredType;
for (SwitchCase switchCase in node.cases) {
for (Expression caseExpression in switchCase.expressions) {
ExpressionInferenceResult caseExpressionResult =
inferrer.inferExpression(caseExpression, expressionType, true);
inferrer.inferExpression(caseExpression, expressionType, true,
isVoidAllowed: false);
if (caseExpressionResult.replacement != null) {
caseExpression = caseExpressionResult.replacement;
}
@ -3789,7 +3903,8 @@ class InferenceVisitor
@override
ExpressionInferenceResult visitThrow(Throw node, DartType typeContext) {
inferrer.inferExpression(
node.expression, const UnknownType(), !inferrer.isTopLevel);
node.expression, const UnknownType(), !inferrer.isTopLevel,
isVoidAllowed: false);
return const ExpressionInferenceResult(const BottomType());
}
@ -3899,7 +4014,8 @@ class InferenceVisitor
InterfaceType expectedType =
inferrer.coreTypes.boolRawType(inferrer.library.nonNullable);
DartType conditionType = inferrer
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel)
.inferExpression(node.condition, expectedType, !inferrer.isTopLevel,
isVoidAllowed: false)
.inferredType;
inferrer.ensureAssignable(
expectedType, conditionType, node.condition, node.condition.fileOffset);
@ -3920,11 +4036,13 @@ class InferenceVisitor
: inferrer.coreTypes.iterableClass);
}
inferredType = inferrer
.inferExpression(node.expression, typeContext, true)
.inferExpression(node.expression, typeContext, true,
isVoidAllowed: true)
.inferredType;
} else {
inferredType = inferrer
.inferExpression(node.expression, const UnknownType(), true)
.inferExpression(node.expression, const UnknownType(), true,
isVoidAllowed: true)
.inferredType;
}
closureContext.handleYield(inferrer, node.isYieldStar, inferredType,

View file

@ -188,6 +188,7 @@ enum InternalExpressionKind {
CompoundPropertySet,
CompoundSuperIndexSet,
DeferredCheck,
ExtensionSet,
IfNull,
IfNullIndexSet,
IfNullPropertySet,
@ -2110,6 +2111,71 @@ class CompoundSuperIndexSet extends InternalExpression {
}
}
/// Internal expression representing an assignment to an extension setter.
///
/// An extension set of the form `receiver.target = value` is, if used for
/// value, encoded as the expression:
///
/// let receiverVariable = receiver in
/// let valueVariable = value in
/// let writeVariable = target(receiverVariable, valueVariable) in
/// valueVariable
///
/// or if the receiver is read-only, like `this` or a final variable,
///
/// let valueVariable = value in
/// let writeVariable = target(receiver, valueVariable) in
/// valueVariable
///
/// and, if used for effect, encoded as a [StaticInvocation]:
///
/// target(receiver, value)
///
// TODO(johnniwinther): Rename read-only to side-effect-free.
class ExtensionSet extends InternalExpression {
Expression receiver;
ObjectAccessTarget target;
Expression value;
bool readOnlyReceiver;
ExtensionSet(this.receiver, this.target, this.value, {this.readOnlyReceiver})
: assert(readOnlyReceiver != null) {
receiver?.parent = this;
value?.parent = this;
}
@override
InternalExpressionKind get kind => InternalExpressionKind.ExtensionSet;
@override
void visitChildren(Visitor<dynamic> v) {
receiver?.accept(v);
value?.accept(v);
}
@override
void transformChildren(Transformer v) {
if (receiver != null) {
receiver = receiver.accept<TreeNode>(v);
receiver?.parent = this;
}
if (value != null) {
value = value.accept<TreeNode>(v);
value?.parent = this;
}
}
}
class PropertySetImpl extends PropertySet {
final bool forEffect;
PropertySetImpl(Expression receiver, Name name, Expression value,
{Member interfaceTarget, this.forEffect})
: assert(forEffect != null),
super(receiver, name, value, interfaceTarget);
}
/// Creates a [Let] of [variable] with the given [body] using
/// `variable.fileOffset` as the file offset for the let.
///

View file

@ -488,6 +488,8 @@ class OutlineBuilder extends StackListener {
if (extensionThisType is TypeBuilder) {
library.currentTypeParameterScopeBuilder
.registerExtensionThisType(extensionThisType);
} else {
// TODO(johnniwinther): Supply an invalid type as the extension on type.
}
}
debugEvent("beginClassOrMixinBody");

View file

@ -1729,6 +1729,7 @@ mutable
mutate
mutated
mutates
mutating
mutation
mutations
mutual

View file

@ -56,25 +56,23 @@ static method NumberExtension|-(final self::Number* #this, core::Object* other)
}
static method ClassExtension|get#property(final self::Class* #this) → self::Number*
return #this.{self::Class::field};
static method ClassExtension|set#property(final self::Class* #this, self::Number* value) → self::Number* {
final self::Number* #t1 = value;
static method ClassExtension|set#property(final self::Class* #this, self::Number* value) → void {
#this.{self::Class::field} = value;
return #t1;
}
static method ClassExtension|testImplicitProperties(final self::Class* #this) → dynamic {
self::Number* n0 = new self::Number::•(0);
self::Number* n1 = new self::Number::•(1);
self::Number* n2 = new self::Number::•(2);
self::expect(n0, self::ClassExtension|get#property(#this));
self::expect(n1, self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1)));
self::expect(n2, self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1)));
self::expect(n0, self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n2)));
self::expect(n1, self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1)));
self::expect(n0, self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n1)));
self::expect(n1, self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1)));
self::expect(n0, self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), 1)));
self::expect(n0, let final self::Number* #t2 = self::ClassExtension|get#property(#this) in let final self::Number* #t3 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t2, 1)) in #t2);
self::expect(n1, let final self::Number* #t4 = self::ClassExtension|get#property(#this) in let final self::Number* #t5 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t4, 1)) in #t4);
self::expect(n1, let final self::Number* #t1 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t2 = self::ClassExtension|set#property(#this, #t1) in #t1);
self::expect(n2, let final self::Number* #t3 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t4 = self::ClassExtension|set#property(#this, #t3) in #t3);
self::expect(n0, let final self::Number* #t5 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n2) in let final void #t6 = self::ClassExtension|set#property(#this, #t5) in #t5);
self::expect(n1, let final self::Number* #t7 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t8 = self::ClassExtension|set#property(#this, #t7) in #t7);
self::expect(n0, let final self::Number* #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
self::expect(n1, let final self::Number* #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
self::expect(n0, let final self::Number* #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
self::expect(n0, let final self::Number* #t15 = self::ClassExtension|get#property(#this) in let final void #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
self::expect(n1, let final self::Number* #t17 = self::ClassExtension|get#property(#this) in let final void #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
self::expect(n0, self::ClassExtension|get#property(#this));
self::expect(n0, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
@ -87,9 +85,9 @@ static method ClassExtension|testImplicitProperties(final self::Class* #this)
self::expect(n1, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n1));
self::expect(n0, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1));
let final self::Number* #t19 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t20 = self::ClassExtension|set#property(#this, #t19) in #t19;
self::expect(n1, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), 1));
let final self::Number* #t21 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t22 = self::ClassExtension|set#property(#this, #t21) in #t21;
self::expect(n0, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1));
self::expect(n1, self::ClassExtension|get#property(#this));
@ -117,8 +115,8 @@ static method testLocals() → dynamic {
self::expect(n0, v = self::NumberExtension|-(v, n1));
self::expect(n1, v = self::NumberExtension|+(v, 1));
self::expect(n0, v = self::NumberExtension|-(v, 1));
self::expect(n0, let final self::Number* #t6 = v in let final self::Number* #t7 = v = self::NumberExtension|+(#t6, 1) in #t6);
self::expect(n1, let final self::Number* #t8 = v in let final self::Number* #t9 = v = self::NumberExtension|-(#t8, 1) in #t8);
self::expect(n0, let final self::Number* #t23 = v in let final self::Number* #t24 = v = self::NumberExtension|+(#t23, 1) in #t23);
self::expect(n1, let final self::Number* #t25 = v in let final self::Number* #t26 = v = self::NumberExtension|-(#t25, 1) in #t25);
self::expect(n0, v);
self::expect(n0, v);
v = self::NumberExtension|+(v, n1);
@ -146,64 +144,64 @@ static method testProperties() → dynamic {
self::Number* n2 = new self::Number::•(2);
self::Class* v = new self::Class::•(n0);
self::expect(n0, v.{self::Class::field});
self::expect(n1, let final self::Class* #t10 = v in #t10.{self::Class::field} = self::NumberExtension|+(#t10.{self::Class::field}, n1));
self::expect(n2, let final self::Class* #t11 = v in #t11.{self::Class::field} = self::NumberExtension|+(#t11.{self::Class::field}, n1));
self::expect(n0, let final self::Class* #t12 = v in #t12.{self::Class::field} = self::NumberExtension|-(#t12.{self::Class::field}, n2));
self::expect(n1, let final self::Class* #t13 = v in #t13.{self::Class::field} = self::NumberExtension|+(#t13.{self::Class::field}, n1));
self::expect(n0, let final self::Class* #t14 = v in #t14.{self::Class::field} = self::NumberExtension|-(#t14.{self::Class::field}, n1));
self::expect(n1, let final self::Class* #t15 = v in #t15.{self::Class::field} = self::NumberExtension|+(#t15.{self::Class::field}, 1));
self::expect(n0, let final self::Class* #t16 = v in #t16.{self::Class::field} = self::NumberExtension|-(#t16.{self::Class::field}, 1));
self::expect(n0, let final self::Class* #t17 = v in let final self::Number* #t18 = #t17.{self::Class::field} in let final self::Number* #t19 = #t17.{self::Class::field} = self::NumberExtension|+(#t18, 1) in #t18);
self::expect(n1, let final self::Class* #t20 = v in let final self::Number* #t21 = #t20.{self::Class::field} in let final self::Number* #t22 = #t20.{self::Class::field} = self::NumberExtension|-(#t21, 1) in #t21);
self::expect(n1, let final self::Class* #t27 = v in #t27.{self::Class::field} = self::NumberExtension|+(#t27.{self::Class::field}, n1));
self::expect(n2, let final self::Class* #t28 = v in #t28.{self::Class::field} = self::NumberExtension|+(#t28.{self::Class::field}, n1));
self::expect(n0, let final self::Class* #t29 = v in #t29.{self::Class::field} = self::NumberExtension|-(#t29.{self::Class::field}, n2));
self::expect(n1, let final self::Class* #t30 = v in #t30.{self::Class::field} = self::NumberExtension|+(#t30.{self::Class::field}, n1));
self::expect(n0, let final self::Class* #t31 = v in #t31.{self::Class::field} = self::NumberExtension|-(#t31.{self::Class::field}, n1));
self::expect(n1, let final self::Class* #t32 = v in #t32.{self::Class::field} = self::NumberExtension|+(#t32.{self::Class::field}, 1));
self::expect(n0, let final self::Class* #t33 = v in #t33.{self::Class::field} = self::NumberExtension|-(#t33.{self::Class::field}, 1));
self::expect(n0, let final self::Class* #t34 = v in let final self::Number* #t35 = #t34.{self::Class::field} in let final self::Number* #t36 = #t34.{self::Class::field} = self::NumberExtension|+(#t35, 1) in #t35);
self::expect(n1, let final self::Class* #t37 = v in let final self::Number* #t38 = #t37.{self::Class::field} in let final self::Number* #t39 = #t37.{self::Class::field} = self::NumberExtension|-(#t38, 1) in #t38);
self::expect(n0, v.{self::Class::field});
self::expect(n0, v.{self::Class::field});
let final self::Class* #t23 = v in #t23.{self::Class::field} = self::NumberExtension|+(#t23.{self::Class::field}, n1);
let final self::Class* #t40 = v in #t40.{self::Class::field} = self::NumberExtension|+(#t40.{self::Class::field}, n1);
self::expect(n1, v.{self::Class::field});
let final self::Class* #t24 = v in #t24.{self::Class::field} = self::NumberExtension|+(#t24.{self::Class::field}, n1);
let final self::Class* #t41 = v in #t41.{self::Class::field} = self::NumberExtension|+(#t41.{self::Class::field}, n1);
self::expect(n2, v.{self::Class::field});
let final self::Class* #t25 = v in #t25.{self::Class::field} = self::NumberExtension|-(#t25.{self::Class::field}, n2);
let final self::Class* #t42 = v in #t42.{self::Class::field} = self::NumberExtension|-(#t42.{self::Class::field}, n2);
self::expect(n0, v.{self::Class::field});
let final self::Class* #t26 = v in #t26.{self::Class::field} = self::NumberExtension|+(#t26.{self::Class::field}, n1);
let final self::Class* #t43 = v in #t43.{self::Class::field} = self::NumberExtension|+(#t43.{self::Class::field}, n1);
self::expect(n1, v.{self::Class::field});
let final self::Class* #t27 = v in #t27.{self::Class::field} = self::NumberExtension|-(#t27.{self::Class::field}, n1);
let final self::Class* #t44 = v in #t44.{self::Class::field} = self::NumberExtension|-(#t44.{self::Class::field}, n1);
self::expect(n0, v.{self::Class::field});
let final self::Class* #t28 = v in #t28.{self::Class::field} = self::NumberExtension|+(#t28.{self::Class::field}, 1);
let final self::Class* #t45 = v in #t45.{self::Class::field} = self::NumberExtension|+(#t45.{self::Class::field}, 1);
self::expect(n1, v.{self::Class::field});
let final self::Class* #t29 = v in #t29.{self::Class::field} = self::NumberExtension|-(#t29.{self::Class::field}, 1);
let final self::Class* #t46 = v in #t46.{self::Class::field} = self::NumberExtension|-(#t46.{self::Class::field}, 1);
self::expect(n0, v.{self::Class::field});
let final self::Class* #t30 = v in #t30.{self::Class::field} = self::NumberExtension|+(#t30.{self::Class::field}, 1);
let final self::Class* #t47 = v in #t47.{self::Class::field} = self::NumberExtension|+(#t47.{self::Class::field}, 1);
self::expect(n1, v.{self::Class::field});
let final self::Class* #t31 = v in #t31.{self::Class::field} = self::NumberExtension|-(#t31.{self::Class::field}, 1);
let final self::Class* #t48 = v in #t48.{self::Class::field} = self::NumberExtension|-(#t48.{self::Class::field}, 1);
self::expect(n0, v.{self::Class::field});
self::expect(n0, self::ClassExtension|get#property(v));
self::expect(n1, let final self::Class* #t32 = v in self::ClassExtension|set#property(#t32, self::NumberExtension|+(self::ClassExtension|get#property(#t32), n1)));
self::expect(n2, let final self::Class* #t33 = v in self::ClassExtension|set#property(#t33, self::NumberExtension|+(self::ClassExtension|get#property(#t33), n1)));
self::expect(n0, let final self::Class* #t34 = v in self::ClassExtension|set#property(#t34, self::NumberExtension|-(self::ClassExtension|get#property(#t34), n2)));
self::expect(n1, let final self::Class* #t35 = v in self::ClassExtension|set#property(#t35, self::NumberExtension|+(self::ClassExtension|get#property(#t35), n1)));
self::expect(n0, let final self::Class* #t36 = v in self::ClassExtension|set#property(#t36, self::NumberExtension|-(self::ClassExtension|get#property(#t36), n1)));
self::expect(n1, let final self::Class* #t37 = v in self::ClassExtension|set#property(#t37, self::NumberExtension|+(self::ClassExtension|get#property(#t37), 1)));
self::expect(n0, let final self::Class* #t38 = v in self::ClassExtension|set#property(#t38, self::NumberExtension|-(self::ClassExtension|get#property(#t38), 1)));
self::expect(n0, let final self::Class* #t39 = v in let final self::Number* #t40 = self::ClassExtension|get#property(#t39) in let final self::Number* #t41 = self::ClassExtension|set#property(#t39, self::NumberExtension|+(#t40, 1)) in #t40);
self::expect(n1, let final self::Class* #t42 = v in let final self::Number* #t43 = self::ClassExtension|get#property(#t42) in let final self::Number* #t44 = self::ClassExtension|set#property(#t42, self::NumberExtension|-(#t43, 1)) in #t43);
self::expect(n1, let final self::Class* #t49 = v in let final self::Class* #t50 = #t49 in let final self::Number* #t51 = self::NumberExtension|+(self::ClassExtension|get#property(#t49), n1) in let final void #t52 = self::ClassExtension|set#property(#t50, #t51) in #t51);
self::expect(n2, let final self::Class* #t53 = v in let final self::Class* #t54 = #t53 in let final self::Number* #t55 = self::NumberExtension|+(self::ClassExtension|get#property(#t53), n1) in let final void #t56 = self::ClassExtension|set#property(#t54, #t55) in #t55);
self::expect(n0, let final self::Class* #t57 = v in let final self::Class* #t58 = #t57 in let final self::Number* #t59 = self::NumberExtension|-(self::ClassExtension|get#property(#t57), n2) in let final void #t60 = self::ClassExtension|set#property(#t58, #t59) in #t59);
self::expect(n1, let final self::Class* #t61 = v in let final self::Class* #t62 = #t61 in let final self::Number* #t63 = self::NumberExtension|+(self::ClassExtension|get#property(#t61), n1) in let final void #t64 = self::ClassExtension|set#property(#t62, #t63) in #t63);
self::expect(n0, let final self::Class* #t65 = v in let final self::Class* #t66 = #t65 in let final self::Number* #t67 = self::NumberExtension|-(self::ClassExtension|get#property(#t65), n1) in let final void #t68 = self::ClassExtension|set#property(#t66, #t67) in #t67);
self::expect(n1, let final self::Class* #t69 = v in let final self::Class* #t70 = #t69 in let final self::Number* #t71 = self::NumberExtension|+(self::ClassExtension|get#property(#t69), 1) in let final void #t72 = self::ClassExtension|set#property(#t70, #t71) in #t71);
self::expect(n0, let final self::Class* #t73 = v in let final self::Class* #t74 = #t73 in let final self::Number* #t75 = self::NumberExtension|-(self::ClassExtension|get#property(#t73), 1) in let final void #t76 = self::ClassExtension|set#property(#t74, #t75) in #t75);
self::expect(n0, let final self::Class* #t77 = v in let final self::Number* #t78 = self::ClassExtension|get#property(#t77) in let final self::Number* #t79 = self::ClassExtension|set#property(#t77, self::NumberExtension|+(#t78, 1)) in #t78);
self::expect(n1, let final self::Class* #t80 = v in let final self::Number* #t81 = self::ClassExtension|get#property(#t80) in let final self::Number* #t82 = self::ClassExtension|set#property(#t80, self::NumberExtension|-(#t81, 1)) in #t81);
self::expect(n0, self::ClassExtension|get#property(v));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t45 = v in self::ClassExtension|set#property(#t45, self::NumberExtension|+(self::ClassExtension|get#property(#t45), n1));
let final self::Class* #t83 = v in self::ClassExtension|set#property(#t83, self::NumberExtension|+(self::ClassExtension|get#property(#t83), n1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t46 = v in self::ClassExtension|set#property(#t46, self::NumberExtension|+(self::ClassExtension|get#property(#t46), n1));
let final self::Class* #t84 = v in self::ClassExtension|set#property(#t84, self::NumberExtension|+(self::ClassExtension|get#property(#t84), n1));
self::expect(n2, self::ClassExtension|get#property(v));
let final self::Class* #t47 = v in self::ClassExtension|set#property(#t47, self::NumberExtension|-(self::ClassExtension|get#property(#t47), n2));
let final self::Class* #t85 = v in self::ClassExtension|set#property(#t85, self::NumberExtension|-(self::ClassExtension|get#property(#t85), n2));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t48 = v in self::ClassExtension|set#property(#t48, self::NumberExtension|+(self::ClassExtension|get#property(#t48), n1));
let final self::Class* #t86 = v in self::ClassExtension|set#property(#t86, self::NumberExtension|+(self::ClassExtension|get#property(#t86), n1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t49 = v in self::ClassExtension|set#property(#t49, self::NumberExtension|-(self::ClassExtension|get#property(#t49), n1));
let final self::Class* #t87 = v in self::ClassExtension|set#property(#t87, self::NumberExtension|-(self::ClassExtension|get#property(#t87), n1));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t50 = v in self::ClassExtension|set#property(#t50, self::NumberExtension|+(self::ClassExtension|get#property(#t50), 1));
let final self::Class* #t88 = v in let final self::Class* #t89 = #t88 in let final self::Number* #t90 = self::NumberExtension|+(self::ClassExtension|get#property(#t88), 1) in let final void #t91 = self::ClassExtension|set#property(#t89, #t90) in #t90;
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t51 = v in self::ClassExtension|set#property(#t51, self::NumberExtension|-(self::ClassExtension|get#property(#t51), 1));
let final self::Class* #t92 = v in let final self::Class* #t93 = #t92 in let final self::Number* #t94 = self::NumberExtension|-(self::ClassExtension|get#property(#t92), 1) in let final void #t95 = self::ClassExtension|set#property(#t93, #t94) in #t94;
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t52 = v in self::ClassExtension|set#property(#t52, self::NumberExtension|+(self::ClassExtension|get#property(#t52), 1));
let final self::Class* #t96 = v in self::ClassExtension|set#property(#t96, self::NumberExtension|+(self::ClassExtension|get#property(#t96), 1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t53 = v in self::ClassExtension|set#property(#t53, self::NumberExtension|-(self::ClassExtension|get#property(#t53), 1));
let final self::Class* #t97 = v in self::ClassExtension|set#property(#t97, self::NumberExtension|-(self::ClassExtension|get#property(#t97), 1));
self::expect(n0, self::ClassExtension|get#property(v));
}
static method testExplicitProperties() → dynamic {
@ -212,34 +210,34 @@ static method testExplicitProperties() → dynamic {
self::Number* n2 = new self::Number::•(2);
self::Class* v = new self::Class::•(n0);
self::expect(n0, self::ClassExtension|get#property(v));
self::expect(n1, let final self::Class* #t54 = v in self::ClassExtension|set#property(#t54, self::NumberExtension|+(self::ClassExtension|get#property(#t54), n1)));
self::expect(n2, let final self::Class* #t55 = v in self::ClassExtension|set#property(#t55, self::NumberExtension|+(self::ClassExtension|get#property(#t55), n1)));
self::expect(n0, let final self::Class* #t56 = v in self::ClassExtension|set#property(#t56, self::NumberExtension|-(self::ClassExtension|get#property(#t56), n2)));
self::expect(n1, let final self::Class* #t57 = v in self::ClassExtension|set#property(#t57, self::NumberExtension|+(self::ClassExtension|get#property(#t57), n1)));
self::expect(n0, let final self::Class* #t58 = v in self::ClassExtension|set#property(#t58, self::NumberExtension|-(self::ClassExtension|get#property(#t58), n1)));
self::expect(n1, let final self::Class* #t59 = v in self::ClassExtension|set#property(#t59, self::NumberExtension|+(self::ClassExtension|get#property(#t59), 1)));
self::expect(n0, let final self::Class* #t60 = v in self::ClassExtension|set#property(#t60, self::NumberExtension|-(self::ClassExtension|get#property(#t60), 1)));
self::expect(n0, let final self::Class* #t61 = v in let final self::Number* #t62 = self::ClassExtension|get#property(#t61) in let final self::Number* #t63 = self::ClassExtension|set#property(#t61, self::NumberExtension|+(#t62, 1)) in #t62);
self::expect(n1, let final self::Class* #t64 = v in let final self::Number* #t65 = self::ClassExtension|get#property(#t64) in let final self::Number* #t66 = self::ClassExtension|set#property(#t64, self::NumberExtension|-(#t65, 1)) in #t65);
self::expect(n1, let final self::Class* #t98 = v in let final self::Number* #t99 = self::NumberExtension|+(self::ClassExtension|get#property(#t98), n1) in let final void #t100 = self::ClassExtension|set#property(#t98, #t99) in #t99);
self::expect(n2, let final self::Class* #t101 = v in let final self::Number* #t102 = self::NumberExtension|+(self::ClassExtension|get#property(#t101), n1) in let final void #t103 = self::ClassExtension|set#property(#t101, #t102) in #t102);
self::expect(n0, let final self::Class* #t104 = v in let final self::Number* #t105 = self::NumberExtension|-(self::ClassExtension|get#property(#t104), n2) in let final void #t106 = self::ClassExtension|set#property(#t104, #t105) in #t105);
self::expect(n1, let final self::Class* #t107 = v in let final self::Number* #t108 = self::NumberExtension|+(self::ClassExtension|get#property(#t107), n1) in let final void #t109 = self::ClassExtension|set#property(#t107, #t108) in #t108);
self::expect(n0, let final self::Class* #t110 = v in let final self::Number* #t111 = self::NumberExtension|-(self::ClassExtension|get#property(#t110), n1) in let final void #t112 = self::ClassExtension|set#property(#t110, #t111) in #t111);
self::expect(n1, let final self::Class* #t113 = v in let final self::Number* #t114 = self::NumberExtension|+(self::ClassExtension|get#property(#t113), 1) in let final void #t115 = self::ClassExtension|set#property(#t113, #t114) in #t114);
self::expect(n0, let final self::Class* #t116 = v in let final self::Number* #t117 = self::NumberExtension|-(self::ClassExtension|get#property(#t116), 1) in let final void #t118 = self::ClassExtension|set#property(#t116, #t117) in #t117);
self::expect(n0, let final self::Class* #t119 = v in let final self::Number* #t120 = self::ClassExtension|get#property(#t119) in let final self::Number* #t121 = let final self::Number* #t122 = self::NumberExtension|+(#t120, 1) in let final void #t123 = self::ClassExtension|set#property(#t119, #t122) in #t122 in #t120);
self::expect(n1, let final self::Class* #t124 = v in let final self::Number* #t125 = self::ClassExtension|get#property(#t124) in let final self::Number* #t126 = let final self::Number* #t127 = self::NumberExtension|-(#t125, 1) in let final void #t128 = self::ClassExtension|set#property(#t124, #t127) in #t127 in #t125);
self::expect(n0, self::ClassExtension|get#property(v));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t67 = v in self::ClassExtension|set#property(#t67, self::NumberExtension|+(self::ClassExtension|get#property(#t67), n1));
let final self::Class* #t129 = v in self::ClassExtension|set#property(#t129, self::NumberExtension|+(self::ClassExtension|get#property(#t129), n1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t68 = v in self::ClassExtension|set#property(#t68, self::NumberExtension|+(self::ClassExtension|get#property(#t68), n1));
let final self::Class* #t130 = v in self::ClassExtension|set#property(#t130, self::NumberExtension|+(self::ClassExtension|get#property(#t130), n1));
self::expect(n2, self::ClassExtension|get#property(v));
let final self::Class* #t69 = v in self::ClassExtension|set#property(#t69, self::NumberExtension|-(self::ClassExtension|get#property(#t69), n2));
let final self::Class* #t131 = v in self::ClassExtension|set#property(#t131, self::NumberExtension|-(self::ClassExtension|get#property(#t131), n2));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t70 = v in self::ClassExtension|set#property(#t70, self::NumberExtension|+(self::ClassExtension|get#property(#t70), n1));
let final self::Class* #t132 = v in self::ClassExtension|set#property(#t132, self::NumberExtension|+(self::ClassExtension|get#property(#t132), n1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t71 = v in self::ClassExtension|set#property(#t71, self::NumberExtension|-(self::ClassExtension|get#property(#t71), n1));
let final self::Class* #t133 = v in self::ClassExtension|set#property(#t133, self::NumberExtension|-(self::ClassExtension|get#property(#t133), n1));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t72 = v in self::ClassExtension|set#property(#t72, self::NumberExtension|+(self::ClassExtension|get#property(#t72), 1));
let final self::Class* #t134 = v in let final self::Number* #t135 = self::NumberExtension|+(self::ClassExtension|get#property(#t134), 1) in let final void #t136 = self::ClassExtension|set#property(#t134, #t135) in #t135;
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t73 = v in self::ClassExtension|set#property(#t73, self::NumberExtension|-(self::ClassExtension|get#property(#t73), 1));
let final self::Class* #t137 = v in let final self::Number* #t138 = self::NumberExtension|-(self::ClassExtension|get#property(#t137), 1) in let final void #t139 = self::ClassExtension|set#property(#t137, #t138) in #t138;
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t74 = v in self::ClassExtension|set#property(#t74, self::NumberExtension|+(self::ClassExtension|get#property(#t74), 1));
let final self::Class* #t140 = v in self::ClassExtension|set#property(#t140, self::NumberExtension|+(self::ClassExtension|get#property(#t140), 1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t75 = v in self::ClassExtension|set#property(#t75, self::NumberExtension|-(self::ClassExtension|get#property(#t75), 1));
let final self::Class* #t141 = v in self::ClassExtension|set#property(#t141, self::NumberExtension|-(self::ClassExtension|get#property(#t141), 1));
self::expect(n0, self::ClassExtension|get#property(v));
}
static method expect(dynamic expected, dynamic actual) → dynamic {

View file

@ -56,25 +56,23 @@ static method NumberExtension|-(final self::Number* #this, core::Object* other)
}
static method ClassExtension|get#property(final self::Class* #this) → self::Number*
return #this.{self::Class::field};
static method ClassExtension|set#property(final self::Class* #this, self::Number* value) → self::Number* {
final self::Number* #t1 = value;
static method ClassExtension|set#property(final self::Class* #this, self::Number* value) → void {
#this.{self::Class::field} = value;
return #t1;
}
static method ClassExtension|testImplicitProperties(final self::Class* #this) → dynamic {
self::Number* n0 = new self::Number::•(0);
self::Number* n1 = new self::Number::•(1);
self::Number* n2 = new self::Number::•(2);
self::expect(n0, self::ClassExtension|get#property(#this));
self::expect(n1, self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1)));
self::expect(n2, self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1)));
self::expect(n0, self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n2)));
self::expect(n1, self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1)));
self::expect(n0, self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n1)));
self::expect(n1, self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1)));
self::expect(n0, self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), 1)));
self::expect(n0, let final self::Number* #t2 = self::ClassExtension|get#property(#this) in let final self::Number* #t3 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t2, 1)) in #t2);
self::expect(n1, let final self::Number* #t4 = self::ClassExtension|get#property(#this) in let final self::Number* #t5 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t4, 1)) in #t4);
self::expect(n1, let final self::Number* #t1 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t2 = self::ClassExtension|set#property(#this, #t1) in #t1);
self::expect(n2, let final self::Number* #t3 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t4 = self::ClassExtension|set#property(#this, #t3) in #t3);
self::expect(n0, let final self::Number* #t5 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n2) in let final void #t6 = self::ClassExtension|set#property(#this, #t5) in #t5);
self::expect(n1, let final self::Number* #t7 = self::NumberExtension|+(self::ClassExtension|get#property(#this), n1) in let final void #t8 = self::ClassExtension|set#property(#this, #t7) in #t7);
self::expect(n0, let final self::Number* #t9 = self::NumberExtension|-(self::ClassExtension|get#property(#this), n1) in let final void #t10 = self::ClassExtension|set#property(#this, #t9) in #t9);
self::expect(n1, let final self::Number* #t11 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t12 = self::ClassExtension|set#property(#this, #t11) in #t11);
self::expect(n0, let final self::Number* #t13 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t14 = self::ClassExtension|set#property(#this, #t13) in #t13);
self::expect(n0, let final self::Number* #t15 = self::ClassExtension|get#property(#this) in let final void #t16 = self::ClassExtension|set#property(#this, self::NumberExtension|+(#t15, 1)) in #t15);
self::expect(n1, let final self::Number* #t17 = self::ClassExtension|get#property(#this) in let final void #t18 = self::ClassExtension|set#property(#this, self::NumberExtension|-(#t17, 1)) in #t17);
self::expect(n0, self::ClassExtension|get#property(#this));
self::expect(n0, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), n1));
@ -87,9 +85,9 @@ static method ClassExtension|testImplicitProperties(final self::Class* #this)
self::expect(n1, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), n1));
self::expect(n0, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1));
let final self::Number* #t19 = self::NumberExtension|+(self::ClassExtension|get#property(#this), 1) in let final void #t20 = self::ClassExtension|set#property(#this, #t19) in #t19;
self::expect(n1, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|-(self::ClassExtension|get#property(#this), 1));
let final self::Number* #t21 = self::NumberExtension|-(self::ClassExtension|get#property(#this), 1) in let final void #t22 = self::ClassExtension|set#property(#this, #t21) in #t21;
self::expect(n0, self::ClassExtension|get#property(#this));
self::ClassExtension|set#property(#this, self::NumberExtension|+(self::ClassExtension|get#property(#this), 1));
self::expect(n1, self::ClassExtension|get#property(#this));
@ -117,8 +115,8 @@ static method testLocals() → dynamic {
self::expect(n0, v = self::NumberExtension|-(v, n1));
self::expect(n1, v = self::NumberExtension|+(v, 1));
self::expect(n0, v = self::NumberExtension|-(v, 1));
self::expect(n0, let final self::Number* #t6 = v in let final self::Number* #t7 = v = self::NumberExtension|+(#t6, 1) in #t6);
self::expect(n1, let final self::Number* #t8 = v in let final self::Number* #t9 = v = self::NumberExtension|-(#t8, 1) in #t8);
self::expect(n0, let final self::Number* #t23 = v in let final self::Number* #t24 = v = self::NumberExtension|+(#t23, 1) in #t23);
self::expect(n1, let final self::Number* #t25 = v in let final self::Number* #t26 = v = self::NumberExtension|-(#t25, 1) in #t25);
self::expect(n0, v);
self::expect(n0, v);
v = self::NumberExtension|+(v, n1);
@ -146,64 +144,64 @@ static method testProperties() → dynamic {
self::Number* n2 = new self::Number::•(2);
self::Class* v = new self::Class::•(n0);
self::expect(n0, v.{self::Class::field});
self::expect(n1, let final self::Class* #t10 = v in #t10.{self::Class::field} = self::NumberExtension|+(#t10.{self::Class::field}, n1));
self::expect(n2, let final self::Class* #t11 = v in #t11.{self::Class::field} = self::NumberExtension|+(#t11.{self::Class::field}, n1));
self::expect(n0, let final self::Class* #t12 = v in #t12.{self::Class::field} = self::NumberExtension|-(#t12.{self::Class::field}, n2));
self::expect(n1, let final self::Class* #t13 = v in #t13.{self::Class::field} = self::NumberExtension|+(#t13.{self::Class::field}, n1));
self::expect(n0, let final self::Class* #t14 = v in #t14.{self::Class::field} = self::NumberExtension|-(#t14.{self::Class::field}, n1));
self::expect(n1, let final self::Class* #t15 = v in #t15.{self::Class::field} = self::NumberExtension|+(#t15.{self::Class::field}, 1));
self::expect(n0, let final self::Class* #t16 = v in #t16.{self::Class::field} = self::NumberExtension|-(#t16.{self::Class::field}, 1));
self::expect(n0, let final self::Class* #t17 = v in let final self::Number* #t18 = #t17.{self::Class::field} in let final self::Number* #t19 = #t17.{self::Class::field} = self::NumberExtension|+(#t18, 1) in #t18);
self::expect(n1, let final self::Class* #t20 = v in let final self::Number* #t21 = #t20.{self::Class::field} in let final self::Number* #t22 = #t20.{self::Class::field} = self::NumberExtension|-(#t21, 1) in #t21);
self::expect(n1, let final self::Class* #t27 = v in #t27.{self::Class::field} = self::NumberExtension|+(#t27.{self::Class::field}, n1));
self::expect(n2, let final self::Class* #t28 = v in #t28.{self::Class::field} = self::NumberExtension|+(#t28.{self::Class::field}, n1));
self::expect(n0, let final self::Class* #t29 = v in #t29.{self::Class::field} = self::NumberExtension|-(#t29.{self::Class::field}, n2));
self::expect(n1, let final self::Class* #t30 = v in #t30.{self::Class::field} = self::NumberExtension|+(#t30.{self::Class::field}, n1));
self::expect(n0, let final self::Class* #t31 = v in #t31.{self::Class::field} = self::NumberExtension|-(#t31.{self::Class::field}, n1));
self::expect(n1, let final self::Class* #t32 = v in #t32.{self::Class::field} = self::NumberExtension|+(#t32.{self::Class::field}, 1));
self::expect(n0, let final self::Class* #t33 = v in #t33.{self::Class::field} = self::NumberExtension|-(#t33.{self::Class::field}, 1));
self::expect(n0, let final self::Class* #t34 = v in let final self::Number* #t35 = #t34.{self::Class::field} in let final self::Number* #t36 = #t34.{self::Class::field} = self::NumberExtension|+(#t35, 1) in #t35);
self::expect(n1, let final self::Class* #t37 = v in let final self::Number* #t38 = #t37.{self::Class::field} in let final self::Number* #t39 = #t37.{self::Class::field} = self::NumberExtension|-(#t38, 1) in #t38);
self::expect(n0, v.{self::Class::field});
self::expect(n0, v.{self::Class::field});
let final self::Class* #t23 = v in #t23.{self::Class::field} = self::NumberExtension|+(#t23.{self::Class::field}, n1);
let final self::Class* #t40 = v in #t40.{self::Class::field} = self::NumberExtension|+(#t40.{self::Class::field}, n1);
self::expect(n1, v.{self::Class::field});
let final self::Class* #t24 = v in #t24.{self::Class::field} = self::NumberExtension|+(#t24.{self::Class::field}, n1);
let final self::Class* #t41 = v in #t41.{self::Class::field} = self::NumberExtension|+(#t41.{self::Class::field}, n1);
self::expect(n2, v.{self::Class::field});
let final self::Class* #t25 = v in #t25.{self::Class::field} = self::NumberExtension|-(#t25.{self::Class::field}, n2);
let final self::Class* #t42 = v in #t42.{self::Class::field} = self::NumberExtension|-(#t42.{self::Class::field}, n2);
self::expect(n0, v.{self::Class::field});
let final self::Class* #t26 = v in #t26.{self::Class::field} = self::NumberExtension|+(#t26.{self::Class::field}, n1);
let final self::Class* #t43 = v in #t43.{self::Class::field} = self::NumberExtension|+(#t43.{self::Class::field}, n1);
self::expect(n1, v.{self::Class::field});
let final self::Class* #t27 = v in #t27.{self::Class::field} = self::NumberExtension|-(#t27.{self::Class::field}, n1);
let final self::Class* #t44 = v in #t44.{self::Class::field} = self::NumberExtension|-(#t44.{self::Class::field}, n1);
self::expect(n0, v.{self::Class::field});
let final self::Class* #t28 = v in #t28.{self::Class::field} = self::NumberExtension|+(#t28.{self::Class::field}, 1);
let final self::Class* #t45 = v in #t45.{self::Class::field} = self::NumberExtension|+(#t45.{self::Class::field}, 1);
self::expect(n1, v.{self::Class::field});
let final self::Class* #t29 = v in #t29.{self::Class::field} = self::NumberExtension|-(#t29.{self::Class::field}, 1);
let final self::Class* #t46 = v in #t46.{self::Class::field} = self::NumberExtension|-(#t46.{self::Class::field}, 1);
self::expect(n0, v.{self::Class::field});
let final self::Class* #t30 = v in #t30.{self::Class::field} = self::NumberExtension|+(#t30.{self::Class::field}, 1);
let final self::Class* #t47 = v in #t47.{self::Class::field} = self::NumberExtension|+(#t47.{self::Class::field}, 1);
self::expect(n1, v.{self::Class::field});
let final self::Class* #t31 = v in #t31.{self::Class::field} = self::NumberExtension|-(#t31.{self::Class::field}, 1);
let final self::Class* #t48 = v in #t48.{self::Class::field} = self::NumberExtension|-(#t48.{self::Class::field}, 1);
self::expect(n0, v.{self::Class::field});
self::expect(n0, self::ClassExtension|get#property(v));
self::expect(n1, let final self::Class* #t32 = v in self::ClassExtension|set#property(#t32, self::NumberExtension|+(self::ClassExtension|get#property(#t32), n1)));
self::expect(n2, let final self::Class* #t33 = v in self::ClassExtension|set#property(#t33, self::NumberExtension|+(self::ClassExtension|get#property(#t33), n1)));
self::expect(n0, let final self::Class* #t34 = v in self::ClassExtension|set#property(#t34, self::NumberExtension|-(self::ClassExtension|get#property(#t34), n2)));
self::expect(n1, let final self::Class* #t35 = v in self::ClassExtension|set#property(#t35, self::NumberExtension|+(self::ClassExtension|get#property(#t35), n1)));
self::expect(n0, let final self::Class* #t36 = v in self::ClassExtension|set#property(#t36, self::NumberExtension|-(self::ClassExtension|get#property(#t36), n1)));
self::expect(n1, let final self::Class* #t37 = v in self::ClassExtension|set#property(#t37, self::NumberExtension|+(self::ClassExtension|get#property(#t37), 1)));
self::expect(n0, let final self::Class* #t38 = v in self::ClassExtension|set#property(#t38, self::NumberExtension|-(self::ClassExtension|get#property(#t38), 1)));
self::expect(n0, let final self::Class* #t39 = v in let final self::Number* #t40 = self::ClassExtension|get#property(#t39) in let final self::Number* #t41 = self::ClassExtension|set#property(#t39, self::NumberExtension|+(#t40, 1)) in #t40);
self::expect(n1, let final self::Class* #t42 = v in let final self::Number* #t43 = self::ClassExtension|get#property(#t42) in let final self::Number* #t44 = self::ClassExtension|set#property(#t42, self::NumberExtension|-(#t43, 1)) in #t43);
self::expect(n1, let final self::Class* #t49 = v in let final self::Class* #t50 = #t49 in let final self::Number* #t51 = self::NumberExtension|+(self::ClassExtension|get#property(#t49), n1) in let final void #t52 = self::ClassExtension|set#property(#t50, #t51) in #t51);
self::expect(n2, let final self::Class* #t53 = v in let final self::Class* #t54 = #t53 in let final self::Number* #t55 = self::NumberExtension|+(self::ClassExtension|get#property(#t53), n1) in let final void #t56 = self::ClassExtension|set#property(#t54, #t55) in #t55);
self::expect(n0, let final self::Class* #t57 = v in let final self::Class* #t58 = #t57 in let final self::Number* #t59 = self::NumberExtension|-(self::ClassExtension|get#property(#t57), n2) in let final void #t60 = self::ClassExtension|set#property(#t58, #t59) in #t59);
self::expect(n1, let final self::Class* #t61 = v in let final self::Class* #t62 = #t61 in let final self::Number* #t63 = self::NumberExtension|+(self::ClassExtension|get#property(#t61), n1) in let final void #t64 = self::ClassExtension|set#property(#t62, #t63) in #t63);
self::expect(n0, let final self::Class* #t65 = v in let final self::Class* #t66 = #t65 in let final self::Number* #t67 = self::NumberExtension|-(self::ClassExtension|get#property(#t65), n1) in let final void #t68 = self::ClassExtension|set#property(#t66, #t67) in #t67);
self::expect(n1, let final self::Class* #t69 = v in let final self::Class* #t70 = #t69 in let final self::Number* #t71 = self::NumberExtension|+(self::ClassExtension|get#property(#t69), 1) in let final void #t72 = self::ClassExtension|set#property(#t70, #t71) in #t71);
self::expect(n0, let final self::Class* #t73 = v in let final self::Class* #t74 = #t73 in let final self::Number* #t75 = self::NumberExtension|-(self::ClassExtension|get#property(#t73), 1) in let final void #t76 = self::ClassExtension|set#property(#t74, #t75) in #t75);
self::expect(n0, let final self::Class* #t77 = v in let final self::Number* #t78 = self::ClassExtension|get#property(#t77) in let final self::Number* #t79 = self::ClassExtension|set#property(#t77, self::NumberExtension|+(#t78, 1)) in #t78);
self::expect(n1, let final self::Class* #t80 = v in let final self::Number* #t81 = self::ClassExtension|get#property(#t80) in let final self::Number* #t82 = self::ClassExtension|set#property(#t80, self::NumberExtension|-(#t81, 1)) in #t81);
self::expect(n0, self::ClassExtension|get#property(v));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t45 = v in self::ClassExtension|set#property(#t45, self::NumberExtension|+(self::ClassExtension|get#property(#t45), n1));
let final self::Class* #t83 = v in self::ClassExtension|set#property(#t83, self::NumberExtension|+(self::ClassExtension|get#property(#t83), n1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t46 = v in self::ClassExtension|set#property(#t46, self::NumberExtension|+(self::ClassExtension|get#property(#t46), n1));
let final self::Class* #t84 = v in self::ClassExtension|set#property(#t84, self::NumberExtension|+(self::ClassExtension|get#property(#t84), n1));
self::expect(n2, self::ClassExtension|get#property(v));
let final self::Class* #t47 = v in self::ClassExtension|set#property(#t47, self::NumberExtension|-(self::ClassExtension|get#property(#t47), n2));
let final self::Class* #t85 = v in self::ClassExtension|set#property(#t85, self::NumberExtension|-(self::ClassExtension|get#property(#t85), n2));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t48 = v in self::ClassExtension|set#property(#t48, self::NumberExtension|+(self::ClassExtension|get#property(#t48), n1));
let final self::Class* #t86 = v in self::ClassExtension|set#property(#t86, self::NumberExtension|+(self::ClassExtension|get#property(#t86), n1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t49 = v in self::ClassExtension|set#property(#t49, self::NumberExtension|-(self::ClassExtension|get#property(#t49), n1));
let final self::Class* #t87 = v in self::ClassExtension|set#property(#t87, self::NumberExtension|-(self::ClassExtension|get#property(#t87), n1));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t50 = v in self::ClassExtension|set#property(#t50, self::NumberExtension|+(self::ClassExtension|get#property(#t50), 1));
let final self::Class* #t88 = v in let final self::Class* #t89 = #t88 in let final self::Number* #t90 = self::NumberExtension|+(self::ClassExtension|get#property(#t88), 1) in let final void #t91 = self::ClassExtension|set#property(#t89, #t90) in #t90;
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t51 = v in self::ClassExtension|set#property(#t51, self::NumberExtension|-(self::ClassExtension|get#property(#t51), 1));
let final self::Class* #t92 = v in let final self::Class* #t93 = #t92 in let final self::Number* #t94 = self::NumberExtension|-(self::ClassExtension|get#property(#t92), 1) in let final void #t95 = self::ClassExtension|set#property(#t93, #t94) in #t94;
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t52 = v in self::ClassExtension|set#property(#t52, self::NumberExtension|+(self::ClassExtension|get#property(#t52), 1));
let final self::Class* #t96 = v in self::ClassExtension|set#property(#t96, self::NumberExtension|+(self::ClassExtension|get#property(#t96), 1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t53 = v in self::ClassExtension|set#property(#t53, self::NumberExtension|-(self::ClassExtension|get#property(#t53), 1));
let final self::Class* #t97 = v in self::ClassExtension|set#property(#t97, self::NumberExtension|-(self::ClassExtension|get#property(#t97), 1));
self::expect(n0, self::ClassExtension|get#property(v));
}
static method testExplicitProperties() → dynamic {
@ -212,34 +210,34 @@ static method testExplicitProperties() → dynamic {
self::Number* n2 = new self::Number::•(2);
self::Class* v = new self::Class::•(n0);
self::expect(n0, self::ClassExtension|get#property(v));
self::expect(n1, let final self::Class* #t54 = v in self::ClassExtension|set#property(#t54, self::NumberExtension|+(self::ClassExtension|get#property(#t54), n1)));
self::expect(n2, let final self::Class* #t55 = v in self::ClassExtension|set#property(#t55, self::NumberExtension|+(self::ClassExtension|get#property(#t55), n1)));
self::expect(n0, let final self::Class* #t56 = v in self::ClassExtension|set#property(#t56, self::NumberExtension|-(self::ClassExtension|get#property(#t56), n2)));
self::expect(n1, let final self::Class* #t57 = v in self::ClassExtension|set#property(#t57, self::NumberExtension|+(self::ClassExtension|get#property(#t57), n1)));
self::expect(n0, let final self::Class* #t58 = v in self::ClassExtension|set#property(#t58, self::NumberExtension|-(self::ClassExtension|get#property(#t58), n1)));
self::expect(n1, let final self::Class* #t59 = v in self::ClassExtension|set#property(#t59, self::NumberExtension|+(self::ClassExtension|get#property(#t59), 1)));
self::expect(n0, let final self::Class* #t60 = v in self::ClassExtension|set#property(#t60, self::NumberExtension|-(self::ClassExtension|get#property(#t60), 1)));
self::expect(n0, let final self::Class* #t61 = v in let final self::Number* #t62 = self::ClassExtension|get#property(#t61) in let final self::Number* #t63 = self::ClassExtension|set#property(#t61, self::NumberExtension|+(#t62, 1)) in #t62);
self::expect(n1, let final self::Class* #t64 = v in let final self::Number* #t65 = self::ClassExtension|get#property(#t64) in let final self::Number* #t66 = self::ClassExtension|set#property(#t64, self::NumberExtension|-(#t65, 1)) in #t65);
self::expect(n1, let final self::Class* #t98 = v in let final self::Number* #t99 = self::NumberExtension|+(self::ClassExtension|get#property(#t98), n1) in let final void #t100 = self::ClassExtension|set#property(#t98, #t99) in #t99);
self::expect(n2, let final self::Class* #t101 = v in let final self::Number* #t102 = self::NumberExtension|+(self::ClassExtension|get#property(#t101), n1) in let final void #t103 = self::ClassExtension|set#property(#t101, #t102) in #t102);
self::expect(n0, let final self::Class* #t104 = v in let final self::Number* #t105 = self::NumberExtension|-(self::ClassExtension|get#property(#t104), n2) in let final void #t106 = self::ClassExtension|set#property(#t104, #t105) in #t105);
self::expect(n1, let final self::Class* #t107 = v in let final self::Number* #t108 = self::NumberExtension|+(self::ClassExtension|get#property(#t107), n1) in let final void #t109 = self::ClassExtension|set#property(#t107, #t108) in #t108);
self::expect(n0, let final self::Class* #t110 = v in let final self::Number* #t111 = self::NumberExtension|-(self::ClassExtension|get#property(#t110), n1) in let final void #t112 = self::ClassExtension|set#property(#t110, #t111) in #t111);
self::expect(n1, let final self::Class* #t113 = v in let final self::Number* #t114 = self::NumberExtension|+(self::ClassExtension|get#property(#t113), 1) in let final void #t115 = self::ClassExtension|set#property(#t113, #t114) in #t114);
self::expect(n0, let final self::Class* #t116 = v in let final self::Number* #t117 = self::NumberExtension|-(self::ClassExtension|get#property(#t116), 1) in let final void #t118 = self::ClassExtension|set#property(#t116, #t117) in #t117);
self::expect(n0, let final self::Class* #t119 = v in let final self::Number* #t120 = self::ClassExtension|get#property(#t119) in let final self::Number* #t121 = let final self::Number* #t122 = self::NumberExtension|+(#t120, 1) in let final void #t123 = self::ClassExtension|set#property(#t119, #t122) in #t122 in #t120);
self::expect(n1, let final self::Class* #t124 = v in let final self::Number* #t125 = self::ClassExtension|get#property(#t124) in let final self::Number* #t126 = let final self::Number* #t127 = self::NumberExtension|-(#t125, 1) in let final void #t128 = self::ClassExtension|set#property(#t124, #t127) in #t127 in #t125);
self::expect(n0, self::ClassExtension|get#property(v));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t67 = v in self::ClassExtension|set#property(#t67, self::NumberExtension|+(self::ClassExtension|get#property(#t67), n1));
let final self::Class* #t129 = v in self::ClassExtension|set#property(#t129, self::NumberExtension|+(self::ClassExtension|get#property(#t129), n1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t68 = v in self::ClassExtension|set#property(#t68, self::NumberExtension|+(self::ClassExtension|get#property(#t68), n1));
let final self::Class* #t130 = v in self::ClassExtension|set#property(#t130, self::NumberExtension|+(self::ClassExtension|get#property(#t130), n1));
self::expect(n2, self::ClassExtension|get#property(v));
let final self::Class* #t69 = v in self::ClassExtension|set#property(#t69, self::NumberExtension|-(self::ClassExtension|get#property(#t69), n2));
let final self::Class* #t131 = v in self::ClassExtension|set#property(#t131, self::NumberExtension|-(self::ClassExtension|get#property(#t131), n2));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t70 = v in self::ClassExtension|set#property(#t70, self::NumberExtension|+(self::ClassExtension|get#property(#t70), n1));
let final self::Class* #t132 = v in self::ClassExtension|set#property(#t132, self::NumberExtension|+(self::ClassExtension|get#property(#t132), n1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t71 = v in self::ClassExtension|set#property(#t71, self::NumberExtension|-(self::ClassExtension|get#property(#t71), n1));
let final self::Class* #t133 = v in self::ClassExtension|set#property(#t133, self::NumberExtension|-(self::ClassExtension|get#property(#t133), n1));
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t72 = v in self::ClassExtension|set#property(#t72, self::NumberExtension|+(self::ClassExtension|get#property(#t72), 1));
let final self::Class* #t134 = v in let final self::Number* #t135 = self::NumberExtension|+(self::ClassExtension|get#property(#t134), 1) in let final void #t136 = self::ClassExtension|set#property(#t134, #t135) in #t135;
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t73 = v in self::ClassExtension|set#property(#t73, self::NumberExtension|-(self::ClassExtension|get#property(#t73), 1));
let final self::Class* #t137 = v in let final self::Number* #t138 = self::NumberExtension|-(self::ClassExtension|get#property(#t137), 1) in let final void #t139 = self::ClassExtension|set#property(#t137, #t138) in #t138;
self::expect(n0, self::ClassExtension|get#property(v));
let final self::Class* #t74 = v in self::ClassExtension|set#property(#t74, self::NumberExtension|+(self::ClassExtension|get#property(#t74), 1));
let final self::Class* #t140 = v in self::ClassExtension|set#property(#t140, self::NumberExtension|+(self::ClassExtension|get#property(#t140), 1));
self::expect(n1, self::ClassExtension|get#property(v));
let final self::Class* #t75 = v in self::ClassExtension|set#property(#t75, self::NumberExtension|-(self::ClassExtension|get#property(#t75), 1));
let final self::Class* #t141 = v in self::ClassExtension|set#property(#t141, self::NumberExtension|-(self::ClassExtension|get#property(#t141), 1));
self::expect(n0, self::ClassExtension|get#property(v));
}
static method expect(dynamic expected, dynamic actual) → dynamic {

View file

@ -97,10 +97,8 @@ static method Extension|get#tearOffGetterNamed(final self::Class* #this) → dyn
return self::Extension|get#writeSetterNamed(#this);
static method Extension|get#property(final self::Class* #this) → dynamic
return #this.{self::Class::field};
static method Extension|set#property(final self::Class* #this, dynamic value) → dynamic {
final dynamic #t1 = value;
static method Extension|set#property(final self::Class* #this, dynamic value) → void {
#this.{self::Class::field} = value;
return #t1;
}
static method Extension|invocations(final self::Class* #this, dynamic value) → dynamic {
self::Extension|readGetter(#this);
@ -173,10 +171,8 @@ static method GenericExtension|genericWriteSetterNamed<T extends core::Object* =
}
static method GenericExtension|get#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
return #this.{self::GenericClass::field};
static method GenericExtension|set#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → self::GenericExtension|set#property::T* {
final self::GenericExtension|set#property::T* #t2 = value;
static method GenericExtension|set#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → void {
#this.{self::GenericClass::field} = value;
return #t2;
}
static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T*>* #this) → dynamic
return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T*>(#this);

View file

@ -97,10 +97,8 @@ static method Extension|get#tearOffGetterNamed(final self::Class* #this) → dyn
return self::Extension|get#writeSetterNamed(#this);
static method Extension|get#property(final self::Class* #this) → dynamic
return #this.{self::Class::field};
static method Extension|set#property(final self::Class* #this, dynamic value) → dynamic {
final dynamic #t1 = value;
static method Extension|set#property(final self::Class* #this, dynamic value) → void {
#this.{self::Class::field} = value;
return #t1;
}
static method Extension|invocations(final self::Class* #this, dynamic value) → dynamic {
self::Extension|readGetter(#this);
@ -173,10 +171,8 @@ static method GenericExtension|genericWriteSetterNamed<T extends core::Object* =
}
static method GenericExtension|get#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#property::T*>* #this) → self::GenericExtension|get#property::T*
return #this.{self::GenericClass::field};
static method GenericExtension|set#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → self::GenericExtension|set#property::T* {
final self::GenericExtension|set#property::T* #t2 = value;
static method GenericExtension|set#property<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|set#property::T*>* #this, self::GenericExtension|set#property::T* value) → void {
#this.{self::GenericClass::field} = value;
return #t2;
}
static method GenericExtension|get#tearOffGetterNoArgs<T extends core::Object* = dynamic>(final self::GenericClass<self::GenericExtension|get#tearOffGetterNoArgs::T*>* #this) → dynamic
return self::GenericExtension|get#readGetter<self::GenericExtension|get#tearOffGetterNoArgs::T*>(#this);

View file

@ -27,10 +27,8 @@ extension Extension2 on self::Class* {
}
static method Extension1|get#field(final self::Class* #this) → core::int*
return #this.{self::Class::field1};
static method Extension1|set#field(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method Extension1|set#field(final self::Class* #this, core::int* value) → void {
#this.{self::Class::field1} = value;
return #t1;
}
static method Extension1|method(final self::Class* #this) → core::int*
return #this.{self::Class::field1};
@ -42,10 +40,8 @@ static method Extension1|get#genericMethod(final self::Class* #this) → <T exte
return <T extends core::num* = dynamic>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
static method Extension2|get#field(final self::Class* #this) → core::int*
return #this.{self::Class::field2};
static method Extension2|set#field(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t2 = value;
static method Extension2|set#field(final self::Class* #this, core::int* value) → void {
#this.{self::Class::field2} = value;
return #t2;
}
static method Extension2|method(final self::Class* #this) → core::int*
return #this.{self::Class::field2};
@ -75,8 +71,8 @@ static method main() → dynamic {
self::expect(97, genericTearOff2.call<core::int*>(10));
self::expect(52, genericTearOff1.call<core::num*>(10));
self::expect(97, genericTearOff2.call<core::num*>(10));
self::expect(23, self::Extension1|set#field(c, 23));
self::expect(67, self::Extension2|set#field(c, 67));
self::expect(23, let final self::Class* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field(#t1, #t2) in #t2);
self::expect(67, let final self::Class* #t4 = c in let final core::int* #t5 = 67 in let final void #t6 = self::Extension2|set#field(#t4, #t5) in #t5);
self::expect(23, self::Extension1|get#field(c));
self::expect(67, self::Extension2|get#field(c));
}

View file

@ -27,10 +27,8 @@ extension Extension2 on self::Class* {
}
static method Extension1|get#field(final self::Class* #this) → core::int*
return #this.{self::Class::field1};
static method Extension1|set#field(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method Extension1|set#field(final self::Class* #this, core::int* value) → void {
#this.{self::Class::field1} = value;
return #t1;
}
static method Extension1|method(final self::Class* #this) → core::int*
return #this.{self::Class::field1};
@ -42,10 +40,8 @@ static method Extension1|get#genericMethod(final self::Class* #this) → <T exte
return <T extends core::num* = dynamic>(T* t) → core::int* => self::Extension1|genericMethod<T*>(#this, t);
static method Extension2|get#field(final self::Class* #this) → core::int*
return #this.{self::Class::field2};
static method Extension2|set#field(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t2 = value;
static method Extension2|set#field(final self::Class* #this, core::int* value) → void {
#this.{self::Class::field2} = value;
return #t2;
}
static method Extension2|method(final self::Class* #this) → core::int*
return #this.{self::Class::field2};
@ -75,8 +71,8 @@ static method main() → dynamic {
self::expect(97, genericTearOff2.call<core::int*>(10));
self::expect(52, genericTearOff1.call<core::num*>(10));
self::expect(97, genericTearOff2.call<core::num*>(10));
self::expect(23, self::Extension1|set#field(c, 23));
self::expect(67, self::Extension2|set#field(c, 67));
self::expect(23, let final self::Class* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field(#t1, #t2) in #t2);
self::expect(67, let final self::Class* #t4 = c in let final core::int* #t5 = 67 in let final void #t6 = self::Extension2|set#field(#t4, #t5) in #t5);
self::expect(23, self::Extension1|get#field(c));
self::expect(67, self::Extension2|get#field(c));
}

View file

@ -31,11 +31,9 @@ static method Extension1|get#field<T extends core::num* = dynamic>(final self::C
self::Extension1|latestType = "${self::Extension1|get#field::T*}";
return #this.{self::Class::field1};
}
static method Extension1|set#field<T extends core::num* = dynamic>(final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → self::Extension1|set#field::T* {
final self::Extension1|set#field::T* #t1 = value;
static method Extension1|set#field<T extends core::num* = dynamic>(final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
self::Extension1|latestType = "${self::Extension1|set#field::T*}";
#this.{self::Class::field1} = value;
return #t1;
}
static method Extension1|method<T extends core::num* = dynamic>(final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
self::Extension1|latestType = "${self::Extension1|method::T*}";
@ -51,10 +49,8 @@ static method Extension1|get#genericMethod<T extends core::num* = dynamic>(final
return <S extends core::num* = dynamic>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
static method Extension2|get#field<T extends core::num* = dynamic>(final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
return #this.{self::Class::field2};
static method Extension2|set#field<T extends core::num* = dynamic>(final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → self::Extension2|set#field::T* {
final self::Extension2|set#field::T* #t2 = value;
static method Extension2|set#field<T extends core::num* = dynamic>(final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
#this.{self::Class::field2} = value;
return #t2;
}
static method Extension2|method<T extends core::num* = dynamic>(final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
return #this.{self::Class::field2};
@ -113,11 +109,11 @@ static method main() → dynamic {
self::expect(52, genericTearOffInteger1.call<core::num*>(10));
self::expect("int:num", self::Extension1|latestType);
self::expect(97, genericTearOff2.call<core::num*>(10));
self::expect(23, self::Extension1|set#field<core::num*>(c, 23));
self::expect(23, let final self::Class<core::int*>* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num*>(#t1, #t2) in #t2);
self::expect("num", self::Extension1|latestType);
self::expect(23, self::Extension1|set#field<core::int*>(c, 23));
self::expect(23, let final self::Class<core::int*>* #t4 = c in let final core::int* #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int*>(#t4, #t5) in #t5);
self::expect("int", self::Extension1|latestType);
self::expect(67, self::Extension2|set#field<core::num*>(c, 67));
self::expect(67, let final self::Class<core::int*>* #t7 = c in let final core::int* #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num*>(#t7, #t8) in #t8);
self::expect(23, self::Extension1|get#field<core::num*>(c));
self::expect(67, self::Extension2|get#field<core::num*>(c));
}

View file

@ -31,11 +31,9 @@ static method Extension1|get#field<T extends core::num* = dynamic>(final self::C
self::Extension1|latestType = "${self::Extension1|get#field::T*}";
return #this.{self::Class::field1};
}
static method Extension1|set#field<T extends core::num* = dynamic>(final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → self::Extension1|set#field::T* {
final self::Extension1|set#field::T* #t1 = value;
static method Extension1|set#field<T extends core::num* = dynamic>(final self::Class<self::Extension1|set#field::T*>* #this, self::Extension1|set#field::T* value) → void {
self::Extension1|latestType = "${self::Extension1|set#field::T*}";
#this.{self::Class::field1} = value;
return #t1;
}
static method Extension1|method<T extends core::num* = dynamic>(final self::Class<self::Extension1|method::T*>* #this) → self::Extension1|method::T* {
self::Extension1|latestType = "${self::Extension1|method::T*}";
@ -51,10 +49,8 @@ static method Extension1|get#genericMethod<T extends core::num* = dynamic>(final
return <S extends core::num* = dynamic>(S* t) → self::Extension1|get#genericMethod::T* => self::Extension1|genericMethod<self::Extension1|get#genericMethod::T*, S*>(#this, t);
static method Extension2|get#field<T extends core::num* = dynamic>(final self::Class<self::Extension2|get#field::T*>* #this) → self::Extension2|get#field::T*
return #this.{self::Class::field2};
static method Extension2|set#field<T extends core::num* = dynamic>(final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → self::Extension2|set#field::T* {
final self::Extension2|set#field::T* #t2 = value;
static method Extension2|set#field<T extends core::num* = dynamic>(final self::Class<self::Extension2|set#field::T*>* #this, self::Extension2|set#field::T* value) → void {
#this.{self::Class::field2} = value;
return #t2;
}
static method Extension2|method<T extends core::num* = dynamic>(final self::Class<self::Extension2|method::T*>* #this) → self::Extension2|method::T*
return #this.{self::Class::field2};
@ -113,11 +109,11 @@ static method main() → dynamic {
self::expect(52, genericTearOffInteger1.call<core::num*>(10));
self::expect("int:num", self::Extension1|latestType);
self::expect(97, genericTearOff2.call<core::num*>(10));
self::expect(23, self::Extension1|set#field<core::num*>(c, 23));
self::expect(23, let final self::Class<core::int*>* #t1 = c in let final core::int* #t2 = 23 in let final void #t3 = self::Extension1|set#field<core::num*>(#t1, #t2) in #t2);
self::expect("num", self::Extension1|latestType);
self::expect(23, self::Extension1|set#field<core::int*>(c, 23));
self::expect(23, let final self::Class<core::int*>* #t4 = c in let final core::int* #t5 = 23 in let final void #t6 = self::Extension1|set#field<core::int*>(#t4, #t5) in #t5);
self::expect("int", self::Extension1|latestType);
self::expect(67, self::Extension2|set#field<core::num*>(c, 67));
self::expect(67, let final self::Class<core::int*>* #t7 = c in let final core::int* #t8 = 67 in let final void #t9 = self::Extension2|set#field<core::num*>(#t7, #t8) in #t8);
self::expect(23, self::Extension1|get#field<core::num*>(c));
self::expect(67, self::Extension2|get#field<core::num*>(c));
}

View file

@ -0,0 +1,201 @@
// Copyright (c) 2019, 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.
class Class {
int field;
}
extension Extension on Class {
int get simpleSetter => field;
set simpleSetter(int value) {
field = value;
}
int get mutatingSetter => field;
set mutatingSetter(int value) {
value = value + 1;
field = value;
}
int get setterWithReturn => field;
set setterWithReturn(int value) {
if (value < 0) {
field = -value;
return;
}
field = value;
}
int get setterWithClosure => field;
set setterWithClosure(int value) {
abs(value) {
return value < 0 ? -value : value;
}
field = abs(value);
}
testInternal() {
expect(null, field);
simpleSetter = 0;
expect(0, field);
expect(1, simpleSetter = 1);
mutatingSetter = 0;
expect(1, field);
expect(2, mutatingSetter = 2);
expect(3, field);
setterWithReturn = 1;
expect(1, field);
setterWithReturn = -2;
expect(2, field);
expect(3, setterWithReturn = 3);
expect(3, field);
expect(-4, setterWithReturn = -4);
expect(4, field);
setterWithClosure = 1;
expect(1, field);
setterWithClosure = -2;
expect(2, field);
expect(3, setterWithClosure = 3);
expect(3, field);
expect(-4, setterWithClosure = -4);
expect(4, field);
}
}
main() {
var c = new Class();
expect(null, c.field);
c.simpleSetter = 0;
expect(0, c.field);
expect(1, c.simpleSetter = 1);
Extension(c).simpleSetter = 2;
expect(2, c.field);
expect(3, Extension(c).simpleSetter = 3);
c.mutatingSetter = 0;
expect(1, c.field);
expect(2, c.mutatingSetter = 2);
expect(3, c.field);
Extension(c).mutatingSetter = 4;
expect(5, c.field);
expect(6, Extension(c).mutatingSetter = 6);
expect(7, c.field);
c.setterWithReturn = 1;
expect(1, c.field);
c.setterWithReturn = -2;
expect(2, c.field);
expect(3, c.setterWithReturn = 3);
expect(3, c.field);
expect(-4, c.setterWithReturn = -4);
expect(4, c.field);
Extension(c).setterWithReturn = 5;
expect(5, c.field);
Extension(c).setterWithReturn = -6;
expect(6, c.field);
expect(7, Extension(c).setterWithReturn = 7);
expect(7, c.field);
expect(-8, Extension(c).setterWithReturn = -8);
expect(8, c.field);
c.setterWithClosure = 1;
expect(1, c.field);
c.setterWithClosure = -2;
expect(2, c.field);
expect(3, c.setterWithClosure = 3);
expect(3, c.field);
expect(-4, c.setterWithClosure = -4);
expect(4, c.field);
Extension(c).setterWithClosure = 5;
expect(5, c.field);
Extension(c).setterWithClosure = -6;
expect(6, c.field);
expect(7, Extension(c).setterWithClosure = 7);
expect(7, c.field);
expect(-8, Extension(c).setterWithClosure = -8);
expect(8, c.field);
c.simpleSetter = 0;
expect(0, c?.field);
expect(1, c?.simpleSetter = 1);
Extension(c).simpleSetter = 2;
expect(2, c?.field);
expect(3, Extension(c).simpleSetter = 3);
c.mutatingSetter = 0;
expect(1, c?.field);
expect(2, c?.mutatingSetter = 2);
expect(3, c?.field);
Extension(c).mutatingSetter = 4;
expect(5, c?.field);
expect(6, Extension(c).mutatingSetter = 6);
expect(7, c?.field);
c?.setterWithReturn = 1;
expect(1, c?.field);
c?.setterWithReturn = -2;
expect(2, c?.field);
expect(3, c?.setterWithReturn = 3);
expect(3, c?.field);
expect(-4, c?.setterWithReturn = -4);
expect(4, c?.field);
Extension(c).setterWithReturn = 5;
expect(5, c?.field);
Extension(c).setterWithReturn = -6;
expect(6, c?.field);
expect(7, Extension(c).setterWithReturn = 7);
expect(7, c?.field);
expect(-8, Extension(c).setterWithReturn = -8);
expect(8, c?.field);
c?.setterWithClosure = 1;
expect(1, c?.field);
c?.setterWithClosure = -2;
expect(2, c?.field);
expect(3, c?.setterWithClosure = 3);
expect(3, c?.field);
expect(-4, c?.setterWithClosure = -4);
expect(4, c?.field);
Extension(c).setterWithClosure = 5;
expect(5, c?.field);
Extension(c).setterWithClosure = -6;
expect(6, c?.field);
expect(7, Extension(c).setterWithClosure = 7);
expect(7, c?.field);
expect(-8, Extension(c).setterWithClosure = -8);
expect(8, c?.field);
c.field = null;
c.simpleSetter ??= 1;
expect(1, c.field);
expect(1, c.simpleSetter ??= 2);
c.field = null;
expect(2, c.simpleSetter ??= 2);
c?.field = null;
c?.simpleSetter ??= 1;
expect(1, c?.field);
expect(1, c?.simpleSetter ??= 2);
c?.field = null;
expect(2, c?.simpleSetter ??= 2);
new Class().testInternal();
}
expect(expected, actual) {
if (expected != actual) {
throw 'Mismatch: expected=$expected, actual=$actual';
}
}

View file

@ -0,0 +1,45 @@
library;
import self as self;
import "dart:core" as core;
class Class extends core::Object {
field core::int* field;
synthetic constructor •() → self::Class*
;
}
extension Extension on self::Class* {
get simpleSetter = self::Extension|get#simpleSetter;
get mutatingSetter = self::Extension|get#mutatingSetter;
get setterWithReturn = self::Extension|get#setterWithReturn;
get setterWithClosure = self::Extension|get#setterWithClosure;
method testInternal = self::Extension|testInternal;
tearoff testInternal = self::Extension|get#testInternal;
set simpleSetter = self::Extension|set#simpleSetter;
set mutatingSetter = self::Extension|set#mutatingSetter;
set setterWithReturn = self::Extension|set#setterWithReturn;
set setterWithClosure = self::Extension|set#setterWithClosure;
}
static method Extension|get#simpleSetter(final self::Class* #this) → core::int*
;
static method Extension|set#simpleSetter(final self::Class* #this, core::int* value) → void
;
static method Extension|get#mutatingSetter(final self::Class* #this) → core::int*
;
static method Extension|set#mutatingSetter(final self::Class* #this, core::int* value) → void
;
static method Extension|get#setterWithReturn(final self::Class* #this) → core::int*
;
static method Extension|set#setterWithReturn(final self::Class* #this, core::int* value) → void
;
static method Extension|get#setterWithClosure(final self::Class* #this) → core::int*
;
static method Extension|set#setterWithClosure(final self::Class* #this, core::int* value) → void
;
static method Extension|testInternal(final self::Class* #this) → dynamic
;
static method Extension|get#testInternal(final self::Class* #this) → () →* dynamic
return () → dynamic => self::Extension|testInternal(#this);
static method main() → dynamic
;
static method expect(dynamic expected, dynamic actual) → dynamic
;

View file

@ -0,0 +1,192 @@
library;
import self as self;
import "dart:core" as core;
class Class extends core::Object {
field core::int* field = null;
synthetic constructor •() → self::Class*
: super core::Object::•()
;
}
extension Extension on self::Class* {
get simpleSetter = self::Extension|get#simpleSetter;
get mutatingSetter = self::Extension|get#mutatingSetter;
get setterWithReturn = self::Extension|get#setterWithReturn;
get setterWithClosure = self::Extension|get#setterWithClosure;
method testInternal = self::Extension|testInternal;
tearoff testInternal = self::Extension|get#testInternal;
set simpleSetter = self::Extension|set#simpleSetter;
set mutatingSetter = self::Extension|set#mutatingSetter;
set setterWithReturn = self::Extension|set#setterWithReturn;
set setterWithClosure = self::Extension|set#setterWithClosure;
}
static method Extension|get#simpleSetter(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#simpleSetter(final self::Class* #this, core::int* value) → void {
#this.{self::Class::field} = value;
}
static method Extension|get#mutatingSetter(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#mutatingSetter(final self::Class* #this, core::int* value) → void {
value = value.{core::num::+}(1);
#this.{self::Class::field} = value;
}
static method Extension|get#setterWithReturn(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#setterWithReturn(final self::Class* #this, core::int* value) → void {
if(value.{core::num::<}(0)) {
#this.{self::Class::field} = value.{core::int::unary-}();
return;
}
#this.{self::Class::field} = value;
}
static method Extension|get#setterWithClosure(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#setterWithClosure(final self::Class* #this, core::int* value) → void {
function abs(dynamic value) → dynamic {
return value.<(0) as{TypeError} core::bool* ?{dynamic} value.unary-() : value;
}
#this.{self::Class::field} = abs.call(value) as{TypeError} core::int*;
}
static method Extension|testInternal(final self::Class* #this) → dynamic {
self::expect(null, #this.{self::Class::field});
self::Extension|set#simpleSetter(#this, 0);
self::expect(0, #this.{self::Class::field});
self::expect(1, let final core::int* #t1 = 1 in let final void #t2 = self::Extension|set#simpleSetter(#this, #t1) in #t1);
self::Extension|set#mutatingSetter(#this, 0);
self::expect(1, #this.{self::Class::field});
self::expect(2, let final core::int* #t3 = 2 in let final void #t4 = self::Extension|set#mutatingSetter(#this, #t3) in #t3);
self::expect(3, #this.{self::Class::field});
self::Extension|set#setterWithReturn(#this, 1);
self::expect(1, #this.{self::Class::field});
self::Extension|set#setterWithReturn(#this, 2.{core::int::unary-}());
self::expect(2, #this.{self::Class::field});
self::expect(3, let final core::int* #t5 = 3 in let final void #t6 = self::Extension|set#setterWithReturn(#this, #t5) in #t5);
self::expect(3, #this.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final core::int* #t7 = 4.{core::int::unary-}() in let final void #t8 = self::Extension|set#setterWithReturn(#this, #t7) in #t7);
self::expect(4, #this.{self::Class::field});
self::Extension|set#setterWithClosure(#this, 1);
self::expect(1, #this.{self::Class::field});
self::Extension|set#setterWithClosure(#this, 2.{core::int::unary-}());
self::expect(2, #this.{self::Class::field});
self::expect(3, let final core::int* #t9 = 3 in let final void #t10 = self::Extension|set#setterWithClosure(#this, #t9) in #t9);
self::expect(3, #this.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final core::int* #t11 = 4.{core::int::unary-}() in let final void #t12 = self::Extension|set#setterWithClosure(#this, #t11) in #t11);
self::expect(4, #this.{self::Class::field});
}
static method Extension|get#testInternal(final self::Class* #this) → () →* dynamic
return () → dynamic => self::Extension|testInternal(#this);
static method main() → dynamic {
self::Class* c = new self::Class::•();
self::expect(null, c.{self::Class::field});
self::Extension|set#simpleSetter(c, 0);
self::expect(0, c.{self::Class::field});
self::expect(1, let final self::Class* #t13 = c in let final core::int* #t14 = 1 in let final void #t15 = self::Extension|set#simpleSetter(#t13, #t14) in #t14);
self::Extension|set#simpleSetter(c, 2);
self::expect(2, c.{self::Class::field});
self::expect(3, let final self::Class* #t16 = c in let final core::int* #t17 = 3 in let final void #t18 = self::Extension|set#simpleSetter(#t16, #t17) in #t17);
self::Extension|set#mutatingSetter(c, 0);
self::expect(1, c.{self::Class::field});
self::expect(2, let final self::Class* #t19 = c in let final core::int* #t20 = 2 in let final void #t21 = self::Extension|set#mutatingSetter(#t19, #t20) in #t20);
self::expect(3, c.{self::Class::field});
self::Extension|set#mutatingSetter(c, 4);
self::expect(5, c.{self::Class::field});
self::expect(6, let final self::Class* #t22 = c in let final core::int* #t23 = 6 in let final void #t24 = self::Extension|set#mutatingSetter(#t22, #t23) in #t23);
self::expect(7, c.{self::Class::field});
self::Extension|set#setterWithReturn(c, 1);
self::expect(1, c.{self::Class::field});
self::Extension|set#setterWithReturn(c, 2.{core::int::unary-}());
self::expect(2, c.{self::Class::field});
self::expect(3, let final self::Class* #t25 = c in let final core::int* #t26 = 3 in let final void #t27 = self::Extension|set#setterWithReturn(#t25, #t26) in #t26);
self::expect(3, c.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final self::Class* #t28 = c in let final core::int* #t29 = 4.{core::int::unary-}() in let final void #t30 = self::Extension|set#setterWithReturn(#t28, #t29) in #t29);
self::expect(4, c.{self::Class::field});
self::Extension|set#setterWithReturn(c, 5);
self::expect(5, c.{self::Class::field});
self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}());
self::expect(6, c.{self::Class::field});
self::expect(7, let final self::Class* #t31 = c in let final core::int* #t32 = 7 in let final void #t33 = self::Extension|set#setterWithReturn(#t31, #t32) in #t32);
self::expect(7, c.{self::Class::field});
self::expect(8.{core::int::unary-}(), let final self::Class* #t34 = c in let final core::int* #t35 = 8.{core::int::unary-}() in let final void #t36 = self::Extension|set#setterWithReturn(#t34, #t35) in #t35);
self::expect(8, c.{self::Class::field});
self::Extension|set#setterWithClosure(c, 1);
self::expect(1, c.{self::Class::field});
self::Extension|set#setterWithClosure(c, 2.{core::int::unary-}());
self::expect(2, c.{self::Class::field});
self::expect(3, let final self::Class* #t37 = c in let final core::int* #t38 = 3 in let final void #t39 = self::Extension|set#setterWithClosure(#t37, #t38) in #t38);
self::expect(3, c.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final self::Class* #t40 = c in let final core::int* #t41 = 4.{core::int::unary-}() in let final void #t42 = self::Extension|set#setterWithClosure(#t40, #t41) in #t41);
self::expect(4, c.{self::Class::field});
self::Extension|set#setterWithClosure(c, 5);
self::expect(5, c.{self::Class::field});
self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}());
self::expect(6, c.{self::Class::field});
self::expect(7, let final self::Class* #t43 = c in let final core::int* #t44 = 7 in let final void #t45 = self::Extension|set#setterWithClosure(#t43, #t44) in #t44);
self::expect(7, c.{self::Class::field});
self::expect(8.{core::int::unary-}(), let final self::Class* #t46 = c in let final core::int* #t47 = 8.{core::int::unary-}() in let final void #t48 = self::Extension|set#setterWithClosure(#t46, #t47) in #t47);
self::expect(8, c.{self::Class::field});
self::Extension|set#simpleSetter(c, 0);
self::expect(0, let final self::Class* #t49 = c in #t49.{core::Object::==}(null) ?{core::int*} null : #t49.{self::Class::field});
self::expect(1, let final self::Class* #t50 = c in #t50.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t51 = #t50 in let final core::int* #t52 = 1 in let final void #t53 = self::Extension|set#simpleSetter(#t51, #t52) in #t52);
self::Extension|set#simpleSetter(c, 2);
self::expect(2, let final self::Class* #t54 = c in #t54.{core::Object::==}(null) ?{core::int*} null : #t54.{self::Class::field});
self::expect(3, let final self::Class* #t55 = c in let final core::int* #t56 = 3 in let final void #t57 = self::Extension|set#simpleSetter(#t55, #t56) in #t56);
self::Extension|set#mutatingSetter(c, 0);
self::expect(1, let final self::Class* #t58 = c in #t58.{core::Object::==}(null) ?{core::int*} null : #t58.{self::Class::field});
self::expect(2, let final self::Class* #t59 = c in #t59.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t60 = #t59 in let final core::int* #t61 = 2 in let final void #t62 = self::Extension|set#mutatingSetter(#t60, #t61) in #t61);
self::expect(3, let final self::Class* #t63 = c in #t63.{core::Object::==}(null) ?{core::int*} null : #t63.{self::Class::field});
self::Extension|set#mutatingSetter(c, 4);
self::expect(5, let final self::Class* #t64 = c in #t64.{core::Object::==}(null) ?{core::int*} null : #t64.{self::Class::field});
self::expect(6, let final self::Class* #t65 = c in let final core::int* #t66 = 6 in let final void #t67 = self::Extension|set#mutatingSetter(#t65, #t66) in #t66);
self::expect(7, let final self::Class* #t68 = c in #t68.{core::Object::==}(null) ?{core::int*} null : #t68.{self::Class::field});
let final self::Class* #t69 = c in #t69.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#setterWithReturn(#t69, 1);
self::expect(1, let final self::Class* #t70 = c in #t70.{core::Object::==}(null) ?{core::int*} null : #t70.{self::Class::field});
let final self::Class* #t71 = c in #t71.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#setterWithReturn(#t71, 2.{core::int::unary-}());
self::expect(2, let final self::Class* #t72 = c in #t72.{core::Object::==}(null) ?{core::int*} null : #t72.{self::Class::field});
self::expect(3, let final self::Class* #t73 = c in #t73.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t74 = #t73 in let final core::int* #t75 = 3 in let final void #t76 = self::Extension|set#setterWithReturn(#t74, #t75) in #t75);
self::expect(3, let final self::Class* #t77 = c in #t77.{core::Object::==}(null) ?{core::int*} null : #t77.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final self::Class* #t78 = c in #t78.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t79 = #t78 in let final core::int* #t80 = 4.{core::int::unary-}() in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
self::expect(4, let final self::Class* #t82 = c in #t82.{core::Object::==}(null) ?{core::int*} null : #t82.{self::Class::field});
self::Extension|set#setterWithReturn(c, 5);
self::expect(5, let final self::Class* #t83 = c in #t83.{core::Object::==}(null) ?{core::int*} null : #t83.{self::Class::field});
self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}());
self::expect(6, let final self::Class* #t84 = c in #t84.{core::Object::==}(null) ?{core::int*} null : #t84.{self::Class::field});
self::expect(7, let final self::Class* #t85 = c in let final core::int* #t86 = 7 in let final void #t87 = self::Extension|set#setterWithReturn(#t85, #t86) in #t86);
self::expect(7, let final self::Class* #t88 = c in #t88.{core::Object::==}(null) ?{core::int*} null : #t88.{self::Class::field});
self::expect(8.{core::int::unary-}(), let final self::Class* #t89 = c in let final core::int* #t90 = 8.{core::int::unary-}() in let final void #t91 = self::Extension|set#setterWithReturn(#t89, #t90) in #t90);
self::expect(8, let final self::Class* #t92 = c in #t92.{core::Object::==}(null) ?{core::int*} null : #t92.{self::Class::field});
let final self::Class* #t93 = c in #t93.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#setterWithClosure(#t93, 1);
self::expect(1, let final self::Class* #t94 = c in #t94.{core::Object::==}(null) ?{core::int*} null : #t94.{self::Class::field});
let final self::Class* #t95 = c in #t95.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#setterWithClosure(#t95, 2.{core::int::unary-}());
self::expect(2, let final self::Class* #t96 = c in #t96.{core::Object::==}(null) ?{core::int*} null : #t96.{self::Class::field});
self::expect(3, let final self::Class* #t97 = c in #t97.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t98 = #t97 in let final core::int* #t99 = 3 in let final void #t100 = self::Extension|set#setterWithClosure(#t98, #t99) in #t99);
self::expect(3, let final self::Class* #t101 = c in #t101.{core::Object::==}(null) ?{core::int*} null : #t101.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final self::Class* #t102 = c in #t102.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t103 = #t102 in let final core::int* #t104 = 4.{core::int::unary-}() in let final void #t105 = self::Extension|set#setterWithClosure(#t103, #t104) in #t104);
self::expect(4, let final self::Class* #t106 = c in #t106.{core::Object::==}(null) ?{core::int*} null : #t106.{self::Class::field});
self::Extension|set#setterWithClosure(c, 5);
self::expect(5, let final self::Class* #t107 = c in #t107.{core::Object::==}(null) ?{core::int*} null : #t107.{self::Class::field});
self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}());
self::expect(6, let final self::Class* #t108 = c in #t108.{core::Object::==}(null) ?{core::int*} null : #t108.{self::Class::field});
self::expect(7, let final self::Class* #t109 = c in let final core::int* #t110 = 7 in let final void #t111 = self::Extension|set#setterWithClosure(#t109, #t110) in #t110);
self::expect(7, let final self::Class* #t112 = c in #t112.{core::Object::==}(null) ?{core::int*} null : #t112.{self::Class::field});
self::expect(8.{core::int::unary-}(), let final self::Class* #t113 = c in let final core::int* #t114 = 8.{core::int::unary-}() in let final void #t115 = self::Extension|set#setterWithClosure(#t113, #t114) in #t114);
self::expect(8, let final self::Class* #t116 = c in #t116.{core::Object::==}(null) ?{core::int*} null : #t116.{self::Class::field});
c.{self::Class::field} = null;
let final self::Class* #t117 = c in self::Extension|get#simpleSetter(#t117).{core::num::==}(null) ?{core::int*} self::Extension|set#simpleSetter(#t117, 1) : null;
self::expect(1, c.{self::Class::field});
self::expect(1, let final self::Class* #t118 = c in let final core::int* #t119 = self::Extension|get#simpleSetter(#t118) in #t119.{core::num::==}(null) ?{core::int*} let final self::Class* #t120 = #t118 in let final core::int* #t121 = 2 in let final void #t122 = self::Extension|set#simpleSetter(#t120, #t121) in #t121 : #t119);
c.{self::Class::field} = null;
self::expect(2, let final self::Class* #t123 = c in let final core::int* #t124 = self::Extension|get#simpleSetter(#t123) in #t124.{core::num::==}(null) ?{core::int*} let final self::Class* #t125 = #t123 in let final core::int* #t126 = 2 in let final void #t127 = self::Extension|set#simpleSetter(#t125, #t126) in #t126 : #t124);
let final self::Class* #t128 = c in #t128.{core::Object::==}(null) ?{core::Null?} null : #t128.{self::Class::field} = null;
let final self::Class* #t129 = c in #t129.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#simpleSetter(#t129).{core::num::==}(null) ?{core::int*} self::Extension|set#simpleSetter(#t129, 1) : null;
self::expect(1, let final self::Class* #t130 = c in #t130.{core::Object::==}(null) ?{core::int*} null : #t130.{self::Class::field});
self::expect(1, let final self::Class* #t131 = c in #t131.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t132 = self::Extension|get#simpleSetter(#t131) in #t132.{core::num::==}(null) ?{core::int*} let final core::int* #t133 = 2 in let final void #t134 = self::Extension|set#simpleSetter(#t131, #t133) in #t133 : #t132);
let final self::Class* #t135 = c in #t135.{core::Object::==}(null) ?{core::Null?} null : #t135.{self::Class::field} = null;
self::expect(2, let final self::Class* #t136 = c in #t136.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t137 = self::Extension|get#simpleSetter(#t136) in #t137.{core::num::==}(null) ?{core::int*} let final core::int* #t138 = 2 in let final void #t139 = self::Extension|set#simpleSetter(#t136, #t138) in #t138 : #t137);
self::Extension|testInternal(new self::Class::•());
}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!expected.{core::Object::==}(actual)) {
throw "Mismatch: expected=${expected}, actual=${actual}";
}
}

View file

@ -0,0 +1,192 @@
library;
import self as self;
import "dart:core" as core;
class Class extends core::Object {
field core::int* field = null;
synthetic constructor •() → self::Class*
: super core::Object::•()
;
}
extension Extension on self::Class* {
get simpleSetter = self::Extension|get#simpleSetter;
get mutatingSetter = self::Extension|get#mutatingSetter;
get setterWithReturn = self::Extension|get#setterWithReturn;
get setterWithClosure = self::Extension|get#setterWithClosure;
method testInternal = self::Extension|testInternal;
tearoff testInternal = self::Extension|get#testInternal;
set simpleSetter = self::Extension|set#simpleSetter;
set mutatingSetter = self::Extension|set#mutatingSetter;
set setterWithReturn = self::Extension|set#setterWithReturn;
set setterWithClosure = self::Extension|set#setterWithClosure;
}
static method Extension|get#simpleSetter(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#simpleSetter(final self::Class* #this, core::int* value) → void {
#this.{self::Class::field} = value;
}
static method Extension|get#mutatingSetter(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#mutatingSetter(final self::Class* #this, core::int* value) → void {
value = value.{core::num::+}(1);
#this.{self::Class::field} = value;
}
static method Extension|get#setterWithReturn(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#setterWithReturn(final self::Class* #this, core::int* value) → void {
if(value.{core::num::<}(0)) {
#this.{self::Class::field} = value.{core::int::unary-}();
return;
}
#this.{self::Class::field} = value;
}
static method Extension|get#setterWithClosure(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#setterWithClosure(final self::Class* #this, core::int* value) → void {
function abs(dynamic value) → dynamic {
return value.<(0) as{TypeError} core::bool* ?{dynamic} value.unary-() : value;
}
#this.{self::Class::field} = abs.call(value) as{TypeError} core::int*;
}
static method Extension|testInternal(final self::Class* #this) → dynamic {
self::expect(null, #this.{self::Class::field});
self::Extension|set#simpleSetter(#this, 0);
self::expect(0, #this.{self::Class::field});
self::expect(1, let final core::int* #t1 = 1 in let final void #t2 = self::Extension|set#simpleSetter(#this, #t1) in #t1);
self::Extension|set#mutatingSetter(#this, 0);
self::expect(1, #this.{self::Class::field});
self::expect(2, let final core::int* #t3 = 2 in let final void #t4 = self::Extension|set#mutatingSetter(#this, #t3) in #t3);
self::expect(3, #this.{self::Class::field});
self::Extension|set#setterWithReturn(#this, 1);
self::expect(1, #this.{self::Class::field});
self::Extension|set#setterWithReturn(#this, 2.{core::int::unary-}());
self::expect(2, #this.{self::Class::field});
self::expect(3, let final core::int* #t5 = 3 in let final void #t6 = self::Extension|set#setterWithReturn(#this, #t5) in #t5);
self::expect(3, #this.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final core::int* #t7 = 4.{core::int::unary-}() in let final void #t8 = self::Extension|set#setterWithReturn(#this, #t7) in #t7);
self::expect(4, #this.{self::Class::field});
self::Extension|set#setterWithClosure(#this, 1);
self::expect(1, #this.{self::Class::field});
self::Extension|set#setterWithClosure(#this, 2.{core::int::unary-}());
self::expect(2, #this.{self::Class::field});
self::expect(3, let final core::int* #t9 = 3 in let final void #t10 = self::Extension|set#setterWithClosure(#this, #t9) in #t9);
self::expect(3, #this.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final core::int* #t11 = 4.{core::int::unary-}() in let final void #t12 = self::Extension|set#setterWithClosure(#this, #t11) in #t11);
self::expect(4, #this.{self::Class::field});
}
static method Extension|get#testInternal(final self::Class* #this) → () →* dynamic
return () → dynamic => self::Extension|testInternal(#this);
static method main() → dynamic {
self::Class* c = new self::Class::•();
self::expect(null, c.{self::Class::field});
self::Extension|set#simpleSetter(c, 0);
self::expect(0, c.{self::Class::field});
self::expect(1, let final self::Class* #t13 = c in let final core::int* #t14 = 1 in let final void #t15 = self::Extension|set#simpleSetter(#t13, #t14) in #t14);
self::Extension|set#simpleSetter(c, 2);
self::expect(2, c.{self::Class::field});
self::expect(3, let final self::Class* #t16 = c in let final core::int* #t17 = 3 in let final void #t18 = self::Extension|set#simpleSetter(#t16, #t17) in #t17);
self::Extension|set#mutatingSetter(c, 0);
self::expect(1, c.{self::Class::field});
self::expect(2, let final self::Class* #t19 = c in let final core::int* #t20 = 2 in let final void #t21 = self::Extension|set#mutatingSetter(#t19, #t20) in #t20);
self::expect(3, c.{self::Class::field});
self::Extension|set#mutatingSetter(c, 4);
self::expect(5, c.{self::Class::field});
self::expect(6, let final self::Class* #t22 = c in let final core::int* #t23 = 6 in let final void #t24 = self::Extension|set#mutatingSetter(#t22, #t23) in #t23);
self::expect(7, c.{self::Class::field});
self::Extension|set#setterWithReturn(c, 1);
self::expect(1, c.{self::Class::field});
self::Extension|set#setterWithReturn(c, 2.{core::int::unary-}());
self::expect(2, c.{self::Class::field});
self::expect(3, let final self::Class* #t25 = c in let final core::int* #t26 = 3 in let final void #t27 = self::Extension|set#setterWithReturn(#t25, #t26) in #t26);
self::expect(3, c.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final self::Class* #t28 = c in let final core::int* #t29 = 4.{core::int::unary-}() in let final void #t30 = self::Extension|set#setterWithReturn(#t28, #t29) in #t29);
self::expect(4, c.{self::Class::field});
self::Extension|set#setterWithReturn(c, 5);
self::expect(5, c.{self::Class::field});
self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}());
self::expect(6, c.{self::Class::field});
self::expect(7, let final self::Class* #t31 = c in let final core::int* #t32 = 7 in let final void #t33 = self::Extension|set#setterWithReturn(#t31, #t32) in #t32);
self::expect(7, c.{self::Class::field});
self::expect(8.{core::int::unary-}(), let final self::Class* #t34 = c in let final core::int* #t35 = 8.{core::int::unary-}() in let final void #t36 = self::Extension|set#setterWithReturn(#t34, #t35) in #t35);
self::expect(8, c.{self::Class::field});
self::Extension|set#setterWithClosure(c, 1);
self::expect(1, c.{self::Class::field});
self::Extension|set#setterWithClosure(c, 2.{core::int::unary-}());
self::expect(2, c.{self::Class::field});
self::expect(3, let final self::Class* #t37 = c in let final core::int* #t38 = 3 in let final void #t39 = self::Extension|set#setterWithClosure(#t37, #t38) in #t38);
self::expect(3, c.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final self::Class* #t40 = c in let final core::int* #t41 = 4.{core::int::unary-}() in let final void #t42 = self::Extension|set#setterWithClosure(#t40, #t41) in #t41);
self::expect(4, c.{self::Class::field});
self::Extension|set#setterWithClosure(c, 5);
self::expect(5, c.{self::Class::field});
self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}());
self::expect(6, c.{self::Class::field});
self::expect(7, let final self::Class* #t43 = c in let final core::int* #t44 = 7 in let final void #t45 = self::Extension|set#setterWithClosure(#t43, #t44) in #t44);
self::expect(7, c.{self::Class::field});
self::expect(8.{core::int::unary-}(), let final self::Class* #t46 = c in let final core::int* #t47 = 8.{core::int::unary-}() in let final void #t48 = self::Extension|set#setterWithClosure(#t46, #t47) in #t47);
self::expect(8, c.{self::Class::field});
self::Extension|set#simpleSetter(c, 0);
self::expect(0, let final self::Class* #t49 = c in #t49.{core::Object::==}(null) ?{core::int*} null : #t49.{self::Class::field});
self::expect(1, let final self::Class* #t50 = c in #t50.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t51 = #t50 in let final core::int* #t52 = 1 in let final void #t53 = self::Extension|set#simpleSetter(#t51, #t52) in #t52);
self::Extension|set#simpleSetter(c, 2);
self::expect(2, let final self::Class* #t54 = c in #t54.{core::Object::==}(null) ?{core::int*} null : #t54.{self::Class::field});
self::expect(3, let final self::Class* #t55 = c in let final core::int* #t56 = 3 in let final void #t57 = self::Extension|set#simpleSetter(#t55, #t56) in #t56);
self::Extension|set#mutatingSetter(c, 0);
self::expect(1, let final self::Class* #t58 = c in #t58.{core::Object::==}(null) ?{core::int*} null : #t58.{self::Class::field});
self::expect(2, let final self::Class* #t59 = c in #t59.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t60 = #t59 in let final core::int* #t61 = 2 in let final void #t62 = self::Extension|set#mutatingSetter(#t60, #t61) in #t61);
self::expect(3, let final self::Class* #t63 = c in #t63.{core::Object::==}(null) ?{core::int*} null : #t63.{self::Class::field});
self::Extension|set#mutatingSetter(c, 4);
self::expect(5, let final self::Class* #t64 = c in #t64.{core::Object::==}(null) ?{core::int*} null : #t64.{self::Class::field});
self::expect(6, let final self::Class* #t65 = c in let final core::int* #t66 = 6 in let final void #t67 = self::Extension|set#mutatingSetter(#t65, #t66) in #t66);
self::expect(7, let final self::Class* #t68 = c in #t68.{core::Object::==}(null) ?{core::int*} null : #t68.{self::Class::field});
let final self::Class* #t69 = c in #t69.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#setterWithReturn(#t69, 1);
self::expect(1, let final self::Class* #t70 = c in #t70.{core::Object::==}(null) ?{core::int*} null : #t70.{self::Class::field});
let final self::Class* #t71 = c in #t71.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#setterWithReturn(#t71, 2.{core::int::unary-}());
self::expect(2, let final self::Class* #t72 = c in #t72.{core::Object::==}(null) ?{core::int*} null : #t72.{self::Class::field});
self::expect(3, let final self::Class* #t73 = c in #t73.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t74 = #t73 in let final core::int* #t75 = 3 in let final void #t76 = self::Extension|set#setterWithReturn(#t74, #t75) in #t75);
self::expect(3, let final self::Class* #t77 = c in #t77.{core::Object::==}(null) ?{core::int*} null : #t77.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final self::Class* #t78 = c in #t78.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t79 = #t78 in let final core::int* #t80 = 4.{core::int::unary-}() in let final void #t81 = self::Extension|set#setterWithReturn(#t79, #t80) in #t80);
self::expect(4, let final self::Class* #t82 = c in #t82.{core::Object::==}(null) ?{core::int*} null : #t82.{self::Class::field});
self::Extension|set#setterWithReturn(c, 5);
self::expect(5, let final self::Class* #t83 = c in #t83.{core::Object::==}(null) ?{core::int*} null : #t83.{self::Class::field});
self::Extension|set#setterWithReturn(c, 6.{core::int::unary-}());
self::expect(6, let final self::Class* #t84 = c in #t84.{core::Object::==}(null) ?{core::int*} null : #t84.{self::Class::field});
self::expect(7, let final self::Class* #t85 = c in let final core::int* #t86 = 7 in let final void #t87 = self::Extension|set#setterWithReturn(#t85, #t86) in #t86);
self::expect(7, let final self::Class* #t88 = c in #t88.{core::Object::==}(null) ?{core::int*} null : #t88.{self::Class::field});
self::expect(8.{core::int::unary-}(), let final self::Class* #t89 = c in let final core::int* #t90 = 8.{core::int::unary-}() in let final void #t91 = self::Extension|set#setterWithReturn(#t89, #t90) in #t90);
self::expect(8, let final self::Class* #t92 = c in #t92.{core::Object::==}(null) ?{core::int*} null : #t92.{self::Class::field});
let final self::Class* #t93 = c in #t93.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#setterWithClosure(#t93, 1);
self::expect(1, let final self::Class* #t94 = c in #t94.{core::Object::==}(null) ?{core::int*} null : #t94.{self::Class::field});
let final self::Class* #t95 = c in #t95.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#setterWithClosure(#t95, 2.{core::int::unary-}());
self::expect(2, let final self::Class* #t96 = c in #t96.{core::Object::==}(null) ?{core::int*} null : #t96.{self::Class::field});
self::expect(3, let final self::Class* #t97 = c in #t97.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t98 = #t97 in let final core::int* #t99 = 3 in let final void #t100 = self::Extension|set#setterWithClosure(#t98, #t99) in #t99);
self::expect(3, let final self::Class* #t101 = c in #t101.{core::Object::==}(null) ?{core::int*} null : #t101.{self::Class::field});
self::expect(4.{core::int::unary-}(), let final self::Class* #t102 = c in #t102.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t103 = #t102 in let final core::int* #t104 = 4.{core::int::unary-}() in let final void #t105 = self::Extension|set#setterWithClosure(#t103, #t104) in #t104);
self::expect(4, let final self::Class* #t106 = c in #t106.{core::Object::==}(null) ?{core::int*} null : #t106.{self::Class::field});
self::Extension|set#setterWithClosure(c, 5);
self::expect(5, let final self::Class* #t107 = c in #t107.{core::Object::==}(null) ?{core::int*} null : #t107.{self::Class::field});
self::Extension|set#setterWithClosure(c, 6.{core::int::unary-}());
self::expect(6, let final self::Class* #t108 = c in #t108.{core::Object::==}(null) ?{core::int*} null : #t108.{self::Class::field});
self::expect(7, let final self::Class* #t109 = c in let final core::int* #t110 = 7 in let final void #t111 = self::Extension|set#setterWithClosure(#t109, #t110) in #t110);
self::expect(7, let final self::Class* #t112 = c in #t112.{core::Object::==}(null) ?{core::int*} null : #t112.{self::Class::field});
self::expect(8.{core::int::unary-}(), let final self::Class* #t113 = c in let final core::int* #t114 = 8.{core::int::unary-}() in let final void #t115 = self::Extension|set#setterWithClosure(#t113, #t114) in #t114);
self::expect(8, let final self::Class* #t116 = c in #t116.{core::Object::==}(null) ?{core::int*} null : #t116.{self::Class::field});
c.{self::Class::field} = null;
let final self::Class* #t117 = c in self::Extension|get#simpleSetter(#t117).{core::num::==}(null) ?{core::int*} self::Extension|set#simpleSetter(#t117, 1) : null;
self::expect(1, c.{self::Class::field});
self::expect(1, let final self::Class* #t118 = c in let final core::int* #t119 = self::Extension|get#simpleSetter(#t118) in #t119.{core::num::==}(null) ?{core::int*} let final self::Class* #t120 = #t118 in let final core::int* #t121 = 2 in let final void #t122 = self::Extension|set#simpleSetter(#t120, #t121) in #t121 : #t119);
c.{self::Class::field} = null;
self::expect(2, let final self::Class* #t123 = c in let final core::int* #t124 = self::Extension|get#simpleSetter(#t123) in #t124.{core::num::==}(null) ?{core::int*} let final self::Class* #t125 = #t123 in let final core::int* #t126 = 2 in let final void #t127 = self::Extension|set#simpleSetter(#t125, #t126) in #t126 : #t124);
let final self::Class* #t128 = c in #t128.{core::Object::==}(null) ?{core::Null?} null : #t128.{self::Class::field} = null;
let final self::Class* #t129 = c in #t129.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#simpleSetter(#t129).{core::num::==}(null) ?{core::int*} self::Extension|set#simpleSetter(#t129, 1) : null;
self::expect(1, let final self::Class* #t130 = c in #t130.{core::Object::==}(null) ?{core::int*} null : #t130.{self::Class::field});
self::expect(1, let final self::Class* #t131 = c in #t131.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t132 = self::Extension|get#simpleSetter(#t131) in #t132.{core::num::==}(null) ?{core::int*} let final core::int* #t133 = 2 in let final void #t134 = self::Extension|set#simpleSetter(#t131, #t133) in #t133 : #t132);
let final self::Class* #t135 = c in #t135.{core::Object::==}(null) ?{core::Null?} null : #t135.{self::Class::field} = null;
self::expect(2, let final self::Class* #t136 = c in #t136.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t137 = self::Extension|get#simpleSetter(#t136) in #t137.{core::num::==}(null) ?{core::int*} let final core::int* #t138 = 2 in let final void #t139 = self::Extension|set#simpleSetter(#t136, #t138) in #t138 : #t137);
self::Extension|testInternal(new self::Class::•());
}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!expected.{core::Object::==}(actual)) {
throw "Mismatch: expected=${expected}, actual=${actual}";
}
}

View file

@ -0,0 +1,3 @@
pkg/front_end/testcases/extensions/extension_setter.dart:19:11: Context: Write to value@335
value = value + 1;
^

View file

@ -59,24 +59,15 @@ extension Extension1 on self::Class* {
get m3 = self::Extension1|get#m3;
set m4 = self::Extension1|set#m4;
}
static method Extension0|set#m1(final self::Class* #this, core::int* x) → core::int* {
final core::int* #t1 = x;
return #t1;
}
static method Extension0|set#m1(final self::Class* #this, core::int* x) → void {}
static method Extension0|get#m2(final self::Class* #this) → core::int*
return 0;
static method Extension0|set#m3(final self::Class* #this, core::int* x) → core::int* {
final core::int* #t2 = x;
return #t2;
}
static method Extension0|set#m3(final self::Class* #this, core::int* x) → void {}
static method Extension0|get#m4(final self::Class* #this) → core::int*
return 0;
static method Extension1|get#m3(final self::Class* #this) → core::int*
return 0;
static method Extension1|set#m4(final self::Class* #this, core::int* x) → core::int* {
final core::int* #t3 = x;
return #t3;
}
static method Extension1|set#m4(final self::Class* #this, core::int* x) → void {}
static method main() → dynamic {
self::Class* c = new self::Class::•();
self::expect(0, c.{self::Class::m1});

View file

@ -59,24 +59,15 @@ extension Extension1 on self::Class* {
get m3 = self::Extension1|get#m3;
set m4 = self::Extension1|set#m4;
}
static method Extension0|set#m1(final self::Class* #this, core::int* x) → core::int* {
final core::int* #t1 = x;
return #t1;
}
static method Extension0|set#m1(final self::Class* #this, core::int* x) → void {}
static method Extension0|get#m2(final self::Class* #this) → core::int*
return 0;
static method Extension0|set#m3(final self::Class* #this, core::int* x) → core::int* {
final core::int* #t2 = x;
return #t2;
}
static method Extension0|set#m3(final self::Class* #this, core::int* x) → void {}
static method Extension0|get#m4(final self::Class* #this) → core::int*
return 0;
static method Extension1|get#m3(final self::Class* #this) → core::int*
return 0;
static method Extension1|set#m4(final self::Class* #this, core::int* x) → core::int* {
final core::int* #t3 = x;
return #t3;
}
static method Extension1|set#m4(final self::Class* #this, core::int* x) → void {}
static method main() → dynamic {
self::Class* c = new self::Class::•();
self::expect(0, c.{self::Class::m1});

View file

@ -0,0 +1,21 @@
// Copyright (c) 2019, 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.
class Class {
int field;
}
extension Extension on Class {
int get property => field;
}
main() {
Class c;
c?.property ?? 0;
// TODO(johnniwinther): Handle null-aware explicit extension access.
// Extension(c)?.property ?? 0;
c = new Class();
c.property ?? 0;
Extension(c).property ?? 0;
}

View file

@ -0,0 +1,16 @@
library;
import self as self;
import "dart:core" as core;
class Class extends core::Object {
field core::int* field;
synthetic constructor •() → self::Class*
;
}
extension Extension on self::Class* {
get property = self::Extension|get#property;
}
static method Extension|get#property(final self::Class* #this) → core::int*
;
static method main() → dynamic
;

View file

@ -0,0 +1,22 @@
library;
import self as self;
import "dart:core" as core;
class Class extends core::Object {
field core::int* field = null;
synthetic constructor •() → self::Class*
: super core::Object::•()
;
}
extension Extension on self::Class* {
get property = self::Extension|get#property;
}
static method Extension|get#property(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method main() → dynamic {
self::Class* c;
let final core::int* #t1 = let final self::Class* #t2 = c in #t2.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t2) in #t1.{core::num::==}(null) ?{core::int*} 0 : #t1;
c = new self::Class::•();
let final core::int* #t3 = self::Extension|get#property(c) in #t3.{core::num::==}(null) ?{core::int*} 0 : #t3;
let final core::int* #t4 = self::Extension|get#property(c) in #t4.{core::num::==}(null) ?{core::int*} 0 : #t4;
}

View file

@ -0,0 +1,22 @@
library;
import self as self;
import "dart:core" as core;
class Class extends core::Object {
field core::int* field = null;
synthetic constructor •() → self::Class*
: super core::Object::•()
;
}
extension Extension on self::Class* {
get property = self::Extension|get#property;
}
static method Extension|get#property(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method main() → dynamic {
self::Class* c;
let final core::int* #t1 = let final self::Class* #t2 = c in #t2.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t2) in #t1.{core::num::==}(null) ?{core::int*} 0 : #t1;
c = new self::Class::•();
let final core::int* #t3 = self::Extension|get#property(c) in #t3.{core::num::==}(null) ?{core::int*} 0 : #t3;
let final core::int* #t4 = self::Extension|get#property(c) in #t4.{core::num::==}(null) ?{core::int*} 0 : #t4;
}

View file

@ -0,0 +1,3 @@
pkg/front_end/testcases/extensions/if_null.dart:18:5: Context: Write to c@327
c = new Class();
^

View file

@ -50,12 +50,10 @@ static method Extension1|get#property(final self::Class1* #this) → core::int*
core::print("Extension1.property get on ${#this}");
return #this.{self::Class1::field};
}
static method Extension1|set#property(final self::Class1* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method Extension1|set#property(final self::Class1* #this, core::int* value) → void {
#this.{self::Class1::field} = value;
core::print("Extension1.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
return #t1;
}
static method Extension2|method(final self::Class2* #this) → core::int* {
core::print("Extension2.method on ${#this}");
@ -73,12 +71,10 @@ static method Extension2|get#property(final self::Class2* #this) → core::int*
core::print("Extension2.property get on ${#this}");
return #this.{self::Class2::field}.{core::num::+}(5);
}
static method Extension2|set#property(final self::Class2* #this, core::int* value) → core::int* {
final core::int* #t2 = value;
static method Extension2|set#property(final self::Class2* #this, core::int* value) → void {
core::print("Extension2.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
#this.{self::Class2::field} = value;
return #t2;
}
static method main() → dynamic {
self::testExtension1();
@ -89,42 +85,42 @@ static method testExtension1() → dynamic {
self::Class1* c1 = new self::Class1::•(1);
self::expect(0, self::Extension1|method(c0));
self::expect(1, self::Extension1|method(c1));
self::expect(1, let final self::Class1* #t3 = c1 in #t3.{core::Object::==}(null) ?{core::int*} null : self::Extension1|method(#t3));
self::expect(1, let final self::Class1* #t1 = c1 in #t1.{core::Object::==}(null) ?{core::int*} null : self::Extension1|method(#t1));
self::expect(42, self::Extension1|genericMethod<core::int*>(c0, 42));
self::expect(43, self::Extension1|genericMethod<core::num*>(c0, 43));
self::expect(88, self::Extension1|genericMethod<core::int*>(c1, 87));
self::expect(89, self::Extension1|genericMethod<core::num*>(c1, 88));
self::expect(0, self::Extension1|get#property(c0));
self::expect(0, let final self::Class1* #t4 = c0 in #t4.{core::Object::==}(null) ?{core::int*} null : self::Extension1|get#property(#t4));
self::expect(42, self::Extension1|set#property(c0, 42));
self::expect(0, let final self::Class1* #t2 = c0 in #t2.{core::Object::==}(null) ?{core::int*} null : self::Extension1|get#property(#t2));
self::expect(42, let final self::Class1* #t3 = c0 in let final core::int* #t4 = 42 in let final void #t5 = self::Extension1|set#property(#t3, #t4) in #t4);
self::expect(1, self::Extension1|get#property(c1));
self::expect(87, self::Extension1|set#property(c0, 87));
self::expect(27, self::Extension1|set#property(c0, self::Extension1|set#property(c1, 27)));
self::expect(37, self::Extension1|set#property(c1, self::Extension1|set#property(c0, 37)));
self::expect(77, self::Extension1|set#property(c1, self::Extension1|set#property(c0, self::Extension1|set#property(c1, 77))));
self::expect(67, self::Extension1|set#property(c0, self::Extension1|set#property(c1, self::Extension1|set#property(c0, 67))));
self::expect(87, let final self::Class1* #t6 = c0 in let final core::int* #t7 = 87 in let final void #t8 = self::Extension1|set#property(#t6, #t7) in #t7);
self::expect(27, let final self::Class1* #t9 = c0 in let final core::int* #t10 = let final self::Class1* #t11 = c1 in let final core::int* #t12 = 27 in let final void #t13 = self::Extension1|set#property(#t11, #t12) in #t12 in let final void #t14 = self::Extension1|set#property(#t9, #t10) in #t10);
self::expect(37, let final self::Class1* #t15 = c1 in let final core::int* #t16 = let final self::Class1* #t17 = c0 in let final core::int* #t18 = 37 in let final void #t19 = self::Extension1|set#property(#t17, #t18) in #t18 in let final void #t20 = self::Extension1|set#property(#t15, #t16) in #t16);
self::expect(77, let final self::Class1* #t21 = c1 in let final core::int* #t22 = let final self::Class1* #t23 = c0 in let final core::int* #t24 = let final self::Class1* #t25 = c1 in let final core::int* #t26 = 77 in let final void #t27 = self::Extension1|set#property(#t25, #t26) in #t26 in let final void #t28 = self::Extension1|set#property(#t23, #t24) in #t24 in let final void #t29 = self::Extension1|set#property(#t21, #t22) in #t22);
self::expect(67, let final self::Class1* #t30 = c0 in let final core::int* #t31 = let final self::Class1* #t32 = c1 in let final core::int* #t33 = let final self::Class1* #t34 = c0 in let final core::int* #t35 = 67 in let final void #t36 = self::Extension1|set#property(#t34, #t35) in #t35 in let final void #t37 = self::Extension1|set#property(#t32, #t33) in #t33 in let final void #t38 = self::Extension1|set#property(#t30, #t31) in #t31);
}
static method testExtension2() → dynamic {
self::Class2* c0 = new self::Class2::•(0);
self::Class2* c1 = new self::Class2::•(1);
self::expect(3, self::Extension2|method(c0));
self::expect(3, let final self::Class2* #t5 = c0 in #t5.{core::Object::==}(null) ?{core::int*} null : self::Extension2|method(#t5));
self::expect(3, let final self::Class2* #t39 = c0 in #t39.{core::Object::==}(null) ?{core::int*} null : self::Extension2|method(#t39));
self::expect(4, self::Extension2|method(c1));
self::expect(46, self::Extension2|genericMethod<core::int*>(c0, 42));
self::expect(47, self::Extension2|genericMethod<core::num*>(c0, 43));
self::expect(92, self::Extension2|genericMethod<core::int*>(c1, 87));
self::expect(93, self::Extension2|genericMethod<core::num*>(c1, 88));
self::expect(5, self::Extension2|get#property(c0));
self::expect(5, let final self::Class2* #t6 = c0 in #t6.{core::Object::==}(null) ?{core::int*} null : self::Extension2|get#property(#t6));
self::expect(42, self::Extension2|set#property(c0, 42));
self::expect(5, let final self::Class2* #t40 = c0 in #t40.{core::Object::==}(null) ?{core::int*} null : self::Extension2|get#property(#t40));
self::expect(42, let final self::Class2* #t41 = c0 in let final core::int* #t42 = 42 in let final void #t43 = self::Extension2|set#property(#t41, #t42) in #t42);
self::expect(48, self::Extension2|get#property(c0));
self::expect(6, self::Extension2|get#property(c1));
self::expect(43, self::Extension2|set#property(c1, 43));
self::expect(43, let final self::Class2* #t44 = c1 in let final core::int* #t45 = 43 in let final void #t46 = self::Extension2|set#property(#t44, #t45) in #t45);
self::expect(49, self::Extension2|get#property(c1));
self::expect(49, self::Extension2|set#property(c0, self::Extension2|get#property(c1)));
self::expect(55, self::Extension2|set#property(c1, self::Extension2|get#property(c0)));
self::expect(61, self::Extension2|set#property(c1, self::Extension2|set#property(c0, self::Extension2|get#property(c1))));
self::expect(67, self::Extension2|set#property(c0, self::Extension2|set#property(c1, self::Extension2|get#property(c0))));
self::expect(49, let final self::Class2* #t47 = c0 in let final core::int* #t48 = self::Extension2|get#property(c1) in let final void #t49 = self::Extension2|set#property(#t47, #t48) in #t48);
self::expect(55, let final self::Class2* #t50 = c1 in let final core::int* #t51 = self::Extension2|get#property(c0) in let final void #t52 = self::Extension2|set#property(#t50, #t51) in #t51);
self::expect(61, let final self::Class2* #t53 = c1 in let final core::int* #t54 = let final self::Class2* #t55 = c0 in let final core::int* #t56 = self::Extension2|get#property(c1) in let final void #t57 = self::Extension2|set#property(#t55, #t56) in #t56 in let final void #t58 = self::Extension2|set#property(#t53, #t54) in #t54);
self::expect(67, let final self::Class2* #t59 = c0 in let final core::int* #t60 = let final self::Class2* #t61 = c1 in let final core::int* #t62 = self::Extension2|get#property(c0) in let final void #t63 = self::Extension2|set#property(#t61, #t62) in #t62 in let final void #t64 = self::Extension2|set#property(#t59, #t60) in #t60);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!expected.{core::Object::==}(actual)) {

View file

@ -50,12 +50,10 @@ static method Extension1|get#property(final self::Class1* #this) → core::int*
core::print("Extension1.property get on ${#this}");
return #this.{self::Class1::field};
}
static method Extension1|set#property(final self::Class1* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method Extension1|set#property(final self::Class1* #this, core::int* value) → void {
#this.{self::Class1::field} = value;
core::print("Extension1.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
return #t1;
}
static method Extension2|method(final self::Class2* #this) → core::int* {
core::print("Extension2.method on ${#this}");
@ -73,12 +71,10 @@ static method Extension2|get#property(final self::Class2* #this) → core::int*
core::print("Extension2.property get on ${#this}");
return #this.{self::Class2::field}.{core::num::+}(5);
}
static method Extension2|set#property(final self::Class2* #this, core::int* value) → core::int* {
final core::int* #t2 = value;
static method Extension2|set#property(final self::Class2* #this, core::int* value) → void {
core::print("Extension2.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
#this.{self::Class2::field} = value;
return #t2;
}
static method main() → dynamic {
self::testExtension1();
@ -89,42 +85,42 @@ static method testExtension1() → dynamic {
self::Class1* c1 = new self::Class1::•(1);
self::expect(0, self::Extension1|method(c0));
self::expect(1, self::Extension1|method(c1));
self::expect(1, let final self::Class1* #t3 = c1 in #t3.{core::Object::==}(null) ?{core::int*} null : self::Extension1|method(#t3));
self::expect(1, let final self::Class1* #t1 = c1 in #t1.{core::Object::==}(null) ?{core::int*} null : self::Extension1|method(#t1));
self::expect(42, self::Extension1|genericMethod<core::int*>(c0, 42));
self::expect(43, self::Extension1|genericMethod<core::num*>(c0, 43));
self::expect(88, self::Extension1|genericMethod<core::int*>(c1, 87));
self::expect(89, self::Extension1|genericMethod<core::num*>(c1, 88));
self::expect(0, self::Extension1|get#property(c0));
self::expect(0, let final self::Class1* #t4 = c0 in #t4.{core::Object::==}(null) ?{core::int*} null : self::Extension1|get#property(#t4));
self::expect(42, self::Extension1|set#property(c0, 42));
self::expect(0, let final self::Class1* #t2 = c0 in #t2.{core::Object::==}(null) ?{core::int*} null : self::Extension1|get#property(#t2));
self::expect(42, let final self::Class1* #t3 = c0 in let final core::int* #t4 = 42 in let final void #t5 = self::Extension1|set#property(#t3, #t4) in #t4);
self::expect(1, self::Extension1|get#property(c1));
self::expect(87, self::Extension1|set#property(c0, 87));
self::expect(27, self::Extension1|set#property(c0, self::Extension1|set#property(c1, 27)));
self::expect(37, self::Extension1|set#property(c1, self::Extension1|set#property(c0, 37)));
self::expect(77, self::Extension1|set#property(c1, self::Extension1|set#property(c0, self::Extension1|set#property(c1, 77))));
self::expect(67, self::Extension1|set#property(c0, self::Extension1|set#property(c1, self::Extension1|set#property(c0, 67))));
self::expect(87, let final self::Class1* #t6 = c0 in let final core::int* #t7 = 87 in let final void #t8 = self::Extension1|set#property(#t6, #t7) in #t7);
self::expect(27, let final self::Class1* #t9 = c0 in let final core::int* #t10 = let final self::Class1* #t11 = c1 in let final core::int* #t12 = 27 in let final void #t13 = self::Extension1|set#property(#t11, #t12) in #t12 in let final void #t14 = self::Extension1|set#property(#t9, #t10) in #t10);
self::expect(37, let final self::Class1* #t15 = c1 in let final core::int* #t16 = let final self::Class1* #t17 = c0 in let final core::int* #t18 = 37 in let final void #t19 = self::Extension1|set#property(#t17, #t18) in #t18 in let final void #t20 = self::Extension1|set#property(#t15, #t16) in #t16);
self::expect(77, let final self::Class1* #t21 = c1 in let final core::int* #t22 = let final self::Class1* #t23 = c0 in let final core::int* #t24 = let final self::Class1* #t25 = c1 in let final core::int* #t26 = 77 in let final void #t27 = self::Extension1|set#property(#t25, #t26) in #t26 in let final void #t28 = self::Extension1|set#property(#t23, #t24) in #t24 in let final void #t29 = self::Extension1|set#property(#t21, #t22) in #t22);
self::expect(67, let final self::Class1* #t30 = c0 in let final core::int* #t31 = let final self::Class1* #t32 = c1 in let final core::int* #t33 = let final self::Class1* #t34 = c0 in let final core::int* #t35 = 67 in let final void #t36 = self::Extension1|set#property(#t34, #t35) in #t35 in let final void #t37 = self::Extension1|set#property(#t32, #t33) in #t33 in let final void #t38 = self::Extension1|set#property(#t30, #t31) in #t31);
}
static method testExtension2() → dynamic {
self::Class2* c0 = new self::Class2::•(0);
self::Class2* c1 = new self::Class2::•(1);
self::expect(3, self::Extension2|method(c0));
self::expect(3, let final self::Class2* #t5 = c0 in #t5.{core::Object::==}(null) ?{core::int*} null : self::Extension2|method(#t5));
self::expect(3, let final self::Class2* #t39 = c0 in #t39.{core::Object::==}(null) ?{core::int*} null : self::Extension2|method(#t39));
self::expect(4, self::Extension2|method(c1));
self::expect(46, self::Extension2|genericMethod<core::int*>(c0, 42));
self::expect(47, self::Extension2|genericMethod<core::num*>(c0, 43));
self::expect(92, self::Extension2|genericMethod<core::int*>(c1, 87));
self::expect(93, self::Extension2|genericMethod<core::num*>(c1, 88));
self::expect(5, self::Extension2|get#property(c0));
self::expect(5, let final self::Class2* #t6 = c0 in #t6.{core::Object::==}(null) ?{core::int*} null : self::Extension2|get#property(#t6));
self::expect(42, self::Extension2|set#property(c0, 42));
self::expect(5, let final self::Class2* #t40 = c0 in #t40.{core::Object::==}(null) ?{core::int*} null : self::Extension2|get#property(#t40));
self::expect(42, let final self::Class2* #t41 = c0 in let final core::int* #t42 = 42 in let final void #t43 = self::Extension2|set#property(#t41, #t42) in #t42);
self::expect(48, self::Extension2|get#property(c0));
self::expect(6, self::Extension2|get#property(c1));
self::expect(43, self::Extension2|set#property(c1, 43));
self::expect(43, let final self::Class2* #t44 = c1 in let final core::int* #t45 = 43 in let final void #t46 = self::Extension2|set#property(#t44, #t45) in #t45);
self::expect(49, self::Extension2|get#property(c1));
self::expect(49, self::Extension2|set#property(c0, self::Extension2|get#property(c1)));
self::expect(55, self::Extension2|set#property(c1, self::Extension2|get#property(c0)));
self::expect(61, self::Extension2|set#property(c1, self::Extension2|set#property(c0, self::Extension2|get#property(c1))));
self::expect(67, self::Extension2|set#property(c0, self::Extension2|set#property(c1, self::Extension2|get#property(c0))));
self::expect(49, let final self::Class2* #t47 = c0 in let final core::int* #t48 = self::Extension2|get#property(c1) in let final void #t49 = self::Extension2|set#property(#t47, #t48) in #t48);
self::expect(55, let final self::Class2* #t50 = c1 in let final core::int* #t51 = self::Extension2|get#property(c0) in let final void #t52 = self::Extension2|set#property(#t50, #t51) in #t51);
self::expect(61, let final self::Class2* #t53 = c1 in let final core::int* #t54 = let final self::Class2* #t55 = c0 in let final core::int* #t56 = self::Extension2|get#property(c1) in let final void #t57 = self::Extension2|set#property(#t55, #t56) in #t56 in let final void #t58 = self::Extension2|set#property(#t53, #t54) in #t54);
self::expect(67, let final self::Class2* #t59 = c0 in let final core::int* #t60 = let final self::Class2* #t61 = c1 in let final core::int* #t62 = self::Extension2|get#property(c0) in let final void #t63 = self::Extension2|set#property(#t61, #t62) in #t62 in let final void #t64 = self::Extension2|set#property(#t59, #t60) in #t60);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!expected.{core::Object::==}(actual)) {

View file

@ -18,25 +18,19 @@ extension _extension#1 on self::Class* {
}
static method _extension#0|get#property1(final self::Class* #this) → core::int*
return self::_extension#1|get#property2(#this);
static method _extension#0|set#property1(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method _extension#0|set#property1(final self::Class* #this, core::int* value) → void
return #this.{self::Class::field} = value;
return #t1;
}
static method _extension#1|get#property2(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method _extension#1|set#property2(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t2 = value;
return self::_extension#0|set#property1(#this, value);
return #t2;
}
static method _extension#1|set#property2(final self::Class* #this, core::int* value) → void
return let final self::Class* #t1 = #this in let final core::int* #t2 = value in let final void #t3 = self::_extension#0|set#property1(#t1, #t2) in #t2;
static method main() → dynamic {
self::Class* c = new self::Class::•();
self::expect(null, self::_extension#0|get#property1(c));
self::expect(null, self::_extension#1|get#property2(c));
self::expect(42, self::_extension#0|set#property1(c, 42));
self::expect(42, let final self::Class* #t4 = c in let final core::int* #t5 = 42 in let final void #t6 = self::_extension#0|set#property1(#t4, #t5) in #t5);
self::expect(42, self::_extension#1|get#property2(c));
self::expect(87, self::_extension#1|set#property2(c, 87));
self::expect(87, let final self::Class* #t7 = c in let final core::int* #t8 = 87 in let final void #t9 = self::_extension#1|set#property2(#t7, #t8) in #t8);
self::expect(87, self::_extension#0|get#property1(c));
}
static method expect(dynamic expected, dynamic actual) → dynamic {

View file

@ -18,25 +18,19 @@ extension _extension#1 on self::Class* {
}
static method _extension#0|get#property1(final self::Class* #this) → core::int*
return self::_extension#1|get#property2(#this);
static method _extension#0|set#property1(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method _extension#0|set#property1(final self::Class* #this, core::int* value) → void
return #this.{self::Class::field} = value;
return #t1;
}
static method _extension#1|get#property2(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method _extension#1|set#property2(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t2 = value;
return self::_extension#0|set#property1(#this, value);
return #t2;
}
static method _extension#1|set#property2(final self::Class* #this, core::int* value) → void
return let final self::Class* #t1 = #this in let final core::int* #t2 = value in let final void #t3 = self::_extension#0|set#property1(#t1, #t2) in #t2;
static method main() → dynamic {
self::Class* c = new self::Class::•();
self::expect(null, self::_extension#0|get#property1(c));
self::expect(null, self::_extension#1|get#property2(c));
self::expect(42, self::_extension#0|set#property1(c, 42));
self::expect(42, let final self::Class* #t4 = c in let final core::int* #t5 = 42 in let final void #t6 = self::_extension#0|set#property1(#t4, #t5) in #t5);
self::expect(42, self::_extension#1|get#property2(c));
self::expect(87, self::_extension#1|set#property2(c, 87));
self::expect(87, let final self::Class* #t7 = c in let final core::int* #t8 = 87 in let final void #t9 = self::_extension#1|set#property2(#t7, #t8) in #t8);
self::expect(87, self::_extension#0|get#property1(c));
}
static method expect(dynamic expected, dynamic actual) → dynamic {

View file

@ -18,10 +18,8 @@ extension Extension on self::Class* {
}
static method Extension|get#property(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#property(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method Extension|set#property(final self::Class* #this, core::int* value) → void {
#this.{self::Class::field} = value;
return #t1;
}
static method Extension|method(final self::Class* #this) → core::int*
return #this.{self::Class::field};
@ -29,46 +27,46 @@ static method Extension|get#method(final self::Class* #this) → () →* core::i
return () → core::int* => self::Extension|method(#this);
static method Extension|testImplicitThis(final self::Class* #this) → dynamic {
self::expect(null, self::Extension|get#property(#this));
self::expect(42, let final core::int* #t2 = self::Extension|get#property(#this) in #t2.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#this, 42) : #t2);
self::expect(42, let final core::int* #t3 = self::Extension|get#property(#this) in #t3.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#this, 87) : #t3);
self::expect(42, let final core::int* #t1 = self::Extension|get#property(#this) in #t1.{core::num::==}(null) ?{core::int*} let final core::int* #t2 = 42 in let final void #t3 = self::Extension|set#property(#this, #t2) in #t2 : #t1);
self::expect(42, let final core::int* #t4 = self::Extension|get#property(#this) in #t4.{core::num::==}(null) ?{core::int*} let final core::int* #t5 = 87 in let final void #t6 = self::Extension|set#property(#this, #t5) in #t5 : #t4);
}
static method Extension|get#testImplicitThis(final self::Class* #this) → () →* dynamic
return () → dynamic => self::Extension|testImplicitThis(#this);
static method main() → dynamic {
self::Class* c;
self::expect(null, let final self::Class* #t4 = c in #t4.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t4));
self::expect(null, let final self::Class* #t5 = c in #t5.{core::Object::==}(null) ?{() →* core::int*} null : self::Extension|get#method(#t5));
self::expect(null, let final self::Class* #t6 = c in #t6.{core::Object::==}(null) ?{core::int*} null : self::Extension|method(#t6));
self::expect(null, let final self::Class* #t7 = c in #t7.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#property(#t7, 42));
c = new self::Class::•();
self::expect(null, let final self::Class* #t8 = c in #t8.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t8));
self::expect(null, let final self::Class* #t7 = c in #t7.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t7));
self::expect(null, let final self::Class* #t8 = c in #t8.{core::Object::==}(null) ?{() →* core::int*} null : self::Extension|get#method(#t8));
self::expect(null, let final self::Class* #t9 = c in #t9.{core::Object::==}(null) ?{core::int*} null : self::Extension|method(#t9));
() →* core::int* tearOff = let final self::Class* #t10 = c in #t10.{core::Object::==}(null) ?{() →* core::int*} null : self::Extension|get#method(#t10);
self::expect(null, let final self::Class* #t10 = c in #t10.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t11 = #t10 in let final core::int* #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11, #t12) in #t12);
c = new self::Class::•();
self::expect(null, let final self::Class* #t14 = c in #t14.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t14));
self::expect(null, let final self::Class* #t15 = c in #t15.{core::Object::==}(null) ?{core::int*} null : self::Extension|method(#t15));
() →* core::int* tearOff = let final self::Class* #t16 = c in #t16.{core::Object::==}(null) ?{() →* core::int*} null : self::Extension|get#method(#t16);
self::expect(null, tearOff.call());
self::expect(42, let final self::Class* #t11 = c in #t11.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#property(#t11, 42));
self::expect(42, let final self::Class* #t17 = c in #t17.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t18 = #t17 in let final core::int* #t19 = 42 in let final void #t20 = self::Extension|set#property(#t18, #t19) in #t19);
self::expect(42, tearOff.call());
self::expect(null, let final self::Class* #t12 = c in #t12.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t12, null));
self::expect(42, let final self::Class* #t13 = c in #t13.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#property(#t13, 42));
let final self::Class* #t14 = c in #t14.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t14, null);
self::expect(null, let final self::Class* #t15 = c in #t15.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t15));
self::expect(42, let final self::Class* #t16 = c in let final core::int* #t17 = self::Extension|get#property(#t16) in #t17.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t16, 42) : #t17);
self::expect(42, let final self::Class* #t18 = c in let final core::int* #t19 = self::Extension|get#property(#t18) in #t19.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t18, 87) : #t19);
self::expect(null, let final self::Class* #t20 = c in #t20.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t20, null));
let final self::Class* #t21 = c in self::Extension|get#property(#t21).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t21, 42) : null;
self::expect(42, let final self::Class* #t22 = c in #t22.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t22));
let final self::Class* #t23 = c in self::Extension|get#property(#t23).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t23, 87) : null;
self::expect(42, let final self::Class* #t24 = c in #t24.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t24));
let final self::Class* #t25 = c in #t25.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t25, null);
self::expect(null, let final self::Class* #t26 = c in #t26.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t26));
self::expect(42, let final self::Class* #t27 = c in let final core::int* #t28 = self::Extension|get#property(#t27) in #t28.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t27, 42) : #t28);
self::expect(42, let final self::Class* #t29 = c in let final core::int* #t30 = self::Extension|get#property(#t29) in #t30.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t29, 87) : #t30);
let final self::Class* #t31 = c in #t31.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t31, null);
self::expect(null, let final self::Class* #t32 = c in #t32.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t32));
let final self::Class* #t33 = c in self::Extension|get#property(#t33).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t33, 42) : null;
self::expect(42, let final self::Class* #t34 = c in #t34.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t34));
let final self::Class* #t35 = c in self::Extension|get#property(#t35).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t35, 87) : null;
self::expect(42, let final self::Class* #t36 = c in #t36.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t36));
let final self::Class* #t37 = c in #t37.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t37, null);
self::expect(null, let final self::Class* #t21 = c in #t21.{core::Object::==}(null) ?{core::Null?} null : let final self::Class* #t22 = #t21 in let final core::Null? #t23 = null in let final void #t24 = self::Extension|set#property(#t22, #t23) in #t23);
self::expect(42, let final self::Class* #t25 = c in #t25.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t26 = #t25 in let final core::int* #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26, #t27) in #t27);
let final self::Class* #t29 = c in #t29.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t29, null);
self::expect(null, let final self::Class* #t30 = c in #t30.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t30));
self::expect(42, let final self::Class* #t31 = c in let final core::int* #t32 = self::Extension|get#property(#t31) in #t32.{core::num::==}(null) ?{core::int*} let final self::Class* #t33 = #t31 in let final core::int* #t34 = 42 in let final void #t35 = self::Extension|set#property(#t33, #t34) in #t34 : #t32);
self::expect(42, let final self::Class* #t36 = c in let final core::int* #t37 = self::Extension|get#property(#t36) in #t37.{core::num::==}(null) ?{core::int*} let final self::Class* #t38 = #t36 in let final core::int* #t39 = 87 in let final void #t40 = self::Extension|set#property(#t38, #t39) in #t39 : #t37);
self::expect(null, let final self::Class* #t41 = c in #t41.{core::Object::==}(null) ?{core::Null?} null : let final self::Class* #t42 = #t41 in let final core::Null? #t43 = null in let final void #t44 = self::Extension|set#property(#t42, #t43) in #t43);
let final self::Class* #t45 = c in self::Extension|get#property(#t45).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t45, 42) : null;
self::expect(42, let final self::Class* #t46 = c in #t46.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t46));
let final self::Class* #t47 = c in self::Extension|get#property(#t47).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t47, 87) : null;
self::expect(42, let final self::Class* #t48 = c in #t48.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t48));
let final self::Class* #t49 = c in #t49.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t49, null);
self::expect(null, let final self::Class* #t50 = c in #t50.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t50));
self::expect(42, let final self::Class* #t51 = c in let final core::int* #t52 = self::Extension|get#property(#t51) in #t52.{core::num::==}(null) ?{core::int*} let final core::int* #t53 = 42 in let final void #t54 = self::Extension|set#property(#t51, #t53) in #t53 : #t52);
self::expect(42, let final self::Class* #t55 = c in let final core::int* #t56 = self::Extension|get#property(#t55) in #t56.{core::num::==}(null) ?{core::int*} let final core::int* #t57 = 87 in let final void #t58 = self::Extension|set#property(#t55, #t57) in #t57 : #t56);
let final self::Class* #t59 = c in #t59.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t59, null);
self::expect(null, let final self::Class* #t60 = c in #t60.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t60));
let final self::Class* #t61 = c in self::Extension|get#property(#t61).{core::num::==}(null) ?{void} self::Extension|set#property(#t61, 42) : null;
self::expect(42, let final self::Class* #t62 = c in #t62.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t62));
let final self::Class* #t63 = c in self::Extension|get#property(#t63).{core::num::==}(null) ?{void} self::Extension|set#property(#t63, 87) : null;
self::expect(42, let final self::Class* #t64 = c in #t64.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t64));
let final self::Class* #t65 = c in #t65.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t65, null);
self::Extension|testImplicitThis(c);
}
static method expect(dynamic expected, dynamic actual) → dynamic {

View file

@ -18,10 +18,8 @@ extension Extension on self::Class* {
}
static method Extension|get#property(final self::Class* #this) → core::int*
return #this.{self::Class::field};
static method Extension|set#property(final self::Class* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method Extension|set#property(final self::Class* #this, core::int* value) → void {
#this.{self::Class::field} = value;
return #t1;
}
static method Extension|method(final self::Class* #this) → core::int*
return #this.{self::Class::field};
@ -29,46 +27,46 @@ static method Extension|get#method(final self::Class* #this) → () →* core::i
return () → core::int* => self::Extension|method(#this);
static method Extension|testImplicitThis(final self::Class* #this) → dynamic {
self::expect(null, self::Extension|get#property(#this));
self::expect(42, let final core::int* #t2 = self::Extension|get#property(#this) in #t2.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#this, 42) : #t2);
self::expect(42, let final core::int* #t3 = self::Extension|get#property(#this) in #t3.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#this, 87) : #t3);
self::expect(42, let final core::int* #t1 = self::Extension|get#property(#this) in #t1.{core::num::==}(null) ?{core::int*} let final core::int* #t2 = 42 in let final void #t3 = self::Extension|set#property(#this, #t2) in #t2 : #t1);
self::expect(42, let final core::int* #t4 = self::Extension|get#property(#this) in #t4.{core::num::==}(null) ?{core::int*} let final core::int* #t5 = 87 in let final void #t6 = self::Extension|set#property(#this, #t5) in #t5 : #t4);
}
static method Extension|get#testImplicitThis(final self::Class* #this) → () →* dynamic
return () → dynamic => self::Extension|testImplicitThis(#this);
static method main() → dynamic {
self::Class* c;
self::expect(null, let final self::Class* #t4 = c in #t4.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t4));
self::expect(null, let final self::Class* #t5 = c in #t5.{core::Object::==}(null) ?{() →* core::int*} null : self::Extension|get#method(#t5));
self::expect(null, let final self::Class* #t6 = c in #t6.{core::Object::==}(null) ?{core::int*} null : self::Extension|method(#t6));
self::expect(null, let final self::Class* #t7 = c in #t7.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#property(#t7, 42));
c = new self::Class::•();
self::expect(null, let final self::Class* #t8 = c in #t8.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t8));
self::expect(null, let final self::Class* #t7 = c in #t7.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t7));
self::expect(null, let final self::Class* #t8 = c in #t8.{core::Object::==}(null) ?{() →* core::int*} null : self::Extension|get#method(#t8));
self::expect(null, let final self::Class* #t9 = c in #t9.{core::Object::==}(null) ?{core::int*} null : self::Extension|method(#t9));
() →* core::int* tearOff = let final self::Class* #t10 = c in #t10.{core::Object::==}(null) ?{() →* core::int*} null : self::Extension|get#method(#t10);
self::expect(null, let final self::Class* #t10 = c in #t10.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t11 = #t10 in let final core::int* #t12 = 42 in let final void #t13 = self::Extension|set#property(#t11, #t12) in #t12);
c = new self::Class::•();
self::expect(null, let final self::Class* #t14 = c in #t14.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t14));
self::expect(null, let final self::Class* #t15 = c in #t15.{core::Object::==}(null) ?{core::int*} null : self::Extension|method(#t15));
() →* core::int* tearOff = let final self::Class* #t16 = c in #t16.{core::Object::==}(null) ?{() →* core::int*} null : self::Extension|get#method(#t16);
self::expect(null, tearOff.call());
self::expect(42, let final self::Class* #t11 = c in #t11.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#property(#t11, 42));
self::expect(42, let final self::Class* #t17 = c in #t17.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t18 = #t17 in let final core::int* #t19 = 42 in let final void #t20 = self::Extension|set#property(#t18, #t19) in #t19);
self::expect(42, tearOff.call());
self::expect(null, let final self::Class* #t12 = c in #t12.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t12, null));
self::expect(42, let final self::Class* #t13 = c in #t13.{core::Object::==}(null) ?{core::int*} null : self::Extension|set#property(#t13, 42));
let final self::Class* #t14 = c in #t14.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t14, null);
self::expect(null, let final self::Class* #t15 = c in #t15.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t15));
self::expect(42, let final self::Class* #t16 = c in let final core::int* #t17 = self::Extension|get#property(#t16) in #t17.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t16, 42) : #t17);
self::expect(42, let final self::Class* #t18 = c in let final core::int* #t19 = self::Extension|get#property(#t18) in #t19.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t18, 87) : #t19);
self::expect(null, let final self::Class* #t20 = c in #t20.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t20, null));
let final self::Class* #t21 = c in self::Extension|get#property(#t21).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t21, 42) : null;
self::expect(42, let final self::Class* #t22 = c in #t22.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t22));
let final self::Class* #t23 = c in self::Extension|get#property(#t23).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t23, 87) : null;
self::expect(42, let final self::Class* #t24 = c in #t24.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t24));
let final self::Class* #t25 = c in #t25.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t25, null);
self::expect(null, let final self::Class* #t26 = c in #t26.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t26));
self::expect(42, let final self::Class* #t27 = c in let final core::int* #t28 = self::Extension|get#property(#t27) in #t28.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t27, 42) : #t28);
self::expect(42, let final self::Class* #t29 = c in let final core::int* #t30 = self::Extension|get#property(#t29) in #t30.{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t29, 87) : #t30);
let final self::Class* #t31 = c in #t31.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t31, null);
self::expect(null, let final self::Class* #t32 = c in #t32.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t32));
let final self::Class* #t33 = c in self::Extension|get#property(#t33).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t33, 42) : null;
self::expect(42, let final self::Class* #t34 = c in #t34.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t34));
let final self::Class* #t35 = c in self::Extension|get#property(#t35).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t35, 87) : null;
self::expect(42, let final self::Class* #t36 = c in #t36.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t36));
let final self::Class* #t37 = c in #t37.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t37, null);
self::expect(null, let final self::Class* #t21 = c in #t21.{core::Object::==}(null) ?{core::Null?} null : let final self::Class* #t22 = #t21 in let final core::Null? #t23 = null in let final void #t24 = self::Extension|set#property(#t22, #t23) in #t23);
self::expect(42, let final self::Class* #t25 = c in #t25.{core::Object::==}(null) ?{core::int*} null : let final self::Class* #t26 = #t25 in let final core::int* #t27 = 42 in let final void #t28 = self::Extension|set#property(#t26, #t27) in #t27);
let final self::Class* #t29 = c in #t29.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t29, null);
self::expect(null, let final self::Class* #t30 = c in #t30.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t30));
self::expect(42, let final self::Class* #t31 = c in let final core::int* #t32 = self::Extension|get#property(#t31) in #t32.{core::num::==}(null) ?{core::int*} let final self::Class* #t33 = #t31 in let final core::int* #t34 = 42 in let final void #t35 = self::Extension|set#property(#t33, #t34) in #t34 : #t32);
self::expect(42, let final self::Class* #t36 = c in let final core::int* #t37 = self::Extension|get#property(#t36) in #t37.{core::num::==}(null) ?{core::int*} let final self::Class* #t38 = #t36 in let final core::int* #t39 = 87 in let final void #t40 = self::Extension|set#property(#t38, #t39) in #t39 : #t37);
self::expect(null, let final self::Class* #t41 = c in #t41.{core::Object::==}(null) ?{core::Null?} null : let final self::Class* #t42 = #t41 in let final core::Null? #t43 = null in let final void #t44 = self::Extension|set#property(#t42, #t43) in #t43);
let final self::Class* #t45 = c in self::Extension|get#property(#t45).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t45, 42) : null;
self::expect(42, let final self::Class* #t46 = c in #t46.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t46));
let final self::Class* #t47 = c in self::Extension|get#property(#t47).{core::num::==}(null) ?{core::int*} self::Extension|set#property(#t47, 87) : null;
self::expect(42, let final self::Class* #t48 = c in #t48.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t48));
let final self::Class* #t49 = c in #t49.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t49, null);
self::expect(null, let final self::Class* #t50 = c in #t50.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t50));
self::expect(42, let final self::Class* #t51 = c in let final core::int* #t52 = self::Extension|get#property(#t51) in #t52.{core::num::==}(null) ?{core::int*} let final core::int* #t53 = 42 in let final void #t54 = self::Extension|set#property(#t51, #t53) in #t53 : #t52);
self::expect(42, let final self::Class* #t55 = c in let final core::int* #t56 = self::Extension|get#property(#t55) in #t56.{core::num::==}(null) ?{core::int*} let final core::int* #t57 = 87 in let final void #t58 = self::Extension|set#property(#t55, #t57) in #t57 : #t56);
let final self::Class* #t59 = c in #t59.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t59, null);
self::expect(null, let final self::Class* #t60 = c in #t60.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t60));
let final self::Class* #t61 = c in self::Extension|get#property(#t61).{core::num::==}(null) ?{void} self::Extension|set#property(#t61, 42) : null;
self::expect(42, let final self::Class* #t62 = c in #t62.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t62));
let final self::Class* #t63 = c in self::Extension|get#property(#t63).{core::num::==}(null) ?{void} self::Extension|set#property(#t63, 87) : null;
self::expect(42, let final self::Class* #t64 = c in #t64.{core::Object::==}(null) ?{core::int*} null : self::Extension|get#property(#t64));
let final self::Class* #t65 = c in #t65.{core::Object::==}(null) ?{core::Null?} null : self::Extension|set#property(#t65, null);
self::Extension|testImplicitThis(c);
}
static method expect(dynamic expected, dynamic actual) → dynamic {

View file

@ -73,10 +73,7 @@ static method Extension|get#method<T extends self::Struct* = dynamic>(final self
return () → self::Extension|get#method::T* => self::Extension|method<self::Extension|get#method::T*>(#this);
static method Extension|get#property<T extends self::Struct* = dynamic>(final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
return #this;
static method Extension|set#property<T extends self::Struct* = dynamic>(final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → self::Extension|set#property::T* {
final self::Extension|set#property::T* #t1 = value;
return #t1;
}
static method Extension|set#property<T extends self::Struct* = dynamic>(final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void {}
static method main() → dynamic {
self::Struct* struct;
self::StructA* structA;

View file

@ -73,10 +73,7 @@ static method Extension|get#method<T extends self::Struct* = dynamic>(final self
return () → self::Extension|get#method::T* => self::Extension|method<self::Extension|get#method::T*>(#this);
static method Extension|get#property<T extends self::Struct* = dynamic>(final self::Extension|get#property::T* #this) → self::Extension|get#property::T*
return #this;
static method Extension|set#property<T extends self::Struct* = dynamic>(final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → self::Extension|set#property::T* {
final self::Extension|set#property::T* #t1 = value;
return #t1;
}
static method Extension|set#property<T extends self::Struct* = dynamic>(final self::Extension|set#property::T* #this, self::Extension|set#property::T* value) → void {}
static method main() → dynamic {
self::Struct* struct;
self::StructA* structA;

View file

@ -30,10 +30,8 @@ extension A2 on self::A1* {
static field core::int* A2|staticField = self::A1::getStaticField();
static method A2|get#instanceProperty(final self::A1* #this) → core::int*
return #this.{self::A1::getInstanceField}();
static method A2|set#instanceProperty(final self::A1* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method A2|set#instanceProperty(final self::A1* #this, core::int* value) → void {
#this.{self::A1::setInstanceField}(value);
return #t1;
}
static method A2|+(final self::A1* #this, core::int* value) → core::int* {
return #this.{self::A1::getInstanceField}().{core::num::+}(value);

View file

@ -30,10 +30,8 @@ extension A2 on self::A1* {
static field core::int* A2|staticField = self::A1::getStaticField();
static method A2|get#instanceProperty(final self::A1* #this) → core::int*
return #this.{self::A1::getInstanceField}();
static method A2|set#instanceProperty(final self::A1* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method A2|set#instanceProperty(final self::A1* #this, core::int* value) → void {
#this.{self::A1::setInstanceField}(value);
return #t1;
}
static method A2|+(final self::A1* #this, core::int* value) → core::int* {
return #this.{self::A1::getInstanceField}().{core::num::+}(value);

View file

@ -29,10 +29,7 @@ static method Extension|get#instanceMethod(final self::Class* #this) → () →*
return () → dynamic => self::Extension|instanceMethod(#this);
static method Extension|get#instanceProperty(final self::Class* #this) → dynamic
return 42;
static method Extension|set#instanceProperty(final self::Class* #this, dynamic value) → dynamic {
final dynamic #t1 = value;
return #t1;
}
static method Extension|set#instanceProperty(final self::Class* #this, dynamic value) → void {}
static method main() → dynamic {
self::Extension|method();
self::Extension|genericMethod<core::int*>(42);

View file

@ -29,10 +29,7 @@ static method Extension|get#instanceMethod(final self::Class* #this) → () →*
return () → dynamic => self::Extension|instanceMethod(#this);
static method Extension|get#instanceProperty(final self::Class* #this) → dynamic
return 42;
static method Extension|set#instanceProperty(final self::Class* #this, dynamic value) → dynamic {
final dynamic #t1 = value;
return #t1;
}
static method Extension|set#instanceProperty(final self::Class* #this, dynamic value) → void {}
static method main() → dynamic {
self::Extension|method();
self::Extension|genericMethod<core::int*>(42);

View file

@ -37,10 +37,7 @@ static method Extension|get#instanceMethod(final self::Class* #this) → () →*
return () → dynamic => self::Extension|instanceMethod(#this);
static method Extension|get#instanceProperty(final self::Class* #this) → dynamic
return 42;
static method Extension|set#instanceProperty(final self::Class* #this, dynamic value) → dynamic {
final dynamic #t1 = value;
return #t1;
}
static method Extension|set#instanceProperty(final self::Class* #this, dynamic value) → void {}
static method main() → dynamic {
invalid-expression "pkg/front_end/testcases/extensions/static_access_of_instance.dart:14:13: Error: Method not found: 'Extension.instanceMethod'.
Extension.instanceMethod();

View file

@ -37,10 +37,7 @@ static method Extension|get#instanceMethod(final self::Class* #this) → () →*
return () → dynamic => self::Extension|instanceMethod(#this);
static method Extension|get#instanceProperty(final self::Class* #this) → dynamic
return 42;
static method Extension|set#instanceProperty(final self::Class* #this, dynamic value) → dynamic {
final dynamic #t1 = value;
return #t1;
}
static method Extension|set#instanceProperty(final self::Class* #this, dynamic value) → void {}
static method main() → dynamic {
invalid-expression "pkg/front_end/testcases/extensions/static_access_of_instance.dart:14:13: Error: Method not found: 'Extension.instanceMethod'.
Extension.instanceMethod();

View file

@ -50,12 +50,10 @@ static method _extension#0|get#property(final self::Class1* #this) → core::int
core::print("Extension1.property get on ${#this}");
return #this.{self::Class1::field};
}
static method _extension#0|set#property(final self::Class1* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method _extension#0|set#property(final self::Class1* #this, core::int* value) → void {
#this.{self::Class1::field} = value;
core::print("Extension1.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
return #t1;
}
static method _extension#1|method(final self::Class2* #this) → core::int* {
core::print("Extension2.method on ${#this}");
@ -73,12 +71,10 @@ static method _extension#1|get#property(final self::Class2* #this) → core::int
core::print("Extension2.property get on ${#this}");
return #this.{self::Class2::field}.{core::num::+}(5);
}
static method _extension#1|set#property(final self::Class2* #this, core::int* value) → core::int* {
final core::int* #t2 = value;
static method _extension#1|set#property(final self::Class2* #this, core::int* value) → void {
core::print("Extension2.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
#this.{self::Class2::field} = value;
return #t2;
}
static method main() → dynamic {
self::testExtension1();
@ -89,42 +85,42 @@ static method testExtension1() → dynamic {
self::Class1* c1 = new self::Class1::•(1);
self::expect(0, self::_extension#0|method(c0));
self::expect(1, self::_extension#0|method(c1));
self::expect(1, let final self::Class1* #t3 = c1 in #t3.{core::Object::==}(null) ?{core::int*} null : self::_extension#0|method(#t3));
self::expect(1, let final self::Class1* #t1 = c1 in #t1.{core::Object::==}(null) ?{core::int*} null : self::_extension#0|method(#t1));
self::expect(42, self::_extension#0|genericMethod<core::int*>(c0, 42));
self::expect(43, self::_extension#0|genericMethod<core::num*>(c0, 43));
self::expect(88, self::_extension#0|genericMethod<core::int*>(c1, 87));
self::expect(89, self::_extension#0|genericMethod<core::num*>(c1, 88));
self::expect(0, self::_extension#0|get#property(c0));
self::expect(0, let final self::Class1* #t4 = c0 in #t4.{core::Object::==}(null) ?{core::int*} null : self::_extension#0|get#property(#t4));
self::expect(42, self::_extension#0|set#property(c0, 42));
self::expect(0, let final self::Class1* #t2 = c0 in #t2.{core::Object::==}(null) ?{core::int*} null : self::_extension#0|get#property(#t2));
self::expect(42, let final self::Class1* #t3 = c0 in let final core::int* #t4 = 42 in let final void #t5 = self::_extension#0|set#property(#t3, #t4) in #t4);
self::expect(1, self::_extension#0|get#property(c1));
self::expect(87, self::_extension#0|set#property(c0, 87));
self::expect(27, self::_extension#0|set#property(c0, self::_extension#0|set#property(c1, 27)));
self::expect(37, self::_extension#0|set#property(c1, self::_extension#0|set#property(c0, 37)));
self::expect(77, self::_extension#0|set#property(c1, self::_extension#0|set#property(c0, self::_extension#0|set#property(c1, 77))));
self::expect(67, self::_extension#0|set#property(c0, self::_extension#0|set#property(c1, self::_extension#0|set#property(c0, 67))));
self::expect(87, let final self::Class1* #t6 = c0 in let final core::int* #t7 = 87 in let final void #t8 = self::_extension#0|set#property(#t6, #t7) in #t7);
self::expect(27, let final self::Class1* #t9 = c0 in let final core::int* #t10 = let final self::Class1* #t11 = c1 in let final core::int* #t12 = 27 in let final void #t13 = self::_extension#0|set#property(#t11, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(#t9, #t10) in #t10);
self::expect(37, let final self::Class1* #t15 = c1 in let final core::int* #t16 = let final self::Class1* #t17 = c0 in let final core::int* #t18 = 37 in let final void #t19 = self::_extension#0|set#property(#t17, #t18) in #t18 in let final void #t20 = self::_extension#0|set#property(#t15, #t16) in #t16);
self::expect(77, let final self::Class1* #t21 = c1 in let final core::int* #t22 = let final self::Class1* #t23 = c0 in let final core::int* #t24 = let final self::Class1* #t25 = c1 in let final core::int* #t26 = 77 in let final void #t27 = self::_extension#0|set#property(#t25, #t26) in #t26 in let final void #t28 = self::_extension#0|set#property(#t23, #t24) in #t24 in let final void #t29 = self::_extension#0|set#property(#t21, #t22) in #t22);
self::expect(67, let final self::Class1* #t30 = c0 in let final core::int* #t31 = let final self::Class1* #t32 = c1 in let final core::int* #t33 = let final self::Class1* #t34 = c0 in let final core::int* #t35 = 67 in let final void #t36 = self::_extension#0|set#property(#t34, #t35) in #t35 in let final void #t37 = self::_extension#0|set#property(#t32, #t33) in #t33 in let final void #t38 = self::_extension#0|set#property(#t30, #t31) in #t31);
}
static method testExtension2() → dynamic {
self::Class2* c0 = new self::Class2::•(0);
self::Class2* c1 = new self::Class2::•(1);
self::expect(3, self::_extension#1|method(c0));
self::expect(3, let final self::Class2* #t5 = c0 in #t5.{core::Object::==}(null) ?{core::int*} null : self::_extension#1|method(#t5));
self::expect(3, let final self::Class2* #t39 = c0 in #t39.{core::Object::==}(null) ?{core::int*} null : self::_extension#1|method(#t39));
self::expect(4, self::_extension#1|method(c1));
self::expect(46, self::_extension#1|genericMethod<core::int*>(c0, 42));
self::expect(47, self::_extension#1|genericMethod<core::num*>(c0, 43));
self::expect(92, self::_extension#1|genericMethod<core::int*>(c1, 87));
self::expect(93, self::_extension#1|genericMethod<core::num*>(c1, 88));
self::expect(5, self::_extension#1|get#property(c0));
self::expect(5, let final self::Class2* #t6 = c0 in #t6.{core::Object::==}(null) ?{core::int*} null : self::_extension#1|get#property(#t6));
self::expect(42, self::_extension#1|set#property(c0, 42));
self::expect(5, let final self::Class2* #t40 = c0 in #t40.{core::Object::==}(null) ?{core::int*} null : self::_extension#1|get#property(#t40));
self::expect(42, let final self::Class2* #t41 = c0 in let final core::int* #t42 = 42 in let final void #t43 = self::_extension#1|set#property(#t41, #t42) in #t42);
self::expect(48, self::_extension#1|get#property(c0));
self::expect(6, self::_extension#1|get#property(c1));
self::expect(43, self::_extension#1|set#property(c1, 43));
self::expect(43, let final self::Class2* #t44 = c1 in let final core::int* #t45 = 43 in let final void #t46 = self::_extension#1|set#property(#t44, #t45) in #t45);
self::expect(49, self::_extension#1|get#property(c1));
self::expect(49, self::_extension#1|set#property(c0, self::_extension#1|get#property(c1)));
self::expect(55, self::_extension#1|set#property(c1, self::_extension#1|get#property(c0)));
self::expect(61, self::_extension#1|set#property(c1, self::_extension#1|set#property(c0, self::_extension#1|get#property(c1))));
self::expect(67, self::_extension#1|set#property(c0, self::_extension#1|set#property(c1, self::_extension#1|get#property(c0))));
self::expect(49, let final self::Class2* #t47 = c0 in let final core::int* #t48 = self::_extension#1|get#property(c1) in let final void #t49 = self::_extension#1|set#property(#t47, #t48) in #t48);
self::expect(55, let final self::Class2* #t50 = c1 in let final core::int* #t51 = self::_extension#1|get#property(c0) in let final void #t52 = self::_extension#1|set#property(#t50, #t51) in #t51);
self::expect(61, let final self::Class2* #t53 = c1 in let final core::int* #t54 = let final self::Class2* #t55 = c0 in let final core::int* #t56 = self::_extension#1|get#property(c1) in let final void #t57 = self::_extension#1|set#property(#t55, #t56) in #t56 in let final void #t58 = self::_extension#1|set#property(#t53, #t54) in #t54);
self::expect(67, let final self::Class2* #t59 = c0 in let final core::int* #t60 = let final self::Class2* #t61 = c1 in let final core::int* #t62 = self::_extension#1|get#property(c0) in let final void #t63 = self::_extension#1|set#property(#t61, #t62) in #t62 in let final void #t64 = self::_extension#1|set#property(#t59, #t60) in #t60);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!expected.{core::Object::==}(actual)) {

View file

@ -50,12 +50,10 @@ static method _extension#0|get#property(final self::Class1* #this) → core::int
core::print("Extension1.property get on ${#this}");
return #this.{self::Class1::field};
}
static method _extension#0|set#property(final self::Class1* #this, core::int* value) → core::int* {
final core::int* #t1 = value;
static method _extension#0|set#property(final self::Class1* #this, core::int* value) → void {
#this.{self::Class1::field} = value;
core::print("Extension1.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
return #t1;
}
static method _extension#1|method(final self::Class2* #this) → core::int* {
core::print("Extension2.method on ${#this}");
@ -73,12 +71,10 @@ static method _extension#1|get#property(final self::Class2* #this) → core::int
core::print("Extension2.property get on ${#this}");
return #this.{self::Class2::field}.{core::num::+}(5);
}
static method _extension#1|set#property(final self::Class2* #this, core::int* value) → core::int* {
final core::int* #t2 = value;
static method _extension#1|set#property(final self::Class2* #this, core::int* value) → void {
core::print("Extension2.property set(${value}) on ${#this}");
value = value.{core::num::+}(1);
#this.{self::Class2::field} = value;
return #t2;
}
static method main() → dynamic {
self::testExtension1();
@ -89,42 +85,42 @@ static method testExtension1() → dynamic {
self::Class1* c1 = new self::Class1::•(1);
self::expect(0, self::_extension#0|method(c0));
self::expect(1, self::_extension#0|method(c1));
self::expect(1, let final self::Class1* #t3 = c1 in #t3.{core::Object::==}(null) ?{core::int*} null : self::_extension#0|method(#t3));
self::expect(1, let final self::Class1* #t1 = c1 in #t1.{core::Object::==}(null) ?{core::int*} null : self::_extension#0|method(#t1));
self::expect(42, self::_extension#0|genericMethod<core::int*>(c0, 42));
self::expect(43, self::_extension#0|genericMethod<core::num*>(c0, 43));
self::expect(88, self::_extension#0|genericMethod<core::int*>(c1, 87));
self::expect(89, self::_extension#0|genericMethod<core::num*>(c1, 88));
self::expect(0, self::_extension#0|get#property(c0));
self::expect(0, let final self::Class1* #t4 = c0 in #t4.{core::Object::==}(null) ?{core::int*} null : self::_extension#0|get#property(#t4));
self::expect(42, self::_extension#0|set#property(c0, 42));
self::expect(0, let final self::Class1* #t2 = c0 in #t2.{core::Object::==}(null) ?{core::int*} null : self::_extension#0|get#property(#t2));
self::expect(42, let final self::Class1* #t3 = c0 in let final core::int* #t4 = 42 in let final void #t5 = self::_extension#0|set#property(#t3, #t4) in #t4);
self::expect(1, self::_extension#0|get#property(c1));
self::expect(87, self::_extension#0|set#property(c0, 87));
self::expect(27, self::_extension#0|set#property(c0, self::_extension#0|set#property(c1, 27)));
self::expect(37, self::_extension#0|set#property(c1, self::_extension#0|set#property(c0, 37)));
self::expect(77, self::_extension#0|set#property(c1, self::_extension#0|set#property(c0, self::_extension#0|set#property(c1, 77))));
self::expect(67, self::_extension#0|set#property(c0, self::_extension#0|set#property(c1, self::_extension#0|set#property(c0, 67))));
self::expect(87, let final self::Class1* #t6 = c0 in let final core::int* #t7 = 87 in let final void #t8 = self::_extension#0|set#property(#t6, #t7) in #t7);
self::expect(27, let final self::Class1* #t9 = c0 in let final core::int* #t10 = let final self::Class1* #t11 = c1 in let final core::int* #t12 = 27 in let final void #t13 = self::_extension#0|set#property(#t11, #t12) in #t12 in let final void #t14 = self::_extension#0|set#property(#t9, #t10) in #t10);
self::expect(37, let final self::Class1* #t15 = c1 in let final core::int* #t16 = let final self::Class1* #t17 = c0 in let final core::int* #t18 = 37 in let final void #t19 = self::_extension#0|set#property(#t17, #t18) in #t18 in let final void #t20 = self::_extension#0|set#property(#t15, #t16) in #t16);
self::expect(77, let final self::Class1* #t21 = c1 in let final core::int* #t22 = let final self::Class1* #t23 = c0 in let final core::int* #t24 = let final self::Class1* #t25 = c1 in let final core::int* #t26 = 77 in let final void #t27 = self::_extension#0|set#property(#t25, #t26) in #t26 in let final void #t28 = self::_extension#0|set#property(#t23, #t24) in #t24 in let final void #t29 = self::_extension#0|set#property(#t21, #t22) in #t22);
self::expect(67, let final self::Class1* #t30 = c0 in let final core::int* #t31 = let final self::Class1* #t32 = c1 in let final core::int* #t33 = let final self::Class1* #t34 = c0 in let final core::int* #t35 = 67 in let final void #t36 = self::_extension#0|set#property(#t34, #t35) in #t35 in let final void #t37 = self::_extension#0|set#property(#t32, #t33) in #t33 in let final void #t38 = self::_extension#0|set#property(#t30, #t31) in #t31);
}
static method testExtension2() → dynamic {
self::Class2* c0 = new self::Class2::•(0);
self::Class2* c1 = new self::Class2::•(1);
self::expect(3, self::_extension#1|method(c0));
self::expect(3, let final self::Class2* #t5 = c0 in #t5.{core::Object::==}(null) ?{core::int*} null : self::_extension#1|method(#t5));
self::expect(3, let final self::Class2* #t39 = c0 in #t39.{core::Object::==}(null) ?{core::int*} null : self::_extension#1|method(#t39));
self::expect(4, self::_extension#1|method(c1));
self::expect(46, self::_extension#1|genericMethod<core::int*>(c0, 42));
self::expect(47, self::_extension#1|genericMethod<core::num*>(c0, 43));
self::expect(92, self::_extension#1|genericMethod<core::int*>(c1, 87));
self::expect(93, self::_extension#1|genericMethod<core::num*>(c1, 88));
self::expect(5, self::_extension#1|get#property(c0));
self::expect(5, let final self::Class2* #t6 = c0 in #t6.{core::Object::==}(null) ?{core::int*} null : self::_extension#1|get#property(#t6));
self::expect(42, self::_extension#1|set#property(c0, 42));
self::expect(5, let final self::Class2* #t40 = c0 in #t40.{core::Object::==}(null) ?{core::int*} null : self::_extension#1|get#property(#t40));
self::expect(42, let final self::Class2* #t41 = c0 in let final core::int* #t42 = 42 in let final void #t43 = self::_extension#1|set#property(#t41, #t42) in #t42);
self::expect(48, self::_extension#1|get#property(c0));
self::expect(6, self::_extension#1|get#property(c1));
self::expect(43, self::_extension#1|set#property(c1, 43));
self::expect(43, let final self::Class2* #t44 = c1 in let final core::int* #t45 = 43 in let final void #t46 = self::_extension#1|set#property(#t44, #t45) in #t45);
self::expect(49, self::_extension#1|get#property(c1));
self::expect(49, self::_extension#1|set#property(c0, self::_extension#1|get#property(c1)));
self::expect(55, self::_extension#1|set#property(c1, self::_extension#1|get#property(c0)));
self::expect(61, self::_extension#1|set#property(c1, self::_extension#1|set#property(c0, self::_extension#1|get#property(c1))));
self::expect(67, self::_extension#1|set#property(c0, self::_extension#1|set#property(c1, self::_extension#1|get#property(c0))));
self::expect(49, let final self::Class2* #t47 = c0 in let final core::int* #t48 = self::_extension#1|get#property(c1) in let final void #t49 = self::_extension#1|set#property(#t47, #t48) in #t48);
self::expect(55, let final self::Class2* #t50 = c1 in let final core::int* #t51 = self::_extension#1|get#property(c0) in let final void #t52 = self::_extension#1|set#property(#t50, #t51) in #t51);
self::expect(61, let final self::Class2* #t53 = c1 in let final core::int* #t54 = let final self::Class2* #t55 = c0 in let final core::int* #t56 = self::_extension#1|get#property(c1) in let final void #t57 = self::_extension#1|set#property(#t55, #t56) in #t56 in let final void #t58 = self::_extension#1|set#property(#t53, #t54) in #t54);
self::expect(67, let final self::Class2* #t59 = c0 in let final core::int* #t60 = let final self::Class2* #t61 = c1 in let final core::int* #t62 = self::_extension#1|get#property(c0) in let final void #t63 = self::_extension#1|set#property(#t61, #t62) in #t62 in let final void #t64 = self::_extension#1|set#property(#t59, #t60) in #t60);
}
static method expect(dynamic expected, dynamic actual) → dynamic {
if(!expected.{core::Object::==}(actual)) {

View file

@ -19,7 +19,9 @@ extensions/explicit_extension_inference: TextSerializationFailure
extensions/explicit_generic_extension_access: TextSerializationFailure
extensions/explicit_this: TextSerializationFailure
extensions/extension_methods: TextSerializationFailure
extensions/extension_setter: TextSerializationFailure
extensions/getter_setter_conflict: TextSerializationFailure
extensions/if_null: TextSerializationFailure
extensions/implicit_extension_inference: TextSerializationFailure
extensions/implicit_this: TextSerializationFailure
extensions/index: TextSerializationFailure