mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:17:14 +00:00
[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:
parent
2b3541da57
commit
bf76e4b49c
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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.
|
||||
///
|
||||
|
|
|
@ -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");
|
||||
|
|
|
@ -1729,6 +1729,7 @@ mutable
|
|||
mutate
|
||||
mutated
|
||||
mutates
|
||||
mutating
|
||||
mutation
|
||||
mutations
|
||||
mutual
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
|
|
201
pkg/front_end/testcases/extensions/extension_setter.dart
Normal file
201
pkg/front_end/testcases/extensions/extension_setter.dart
Normal 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';
|
||||
}
|
||||
}
|
|
@ -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
|
||||
;
|
|
@ -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}";
|
||||
}
|
||||
}
|
|
@ -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}";
|
||||
}
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
pkg/front_end/testcases/extensions/extension_setter.dart:19:11: Context: Write to value@335
|
||||
value = value + 1;
|
||||
^
|
|
@ -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});
|
||||
|
|
|
@ -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});
|
||||
|
|
21
pkg/front_end/testcases/extensions/if_null.dart
Normal file
21
pkg/front_end/testcases/extensions/if_null.dart
Normal 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;
|
||||
}
|
|
@ -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
|
||||
;
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
pkg/front_end/testcases/extensions/if_null.dart:18:5: Context: Write to c@327
|
||||
c = new Class();
|
||||
^
|
|
@ -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)) {
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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)) {
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue