mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 02:27:39 +00:00
[cfe] Refactor null-aware if-null and compound assignments
Change-Id: Ie96ac05974cff706af5b49536cd9a006a9786195 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/117540 Reviewed-by: Aske Simon Christensen <askesc@google.com>
This commit is contained in:
parent
9203453183
commit
a2a155afd1
|
@ -198,6 +198,9 @@ abstract class Generator {
|
|||
return buildCompoundAssignment(
|
||||
binaryOperator, _forest.createIntLiteral(1, null)..fileOffset = offset,
|
||||
offset: offset,
|
||||
// TODO(johnniwinther): We are missing some void contexts here. For
|
||||
// instance `++a?.b;` is not providing a void context making it default
|
||||
// `true`.
|
||||
voidContext: voidContext,
|
||||
interfaceTarget: interfaceTarget,
|
||||
isPreIncDec: true);
|
||||
|
@ -1057,6 +1060,43 @@ class NullAwarePropertyAccessGenerator extends Generator {
|
|||
..fileOffset = receiverExpression.fileOffset;
|
||||
}
|
||||
|
||||
Expression buildIfNullAssignment(Expression value, DartType type, int offset,
|
||||
{bool voidContext: false}) {
|
||||
return new NullAwareIfNullSet(receiverExpression, name, value,
|
||||
forEffect: voidContext,
|
||||
readOffset: fileOffset,
|
||||
testOffset: offset,
|
||||
writeOffset: fileOffset)
|
||||
..fileOffset = offset;
|
||||
}
|
||||
|
||||
Expression buildCompoundAssignment(Name binaryOperator, Expression value,
|
||||
{int offset: TreeNode.noOffset,
|
||||
bool voidContext: false,
|
||||
Procedure interfaceTarget,
|
||||
bool isPreIncDec: false,
|
||||
bool isPostIncDec: false}) {
|
||||
return new NullAwareCompoundSet(
|
||||
receiverExpression, name, binaryOperator, value,
|
||||
readOffset: fileOffset,
|
||||
binaryOffset: offset,
|
||||
writeOffset: fileOffset,
|
||||
forEffect: voidContext,
|
||||
forPostIncDec: isPostIncDec);
|
||||
}
|
||||
|
||||
Expression buildPostfixIncrement(Name binaryOperator,
|
||||
{int offset: TreeNode.noOffset,
|
||||
bool voidContext: false,
|
||||
Procedure interfaceTarget}) {
|
||||
return buildCompoundAssignment(
|
||||
binaryOperator, _forest.createIntLiteral(1, null)..fileOffset = offset,
|
||||
offset: offset,
|
||||
voidContext: voidContext,
|
||||
interfaceTarget: interfaceTarget,
|
||||
isPostIncDec: true);
|
||||
}
|
||||
|
||||
@override
|
||||
Expression _makeRead(ComplexAssignmentJudgment complexAssignment) {
|
||||
PropertyGet read = new PropertyGet(receiverAccess(), name, getter)
|
||||
|
@ -2539,6 +2579,22 @@ class ExplicitExtensionAccessGenerator extends Generator {
|
|||
return _makeInvalidRead();
|
||||
}
|
||||
|
||||
Expression buildCompoundAssignment(Name binaryOperator, Expression value,
|
||||
{int offset: TreeNode.noOffset,
|
||||
bool voidContext: false,
|
||||
Procedure interfaceTarget,
|
||||
bool isPreIncDec: false,
|
||||
bool isPostIncDec: false}) {
|
||||
return _makeInvalidRead();
|
||||
}
|
||||
|
||||
Expression buildPostfixIncrement(Name binaryOperator,
|
||||
{int offset: TreeNode.noOffset,
|
||||
bool voidContext: false,
|
||||
Procedure interfaceTarget}) {
|
||||
return _makeInvalidRead();
|
||||
}
|
||||
|
||||
/* Expression | Generator */ buildPropertyAccess(
|
||||
IncompleteSendGenerator send, int operatorOffset, bool isNullAware) {
|
||||
if (_helper.constantContext != ConstantContext.none) {
|
||||
|
|
|
@ -63,6 +63,10 @@ class InferenceVisitor
|
|||
return visitLoadLibraryTearOff(node, typeContext);
|
||||
case InternalExpressionKind.LocalPostIncDec:
|
||||
return visitLocalPostIncDec(node, typeContext);
|
||||
case InternalExpressionKind.NullAwareCompoundSet:
|
||||
return visitNullAwareCompoundSet(node, typeContext);
|
||||
case InternalExpressionKind.NullAwareIfNullSet:
|
||||
return visitNullAwareIfNullSet(node, typeContext);
|
||||
case InternalExpressionKind.NullAwareMethodInvocation:
|
||||
return visitNullAwareMethodInvocation(node, typeContext);
|
||||
case InternalExpressionKind.NullAwarePropertyGet:
|
||||
|
@ -2878,6 +2882,258 @@ class InferenceVisitor
|
|||
node.forPostIncDec ? readType : binaryType, replacement);
|
||||
}
|
||||
|
||||
ExpressionInferenceResult visitNullAwareCompoundSet(
|
||||
NullAwareCompoundSet node, DartType typeContext) {
|
||||
ExpressionInferenceResult receiverResult = inferrer.inferExpression(
|
||||
node.receiver, const UnknownType(), true,
|
||||
isVoidAllowed: true);
|
||||
DartType receiverType = receiverResult.inferredType;
|
||||
VariableDeclaration receiverVariable =
|
||||
createVariable(node.receiver, receiverType);
|
||||
Expression readReceiver = createVariableGet(receiverVariable);
|
||||
Expression writeReceiver = createVariableGet(receiverVariable);
|
||||
|
||||
Member equalsMember = inferrer
|
||||
.findInterfaceMember(receiverType, equalsName, node.receiver.fileOffset)
|
||||
.member;
|
||||
|
||||
ObjectAccessTarget readTarget = inferrer.findInterfaceMember(
|
||||
receiverType, node.propertyName, node.readOffset,
|
||||
includeExtensionMethods: true);
|
||||
|
||||
MethodContravarianceCheckKind readCheckKind =
|
||||
inferrer.preCheckInvocationContravariance(receiverType, readTarget,
|
||||
isThisReceiver: node.receiver is ThisExpression);
|
||||
|
||||
DartType readType = inferrer.getGetterType(readTarget, receiverType);
|
||||
|
||||
Expression read;
|
||||
if (readTarget.isMissing) {
|
||||
read = inferrer.helper.buildProblem(
|
||||
templateUndefinedMethod.withArguments(
|
||||
node.propertyName.name, receiverType),
|
||||
node.readOffset,
|
||||
node.propertyName.name.length,
|
||||
wrapInSyntheticExpression: false);
|
||||
} else if (readTarget.isExtensionMember) {
|
||||
read = new StaticInvocation(
|
||||
readTarget.member,
|
||||
new Arguments(<Expression>[
|
||||
readReceiver,
|
||||
], types: readTarget.inferredExtensionTypeArguments)
|
||||
..fileOffset = node.readOffset)
|
||||
..fileOffset = node.readOffset;
|
||||
} else {
|
||||
read = new PropertyGet(readReceiver, node.propertyName, readTarget.member)
|
||||
..fileOffset = node.readOffset;
|
||||
if (readCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
|
||||
if (inferrer.instrumentation != null) {
|
||||
inferrer.instrumentation.record(inferrer.uri, node.readOffset,
|
||||
'checkReturn', new InstrumentationValueForType(readType));
|
||||
}
|
||||
read = new AsExpression(read, readType)
|
||||
..isTypeError = true
|
||||
..fileOffset = node.readOffset;
|
||||
}
|
||||
}
|
||||
|
||||
VariableDeclaration leftVariable;
|
||||
Expression left;
|
||||
if (node.forEffect) {
|
||||
left = read;
|
||||
} else if (node.forPostIncDec) {
|
||||
leftVariable = createVariable(read, readType);
|
||||
left = createVariableGet(leftVariable);
|
||||
} else {
|
||||
left = read;
|
||||
}
|
||||
|
||||
ObjectAccessTarget binaryTarget = inferrer.findInterfaceMember(
|
||||
readType, node.binaryName, node.binaryOffset,
|
||||
includeExtensionMethods: true);
|
||||
|
||||
MethodContravarianceCheckKind binaryCheckKind =
|
||||
inferrer.preCheckInvocationContravariance(readType, binaryTarget,
|
||||
isThisReceiver: false);
|
||||
|
||||
DartType binaryType = inferrer.getReturnType(binaryTarget, readType);
|
||||
DartType rhsType =
|
||||
inferrer.getPositionalParameterTypeForTarget(binaryTarget, readType, 0);
|
||||
|
||||
ExpressionInferenceResult rhsResult =
|
||||
inferrer.inferExpression(node.rhs, rhsType, true, isVoidAllowed: true);
|
||||
inferrer.ensureAssignable(
|
||||
rhsType, rhsResult.inferredType, node.rhs, node.rhs.fileOffset);
|
||||
|
||||
if (inferrer.isOverloadedArithmeticOperatorAndType(
|
||||
binaryTarget, readType)) {
|
||||
binaryType = inferrer.typeSchemaEnvironment
|
||||
.getTypeOfOverloadedArithmetic(readType, rhsResult.inferredType);
|
||||
}
|
||||
|
||||
Expression binary;
|
||||
if (binaryTarget.isMissing) {
|
||||
binary = inferrer.helper.buildProblem(
|
||||
templateUndefinedMethod.withArguments(node.binaryName.name, readType),
|
||||
node.binaryOffset,
|
||||
node.binaryName.name.length,
|
||||
wrapInSyntheticExpression: false);
|
||||
} else if (binaryTarget.isExtensionMember) {
|
||||
binary = new StaticInvocation(
|
||||
binaryTarget.member,
|
||||
new Arguments(<Expression>[
|
||||
left,
|
||||
node.rhs,
|
||||
], types: binaryTarget.inferredExtensionTypeArguments)
|
||||
..fileOffset = node.binaryOffset)
|
||||
..fileOffset = node.binaryOffset;
|
||||
} else {
|
||||
binary = new MethodInvocation(
|
||||
left,
|
||||
node.binaryName,
|
||||
new Arguments(<Expression>[
|
||||
node.rhs,
|
||||
])
|
||||
..fileOffset = node.binaryOffset,
|
||||
binaryTarget.member)
|
||||
..fileOffset = node.binaryOffset;
|
||||
|
||||
if (binaryCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
|
||||
if (inferrer.instrumentation != null) {
|
||||
inferrer.instrumentation.record(inferrer.uri, node.binaryOffset,
|
||||
'checkReturn', new InstrumentationValueForType(readType));
|
||||
}
|
||||
binary = new AsExpression(binary, binaryType)
|
||||
..isTypeError = true
|
||||
..fileOffset = node.binaryOffset;
|
||||
}
|
||||
}
|
||||
|
||||
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
|
||||
receiverType, node.propertyName, node.writeOffset,
|
||||
setter: true, includeExtensionMethods: true);
|
||||
|
||||
DartType valueType = inferrer.getSetterType(writeTarget, receiverType);
|
||||
Expression binaryReplacement = inferrer.ensureAssignable(
|
||||
valueType, binaryType, binary, node.fileOffset);
|
||||
if (binaryReplacement != null) {
|
||||
binary = binaryReplacement;
|
||||
}
|
||||
|
||||
VariableDeclaration valueVariable;
|
||||
Expression valueExpression;
|
||||
if (node.forEffect || node.forPostIncDec) {
|
||||
valueExpression = binary;
|
||||
} else {
|
||||
valueVariable = createVariable(binary, binaryType);
|
||||
valueExpression = createVariableGet(valueVariable);
|
||||
}
|
||||
|
||||
Expression write;
|
||||
|
||||
if (writeTarget.isMissing) {
|
||||
write = inferrer.helper.buildProblem(
|
||||
templateUndefinedMethod.withArguments(
|
||||
node.propertyName.name, receiverType),
|
||||
node.writeOffset,
|
||||
node.propertyName.name.length,
|
||||
wrapInSyntheticExpression: false);
|
||||
} else if (writeTarget.isExtensionMember) {
|
||||
write = new StaticInvocation(
|
||||
writeTarget.member,
|
||||
new Arguments(<Expression>[writeReceiver, valueExpression],
|
||||
types: writeTarget.inferredExtensionTypeArguments)
|
||||
..fileOffset = node.writeOffset)
|
||||
..fileOffset = node.writeOffset;
|
||||
} else {
|
||||
write = new PropertySet(
|
||||
writeReceiver, node.propertyName, valueExpression, writeTarget.member)
|
||||
..fileOffset = node.writeOffset;
|
||||
}
|
||||
|
||||
DartType resultType = node.forPostIncDec ? readType : binaryType;
|
||||
|
||||
Expression replacement;
|
||||
if (node.forEffect) {
|
||||
assert(leftVariable == null);
|
||||
assert(valueVariable == null);
|
||||
// Encode `receiver?.propertyName binaryName= rhs` as:
|
||||
//
|
||||
// let receiverVariable = receiver in
|
||||
// receiverVariable == null ? null :
|
||||
// receiverVariable.propertyName =
|
||||
// receiverVariable.propertyName + rhs
|
||||
//
|
||||
|
||||
MethodInvocation equalsNull = createEqualsNull(
|
||||
receiverVariable.fileOffset,
|
||||
createVariableGet(receiverVariable),
|
||||
equalsMember);
|
||||
ConditionalExpression condition = new ConditionalExpression(equalsNull,
|
||||
new NullLiteral()..fileOffset = node.readOffset, write, resultType);
|
||||
replacement = createLet(receiverVariable, condition);
|
||||
} else if (node.forPostIncDec) {
|
||||
// Encode `receiver?.propertyName binaryName= rhs` from a postfix
|
||||
// expression like `o?.a++` as:
|
||||
//
|
||||
// let receiverVariable = receiver in
|
||||
// receiverVariable == null ? null :
|
||||
// let leftVariable = receiverVariable.propertyName in
|
||||
// let writeVariable =
|
||||
// receiverVariable.propertyName =
|
||||
// leftVariable binaryName rhs in
|
||||
// leftVariable
|
||||
//
|
||||
assert(leftVariable != null);
|
||||
assert(valueVariable == null);
|
||||
|
||||
VariableDeclaration writeVariable =
|
||||
createVariable(write, const VoidType());
|
||||
MethodInvocation equalsNull = createEqualsNull(
|
||||
receiverVariable.fileOffset,
|
||||
createVariableGet(receiverVariable),
|
||||
equalsMember);
|
||||
ConditionalExpression condition = new ConditionalExpression(
|
||||
equalsNull,
|
||||
new NullLiteral()..fileOffset = node.readOffset,
|
||||
createLet(leftVariable,
|
||||
createLet(writeVariable, createVariableGet(leftVariable))),
|
||||
resultType);
|
||||
replacement = createLet(receiverVariable, condition);
|
||||
} else {
|
||||
// Encode `receiver?.propertyName binaryName= rhs` as:
|
||||
//
|
||||
// let receiverVariable = receiver in
|
||||
// receiverVariable == null ? null :
|
||||
// let leftVariable = receiverVariable.propertyName in
|
||||
// let valueVariable = leftVariable binaryName rhs in
|
||||
// let writeVariable =
|
||||
// receiverVariable.propertyName = valueVariable in
|
||||
// valueVariable
|
||||
//
|
||||
// TODO(johnniwinther): Do we need the `leftVariable` in this case?
|
||||
assert(leftVariable == null);
|
||||
assert(valueVariable != null);
|
||||
|
||||
VariableDeclaration writeVariable =
|
||||
createVariable(write, const VoidType());
|
||||
MethodInvocation equalsNull = createEqualsNull(
|
||||
receiverVariable.fileOffset,
|
||||
createVariableGet(receiverVariable),
|
||||
equalsMember);
|
||||
ConditionalExpression condition = new ConditionalExpression(
|
||||
equalsNull,
|
||||
new NullLiteral()..fileOffset = node.readOffset,
|
||||
createLet(valueVariable,
|
||||
createLet(writeVariable, createVariableGet(valueVariable))),
|
||||
resultType);
|
||||
replacement = createLet(receiverVariable, condition);
|
||||
}
|
||||
|
||||
node.replaceWith(replacement);
|
||||
return new ExpressionInferenceResult(resultType, replacement);
|
||||
}
|
||||
|
||||
ExpressionInferenceResult visitCompoundSuperIndexSet(
|
||||
CompoundSuperIndexSet node, DartType typeContext) {
|
||||
ObjectAccessTarget readTarget = node.getter != null
|
||||
|
@ -3151,6 +3407,164 @@ class InferenceVisitor
|
|||
return new ExpressionInferenceResult(rhsType, replacement);
|
||||
}
|
||||
|
||||
ExpressionInferenceResult visitNullAwareIfNullSet(
|
||||
NullAwareIfNullSet node, DartType typeContext) {
|
||||
ExpressionInferenceResult receiverResult = inferrer.inferExpression(
|
||||
node.receiver, const UnknownType(), true,
|
||||
isVoidAllowed: true);
|
||||
DartType receiverType = receiverResult.inferredType;
|
||||
VariableDeclaration receiverVariable =
|
||||
createVariable(node.receiver, receiverType);
|
||||
Expression readReceiver = createVariableGet(receiverVariable);
|
||||
Expression writeReceiver = createVariableGet(receiverVariable);
|
||||
|
||||
Member receiverEqualsMember = inferrer
|
||||
.findInterfaceMember(receiverType, equalsName, node.receiver.fileOffset)
|
||||
.member;
|
||||
|
||||
ObjectAccessTarget readTarget = inferrer.findInterfaceMember(
|
||||
receiverType, node.name, node.readOffset,
|
||||
includeExtensionMethods: true);
|
||||
|
||||
MethodContravarianceCheckKind readCheckKind =
|
||||
inferrer.preCheckInvocationContravariance(receiverType, readTarget,
|
||||
isThisReceiver: node.receiver is ThisExpression);
|
||||
|
||||
DartType readType = inferrer.getGetterType(readTarget, receiverType);
|
||||
|
||||
Member readEqualsMember = inferrer
|
||||
.findInterfaceMember(readType, equalsName, node.testOffset)
|
||||
.member;
|
||||
|
||||
Expression read;
|
||||
if (readTarget.isMissing) {
|
||||
read = inferrer.helper.buildProblem(
|
||||
templateUndefinedMethod.withArguments(node.name.name, receiverType),
|
||||
node.readOffset,
|
||||
node.name.name.length,
|
||||
wrapInSyntheticExpression: false);
|
||||
} else if (readTarget.isExtensionMember) {
|
||||
read = new StaticInvocation(
|
||||
readTarget.member,
|
||||
new Arguments(<Expression>[
|
||||
readReceiver,
|
||||
], types: readTarget.inferredExtensionTypeArguments)
|
||||
..fileOffset = node.readOffset)
|
||||
..fileOffset = node.readOffset;
|
||||
} else {
|
||||
read = new PropertyGet(readReceiver, node.name, readTarget.member)
|
||||
..fileOffset = node.readOffset;
|
||||
if (readCheckKind == MethodContravarianceCheckKind.checkMethodReturn) {
|
||||
if (inferrer.instrumentation != null) {
|
||||
inferrer.instrumentation.record(inferrer.uri, node.readOffset,
|
||||
'checkReturn', new InstrumentationValueForType(readType));
|
||||
}
|
||||
read = new AsExpression(read, readType)
|
||||
..isTypeError = true
|
||||
..fileOffset = node.readOffset;
|
||||
}
|
||||
}
|
||||
|
||||
VariableDeclaration readVariable;
|
||||
if (!node.forEffect) {
|
||||
readVariable = createVariable(read, readType);
|
||||
read = createVariableGet(readVariable);
|
||||
}
|
||||
|
||||
ObjectAccessTarget writeTarget = inferrer.findInterfaceMember(
|
||||
receiverType, node.name, node.writeOffset,
|
||||
setter: true, includeExtensionMethods: true);
|
||||
|
||||
DartType valueType = inferrer.getSetterType(writeTarget, receiverType);
|
||||
|
||||
ExpressionInferenceResult valueResult = inferrer
|
||||
.inferExpression(node.value, valueType, true, isVoidAllowed: true);
|
||||
inferrer.ensureAssignable(
|
||||
valueType, valueResult.inferredType, node.value, node.value.fileOffset);
|
||||
|
||||
Expression write;
|
||||
|
||||
if (writeTarget.isMissing) {
|
||||
write = inferrer.helper.buildProblem(
|
||||
templateUndefinedMethod.withArguments(node.name.name, receiverType),
|
||||
node.writeOffset,
|
||||
node.name.name.length,
|
||||
wrapInSyntheticExpression: false);
|
||||
} else if (writeTarget.isExtensionMember) {
|
||||
write = new StaticInvocation(
|
||||
writeTarget.member,
|
||||
new Arguments(<Expression>[writeReceiver, node.value],
|
||||
types: writeTarget.inferredExtensionTypeArguments)
|
||||
..fileOffset = node.writeOffset)
|
||||
..fileOffset = node.writeOffset;
|
||||
} else {
|
||||
write = new PropertySet(
|
||||
writeReceiver, node.name, node.value, writeTarget.member)
|
||||
..fileOffset = node.writeOffset;
|
||||
}
|
||||
|
||||
DartType inferredType = inferrer.typeSchemaEnvironment
|
||||
.getStandardUpperBound(readType, valueResult.inferredType);
|
||||
|
||||
Expression replacement;
|
||||
if (node.forEffect) {
|
||||
assert(readVariable == null);
|
||||
// Encode `receiver?.name ??= value` as:
|
||||
//
|
||||
// let receiverVariable = receiver in
|
||||
// receiverVariable == null ? null :
|
||||
// (receiverVariable.name == null ?
|
||||
// receiverVariable.name = value : null)
|
||||
//
|
||||
|
||||
MethodInvocation receiverEqualsNull = createEqualsNull(
|
||||
receiverVariable.fileOffset,
|
||||
createVariableGet(receiverVariable),
|
||||
receiverEqualsMember);
|
||||
MethodInvocation readEqualsNull =
|
||||
createEqualsNull(node.readOffset, read, readEqualsMember);
|
||||
ConditionalExpression innerCondition = new ConditionalExpression(
|
||||
readEqualsNull,
|
||||
write,
|
||||
new NullLiteral()..fileOffset = node.writeOffset,
|
||||
inferredType);
|
||||
ConditionalExpression outerCondition = new ConditionalExpression(
|
||||
receiverEqualsNull,
|
||||
new NullLiteral()..fileOffset = node.readOffset,
|
||||
innerCondition,
|
||||
inferredType);
|
||||
replacement = createLet(receiverVariable, outerCondition);
|
||||
} else {
|
||||
// Encode `receiver?.name ??= value` as:
|
||||
//
|
||||
// let receiverVariable = receiver in
|
||||
// receiverVariable == null ? null :
|
||||
// (let readVariable = receiverVariable.name in
|
||||
// readVariable == null ?
|
||||
// receiverVariable.name = value : readVariable)
|
||||
//
|
||||
assert(readVariable != null);
|
||||
|
||||
MethodInvocation receiverEqualsNull = createEqualsNull(
|
||||
receiverVariable.fileOffset,
|
||||
createVariableGet(receiverVariable),
|
||||
receiverEqualsMember);
|
||||
MethodInvocation readEqualsNull =
|
||||
createEqualsNull(receiverVariable.fileOffset, read, readEqualsMember);
|
||||
ConditionalExpression innerCondition = new ConditionalExpression(
|
||||
readEqualsNull, write, createVariableGet(readVariable), inferredType);
|
||||
ConditionalExpression outerCondition = new ConditionalExpression(
|
||||
receiverEqualsNull,
|
||||
new NullLiteral()..fileOffset = node.readOffset,
|
||||
createLet(readVariable, innerCondition),
|
||||
inferredType);
|
||||
replacement = createLet(receiverVariable, outerCondition);
|
||||
}
|
||||
|
||||
node.replaceWith(replacement);
|
||||
return new ExpressionInferenceResult(inferredType, replacement);
|
||||
}
|
||||
|
||||
ExpressionInferenceResult visitPropertyAssignmentJudgment(
|
||||
PropertyAssignmentJudgment node, DartType typeContext) {
|
||||
DartType receiverType = node._inferReceiver(inferrer);
|
||||
|
|
|
@ -195,6 +195,8 @@ enum InternalExpressionKind {
|
|||
IndexSet,
|
||||
LoadLibraryTearOff,
|
||||
LocalPostIncDec,
|
||||
NullAwareCompoundSet,
|
||||
NullAwareIfNullSet,
|
||||
NullAwareMethodInvocation,
|
||||
NullAwarePropertyGet,
|
||||
NullAwarePropertySet,
|
||||
|
@ -2385,6 +2387,183 @@ class CompoundIndexSet extends InternalExpression {
|
|||
}
|
||||
}
|
||||
|
||||
/// Internal expression representing a null-aware compound assignment.
|
||||
///
|
||||
/// A null-aware compound assignment of the form
|
||||
///
|
||||
/// receiver?.property binaryName= rhs
|
||||
///
|
||||
/// is, if used for value as a normal compound or prefix operation, encoded as
|
||||
/// the expression:
|
||||
///
|
||||
/// let receiverVariable = receiver in
|
||||
/// receiverVariable == null ? null :
|
||||
/// let leftVariable = receiverVariable.propertyName in
|
||||
/// let valueVariable = leftVariable binaryName rhs in
|
||||
/// let writeVariable =
|
||||
/// receiverVariable.propertyName = valueVariable in
|
||||
/// valueVariable
|
||||
///
|
||||
/// and, if used for value as a postfix operation, encoded as
|
||||
///
|
||||
/// let receiverVariable = receiver in
|
||||
/// receiverVariable == null ? null :
|
||||
/// let leftVariable = receiverVariable.propertyName in
|
||||
/// let writeVariable =
|
||||
/// receiverVariable.propertyName =
|
||||
/// leftVariable binaryName rhs in
|
||||
/// leftVariable
|
||||
///
|
||||
/// and, if used for effect, encoded as:
|
||||
///
|
||||
/// let receiverVariable = receiver in
|
||||
/// receiverVariable == null ? null :
|
||||
/// receiverVariable.propertyName = receiverVariable.propertyName + rhs
|
||||
///
|
||||
class NullAwareCompoundSet extends InternalExpression {
|
||||
/// The receiver on which the null aware operation is performed.
|
||||
Expression receiver;
|
||||
|
||||
/// The name of the null-aware property.
|
||||
Name propertyName;
|
||||
|
||||
/// The name of the binary operation.
|
||||
Name binaryName;
|
||||
|
||||
/// The right-hand side of the binary expression.
|
||||
Expression rhs;
|
||||
|
||||
/// The file offset for the read operation.
|
||||
final int readOffset;
|
||||
|
||||
/// The file offset for the write operation.
|
||||
final int writeOffset;
|
||||
|
||||
/// The file offset for the binary operation.
|
||||
final int binaryOffset;
|
||||
|
||||
/// If `true`, the expression is only need for effect and not for its value.
|
||||
final bool forEffect;
|
||||
|
||||
/// If `true`, the expression is a postfix inc/dec expression.
|
||||
final bool forPostIncDec;
|
||||
|
||||
NullAwareCompoundSet(
|
||||
this.receiver, this.propertyName, this.binaryName, this.rhs,
|
||||
{this.readOffset,
|
||||
this.binaryOffset,
|
||||
this.writeOffset,
|
||||
this.forEffect,
|
||||
this.forPostIncDec})
|
||||
: assert(readOffset != null),
|
||||
assert(binaryOffset != null),
|
||||
assert(writeOffset != null),
|
||||
assert(forEffect != null),
|
||||
assert(forPostIncDec != null) {
|
||||
receiver?.parent = this;
|
||||
rhs?.parent = this;
|
||||
fileOffset = binaryOffset;
|
||||
}
|
||||
|
||||
@override
|
||||
InternalExpressionKind get kind =>
|
||||
InternalExpressionKind.NullAwareCompoundSet;
|
||||
|
||||
@override
|
||||
void visitChildren(Visitor<dynamic> v) {
|
||||
receiver?.accept(v);
|
||||
rhs?.accept(v);
|
||||
}
|
||||
|
||||
@override
|
||||
void transformChildren(Transformer v) {
|
||||
if (receiver != null) {
|
||||
receiver = receiver.accept<TreeNode>(v);
|
||||
receiver?.parent = this;
|
||||
}
|
||||
if (rhs != null) {
|
||||
rhs = rhs.accept<TreeNode>(v);
|
||||
rhs?.parent = this;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Internal expression representing an null-aware if-null property set.
|
||||
///
|
||||
/// A null-aware if-null property set of the form
|
||||
///
|
||||
/// receiver?.name ??= value
|
||||
///
|
||||
/// is, if used for value, encoded as the expression:
|
||||
///
|
||||
/// let receiverVariable = receiver in
|
||||
/// receiverVariable == null ? null :
|
||||
/// (let readVariable = receiverVariable.name in
|
||||
/// readVariable == null ?
|
||||
/// receiverVariable.name = value : readVariable)
|
||||
///
|
||||
/// and, if used for effect, encoded as the expression:
|
||||
///
|
||||
/// let receiverVariable = receiver in
|
||||
/// receiverVariable == null ? null :
|
||||
/// (receiverVariable.name == null ?
|
||||
/// receiverVariable.name = value : null)
|
||||
///
|
||||
///
|
||||
class NullAwareIfNullSet extends InternalExpression {
|
||||
/// The synthetic variable whose initializer hold the receiver.
|
||||
Expression receiver;
|
||||
|
||||
/// The expression that reads the property from [variable].
|
||||
Name name;
|
||||
|
||||
/// The expression that writes the value to the property on [variable].
|
||||
Expression value;
|
||||
|
||||
/// The file offset for the read operation.
|
||||
final int readOffset;
|
||||
|
||||
/// The file offset for the write operation.
|
||||
final int writeOffset;
|
||||
|
||||
/// The file offset for the == operation.
|
||||
final int testOffset;
|
||||
|
||||
/// If `true`, the expression is only need for effect and not for its value.
|
||||
final bool forEffect;
|
||||
|
||||
NullAwareIfNullSet(this.receiver, this.name, this.value,
|
||||
{this.readOffset, this.writeOffset, this.testOffset, this.forEffect})
|
||||
: assert(readOffset != null),
|
||||
assert(writeOffset != null),
|
||||
assert(testOffset != null),
|
||||
assert(forEffect != null) {
|
||||
receiver?.parent = this;
|
||||
value?.parent = this;
|
||||
}
|
||||
|
||||
@override
|
||||
InternalExpressionKind get kind => InternalExpressionKind.NullAwareIfNullSet;
|
||||
|
||||
@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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Internal expression representing a compound super index assignment.
|
||||
///
|
||||
/// An if-null index assignment of the form `super[a] += b` is, if used for
|
||||
|
|
|
@ -15,7 +15,7 @@ static method main() → dynamic {
|
|||
self::Foo::staticField = 5;
|
||||
let final self::Foo* #t2 = foo in #t2.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t2.{self::Foo::field} = 5 : null;
|
||||
self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
|
||||
let final self::Foo* #t3 = foo in #t3.==(null) ?{core::int*} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
|
||||
let final self::Foo* #t3 = foo in #t3.{core::Object::==}(null) ?{core::int*} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
|
||||
self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
|
||||
core::int* intValue = let final core::int* #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int*} 6 : #t4;
|
||||
core::num* numValue = let final core::int* #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num*} 4.5 : #t5;
|
||||
|
|
|
@ -15,7 +15,7 @@ static method main() → dynamic {
|
|||
self::Foo::staticField = 5;
|
||||
let final self::Foo* #t2 = foo in #t2.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t2.{self::Foo::field} = 5 : null;
|
||||
self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
|
||||
let final self::Foo* #t3 = foo in #t3.==(null) ?{core::int*} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
|
||||
let final self::Foo* #t3 = foo in #t3.{core::Object::==}(null) ?{core::int*} null : #t3.{self::Foo::field}.{core::num::==}(null) ?{core::int*} #t3.{self::Foo::field} = 5 : null;
|
||||
self::Foo::staticField.{core::num::==}(null) ?{core::int*} self::Foo::staticField = 5 : null;
|
||||
core::int* intValue = let final core::int* #t4 = foo.{self::Foo::field} in #t4.==(null) ?{core::int*} 6 : #t4;
|
||||
core::num* numValue = let final core::int* #t5 = foo.{self::Foo::field} in #t5.==(null) ?{core::num*} 4.5 : #t5;
|
||||
|
|
19
pkg/front_end/testcases/general/null_aware_postfix.dart
Normal file
19
pkg/front_end/testcases/general/null_aware_postfix.dart
Normal file
|
@ -0,0 +1,19 @@
|
|||
// 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 A {
|
||||
B b;
|
||||
}
|
||||
|
||||
class B {
|
||||
C operator +(int i) => null;
|
||||
}
|
||||
|
||||
class C extends B {}
|
||||
|
||||
main() {
|
||||
A a;
|
||||
a?.b++;
|
||||
C c = a?.b++;
|
||||
}
|
|
@ -0,0 +1,21 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object {
|
||||
field self::B* b;
|
||||
synthetic constructor •() → self::A*
|
||||
;
|
||||
}
|
||||
class B extends core::Object {
|
||||
synthetic constructor •() → self::B*
|
||||
;
|
||||
operator +(core::int* i) → self::C*
|
||||
;
|
||||
}
|
||||
class C extends self::B {
|
||||
synthetic constructor •() → self::C*
|
||||
;
|
||||
}
|
||||
static method main() → dynamic
|
||||
;
|
|
@ -0,0 +1,27 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object {
|
||||
field self::B* b = null;
|
||||
synthetic constructor •() → self::A*
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
class B extends core::Object {
|
||||
synthetic constructor •() → self::B*
|
||||
: super core::Object::•()
|
||||
;
|
||||
operator +(core::int* i) → self::C*
|
||||
return null;
|
||||
}
|
||||
class C extends self::B {
|
||||
synthetic constructor •() → self::C*
|
||||
: super self::B::•()
|
||||
;
|
||||
}
|
||||
static method main() → dynamic {
|
||||
self::A* a;
|
||||
let final self::A* #t1 = a in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::A::b} = #t1.{self::A::b}.{self::B::+}(1);
|
||||
self::C* c = (let final self::A* #t2 = a in #t2.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t3 = #t2.{self::A::b} in let final void #t4 = #t2.{self::A::b} = #t3.{self::B::+}(1) in #t3) as{TypeError} self::C*;
|
||||
}
|
|
@ -0,0 +1,27 @@
|
|||
library;
|
||||
import self as self;
|
||||
import "dart:core" as core;
|
||||
|
||||
class A extends core::Object {
|
||||
field self::B* b = null;
|
||||
synthetic constructor •() → self::A*
|
||||
: super core::Object::•()
|
||||
;
|
||||
}
|
||||
class B extends core::Object {
|
||||
synthetic constructor •() → self::B*
|
||||
: super core::Object::•()
|
||||
;
|
||||
operator +(core::int* i) → self::C*
|
||||
return null;
|
||||
}
|
||||
class C extends self::B {
|
||||
synthetic constructor •() → self::C*
|
||||
: super self::B::•()
|
||||
;
|
||||
}
|
||||
static method main() → dynamic {
|
||||
self::A* a;
|
||||
let final self::A* #t1 = a in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::A::b} = #t1.{self::A::b}.{self::B::+}(1);
|
||||
self::C* c = (let final self::A* #t2 = a in #t2.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t3 = #t2.{self::A::b} in let final void #t4 = #t2.{self::A::b} = #t3.{self::B::+}(1) in #t3) as{TypeError} self::C*;
|
||||
}
|
|
@ -24,23 +24,62 @@ class Test {
|
|||
static void test(Test t) {
|
||||
/*@ type=Test* */ /*@target=Object::==*/ t?. /*@target=Test::member*/
|
||||
member = /*@ typeArgs=B* */ f();
|
||||
t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
|
||||
t?. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
|
||||
t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
|
||||
t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
|
||||
--t?. /*@target=Test::member*/ member;
|
||||
t?. /*@target=Test::member*/ member--;
|
||||
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=Object::== */ ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::+ */ += /*@ typeArgs=C* */ f();
|
||||
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::* */ *= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::& */ &= /*@ typeArgs=A* */ f();
|
||||
|
||||
/*@ target=B::- */ -- /*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member;
|
||||
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::- */ --;
|
||||
|
||||
var /*@ type=B* */ v1 =
|
||||
/*@ type=Test* */ /*@target=Object::==*/ t?. /*@target=Test::member*/
|
||||
member = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=Object::== */ ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 =
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::+ */ += /*@ typeArgs=C* */ f();
|
||||
|
||||
var /*@ type=B* */ v4 =
|
||||
t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::* */ *= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=C* */ v5 =
|
||||
t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
|
||||
var /*@ type=B* */ v6 = --t?. /*@target=Test::member*/ member;
|
||||
var /*@ type=B* */ v7 = t?. /*@target=Test::member*/ member--;
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::& */ &= /*@ typeArgs=A* */ f();
|
||||
|
||||
var /*@ type=B* */ v6 =
|
||||
/*@ target=B::- */ -- /*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member;
|
||||
|
||||
var /*@ type=B* */ v7 =
|
||||
/*@ target=Object::== */ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::- */ --;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,18 +32,19 @@ class Test extends core::Object {
|
|||
;
|
||||
static method test(self::Test* t) → void {
|
||||
let final self::Test* #t1 = t in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
|
||||
let final self::Test* #t2 = t in #t2.==(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
|
||||
let final self::Test* #t3 = t in #t3.==(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
|
||||
let final self::Test* #t4 = t in #t4.==(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
|
||||
let final self::Test* #t5 = t in #t5.==(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
|
||||
let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
|
||||
let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v1 = let final self::Test* #t8 = t in #t8.{core::Object::==}(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
|
||||
self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
|
||||
self::B* v4 = let final self::Test* #t11 = t in #t11.==(null) ?{self::B*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
|
||||
self::C* v5 = let final self::Test* #t12 = t in #t12.==(null) ?{self::C*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
|
||||
self::B* v6 = let final self::Test* #t13 = t in #t13.==(null) ?{self::B*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v7 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : let final self::B* #t15 = #t14.{self::Test::member} in let final self::B* #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
|
||||
let final self::Test* #t2 = t in #t2.{core::Object::==}(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
|
||||
let final self::Test* #t3 = t in #t3.{core::Object::==}(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
|
||||
let final self::Test* #t4 = t in #t4.{core::Object::==}(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<self::B*>());
|
||||
let final self::Test* #t5 = t in #t5.{core::Object::==}(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<self::A*>());
|
||||
let final self::Test* #t6 = t in #t6.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}.{self::B::-}(1) in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
|
||||
let final self::Test* #t9 = t in #t9.{core::Object::==}(null) ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v1 = let final self::Test* #t10 = t in #t10.{core::Object::==}(null) ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
|
||||
self::B* v2 = let final self::Test* #t11 = t in #t11.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member} in #t12.{core::Object::==}(null) ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
|
||||
self::A* v3 = let final self::Test* #t13 = t in #t13.{core::Object::==}(null) ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
|
||||
self::B* v4 = let final self::Test* #t16 = t in #t16.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}.{self::B::*}(self::f<self::B*>()) in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
|
||||
self::C* v5 = let final self::Test* #t19 = t in #t19.{core::Object::==}(null) ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}.{self::B::&}(self::f<self::A*>()) in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
|
||||
self::B* v6 = let final self::Test* #t22 = t in #t22.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}.{self::B::-}(1) in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
|
||||
self::B* v7 = let final self::Test* #t25 = t in #t25.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1) in #t26;
|
||||
}
|
||||
}
|
||||
static method f<T extends core::Object* = dynamic>() → self::f::T*
|
||||
|
|
|
@ -32,18 +32,19 @@ class Test extends core::Object {
|
|||
;
|
||||
static method test(self::Test* t) → void {
|
||||
let final self::Test* #t1 = t in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
|
||||
let final self::Test* #t2 = t in #t2.==(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
|
||||
let final self::Test* #t3 = t in #t3.==(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
|
||||
let final self::Test* #t4 = t in #t4.==(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
|
||||
let final self::Test* #t5 = t in #t5.==(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
|
||||
let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
|
||||
let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v1 = let final self::Test* #t8 = t in #t8.{core::Object::==}(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
|
||||
self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
|
||||
self::B* v4 = let final self::Test* #t11 = t in #t11.==(null) ?{self::B*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
|
||||
self::C* v5 = let final self::Test* #t12 = t in #t12.==(null) ?{self::C*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
|
||||
self::B* v6 = let final self::Test* #t13 = t in #t13.==(null) ?{self::B*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v7 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : let final self::B* #t15 = #t14.{self::Test::member} in let final self::B* #t16 = #t14.{self::Test::member} = #t15.{self::B::-}(1) in #t15;
|
||||
let final self::Test* #t2 = t in #t2.{core::Object::==}(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
|
||||
let final self::Test* #t3 = t in #t3.{core::Object::==}(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
|
||||
let final self::Test* #t4 = t in #t4.{core::Object::==}(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<self::B*>());
|
||||
let final self::Test* #t5 = t in #t5.{core::Object::==}(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<self::A*>());
|
||||
let final self::Test* #t6 = t in #t6.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}.{self::B::-}(1) in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
|
||||
let final self::Test* #t9 = t in #t9.{core::Object::==}(null) ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v1 = let final self::Test* #t10 = t in #t10.{core::Object::==}(null) ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
|
||||
self::B* v2 = let final self::Test* #t11 = t in #t11.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member} in #t12.{core::Object::==}(null) ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
|
||||
self::A* v3 = let final self::Test* #t13 = t in #t13.{core::Object::==}(null) ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
|
||||
self::B* v4 = let final self::Test* #t16 = t in #t16.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}.{self::B::*}(self::f<self::B*>()) in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
|
||||
self::C* v5 = let final self::Test* #t19 = t in #t19.{core::Object::==}(null) ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}.{self::B::&}(self::f<self::A*>()) in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
|
||||
self::B* v6 = let final self::Test* #t22 = t in #t22.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}.{self::B::-}(1) in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
|
||||
self::B* v7 = let final self::Test* #t25 = t in #t25.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1) in #t26;
|
||||
}
|
||||
}
|
||||
static method f<T extends core::Object* = dynamic>() → self::f::T*
|
||||
|
|
|
@ -15,10 +15,24 @@ class Test1 {
|
|||
static void test(Test1 t) {
|
||||
var /*@ type=int* */ v1 = /*@ type=Test1* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test1::prop*/ prop = getInt();
|
||||
var /*@ type=int* */ v4 = t?. /*@target=Test1::prop*/ prop ??= getInt();
|
||||
var /*@ type=int* */ v7 = t?. /*@target=Test1::prop*/ prop += getInt();
|
||||
var /*@ type=int* */ v10 = ++t?. /*@target=Test1::prop*/ prop;
|
||||
var /*@ type=int* */ v11 = t?. /*@target=Test1::prop*/ prop++;
|
||||
|
||||
var /*@ type=int* */ v4 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
|
||||
/*@target=num::==*/ ??= getInt();
|
||||
|
||||
var /*@ type=int* */ v7 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
|
||||
/*@target=num::+*/ += getInt();
|
||||
|
||||
var /*@ type=int* */ v10 = /*@target=num::+*/ ++ /*@target=Object::==*/ t
|
||||
?. /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop;
|
||||
|
||||
var /*@ type=int* */ v11 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
|
||||
/*@target=num::+*/ ++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -28,18 +42,49 @@ class Test2 {
|
|||
static void test(Test2 t) {
|
||||
var /*@ type=int* */ v1 = /*@ type=Test2* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ prop = getInt();
|
||||
|
||||
var /*@ type=num* */ v2 = /*@ type=Test2* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ prop = getNum();
|
||||
|
||||
var /*@ type=double* */ v3 = /*@ type=Test2* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ prop = getDouble();
|
||||
var /*@ type=num* */ v4 = t?. /*@target=Test2::prop*/ prop ??= getInt();
|
||||
var /*@ type=num* */ v5 = t?. /*@target=Test2::prop*/ prop ??= getNum();
|
||||
var /*@ type=num* */ v6 = t?. /*@target=Test2::prop*/ prop ??= getDouble();
|
||||
var /*@ type=num* */ v7 = t?. /*@target=Test2::prop*/ prop += getInt();
|
||||
var /*@ type=num* */ v8 = t?. /*@target=Test2::prop*/ prop += getNum();
|
||||
var /*@ type=num* */ v9 = t?. /*@target=Test2::prop*/ prop += getDouble();
|
||||
var /*@ type=num* */ v10 = ++t?. /*@target=Test2::prop*/ prop;
|
||||
var /*@ type=num* */ v11 = t?. /*@target=Test2::prop*/ prop++;
|
||||
|
||||
var /*@ type=num* */ v4 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@target=num::==*/ ??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@target=num::==*/ ??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = /*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@target=num::==*/ ??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@target=num::+*/ += getInt();
|
||||
|
||||
var /*@ type=num* */ v8 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@target=num::+*/ += getNum();
|
||||
|
||||
var /*@ type=num* */ v9 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@target=num::+*/ += getDouble();
|
||||
|
||||
var /*@ type=num* */ v10 = /*@target=num::+*/ ++ /*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop;
|
||||
|
||||
var /*@ type=num* */ v11 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@target=num::+*/ ++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -50,14 +95,35 @@ class Test3 {
|
|||
var /*@ type=double* */ v3 =
|
||||
/*@ type=Test3* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test3::prop*/ prop = getDouble();
|
||||
|
||||
var /*@ type=double* */ v6 =
|
||||
t?. /*@target=Test3::prop*/ prop ??= getDouble();
|
||||
var /*@ type=double* */ v7 = t?. /*@target=Test3::prop*/ prop += getInt();
|
||||
var /*@ type=double* */ v8 = t?. /*@target=Test3::prop*/ prop += getNum();
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@target=num::==*/ ??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@target=double::+*/ += getInt();
|
||||
|
||||
var /*@ type=double* */ v8 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@target=double::+*/ += getNum();
|
||||
|
||||
var /*@ type=double* */ v9 =
|
||||
t?. /*@target=Test3::prop*/ prop += getDouble();
|
||||
var /*@ type=double* */ v10 = ++t?. /*@target=Test3::prop*/ prop;
|
||||
var /*@ type=double* */ v11 = t?. /*@target=Test3::prop*/ prop++;
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@target=double::+*/ += getDouble();
|
||||
|
||||
var /*@ type=double* */ v10 = /*@target=double::+*/ ++
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop;
|
||||
|
||||
var /*@ type=double* */ v11 =
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@target=double::+*/ ++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,10 +9,10 @@ class Test1 extends core::Object {
|
|||
;
|
||||
static method test(self::Test1* t) → void {
|
||||
core::int* v1 = let final self::Test1* #t1 = t in #t1.{core::Object::==}(null) ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
|
||||
core::int* v4 = let final self::Test1* #t2 = t in #t2.==(null) ?{core::int*} null : let final core::int* #t3 = #t2.{self::Test1::prop} in #t3.{core::num::==}(null) ?{core::int*} #t2.{self::Test1::prop} = self::getInt() : #t3;
|
||||
core::int* v7 = let final self::Test1* #t4 = t in #t4.==(null) ?{core::int*} null : #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(self::getInt());
|
||||
core::int* v10 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::int*} null : #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(1);
|
||||
core::int* v11 = let final self::Test1* #t6 = t in #t6.==(null) ?{core::int*} null : let final core::int* #t7 = #t6.{self::Test1::prop} in let final core::int* #t8 = #t6.{self::Test1::prop} = #t7.{core::num::+}(1) in #t7;
|
||||
core::int* v4 = let final self::Test1* #t2 = t in #t2.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t3 = #t2.{self::Test1::prop} in #t3.{core::num::==}(null) ?{core::int*} #t2.{self::Test1::prop} = self::getInt() : #t3;
|
||||
core::int* v7 = let final self::Test1* #t4 = t in #t4.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t5 = #t4.{self::Test1::prop}.{core::num::+}(self::getInt()) in let final void #t6 = #t4.{self::Test1::prop} = #t5 in #t5;
|
||||
core::int* v10 = let final self::Test1* #t7 = t in #t7.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}.{core::num::+}(1) in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
|
||||
core::int* v11 = let final self::Test1* #t10 = t in #t10.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final void #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
|
||||
}
|
||||
}
|
||||
class Test2 extends core::Object {
|
||||
|
@ -21,17 +21,17 @@ class Test2 extends core::Object {
|
|||
: super core::Object::•()
|
||||
;
|
||||
static method test(self::Test2* t) → void {
|
||||
core::int* v1 = let final self::Test2* #t9 = t in #t9.{core::Object::==}(null) ?{core::int*} null : #t9.{self::Test2::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test2* #t10 = t in #t10.{core::Object::==}(null) ?{core::num*} null : #t10.{self::Test2::prop} = self::getNum();
|
||||
core::double* v3 = let final self::Test2* #t11 = t in #t11.{core::Object::==}(null) ?{core::double*} null : #t11.{self::Test2::prop} = self::getDouble();
|
||||
core::num* v4 = let final self::Test2* #t12 = t in #t12.==(null) ?{core::num*} null : let final core::num* #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num*} #t12.{self::Test2::prop} = self::getInt() : #t13;
|
||||
core::num* v5 = let final self::Test2* #t14 = t in #t14.==(null) ?{core::num*} null : let final core::num* #t15 = #t14.{self::Test2::prop} in #t15.{core::num::==}(null) ?{core::num*} #t14.{self::Test2::prop} = self::getNum() : #t15;
|
||||
core::num* v6 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getDouble() : #t17;
|
||||
core::num* v7 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getInt());
|
||||
core::num* v8 = let final self::Test2* #t19 = t in #t19.==(null) ?{core::num*} null : #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getNum());
|
||||
core::num* v9 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(self::getDouble());
|
||||
core::num* v10 = let final self::Test2* #t21 = t in #t21.==(null) ?{core::num*} null : #t21.{self::Test2::prop} = #t21.{self::Test2::prop}.{core::num::+}(1);
|
||||
core::num* v11 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in let final core::num* #t24 = #t22.{self::Test2::prop} = #t23.{core::num::+}(1) in #t23;
|
||||
core::int* v1 = let final self::Test2* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : #t13.{self::Test2::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test2* #t14 = t in #t14.{core::Object::==}(null) ?{core::num*} null : #t14.{self::Test2::prop} = self::getNum();
|
||||
core::double* v3 = let final self::Test2* #t15 = t in #t15.{core::Object::==}(null) ?{core::double*} null : #t15.{self::Test2::prop} = self::getDouble();
|
||||
core::num* v4 = let final self::Test2* #t16 = t in #t16.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getInt() : #t17;
|
||||
core::num* v5 = let final self::Test2* #t18 = t in #t18.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t19 = #t18.{self::Test2::prop} in #t19.{core::num::==}(null) ?{core::num*} #t18.{self::Test2::prop} = self::getNum() : #t19;
|
||||
core::num* v6 = let final self::Test2* #t20 = t in #t20.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t21 = #t20.{self::Test2::prop} in #t21.{core::num::==}(null) ?{core::num*} #t20.{self::Test2::prop} = self::getDouble() : #t21;
|
||||
core::num* v7 = let final self::Test2* #t22 = t in #t22.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop}.{core::num::+}(self::getInt()) in let final void #t24 = #t22.{self::Test2::prop} = #t23 in #t23;
|
||||
core::num* v8 = let final self::Test2* #t25 = t in #t25.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t26 = #t25.{self::Test2::prop}.{core::num::+}(self::getNum()) in let final void #t27 = #t25.{self::Test2::prop} = #t26 in #t26;
|
||||
core::num* v9 = let final self::Test2* #t28 = t in #t28.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}.{core::num::+}(self::getDouble()) in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
|
||||
core::num* v10 = let final self::Test2* #t31 = t in #t31.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}.{core::num::+}(1) in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
|
||||
core::num* v11 = let final self::Test2* #t34 = t in #t34.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop} in let final void #t36 = #t34.{self::Test2::prop} = #t35.{core::num::+}(1) in #t35;
|
||||
}
|
||||
}
|
||||
class Test3 extends core::Object {
|
||||
|
@ -40,13 +40,13 @@ class Test3 extends core::Object {
|
|||
: super core::Object::•()
|
||||
;
|
||||
static method test3(self::Test3* t) → void {
|
||||
core::double* v3 = let final self::Test3* #t25 = t in #t25.{core::Object::==}(null) ?{core::double*} null : #t25.{self::Test3::prop} = self::getDouble();
|
||||
core::double* v6 = let final self::Test3* #t26 = t in #t26.==(null) ?{core::double*} null : let final core::double* #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double*} #t26.{self::Test3::prop} = self::getDouble() : #t27;
|
||||
core::double* v7 = let final self::Test3* #t28 = t in #t28.==(null) ?{core::double*} null : #t28.{self::Test3::prop} = #t28.{self::Test3::prop}.{core::double::+}(self::getInt());
|
||||
core::double* v8 = let final self::Test3* #t29 = t in #t29.==(null) ?{core::double*} null : #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
|
||||
core::double* v9 = let final self::Test3* #t30 = t in #t30.==(null) ?{core::double*} null : #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
|
||||
core::double* v10 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::double*} null : #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
|
||||
core::double* v11 = let final self::Test3* #t32 = t in #t32.==(null) ?{core::double*} null : let final core::double* #t33 = #t32.{self::Test3::prop} in let final core::double* #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
|
||||
core::double* v3 = let final self::Test3* #t37 = t in #t37.{core::Object::==}(null) ?{core::double*} null : #t37.{self::Test3::prop} = self::getDouble();
|
||||
core::double* v6 = let final self::Test3* #t38 = t in #t38.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t39 = #t38.{self::Test3::prop} in #t39.{core::num::==}(null) ?{core::double*} #t38.{self::Test3::prop} = self::getDouble() : #t39;
|
||||
core::double* v7 = let final self::Test3* #t40 = t in #t40.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t41 = #t40.{self::Test3::prop}.{core::double::+}(self::getInt()) in let final void #t42 = #t40.{self::Test3::prop} = #t41 in #t41;
|
||||
core::double* v8 = let final self::Test3* #t43 = t in #t43.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t44 = #t43.{self::Test3::prop}.{core::double::+}(self::getNum()) in let final void #t45 = #t43.{self::Test3::prop} = #t44 in #t44;
|
||||
core::double* v9 = let final self::Test3* #t46 = t in #t46.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t47 = #t46.{self::Test3::prop}.{core::double::+}(self::getDouble()) in let final void #t48 = #t46.{self::Test3::prop} = #t47 in #t47;
|
||||
core::double* v10 = let final self::Test3* #t49 = t in #t49.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}.{core::double::+}(1) in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
|
||||
core::double* v11 = let final self::Test3* #t52 = t in #t52.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop} in let final void #t54 = #t52.{self::Test3::prop} = #t53.{core::double::+}(1) in #t53;
|
||||
}
|
||||
}
|
||||
static method getInt() → core::int*
|
||||
|
|
|
@ -9,10 +9,10 @@ class Test1 extends core::Object {
|
|||
;
|
||||
static method test(self::Test1* t) → void {
|
||||
core::int* v1 = let final self::Test1* #t1 = t in #t1.{core::Object::==}(null) ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
|
||||
core::int* v4 = let final self::Test1* #t2 = t in #t2.==(null) ?{core::int*} null : let final core::int* #t3 = #t2.{self::Test1::prop} in #t3.{core::num::==}(null) ?{core::int*} #t2.{self::Test1::prop} = self::getInt() : #t3;
|
||||
core::int* v7 = let final self::Test1* #t4 = t in #t4.==(null) ?{core::int*} null : #t4.{self::Test1::prop} = #t4.{self::Test1::prop}.{core::num::+}(self::getInt());
|
||||
core::int* v10 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::int*} null : #t5.{self::Test1::prop} = #t5.{self::Test1::prop}.{core::num::+}(1);
|
||||
core::int* v11 = let final self::Test1* #t6 = t in #t6.==(null) ?{core::int*} null : let final core::int* #t7 = #t6.{self::Test1::prop} in let final core::int* #t8 = #t6.{self::Test1::prop} = #t7.{core::num::+}(1) in #t7;
|
||||
core::int* v4 = let final self::Test1* #t2 = t in #t2.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t3 = #t2.{self::Test1::prop} in #t3.{core::num::==}(null) ?{core::int*} #t2.{self::Test1::prop} = self::getInt() : #t3;
|
||||
core::int* v7 = let final self::Test1* #t4 = t in #t4.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t5 = #t4.{self::Test1::prop}.{core::num::+}(self::getInt()) in let final void #t6 = #t4.{self::Test1::prop} = #t5 in #t5;
|
||||
core::int* v10 = let final self::Test1* #t7 = t in #t7.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}.{core::num::+}(1) in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
|
||||
core::int* v11 = let final self::Test1* #t10 = t in #t10.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final void #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
|
||||
}
|
||||
}
|
||||
class Test2 extends core::Object {
|
||||
|
@ -21,17 +21,17 @@ class Test2 extends core::Object {
|
|||
: super core::Object::•()
|
||||
;
|
||||
static method test(self::Test2* t) → void {
|
||||
core::int* v1 = let final self::Test2* #t9 = t in #t9.{core::Object::==}(null) ?{core::int*} null : #t9.{self::Test2::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test2* #t10 = t in #t10.{core::Object::==}(null) ?{core::num*} null : #t10.{self::Test2::prop} = self::getNum();
|
||||
core::double* v3 = let final self::Test2* #t11 = t in #t11.{core::Object::==}(null) ?{core::double*} null : #t11.{self::Test2::prop} = self::getDouble();
|
||||
core::num* v4 = let final self::Test2* #t12 = t in #t12.==(null) ?{core::num*} null : let final core::num* #t13 = #t12.{self::Test2::prop} in #t13.{core::num::==}(null) ?{core::num*} #t12.{self::Test2::prop} = self::getInt() : #t13;
|
||||
core::num* v5 = let final self::Test2* #t14 = t in #t14.==(null) ?{core::num*} null : let final core::num* #t15 = #t14.{self::Test2::prop} in #t15.{core::num::==}(null) ?{core::num*} #t14.{self::Test2::prop} = self::getNum() : #t15;
|
||||
core::num* v6 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getDouble() : #t17;
|
||||
core::num* v7 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : #t18.{self::Test2::prop} = #t18.{self::Test2::prop}.{core::num::+}(self::getInt());
|
||||
core::num* v8 = let final self::Test2* #t19 = t in #t19.==(null) ?{core::num*} null : #t19.{self::Test2::prop} = #t19.{self::Test2::prop}.{core::num::+}(self::getNum());
|
||||
core::num* v9 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : #t20.{self::Test2::prop} = #t20.{self::Test2::prop}.{core::num::+}(self::getDouble());
|
||||
core::num* v10 = let final self::Test2* #t21 = t in #t21.==(null) ?{core::num*} null : #t21.{self::Test2::prop} = #t21.{self::Test2::prop}.{core::num::+}(1);
|
||||
core::num* v11 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in let final core::num* #t24 = #t22.{self::Test2::prop} = #t23.{core::num::+}(1) in #t23;
|
||||
core::int* v1 = let final self::Test2* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : #t13.{self::Test2::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test2* #t14 = t in #t14.{core::Object::==}(null) ?{core::num*} null : #t14.{self::Test2::prop} = self::getNum();
|
||||
core::double* v3 = let final self::Test2* #t15 = t in #t15.{core::Object::==}(null) ?{core::double*} null : #t15.{self::Test2::prop} = self::getDouble();
|
||||
core::num* v4 = let final self::Test2* #t16 = t in #t16.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getInt() : #t17;
|
||||
core::num* v5 = let final self::Test2* #t18 = t in #t18.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t19 = #t18.{self::Test2::prop} in #t19.{core::num::==}(null) ?{core::num*} #t18.{self::Test2::prop} = self::getNum() : #t19;
|
||||
core::num* v6 = let final self::Test2* #t20 = t in #t20.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t21 = #t20.{self::Test2::prop} in #t21.{core::num::==}(null) ?{core::num*} #t20.{self::Test2::prop} = self::getDouble() : #t21;
|
||||
core::num* v7 = let final self::Test2* #t22 = t in #t22.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop}.{core::num::+}(self::getInt()) in let final void #t24 = #t22.{self::Test2::prop} = #t23 in #t23;
|
||||
core::num* v8 = let final self::Test2* #t25 = t in #t25.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t26 = #t25.{self::Test2::prop}.{core::num::+}(self::getNum()) in let final void #t27 = #t25.{self::Test2::prop} = #t26 in #t26;
|
||||
core::num* v9 = let final self::Test2* #t28 = t in #t28.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}.{core::num::+}(self::getDouble()) in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
|
||||
core::num* v10 = let final self::Test2* #t31 = t in #t31.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}.{core::num::+}(1) in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
|
||||
core::num* v11 = let final self::Test2* #t34 = t in #t34.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop} in let final void #t36 = #t34.{self::Test2::prop} = #t35.{core::num::+}(1) in #t35;
|
||||
}
|
||||
}
|
||||
class Test3 extends core::Object {
|
||||
|
@ -40,13 +40,13 @@ class Test3 extends core::Object {
|
|||
: super core::Object::•()
|
||||
;
|
||||
static method test3(self::Test3* t) → void {
|
||||
core::double* v3 = let final self::Test3* #t25 = t in #t25.{core::Object::==}(null) ?{core::double*} null : #t25.{self::Test3::prop} = self::getDouble();
|
||||
core::double* v6 = let final self::Test3* #t26 = t in #t26.==(null) ?{core::double*} null : let final core::double* #t27 = #t26.{self::Test3::prop} in #t27.{core::num::==}(null) ?{core::double*} #t26.{self::Test3::prop} = self::getDouble() : #t27;
|
||||
core::double* v7 = let final self::Test3* #t28 = t in #t28.==(null) ?{core::double*} null : #t28.{self::Test3::prop} = #t28.{self::Test3::prop}.{core::double::+}(self::getInt());
|
||||
core::double* v8 = let final self::Test3* #t29 = t in #t29.==(null) ?{core::double*} null : #t29.{self::Test3::prop} = #t29.{self::Test3::prop}.{core::double::+}(self::getNum());
|
||||
core::double* v9 = let final self::Test3* #t30 = t in #t30.==(null) ?{core::double*} null : #t30.{self::Test3::prop} = #t30.{self::Test3::prop}.{core::double::+}(self::getDouble());
|
||||
core::double* v10 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::double*} null : #t31.{self::Test3::prop} = #t31.{self::Test3::prop}.{core::double::+}(1);
|
||||
core::double* v11 = let final self::Test3* #t32 = t in #t32.==(null) ?{core::double*} null : let final core::double* #t33 = #t32.{self::Test3::prop} in let final core::double* #t34 = #t32.{self::Test3::prop} = #t33.{core::double::+}(1) in #t33;
|
||||
core::double* v3 = let final self::Test3* #t37 = t in #t37.{core::Object::==}(null) ?{core::double*} null : #t37.{self::Test3::prop} = self::getDouble();
|
||||
core::double* v6 = let final self::Test3* #t38 = t in #t38.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t39 = #t38.{self::Test3::prop} in #t39.{core::num::==}(null) ?{core::double*} #t38.{self::Test3::prop} = self::getDouble() : #t39;
|
||||
core::double* v7 = let final self::Test3* #t40 = t in #t40.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t41 = #t40.{self::Test3::prop}.{core::double::+}(self::getInt()) in let final void #t42 = #t40.{self::Test3::prop} = #t41 in #t41;
|
||||
core::double* v8 = let final self::Test3* #t43 = t in #t43.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t44 = #t43.{self::Test3::prop}.{core::double::+}(self::getNum()) in let final void #t45 = #t43.{self::Test3::prop} = #t44 in #t44;
|
||||
core::double* v9 = let final self::Test3* #t46 = t in #t46.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t47 = #t46.{self::Test3::prop}.{core::double::+}(self::getDouble()) in let final void #t48 = #t46.{self::Test3::prop} = #t47 in #t47;
|
||||
core::double* v10 = let final self::Test3* #t49 = t in #t49.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}.{core::double::+}(1) in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
|
||||
core::double* v11 = let final self::Test3* #t52 = t in #t52.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop} in let final void #t54 = #t52.{self::Test3::prop} = #t53.{core::double::+}(1) in #t53;
|
||||
}
|
||||
}
|
||||
static method getInt() → core::int*
|
||||
|
|
|
@ -24,25 +24,60 @@ class Test {
|
|||
static void test(Test t) {
|
||||
/*@ type=Test* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
|
||||
t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
|
||||
t?. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
|
||||
t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
|
||||
t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
|
||||
--t?. /*@target=Test::member*/ member;
|
||||
t?. /*@target=Test::member*/ member--;
|
||||
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@target=Object::==*/ ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::+ */ += /*@ typeArgs=C* */ f();
|
||||
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::* */ *= /*@ typeArgs=B* */ f();
|
||||
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::& */ &= /*@ typeArgs=A* */ f();
|
||||
|
||||
/*@ target=B::- */ -- /*@target=Object::==*/ t?.
|
||||
/*@target=Test::member*/ /*@target=Test::member*/ member;
|
||||
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::- */ --;
|
||||
|
||||
var /*@ type=B* */ v1 =
|
||||
/*@ type=Test* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test::member*/ member = /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=B* */ v2 =
|
||||
t?. /*@target=Test::member*/ member ??= /*@ typeArgs=B* */ f();
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@target=Object::==*/ ??= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=A* */ v3 =
|
||||
t?. /*@target=Test::member*/ member += /*@ typeArgs=dynamic */ f();
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::+ */ += /*@ typeArgs=C* */ f();
|
||||
|
||||
var /*@ type=B* */ v4 =
|
||||
t?. /*@target=Test::member*/ member *= /*@ typeArgs=dynamic */ f();
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::* */ *= /*@ typeArgs=B* */ f();
|
||||
|
||||
var /*@ type=C* */ v5 =
|
||||
t?. /*@target=Test::member*/ member &= /*@ typeArgs=dynamic */ f();
|
||||
var /*@ type=B* */ v6 = --t?. /*@target=Test::member*/ member;
|
||||
var /*@ type=B* */ v7 = t?. /*@target=Test::member*/ member--;
|
||||
/*@target=Object::==*/ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::& */ &= /*@ typeArgs=A* */ f();
|
||||
|
||||
var /*@ type=B* */ v6 = /*@ target=B::- */ -- /*@target=Object::==*/ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member;
|
||||
|
||||
var /*@ type=B* */ v7 = /*@target=Object::==*/ t
|
||||
?. /*@target=Test::member*/ /*@target=Test::member*/ member
|
||||
/*@ target=B::- */ --;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -32,19 +32,19 @@ class Test extends core::Object {
|
|||
;
|
||||
static method test(self::Test* t) → void {
|
||||
let final self::Test* #t1 = t in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
|
||||
let final self::Test* #t2 = t in #t2.==(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
|
||||
let final self::Test* #t3 = t in #t3.==(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
|
||||
let final self::Test* #t4 = t in #t4.==(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
|
||||
let final self::Test* #t5 = t in #t5.==(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
|
||||
let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
|
||||
let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v1 = let final self::Test* #t8 = t in #t8.{core::Object::==}(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
|
||||
self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
|
||||
self::A* v3 = let final self::Test* #t11 = t in #t11.==(null) ?{self::A*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
|
||||
self::B* v4 = let final self::Test* #t12 = t in #t12.==(null) ?{self::B*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
|
||||
self::C* v5 = let final self::Test* #t13 = t in #t13.==(null) ?{self::C*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
|
||||
self::B* v6 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : #t14.{self::Test::member} = #t14.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v7 = let final self::Test* #t15 = t in #t15.==(null) ?{self::B*} null : let final self::B* #t16 = #t15.{self::Test::member} in let final self::B* #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
|
||||
let final self::Test* #t2 = t in #t2.{core::Object::==}(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
|
||||
let final self::Test* #t3 = t in #t3.{core::Object::==}(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
|
||||
let final self::Test* #t4 = t in #t4.{core::Object::==}(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<self::B*>());
|
||||
let final self::Test* #t5 = t in #t5.{core::Object::==}(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<self::A*>());
|
||||
let final self::Test* #t6 = t in #t6.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}.{self::B::-}(1) in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
|
||||
let final self::Test* #t9 = t in #t9.{core::Object::==}(null) ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v1 = let final self::Test* #t10 = t in #t10.{core::Object::==}(null) ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
|
||||
self::B* v2 = let final self::Test* #t11 = t in #t11.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member} in #t12.{core::Object::==}(null) ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
|
||||
self::A* v3 = let final self::Test* #t13 = t in #t13.{core::Object::==}(null) ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
|
||||
self::B* v4 = let final self::Test* #t16 = t in #t16.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}.{self::B::*}(self::f<self::B*>()) in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
|
||||
self::C* v5 = let final self::Test* #t19 = t in #t19.{core::Object::==}(null) ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}.{self::B::&}(self::f<self::A*>()) in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
|
||||
self::B* v6 = let final self::Test* #t22 = t in #t22.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}.{self::B::-}(1) in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
|
||||
self::B* v7 = let final self::Test* #t25 = t in #t25.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1) in #t26;
|
||||
}
|
||||
}
|
||||
static method f<T extends core::Object* = dynamic>() → self::f::T*
|
||||
|
|
|
@ -32,19 +32,19 @@ class Test extends core::Object {
|
|||
;
|
||||
static method test(self::Test* t) → void {
|
||||
let final self::Test* #t1 = t in #t1.{core::Object::==}(null) ?{self::B*} null : #t1.{self::Test::member} = self::f<self::B*>();
|
||||
let final self::Test* #t2 = t in #t2.==(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
|
||||
let final self::Test* #t3 = t in #t3.==(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
|
||||
let final self::Test* #t4 = t in #t4.==(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
|
||||
let final self::Test* #t5 = t in #t5.==(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
|
||||
let final self::Test* #t6 = t in #t6.==(null) ?{self::B*} null : #t6.{self::Test::member} = #t6.{self::Test::member}.{self::B::-}(1);
|
||||
let final self::Test* #t7 = t in #t7.==(null) ?{self::B*} null : #t7.{self::Test::member} = #t7.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v1 = let final self::Test* #t8 = t in #t8.{core::Object::==}(null) ?{self::B*} null : #t8.{self::Test::member} = self::f<self::B*>();
|
||||
self::B* v2 = let final self::Test* #t9 = t in #t9.==(null) ?{self::B*} null : let final self::B* #t10 = #t9.{self::Test::member} in #t10.{core::Object::==}(null) ?{self::B*} #t9.{self::Test::member} = self::f<self::B*>() : #t10;
|
||||
self::A* v3 = let final self::Test* #t11 = t in #t11.==(null) ?{self::A*} null : #t11.{self::Test::member} = #t11.{self::Test::member}.{self::B::+}(self::f<dynamic>() as{TypeError} self::C*) as{TypeError} self::B*;
|
||||
self::B* v4 = let final self::Test* #t12 = t in #t12.==(null) ?{self::B*} null : #t12.{self::Test::member} = #t12.{self::Test::member}.{self::B::*}(self::f<dynamic>() as{TypeError} self::B*);
|
||||
self::C* v5 = let final self::Test* #t13 = t in #t13.==(null) ?{self::C*} null : #t13.{self::Test::member} = #t13.{self::Test::member}.{self::B::&}(self::f<dynamic>() as{TypeError} self::A*);
|
||||
self::B* v6 = let final self::Test* #t14 = t in #t14.==(null) ?{self::B*} null : #t14.{self::Test::member} = #t14.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v7 = let final self::Test* #t15 = t in #t15.==(null) ?{self::B*} null : let final self::B* #t16 = #t15.{self::Test::member} in let final self::B* #t17 = #t15.{self::Test::member} = #t16.{self::B::-}(1) in #t16;
|
||||
let final self::Test* #t2 = t in #t2.{core::Object::==}(null) ?{self::B*} null : #t2.{self::Test::member}.{core::Object::==}(null) ?{self::B*} #t2.{self::Test::member} = self::f<self::B*>() : null;
|
||||
let final self::Test* #t3 = t in #t3.{core::Object::==}(null) ?{self::A*} null : #t3.{self::Test::member} = #t3.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B*;
|
||||
let final self::Test* #t4 = t in #t4.{core::Object::==}(null) ?{self::B*} null : #t4.{self::Test::member} = #t4.{self::Test::member}.{self::B::*}(self::f<self::B*>());
|
||||
let final self::Test* #t5 = t in #t5.{core::Object::==}(null) ?{self::C*} null : #t5.{self::Test::member} = #t5.{self::Test::member}.{self::B::&}(self::f<self::A*>());
|
||||
let final self::Test* #t6 = t in #t6.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t7 = #t6.{self::Test::member}.{self::B::-}(1) in let final void #t8 = #t6.{self::Test::member} = #t7 in #t7;
|
||||
let final self::Test* #t9 = t in #t9.{core::Object::==}(null) ?{self::B*} null : #t9.{self::Test::member} = #t9.{self::Test::member}.{self::B::-}(1);
|
||||
self::B* v1 = let final self::Test* #t10 = t in #t10.{core::Object::==}(null) ?{self::B*} null : #t10.{self::Test::member} = self::f<self::B*>();
|
||||
self::B* v2 = let final self::Test* #t11 = t in #t11.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t12 = #t11.{self::Test::member} in #t12.{core::Object::==}(null) ?{self::B*} #t11.{self::Test::member} = self::f<self::B*>() : #t12;
|
||||
self::A* v3 = let final self::Test* #t13 = t in #t13.{core::Object::==}(null) ?{self::A*} null : let final self::A* #t14 = #t13.{self::Test::member}.{self::B::+}(self::f<self::C*>()) as{TypeError} self::B* in let final void #t15 = #t13.{self::Test::member} = #t14 in #t14;
|
||||
self::B* v4 = let final self::Test* #t16 = t in #t16.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t17 = #t16.{self::Test::member}.{self::B::*}(self::f<self::B*>()) in let final void #t18 = #t16.{self::Test::member} = #t17 in #t17;
|
||||
self::C* v5 = let final self::Test* #t19 = t in #t19.{core::Object::==}(null) ?{self::C*} null : let final self::C* #t20 = #t19.{self::Test::member}.{self::B::&}(self::f<self::A*>()) in let final void #t21 = #t19.{self::Test::member} = #t20 in #t20;
|
||||
self::B* v6 = let final self::Test* #t22 = t in #t22.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t23 = #t22.{self::Test::member}.{self::B::-}(1) in let final void #t24 = #t22.{self::Test::member} = #t23 in #t23;
|
||||
self::B* v7 = let final self::Test* #t25 = t in #t25.{core::Object::==}(null) ?{self::B*} null : let final self::B* #t26 = #t25.{self::Test::member} in let final void #t27 = #t25.{self::Test::member} = #t26.{self::B::-}(1) in #t26;
|
||||
}
|
||||
}
|
||||
static method f<T extends core::Object* = dynamic>() → self::f::T*
|
||||
|
|
|
@ -15,14 +15,33 @@ class Test1 {
|
|||
static void test(Test1 t) {
|
||||
var /*@ type=int* */ v1 = /*@ type=Test1* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test1::prop*/ prop = getInt();
|
||||
|
||||
var /*@ type=num* */ v2 = /*@ type=Test1* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test1::prop*/ prop = getNum();
|
||||
var /*@ type=int* */ v4 = t?. /*@target=Test1::prop*/ prop ??= getInt();
|
||||
var /*@ type=num* */ v5 = t?. /*@target=Test1::prop*/ prop ??= getNum();
|
||||
var /*@ type=int* */ v7 = t?. /*@target=Test1::prop*/ prop += getInt();
|
||||
var /*@ type=num* */ v8 = t?. /*@target=Test1::prop*/ prop += getNum();
|
||||
var /*@ type=int* */ v10 = ++t?. /*@target=Test1::prop*/ prop;
|
||||
var /*@ type=int* */ v11 = t?. /*@target=Test1::prop*/ prop++;
|
||||
|
||||
var /*@ type=int* */ v4 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
|
||||
/*@ target=num::== */ ??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
|
||||
/*@ target=num::== */ ??= getNum();
|
||||
|
||||
var /*@ type=int* */ v7 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
|
||||
/*@ target=num::+ */ += getInt();
|
||||
|
||||
var /*@ type=num* */ v8 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
|
||||
/*@ target=num::+ */ += getNum();
|
||||
|
||||
var /*@ type=int* */ v10 = /*@ target=num::+ */ ++
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop;
|
||||
|
||||
var /*@ type=int* */ v11 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test1::prop*/ /*@target=Test1::prop*/ prop
|
||||
/*@ target=num::+ */ ++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -32,18 +51,43 @@ class Test2 {
|
|||
static void test(Test2 t) {
|
||||
var /*@ type=int* */ v1 = /*@ type=Test2* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ prop = getInt();
|
||||
|
||||
var /*@ type=num* */ v2 = /*@ type=Test2* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ prop = getNum();
|
||||
|
||||
var /*@ type=double* */ v3 = /*@ type=Test2* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test2::prop*/ prop = getDouble();
|
||||
var /*@ type=num* */ v4 = t?. /*@target=Test2::prop*/ prop ??= getInt();
|
||||
var /*@ type=num* */ v5 = t?. /*@target=Test2::prop*/ prop ??= getNum();
|
||||
var /*@ type=num* */ v6 = t?. /*@target=Test2::prop*/ prop ??= getDouble();
|
||||
var /*@ type=num* */ v7 = t?. /*@target=Test2::prop*/ prop += getInt();
|
||||
var /*@ type=num* */ v8 = t?. /*@target=Test2::prop*/ prop += getNum();
|
||||
var /*@ type=num* */ v9 = t?. /*@target=Test2::prop*/ prop += getDouble();
|
||||
var /*@ type=num* */ v10 = ++t?. /*@target=Test2::prop*/ prop;
|
||||
var /*@ type=num* */ v11 = t?. /*@target=Test2::prop*/ prop++;
|
||||
|
||||
var /*@ type=num* */ v4 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@ target=num::== */ ??= getInt();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@ target=num::== */ ??= getNum();
|
||||
|
||||
var /*@ type=num* */ v6 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@ target=num::== */ ??= getDouble();
|
||||
|
||||
var /*@ type=num* */ v7 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@ target=num::+ */ += getInt();
|
||||
|
||||
var /*@ type=num* */ v8 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@ target=num::+ */ += getNum();
|
||||
|
||||
var /*@ type=num* */ v9 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test2::prop*/ /*@target=Test2::prop*/
|
||||
prop /*@ target=num::+ */ += getDouble();
|
||||
|
||||
var /*@ type=num* */ v10 = /*@ target=num::+ */ ++ /*@target=Object::==*/
|
||||
t?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop;
|
||||
|
||||
var /*@ type=num* */ v11 = /*@target=Object::==*/
|
||||
t?. /*@target=Test2::prop*/ /*@target=Test2::prop*/ prop
|
||||
/*@ target=num::+ */ ++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -53,17 +97,39 @@ class Test3 {
|
|||
static void test3(Test3 t) {
|
||||
var /*@ type=num* */ v2 = /*@ type=Test3* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test3::prop*/ prop = getNum();
|
||||
|
||||
var /*@ type=double* */ v3 = /*@ type=Test3* */ /*@target=Object::==*/ t
|
||||
?. /*@target=Test3::prop*/ prop = getDouble();
|
||||
var /*@ type=num* */ v5 = t?. /*@target=Test3::prop*/ prop ??= getNum();
|
||||
|
||||
var /*@ type=num* */ v5 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@ target=num::== */ ??= getNum();
|
||||
|
||||
var /*@ type=double* */ v6 =
|
||||
t?. /*@target=Test3::prop*/ prop ??= getDouble();
|
||||
var /*@ type=double* */ v7 = t?. /*@target=Test3::prop*/ prop += getInt();
|
||||
var /*@ type=double* */ v8 = t?. /*@target=Test3::prop*/ prop += getNum();
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@ target=num::== */ ??= getDouble();
|
||||
|
||||
var /*@ type=double* */ v7 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@ target=double::+ */ += getInt();
|
||||
|
||||
var /*@ type=double* */ v8 = /*@target=Object::==*/ t?.
|
||||
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@ target=double::+ */ += getNum();
|
||||
|
||||
var /*@ type=double* */ v9 =
|
||||
t?. /*@target=Test3::prop*/ prop += getDouble();
|
||||
var /*@ type=double* */ v10 = ++t?. /*@target=Test3::prop*/ prop;
|
||||
var /*@ type=double* */ v11 = t?. /*@target=Test3::prop*/ prop++;
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@ target=double::+ */ += getDouble();
|
||||
|
||||
var /*@ type=double* */ v10 = /*@ target=double::+ */ ++
|
||||
/*@target=Object::==*/ t?.
|
||||
/*@target=Test3::prop*/ /*@target=Test3::prop*/ prop;
|
||||
|
||||
var /*@ type=double* */ v11 = /*@target=Object::==*/
|
||||
t?. /*@target=Test3::prop*/ /*@target=Test3::prop*/ prop
|
||||
/*@ target=double::+ */ ++;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -10,12 +10,12 @@ class Test1 extends core::Object {
|
|||
static method test(self::Test1* t) → void {
|
||||
core::int* v1 = let final self::Test1* #t1 = t in #t1.{core::Object::==}(null) ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test1* #t2 = t in #t2.{core::Object::==}(null) ?{core::num*} null : #t2.{self::Test1::prop} = self::getNum() as{TypeError} core::int*;
|
||||
core::int* v4 = let final self::Test1* #t3 = t in #t3.==(null) ?{core::int*} null : let final core::int* #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::int*} #t3.{self::Test1::prop} = self::getInt() : #t4;
|
||||
core::num* v5 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::num*} null : let final core::int* #t6 = #t5.{self::Test1::prop} in #t6.{core::num::==}(null) ?{core::num*} #t5.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t6;
|
||||
core::int* v7 = let final self::Test1* #t7 = t in #t7.==(null) ?{core::int*} null : #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(self::getInt());
|
||||
core::num* v8 = let final self::Test1* #t8 = t in #t8.==(null) ?{core::num*} null : #t8.{self::Test1::prop} = #t8.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
|
||||
core::int* v10 = let final self::Test1* #t9 = t in #t9.==(null) ?{core::int*} null : #t9.{self::Test1::prop} = #t9.{self::Test1::prop}.{core::num::+}(1);
|
||||
core::int* v11 = let final self::Test1* #t10 = t in #t10.==(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final core::int* #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
|
||||
core::int* v4 = let final self::Test1* #t3 = t in #t3.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::int*} #t3.{self::Test1::prop} = self::getInt() : #t4;
|
||||
core::num* v5 = let final self::Test1* #t5 = t in #t5.{core::Object::==}(null) ?{core::num*} null : let final core::int* #t6 = #t5.{self::Test1::prop} in #t6.{core::num::==}(null) ?{core::num*} #t5.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t6;
|
||||
core::int* v7 = let final self::Test1* #t7 = t in #t7.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}.{core::num::+}(self::getInt()) in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
|
||||
core::num* v8 = let final self::Test1* #t10 = t in #t10.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t11 = #t10.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t12 = #t10.{self::Test1::prop} = #t11 in #t11;
|
||||
core::int* v10 = let final self::Test1* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t14 = #t13.{self::Test1::prop}.{core::num::+}(1) in let final void #t15 = #t13.{self::Test1::prop} = #t14 in #t14;
|
||||
core::int* v11 = let final self::Test1* #t16 = t in #t16.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t17 = #t16.{self::Test1::prop} in let final void #t18 = #t16.{self::Test1::prop} = #t17.{core::num::+}(1) in #t17;
|
||||
}
|
||||
}
|
||||
class Test2 extends core::Object {
|
||||
|
@ -24,17 +24,17 @@ class Test2 extends core::Object {
|
|||
: super core::Object::•()
|
||||
;
|
||||
static method test(self::Test2* t) → void {
|
||||
core::int* v1 = let final self::Test2* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : #t13.{self::Test2::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test2* #t14 = t in #t14.{core::Object::==}(null) ?{core::num*} null : #t14.{self::Test2::prop} = self::getNum();
|
||||
core::double* v3 = let final self::Test2* #t15 = t in #t15.{core::Object::==}(null) ?{core::double*} null : #t15.{self::Test2::prop} = self::getDouble();
|
||||
core::num* v4 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getInt() : #t17;
|
||||
core::num* v5 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : let final core::num* #t19 = #t18.{self::Test2::prop} in #t19.{core::num::==}(null) ?{core::num*} #t18.{self::Test2::prop} = self::getNum() : #t19;
|
||||
core::num* v6 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : let final core::num* #t21 = #t20.{self::Test2::prop} in #t21.{core::num::==}(null) ?{core::num*} #t20.{self::Test2::prop} = self::getDouble() : #t21;
|
||||
core::num* v7 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : #t22.{self::Test2::prop} = #t22.{self::Test2::prop}.{core::num::+}(self::getInt());
|
||||
core::num* v8 = let final self::Test2* #t23 = t in #t23.==(null) ?{core::num*} null : #t23.{self::Test2::prop} = #t23.{self::Test2::prop}.{core::num::+}(self::getNum());
|
||||
core::num* v9 = let final self::Test2* #t24 = t in #t24.==(null) ?{core::num*} null : #t24.{self::Test2::prop} = #t24.{self::Test2::prop}.{core::num::+}(self::getDouble());
|
||||
core::num* v10 = let final self::Test2* #t25 = t in #t25.==(null) ?{core::num*} null : #t25.{self::Test2::prop} = #t25.{self::Test2::prop}.{core::num::+}(1);
|
||||
core::num* v11 = let final self::Test2* #t26 = t in #t26.==(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in let final core::num* #t28 = #t26.{self::Test2::prop} = #t27.{core::num::+}(1) in #t27;
|
||||
core::int* v1 = let final self::Test2* #t19 = t in #t19.{core::Object::==}(null) ?{core::int*} null : #t19.{self::Test2::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test2* #t20 = t in #t20.{core::Object::==}(null) ?{core::num*} null : #t20.{self::Test2::prop} = self::getNum();
|
||||
core::double* v3 = let final self::Test2* #t21 = t in #t21.{core::Object::==}(null) ?{core::double*} null : #t21.{self::Test2::prop} = self::getDouble();
|
||||
core::num* v4 = let final self::Test2* #t22 = t in #t22.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in #t23.{core::num::==}(null) ?{core::num*} #t22.{self::Test2::prop} = self::getInt() : #t23;
|
||||
core::num* v5 = let final self::Test2* #t24 = t in #t24.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t25 = #t24.{self::Test2::prop} in #t25.{core::num::==}(null) ?{core::num*} #t24.{self::Test2::prop} = self::getNum() : #t25;
|
||||
core::num* v6 = let final self::Test2* #t26 = t in #t26.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in #t27.{core::num::==}(null) ?{core::num*} #t26.{self::Test2::prop} = self::getDouble() : #t27;
|
||||
core::num* v7 = let final self::Test2* #t28 = t in #t28.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}.{core::num::+}(self::getInt()) in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
|
||||
core::num* v8 = let final self::Test2* #t31 = t in #t31.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}.{core::num::+}(self::getNum()) in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
|
||||
core::num* v9 = let final self::Test2* #t34 = t in #t34.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop}.{core::num::+}(self::getDouble()) in let final void #t36 = #t34.{self::Test2::prop} = #t35 in #t35;
|
||||
core::num* v10 = let final self::Test2* #t37 = t in #t37.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t38 = #t37.{self::Test2::prop}.{core::num::+}(1) in let final void #t39 = #t37.{self::Test2::prop} = #t38 in #t38;
|
||||
core::num* v11 = let final self::Test2* #t40 = t in #t40.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t41 = #t40.{self::Test2::prop} in let final void #t42 = #t40.{self::Test2::prop} = #t41.{core::num::+}(1) in #t41;
|
||||
}
|
||||
}
|
||||
class Test3 extends core::Object {
|
||||
|
@ -43,15 +43,15 @@ class Test3 extends core::Object {
|
|||
: super core::Object::•()
|
||||
;
|
||||
static method test3(self::Test3* t) → void {
|
||||
core::num* v2 = let final self::Test3* #t29 = t in #t29.{core::Object::==}(null) ?{core::num*} null : #t29.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
|
||||
core::double* v3 = let final self::Test3* #t30 = t in #t30.{core::Object::==}(null) ?{core::double*} null : #t30.{self::Test3::prop} = self::getDouble();
|
||||
core::num* v5 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::num*} null : let final core::double* #t32 = #t31.{self::Test3::prop} in #t32.{core::num::==}(null) ?{core::num*} #t31.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t32;
|
||||
core::double* v6 = let final self::Test3* #t33 = t in #t33.==(null) ?{core::double*} null : let final core::double* #t34 = #t33.{self::Test3::prop} in #t34.{core::num::==}(null) ?{core::double*} #t33.{self::Test3::prop} = self::getDouble() : #t34;
|
||||
core::double* v7 = let final self::Test3* #t35 = t in #t35.==(null) ?{core::double*} null : #t35.{self::Test3::prop} = #t35.{self::Test3::prop}.{core::double::+}(self::getInt());
|
||||
core::double* v8 = let final self::Test3* #t36 = t in #t36.==(null) ?{core::double*} null : #t36.{self::Test3::prop} = #t36.{self::Test3::prop}.{core::double::+}(self::getNum());
|
||||
core::double* v9 = let final self::Test3* #t37 = t in #t37.==(null) ?{core::double*} null : #t37.{self::Test3::prop} = #t37.{self::Test3::prop}.{core::double::+}(self::getDouble());
|
||||
core::double* v10 = let final self::Test3* #t38 = t in #t38.==(null) ?{core::double*} null : #t38.{self::Test3::prop} = #t38.{self::Test3::prop}.{core::double::+}(1);
|
||||
core::double* v11 = let final self::Test3* #t39 = t in #t39.==(null) ?{core::double*} null : let final core::double* #t40 = #t39.{self::Test3::prop} in let final core::double* #t41 = #t39.{self::Test3::prop} = #t40.{core::double::+}(1) in #t40;
|
||||
core::num* v2 = let final self::Test3* #t43 = t in #t43.{core::Object::==}(null) ?{core::num*} null : #t43.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
|
||||
core::double* v3 = let final self::Test3* #t44 = t in #t44.{core::Object::==}(null) ?{core::double*} null : #t44.{self::Test3::prop} = self::getDouble();
|
||||
core::num* v5 = let final self::Test3* #t45 = t in #t45.{core::Object::==}(null) ?{core::num*} null : let final core::double* #t46 = #t45.{self::Test3::prop} in #t46.{core::num::==}(null) ?{core::num*} #t45.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t46;
|
||||
core::double* v6 = let final self::Test3* #t47 = t in #t47.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t48 = #t47.{self::Test3::prop} in #t48.{core::num::==}(null) ?{core::double*} #t47.{self::Test3::prop} = self::getDouble() : #t48;
|
||||
core::double* v7 = let final self::Test3* #t49 = t in #t49.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}.{core::double::+}(self::getInt()) in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
|
||||
core::double* v8 = let final self::Test3* #t52 = t in #t52.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop}.{core::double::+}(self::getNum()) in let final void #t54 = #t52.{self::Test3::prop} = #t53 in #t53;
|
||||
core::double* v9 = let final self::Test3* #t55 = t in #t55.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t56 = #t55.{self::Test3::prop}.{core::double::+}(self::getDouble()) in let final void #t57 = #t55.{self::Test3::prop} = #t56 in #t56;
|
||||
core::double* v10 = let final self::Test3* #t58 = t in #t58.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t59 = #t58.{self::Test3::prop}.{core::double::+}(1) in let final void #t60 = #t58.{self::Test3::prop} = #t59 in #t59;
|
||||
core::double* v11 = let final self::Test3* #t61 = t in #t61.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t62 = #t61.{self::Test3::prop} in let final void #t63 = #t61.{self::Test3::prop} = #t62.{core::double::+}(1) in #t62;
|
||||
}
|
||||
}
|
||||
static method getInt() → core::int*
|
||||
|
|
|
@ -10,12 +10,12 @@ class Test1 extends core::Object {
|
|||
static method test(self::Test1* t) → void {
|
||||
core::int* v1 = let final self::Test1* #t1 = t in #t1.{core::Object::==}(null) ?{core::int*} null : #t1.{self::Test1::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test1* #t2 = t in #t2.{core::Object::==}(null) ?{core::num*} null : #t2.{self::Test1::prop} = self::getNum() as{TypeError} core::int*;
|
||||
core::int* v4 = let final self::Test1* #t3 = t in #t3.==(null) ?{core::int*} null : let final core::int* #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::int*} #t3.{self::Test1::prop} = self::getInt() : #t4;
|
||||
core::num* v5 = let final self::Test1* #t5 = t in #t5.==(null) ?{core::num*} null : let final core::int* #t6 = #t5.{self::Test1::prop} in #t6.{core::num::==}(null) ?{core::num*} #t5.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t6;
|
||||
core::int* v7 = let final self::Test1* #t7 = t in #t7.==(null) ?{core::int*} null : #t7.{self::Test1::prop} = #t7.{self::Test1::prop}.{core::num::+}(self::getInt());
|
||||
core::num* v8 = let final self::Test1* #t8 = t in #t8.==(null) ?{core::num*} null : #t8.{self::Test1::prop} = #t8.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int*;
|
||||
core::int* v10 = let final self::Test1* #t9 = t in #t9.==(null) ?{core::int*} null : #t9.{self::Test1::prop} = #t9.{self::Test1::prop}.{core::num::+}(1);
|
||||
core::int* v11 = let final self::Test1* #t10 = t in #t10.==(null) ?{core::int*} null : let final core::int* #t11 = #t10.{self::Test1::prop} in let final core::int* #t12 = #t10.{self::Test1::prop} = #t11.{core::num::+}(1) in #t11;
|
||||
core::int* v4 = let final self::Test1* #t3 = t in #t3.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t4 = #t3.{self::Test1::prop} in #t4.{core::num::==}(null) ?{core::int*} #t3.{self::Test1::prop} = self::getInt() : #t4;
|
||||
core::num* v5 = let final self::Test1* #t5 = t in #t5.{core::Object::==}(null) ?{core::num*} null : let final core::int* #t6 = #t5.{self::Test1::prop} in #t6.{core::num::==}(null) ?{core::num*} #t5.{self::Test1::prop} = self::getNum() as{TypeError} core::int* : #t6;
|
||||
core::int* v7 = let final self::Test1* #t7 = t in #t7.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t8 = #t7.{self::Test1::prop}.{core::num::+}(self::getInt()) in let final void #t9 = #t7.{self::Test1::prop} = #t8 in #t8;
|
||||
core::num* v8 = let final self::Test1* #t10 = t in #t10.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t11 = #t10.{self::Test1::prop}.{core::num::+}(self::getNum()) as{TypeError} core::int* in let final void #t12 = #t10.{self::Test1::prop} = #t11 in #t11;
|
||||
core::int* v10 = let final self::Test1* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t14 = #t13.{self::Test1::prop}.{core::num::+}(1) in let final void #t15 = #t13.{self::Test1::prop} = #t14 in #t14;
|
||||
core::int* v11 = let final self::Test1* #t16 = t in #t16.{core::Object::==}(null) ?{core::int*} null : let final core::int* #t17 = #t16.{self::Test1::prop} in let final void #t18 = #t16.{self::Test1::prop} = #t17.{core::num::+}(1) in #t17;
|
||||
}
|
||||
}
|
||||
class Test2 extends core::Object {
|
||||
|
@ -24,17 +24,17 @@ class Test2 extends core::Object {
|
|||
: super core::Object::•()
|
||||
;
|
||||
static method test(self::Test2* t) → void {
|
||||
core::int* v1 = let final self::Test2* #t13 = t in #t13.{core::Object::==}(null) ?{core::int*} null : #t13.{self::Test2::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test2* #t14 = t in #t14.{core::Object::==}(null) ?{core::num*} null : #t14.{self::Test2::prop} = self::getNum();
|
||||
core::double* v3 = let final self::Test2* #t15 = t in #t15.{core::Object::==}(null) ?{core::double*} null : #t15.{self::Test2::prop} = self::getDouble();
|
||||
core::num* v4 = let final self::Test2* #t16 = t in #t16.==(null) ?{core::num*} null : let final core::num* #t17 = #t16.{self::Test2::prop} in #t17.{core::num::==}(null) ?{core::num*} #t16.{self::Test2::prop} = self::getInt() : #t17;
|
||||
core::num* v5 = let final self::Test2* #t18 = t in #t18.==(null) ?{core::num*} null : let final core::num* #t19 = #t18.{self::Test2::prop} in #t19.{core::num::==}(null) ?{core::num*} #t18.{self::Test2::prop} = self::getNum() : #t19;
|
||||
core::num* v6 = let final self::Test2* #t20 = t in #t20.==(null) ?{core::num*} null : let final core::num* #t21 = #t20.{self::Test2::prop} in #t21.{core::num::==}(null) ?{core::num*} #t20.{self::Test2::prop} = self::getDouble() : #t21;
|
||||
core::num* v7 = let final self::Test2* #t22 = t in #t22.==(null) ?{core::num*} null : #t22.{self::Test2::prop} = #t22.{self::Test2::prop}.{core::num::+}(self::getInt());
|
||||
core::num* v8 = let final self::Test2* #t23 = t in #t23.==(null) ?{core::num*} null : #t23.{self::Test2::prop} = #t23.{self::Test2::prop}.{core::num::+}(self::getNum());
|
||||
core::num* v9 = let final self::Test2* #t24 = t in #t24.==(null) ?{core::num*} null : #t24.{self::Test2::prop} = #t24.{self::Test2::prop}.{core::num::+}(self::getDouble());
|
||||
core::num* v10 = let final self::Test2* #t25 = t in #t25.==(null) ?{core::num*} null : #t25.{self::Test2::prop} = #t25.{self::Test2::prop}.{core::num::+}(1);
|
||||
core::num* v11 = let final self::Test2* #t26 = t in #t26.==(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in let final core::num* #t28 = #t26.{self::Test2::prop} = #t27.{core::num::+}(1) in #t27;
|
||||
core::int* v1 = let final self::Test2* #t19 = t in #t19.{core::Object::==}(null) ?{core::int*} null : #t19.{self::Test2::prop} = self::getInt();
|
||||
core::num* v2 = let final self::Test2* #t20 = t in #t20.{core::Object::==}(null) ?{core::num*} null : #t20.{self::Test2::prop} = self::getNum();
|
||||
core::double* v3 = let final self::Test2* #t21 = t in #t21.{core::Object::==}(null) ?{core::double*} null : #t21.{self::Test2::prop} = self::getDouble();
|
||||
core::num* v4 = let final self::Test2* #t22 = t in #t22.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t23 = #t22.{self::Test2::prop} in #t23.{core::num::==}(null) ?{core::num*} #t22.{self::Test2::prop} = self::getInt() : #t23;
|
||||
core::num* v5 = let final self::Test2* #t24 = t in #t24.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t25 = #t24.{self::Test2::prop} in #t25.{core::num::==}(null) ?{core::num*} #t24.{self::Test2::prop} = self::getNum() : #t25;
|
||||
core::num* v6 = let final self::Test2* #t26 = t in #t26.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t27 = #t26.{self::Test2::prop} in #t27.{core::num::==}(null) ?{core::num*} #t26.{self::Test2::prop} = self::getDouble() : #t27;
|
||||
core::num* v7 = let final self::Test2* #t28 = t in #t28.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t29 = #t28.{self::Test2::prop}.{core::num::+}(self::getInt()) in let final void #t30 = #t28.{self::Test2::prop} = #t29 in #t29;
|
||||
core::num* v8 = let final self::Test2* #t31 = t in #t31.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t32 = #t31.{self::Test2::prop}.{core::num::+}(self::getNum()) in let final void #t33 = #t31.{self::Test2::prop} = #t32 in #t32;
|
||||
core::num* v9 = let final self::Test2* #t34 = t in #t34.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t35 = #t34.{self::Test2::prop}.{core::num::+}(self::getDouble()) in let final void #t36 = #t34.{self::Test2::prop} = #t35 in #t35;
|
||||
core::num* v10 = let final self::Test2* #t37 = t in #t37.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t38 = #t37.{self::Test2::prop}.{core::num::+}(1) in let final void #t39 = #t37.{self::Test2::prop} = #t38 in #t38;
|
||||
core::num* v11 = let final self::Test2* #t40 = t in #t40.{core::Object::==}(null) ?{core::num*} null : let final core::num* #t41 = #t40.{self::Test2::prop} in let final void #t42 = #t40.{self::Test2::prop} = #t41.{core::num::+}(1) in #t41;
|
||||
}
|
||||
}
|
||||
class Test3 extends core::Object {
|
||||
|
@ -43,15 +43,15 @@ class Test3 extends core::Object {
|
|||
: super core::Object::•()
|
||||
;
|
||||
static method test3(self::Test3* t) → void {
|
||||
core::num* v2 = let final self::Test3* #t29 = t in #t29.{core::Object::==}(null) ?{core::num*} null : #t29.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
|
||||
core::double* v3 = let final self::Test3* #t30 = t in #t30.{core::Object::==}(null) ?{core::double*} null : #t30.{self::Test3::prop} = self::getDouble();
|
||||
core::num* v5 = let final self::Test3* #t31 = t in #t31.==(null) ?{core::num*} null : let final core::double* #t32 = #t31.{self::Test3::prop} in #t32.{core::num::==}(null) ?{core::num*} #t31.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t32;
|
||||
core::double* v6 = let final self::Test3* #t33 = t in #t33.==(null) ?{core::double*} null : let final core::double* #t34 = #t33.{self::Test3::prop} in #t34.{core::num::==}(null) ?{core::double*} #t33.{self::Test3::prop} = self::getDouble() : #t34;
|
||||
core::double* v7 = let final self::Test3* #t35 = t in #t35.==(null) ?{core::double*} null : #t35.{self::Test3::prop} = #t35.{self::Test3::prop}.{core::double::+}(self::getInt());
|
||||
core::double* v8 = let final self::Test3* #t36 = t in #t36.==(null) ?{core::double*} null : #t36.{self::Test3::prop} = #t36.{self::Test3::prop}.{core::double::+}(self::getNum());
|
||||
core::double* v9 = let final self::Test3* #t37 = t in #t37.==(null) ?{core::double*} null : #t37.{self::Test3::prop} = #t37.{self::Test3::prop}.{core::double::+}(self::getDouble());
|
||||
core::double* v10 = let final self::Test3* #t38 = t in #t38.==(null) ?{core::double*} null : #t38.{self::Test3::prop} = #t38.{self::Test3::prop}.{core::double::+}(1);
|
||||
core::double* v11 = let final self::Test3* #t39 = t in #t39.==(null) ?{core::double*} null : let final core::double* #t40 = #t39.{self::Test3::prop} in let final core::double* #t41 = #t39.{self::Test3::prop} = #t40.{core::double::+}(1) in #t40;
|
||||
core::num* v2 = let final self::Test3* #t43 = t in #t43.{core::Object::==}(null) ?{core::num*} null : #t43.{self::Test3::prop} = self::getNum() as{TypeError} core::double*;
|
||||
core::double* v3 = let final self::Test3* #t44 = t in #t44.{core::Object::==}(null) ?{core::double*} null : #t44.{self::Test3::prop} = self::getDouble();
|
||||
core::num* v5 = let final self::Test3* #t45 = t in #t45.{core::Object::==}(null) ?{core::num*} null : let final core::double* #t46 = #t45.{self::Test3::prop} in #t46.{core::num::==}(null) ?{core::num*} #t45.{self::Test3::prop} = self::getNum() as{TypeError} core::double* : #t46;
|
||||
core::double* v6 = let final self::Test3* #t47 = t in #t47.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t48 = #t47.{self::Test3::prop} in #t48.{core::num::==}(null) ?{core::double*} #t47.{self::Test3::prop} = self::getDouble() : #t48;
|
||||
core::double* v7 = let final self::Test3* #t49 = t in #t49.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t50 = #t49.{self::Test3::prop}.{core::double::+}(self::getInt()) in let final void #t51 = #t49.{self::Test3::prop} = #t50 in #t50;
|
||||
core::double* v8 = let final self::Test3* #t52 = t in #t52.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t53 = #t52.{self::Test3::prop}.{core::double::+}(self::getNum()) in let final void #t54 = #t52.{self::Test3::prop} = #t53 in #t53;
|
||||
core::double* v9 = let final self::Test3* #t55 = t in #t55.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t56 = #t55.{self::Test3::prop}.{core::double::+}(self::getDouble()) in let final void #t57 = #t55.{self::Test3::prop} = #t56 in #t56;
|
||||
core::double* v10 = let final self::Test3* #t58 = t in #t58.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t59 = #t58.{self::Test3::prop}.{core::double::+}(1) in let final void #t60 = #t58.{self::Test3::prop} = #t59 in #t59;
|
||||
core::double* v11 = let final self::Test3* #t61 = t in #t61.{core::Object::==}(null) ?{core::double*} null : let final core::double* #t62 = #t61.{self::Test3::prop} in let final void #t63 = #t61.{self::Test3::prop} = #t62.{core::double::+}(1) in #t62;
|
||||
}
|
||||
}
|
||||
static method getInt() → core::int*
|
||||
|
|
|
@ -195,6 +195,7 @@ general/no_such_method_private_setter_lib: TextSerializationFailure # Was: Pass
|
|||
general/non_covariant_checks: TextSerializationFailure
|
||||
general/null_aware: TextSerializationFailure # Was: Pass
|
||||
general/null_aware_for_in: TextSerializationFailure
|
||||
general/null_aware_postfix: TextSerializationFailure
|
||||
general/operator_method_not_found: TextSerializationFailure
|
||||
general/operators: TextSerializationFailure # Was: Pass
|
||||
general/optional: TypeCheckError
|
||||
|
|
Loading…
Reference in a new issue