[cfe] Remove .isNonNullableByDefault from package:kernel
This removes the .isNonNullableByDefault properties and similar from the AST nodes in package:kernel. NNBD is now always enabled so these properties are trivial. TEST=existing Change-Id: I75ca0551ac4b5910ea63530dd0c9c2e68bd01aff Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/366320 Commit-Queue: Johnni Winther <johnniwinther@google.com> Reviewed-by: Chloe Stefantsova <cstefantsova@google.com> Reviewed-by: Alexander Markov <alexmarkov@google.com> Reviewed-by: Sigmund Cherem <sigmund@google.com>
This commit is contained in:
committed by
Commit Queue
parent
4bf22f41f3
commit
ae03b57cbb
@@ -327,7 +327,6 @@ class LateLowering {
|
||||
fileUri: fileUri,
|
||||
fieldReference: field.fieldReference)
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = true
|
||||
// TODO(fishythefish,srujzs,johnniwinther): Also mark the getter/setter
|
||||
// as extension/extension type members.
|
||||
..isExtensionMember = field.isExtensionMember
|
||||
@@ -347,8 +346,7 @@ class LateLowering {
|
||||
isStatic: true,
|
||||
fileUri: fileUri,
|
||||
reference: field.getterReference)
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileOffset = fileOffset;
|
||||
|
||||
VariableDeclaration setterValue =
|
||||
VariableDeclaration('value', type: type, isSynthesized: true)
|
||||
@@ -374,8 +372,7 @@ class LateLowering {
|
||||
isStatic: true,
|
||||
fileUri: fileUri,
|
||||
reference: field.setterReference)
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileOffset = fileOffset;
|
||||
|
||||
TreeNode parent = field.parent!;
|
||||
if (parent is Class) {
|
||||
@@ -419,7 +416,6 @@ class LateLowering {
|
||||
fileUri: fileUri,
|
||||
fieldReference: field.fieldReference)
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = true
|
||||
..isInternalImplementation = true;
|
||||
InstanceGet fieldRead() => InstanceGet(InstanceAccessKind.Instance,
|
||||
ThisExpression()..fileOffset = fileOffset, mangledName,
|
||||
@@ -538,8 +534,7 @@ class LateLowering {
|
||||
Procedure getter = Procedure(name, ProcedureKind.Getter,
|
||||
FunctionNode(getterBody(), returnType: type)..fileOffset = fileOffset,
|
||||
fileUri: fileUri, reference: field.getterReference)
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileOffset = fileOffset;
|
||||
// The initializer is copied from [field] to [getter] so we copy the
|
||||
// transformer flags to reflect whether the getter contains super calls.
|
||||
getter.transformerFlags = field.transformerFlags;
|
||||
@@ -596,8 +591,7 @@ class LateLowering {
|
||||
..fileOffset = fileOffset,
|
||||
fileUri: fileUri,
|
||||
reference: field.setterReference)
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileOffset = fileOffset;
|
||||
_copyAnnotations(setter, field);
|
||||
enclosingClass.addProcedure(setter);
|
||||
}
|
||||
|
||||
@@ -191,8 +191,7 @@ class WasmFfiNativeTransformer extends FfiNativeTransformer {
|
||||
isExternal: true,
|
||||
isStatic: true,
|
||||
isSynthetic: true)
|
||||
..fileOffset = node.fileOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileOffset = node.fileOffset;
|
||||
wasmImportProcedure.addAnnotation(wasmImportPragma);
|
||||
currentLibrary.addProcedure(wasmImportProcedure);
|
||||
|
||||
|
||||
@@ -28,8 +28,7 @@ class MethodCollector {
|
||||
{required bool isExternal}) {
|
||||
final procedure = Procedure(
|
||||
Name(name, _library), ProcedureKind.Method, function,
|
||||
isStatic: true, isExternal: isExternal, fileUri: fileUri)
|
||||
..isNonNullableByDefault = true;
|
||||
isStatic: true, isExternal: isExternal, fileUri: fileUri);
|
||||
_util.annotateProcedure(procedure, pragmaOptionString, type);
|
||||
_library.addProcedure(procedure);
|
||||
return procedure;
|
||||
|
||||
@@ -193,8 +193,7 @@ class _WasmTransformer extends Transformer {
|
||||
),
|
||||
isExternal: true,
|
||||
isSynthetic: true,
|
||||
fileUri: cls.fileUri)
|
||||
..isNonNullableByDefault = true;
|
||||
fileUri: cls.fileUri);
|
||||
cls.addProcedure(getTypeArguments);
|
||||
}
|
||||
return super.visitClass(cls);
|
||||
|
||||
@@ -2533,11 +2533,8 @@ class ProgramCompiler extends ComputeOnceConstantVisitor<js_ast.Expression>
|
||||
}
|
||||
_currentUri = savedUri;
|
||||
|
||||
return runtimeStatement('defineLazy(#, { # }, #)', [
|
||||
objExpr,
|
||||
accessors,
|
||||
js.boolean(!_currentLibrary!.isNonNullableByDefault)
|
||||
]);
|
||||
return runtimeStatement(
|
||||
'defineLazy(#, { # }, #)', [objExpr, accessors, js.boolean(false)]);
|
||||
}
|
||||
|
||||
js_ast.Fun _emitStaticFieldInitializer(Field field) {
|
||||
@@ -3543,14 +3540,7 @@ class ProgramCompiler extends ComputeOnceConstantVisitor<js_ast.Expression>
|
||||
//
|
||||
// In the body of an `async`, `await` is generated simply as `yield`.
|
||||
var gen = emitGeneratorFn((_) => []);
|
||||
var returnType = _currentLibrary!.isNonNullableByDefault
|
||||
? function.emittedValueType!
|
||||
// Otherwise flatten the return type because futureValueType(T) is not
|
||||
// defined for legacy libraries.
|
||||
: _types.flatten(function
|
||||
.computeThisFunctionType(_currentLibrary!.nonNullable,
|
||||
reuseTypeParameters: true)
|
||||
.returnType);
|
||||
var returnType = function.emittedValueType!;
|
||||
return js.call('#.async(#, #)',
|
||||
[emitLibraryName(_coreTypes.asyncLibrary), _emitType(returnType), gen]);
|
||||
}
|
||||
|
||||
@@ -2081,8 +2081,7 @@ class IncrementalCompiler implements IncrementalKernelGenerator {
|
||||
|
||||
Procedure procedure = new Procedure(
|
||||
new Name(syntheticProcedureName), ProcedureKind.Method, parameters,
|
||||
isStatic: isStatic, fileUri: debugLibrary.fileUri)
|
||||
..isNonNullableByDefault = true;
|
||||
isStatic: isStatic, fileUri: debugLibrary.fileUri);
|
||||
|
||||
parameters.body = new ReturnStatement(compiledExpression)
|
||||
..parent = parameters;
|
||||
|
||||
@@ -5248,9 +5248,8 @@ class BodyBuilder extends StackListenerImpl
|
||||
DartType type = buildDartType(pop() as TypeBuilder, TypeUse.asType,
|
||||
allowPotentiallyConstantType: true);
|
||||
Expression expression = popForValue();
|
||||
Expression asExpression = forest.createAsExpression(
|
||||
offsetForToken(operator), expression, type,
|
||||
forNonNullableByDefault: true);
|
||||
Expression asExpression =
|
||||
forest.createAsExpression(offsetForToken(operator), expression, type);
|
||||
push(asExpression);
|
||||
}
|
||||
|
||||
@@ -5292,7 +5291,6 @@ class BodyBuilder extends StackListenerImpl
|
||||
Expression operand = popForValue();
|
||||
Expression isExpression = forest.createIsExpression(
|
||||
offsetForToken(isOperator), operand, type,
|
||||
forNonNullableByDefault: true,
|
||||
notFileOffset: not != null ? offsetForToken(not) : null);
|
||||
push(isExpression);
|
||||
}
|
||||
|
||||
@@ -289,8 +289,7 @@ abstract class CombinedMemberSignatureBase {
|
||||
}
|
||||
DartType canonicalMemberType =
|
||||
_combinedMemberSignatureType = getMemberType(_canonicalMemberIndex!);
|
||||
_containsNnbdTypes =
|
||||
_getMember(_canonicalMemberIndex!).isNonNullableByDefault;
|
||||
_containsNnbdTypes = true;
|
||||
if (_mutualSubtypes != null) {
|
||||
_combinedMemberSignatureType =
|
||||
norm(_coreTypes, _combinedMemberSignatureType!);
|
||||
@@ -511,7 +510,6 @@ abstract class CombinedMemberSignatureBase {
|
||||
)
|
||||
..fileStartOffset = startFileOffset
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = containsNnbdTypes
|
||||
..parent = declarationNode;
|
||||
}
|
||||
|
||||
@@ -560,7 +558,6 @@ abstract class CombinedMemberSignatureBase {
|
||||
)
|
||||
..fileStartOffset = startFileOffset
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = containsNnbdTypes
|
||||
..parent = declarationNode;
|
||||
}
|
||||
|
||||
@@ -650,7 +647,6 @@ abstract class CombinedMemberSignatureBase {
|
||||
)
|
||||
..fileStartOffset = startFileOffset
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = containsNnbdTypes
|
||||
..parent = declarationNode;
|
||||
}
|
||||
|
||||
|
||||
@@ -4871,11 +4871,8 @@ class ConstantEvaluator implements ExpressionVisitor<Constant> {
|
||||
final Constant constant = _evaluateSubexpression(node.operand);
|
||||
if (constant is AbortConstant) return constant;
|
||||
if (shouldBeUnevaluated) {
|
||||
return unevaluated(
|
||||
node,
|
||||
new AsExpression(_wrap(constant), env.substituteType(node.type))
|
||||
..isForNonNullableByDefault =
|
||||
staticTypeContext.isNonNullableByDefault);
|
||||
return unevaluated(node,
|
||||
new AsExpression(_wrap(constant), env.substituteType(node.type)));
|
||||
}
|
||||
DartType? type = _evaluateDartType(node, node.type);
|
||||
if (type == null) {
|
||||
@@ -4895,8 +4892,7 @@ class ConstantEvaluator implements ExpressionVisitor<Constant> {
|
||||
return unevaluated(
|
||||
node,
|
||||
new IsExpression(_wrap(constant), env.substituteType(node.type))
|
||||
..fileOffset = node.fileOffset
|
||||
..flags = node.flags);
|
||||
..fileOffset = node.fileOffset);
|
||||
}
|
||||
|
||||
DartType? type = _evaluateDartType(node, node.type);
|
||||
|
||||
@@ -280,8 +280,7 @@ Procedure _createTearOffProcedure(SourceLibraryBuilder libraryBuilder,
|
||||
fileUri: fileUri, isStatic: true, isSynthetic: true, reference: reference)
|
||||
..fileStartOffset = fileOffset
|
||||
..fileOffset = fileOffset
|
||||
..fileEndOffset = fileOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileEndOffset = fileOffset;
|
||||
tearOffName.attachMember(tearOff);
|
||||
return tearOff;
|
||||
}
|
||||
|
||||
@@ -203,10 +203,9 @@ class Forest {
|
||||
|
||||
Expression createAsExpression(
|
||||
int fileOffset, Expression expression, DartType type,
|
||||
{required bool forNonNullableByDefault, bool forDynamic = false}) {
|
||||
{bool forDynamic = false}) {
|
||||
return new AsExpression(expression, type)
|
||||
..fileOffset = fileOffset
|
||||
..isForNonNullableByDefault = forNonNullableByDefault
|
||||
..isForDynamic = forDynamic;
|
||||
}
|
||||
|
||||
@@ -464,10 +463,9 @@ class Forest {
|
||||
/// is non-null the test is negated the that file offset.
|
||||
Expression createIsExpression(
|
||||
int fileOffset, Expression operand, DartType type,
|
||||
{required bool forNonNullableByDefault, int? notFileOffset}) {
|
||||
{int? notFileOffset}) {
|
||||
Expression result = new IsExpression(operand, type)
|
||||
..fileOffset = fileOffset
|
||||
..isForNonNullableByDefault = forNonNullableByDefault;
|
||||
..fileOffset = fileOffset;
|
||||
if (notFileOffset != null) {
|
||||
result = createNot(notFileOffset, result);
|
||||
}
|
||||
|
||||
@@ -467,7 +467,6 @@ class ForwardingNode {
|
||||
result = new AsExpression(result, procedure.function.returnType)
|
||||
..isTypeError = true
|
||||
..isForDynamic = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = procedure.fileOffset;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
library fasta.class_hierarchy_builder;
|
||||
|
||||
import 'package:kernel/ast.dart';
|
||||
import 'package:kernel/src/legacy_erasure.dart';
|
||||
import 'package:kernel/src/types.dart';
|
||||
import 'package:kernel/type_algebra.dart';
|
||||
import 'package:kernel/type_environment.dart';
|
||||
@@ -64,13 +63,12 @@ class DelayedOverrideCheck implements DelayedCheck {
|
||||
/// int? mixedInMethod(int? i, {int? j}) => i;
|
||||
/// }
|
||||
///
|
||||
bool declaredNeedsLegacyErasure =
|
||||
needsLegacyErasure(_classBuilder.cls, declaredMember.enclosingClass!);
|
||||
|
||||
void callback(Member interfaceMember, bool isSetter) {
|
||||
_classBuilder.checkOverride(membersBuilder.hierarchyBuilder.types,
|
||||
membersBuilder, declaredMember, interfaceMember, isSetter, callback,
|
||||
isInterfaceCheck: !_classBuilder.isMixinApplication,
|
||||
declaredNeedsLegacyErasure: declaredNeedsLegacyErasure);
|
||||
declaredNeedsLegacyErasure: false);
|
||||
}
|
||||
|
||||
for (ClassMember overriddenMember in _overriddenMembers) {
|
||||
|
||||
@@ -165,8 +165,7 @@ class BuilderMixinInferrer {
|
||||
}
|
||||
// Use instantiate to bounds.
|
||||
List<DartType> bounds = calculateBounds(parameters, coreTypes.objectClass,
|
||||
isNonNullableByDefault:
|
||||
classNode.enclosingLibrary.isNonNullableByDefault);
|
||||
isNonNullableByDefault: true);
|
||||
for (int i = 0; i < mixedInType.typeArguments.length; ++i) {
|
||||
mixedInType.typeArguments[i] = bounds[i];
|
||||
}
|
||||
|
||||
@@ -1098,17 +1098,17 @@ class KernelTarget extends TargetImplementation {
|
||||
SuperInitializer initializer = new SuperInitializer(
|
||||
superConstructor, new Arguments(positional, named: named));
|
||||
Constructor constructor = new Constructor(function,
|
||||
name: superConstructor.name,
|
||||
initializers: <Initializer>[initializer],
|
||||
isSynthetic: true,
|
||||
isConst: isConst,
|
||||
reference: constructorReference,
|
||||
fileUri: cls.fileUri)
|
||||
..fileOffset = cls.fileOffset
|
||||
// TODO(johnniwinther): Should we add file end offset to synthesized
|
||||
// constructors?
|
||||
//..fileEndOffset = cls.fileOffset
|
||||
..isNonNullableByDefault = cls.enclosingLibrary.isNonNullableByDefault;
|
||||
name: superConstructor.name,
|
||||
initializers: <Initializer>[initializer],
|
||||
isSynthetic: true,
|
||||
isConst: isConst,
|
||||
reference: constructorReference,
|
||||
fileUri: cls.fileUri)
|
||||
..fileOffset = cls.fileOffset
|
||||
// TODO(johnniwinther): Should we add file end offset to synthesized
|
||||
// constructors?
|
||||
//..fileEndOffset = cls.fileOffset
|
||||
;
|
||||
DelayedDefaultValueCloner delayedDefaultValueCloner =
|
||||
new DelayedDefaultValueCloner(superConstructor, constructor,
|
||||
libraryBuilder: libraryBuilder);
|
||||
@@ -1193,17 +1193,17 @@ class KernelTarget extends TargetImplementation {
|
||||
SourceLibraryBuilder libraryBuilder = classBuilder.libraryBuilder;
|
||||
Class enclosingClass = classBuilder.cls;
|
||||
Constructor constructor = new Constructor(
|
||||
new FunctionNode(new EmptyStatement(),
|
||||
returnType: makeConstructorReturnType(enclosingClass)),
|
||||
name: new Name(""),
|
||||
isSynthetic: true,
|
||||
reference: constructorReference,
|
||||
fileUri: enclosingClass.fileUri)
|
||||
..fileOffset = enclosingClass.fileOffset
|
||||
// TODO(johnniwinther): Should we add file end offsets to synthesized
|
||||
// constructors?
|
||||
//..fileEndOffset = enclosingClass.fileOffset
|
||||
..isNonNullableByDefault = true;
|
||||
new FunctionNode(new EmptyStatement(),
|
||||
returnType: makeConstructorReturnType(enclosingClass)),
|
||||
name: new Name(""),
|
||||
isSynthetic: true,
|
||||
reference: constructorReference,
|
||||
fileUri: enclosingClass.fileUri)
|
||||
..fileOffset = enclosingClass.fileOffset
|
||||
// TODO(johnniwinther): Should we add file end offsets to synthesized
|
||||
// constructors?
|
||||
//..fileEndOffset = enclosingClass.fileOffset
|
||||
;
|
||||
Procedure? constructorTearOff = createConstructorTearOffProcedure(
|
||||
new MemberName(libraryBuilder.libraryName, constructorTearOffName('')),
|
||||
libraryBuilder,
|
||||
|
||||
@@ -64,8 +64,7 @@ class LoadLibraryBuilder extends BuilderImpl {
|
||||
isStatic: true,
|
||||
reference: reference)
|
||||
..fileStartOffset = charOffset
|
||||
..fileOffset = charOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileOffset = charOffset;
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -135,7 +135,6 @@ Component createExpressionEvaluationComponent(Procedure procedure) {
|
||||
Uri uri = new Uri(scheme: 'evaluate', path: 'source');
|
||||
Library fakeLibrary = new Library(uri, fileUri: uri)
|
||||
..setLanguageVersion(realLibrary.languageVersion)
|
||||
..isNonNullableByDefault = realLibrary.isNonNullableByDefault
|
||||
..nonNullableByDefaultCompiledMode =
|
||||
realLibrary.nonNullableByDefaultCompiledMode;
|
||||
|
||||
|
||||
@@ -1556,11 +1556,6 @@ class SourceClassBuilder extends ClassBuilderImpl
|
||||
declaredType = legacyErasure(declaredType);
|
||||
}
|
||||
|
||||
if (!declaredMember.isNonNullableByDefault &&
|
||||
interfaceMember.isNonNullableByDefault) {
|
||||
interfaceType = legacyErasure(interfaceType);
|
||||
}
|
||||
|
||||
bool inParameter = declaredParameter != null || asIfDeclaredParameter;
|
||||
DartType subtype = inParameter ? interfaceType : declaredType;
|
||||
DartType supertype = inParameter ? declaredType : interfaceType;
|
||||
@@ -1830,10 +1825,8 @@ class SourceClassBuilder extends ClassBuilderImpl
|
||||
declaredParameter,
|
||||
isInterfaceCheck,
|
||||
declaredNeedsLegacyErasure);
|
||||
if (declaredMember.isNonNullableByDefault &&
|
||||
!declaredNeedsLegacyErasure &&
|
||||
if (!declaredNeedsLegacyErasure &&
|
||||
declaredParameter.isRequired &&
|
||||
interfaceMember.isNonNullableByDefault &&
|
||||
!interfaceNamedParameters.current.isRequired) {
|
||||
reportInvalidOverride(
|
||||
isInterfaceCheck,
|
||||
|
||||
@@ -430,8 +430,7 @@ class DeclaredSourceConstructorBuilder
|
||||
isSynthetic: isSynthetic)
|
||||
..startFileOffset = startCharOffset
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileEndOffset = charEndOffset;
|
||||
nameScheme
|
||||
.getConstructorMemberName(name, isTearOff: false)
|
||||
.attachMember(_constructor);
|
||||
@@ -1123,8 +1122,7 @@ class SourceExtensionTypeConstructorBuilder
|
||||
dummyName, ProcedureKind.Method, new FunctionNode(null),
|
||||
fileUri: compilationUnit.fileUri, reference: constructorReference)
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileEndOffset = charEndOffset;
|
||||
nameScheme
|
||||
.getConstructorMemberName(name, isTearOff: false)
|
||||
.attachMember(_constructor);
|
||||
|
||||
@@ -97,7 +97,6 @@ class SourceFactoryBuilder extends SourceFunctionBuilderImpl {
|
||||
..fileStartOffset = startCharOffset
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = true
|
||||
..isExtensionTypeMember = nameScheme.isExtensionTypeMember;
|
||||
nameScheme
|
||||
.getConstructorMemberName(name, isTearOff: false)
|
||||
|
||||
@@ -689,8 +689,7 @@ class RegularFieldEncoding implements FieldEncoding {
|
||||
.attachMember(_field);
|
||||
_field
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = isNonNullableByDefault;
|
||||
..fileEndOffset = charEndOffset;
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -912,7 +911,6 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
|
||||
setterReference: fieldSetterReference)
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = true
|
||||
..isInternalImplementation = true;
|
||||
nameScheme
|
||||
.getFieldMemberName(FieldNameType.Field, name, isSynthesized: true)
|
||||
@@ -931,7 +929,6 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
|
||||
setterReference: lateIsSetSetterReference)
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = true
|
||||
..isInternalImplementation = true;
|
||||
nameScheme
|
||||
.getFieldMemberName(FieldNameType.IsSetField, name,
|
||||
@@ -948,8 +945,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
|
||||
fileUri: fileUri,
|
||||
reference: lateGetterReference)
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileEndOffset = charEndOffset;
|
||||
nameScheme
|
||||
.getFieldMemberName(FieldNameType.Getter, name, isSynthesized: true)
|
||||
.attachMember(_lateGetter);
|
||||
@@ -1079,8 +1075,7 @@ abstract class AbstractLateFieldEncoding implements FieldEncoding {
|
||||
fileUri: fileUri,
|
||||
reference: reference)
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = fileEndOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileEndOffset = fileEndOffset;
|
||||
}
|
||||
|
||||
Statement _createSetterBody(
|
||||
@@ -1728,8 +1723,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
|
||||
fileUri: fileUri,
|
||||
reference: getterReference)
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = isNonNullableByDefault;
|
||||
..fileEndOffset = charEndOffset;
|
||||
nameScheme
|
||||
.getProcedureMemberName(ProcedureKind.Getter, name)
|
||||
.attachMember(_getter);
|
||||
@@ -1754,8 +1748,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
|
||||
fileUri: fileUri,
|
||||
reference: setterReference)
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = isNonNullableByDefault;
|
||||
..fileEndOffset = charEndOffset;
|
||||
nameScheme
|
||||
.getProcedureMemberName(ProcedureKind.Setter, name)
|
||||
.attachMember(_setter!);
|
||||
@@ -1765,8 +1758,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
|
||||
dummyName, ProcedureKind.Getter, new FunctionNode(null),
|
||||
fileUri: fileUri, reference: getterReference)
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = isNonNullableByDefault;
|
||||
..fileEndOffset = charEndOffset;
|
||||
nameScheme
|
||||
.getFieldMemberName(FieldNameType.Getter, name, isSynthesized: true)
|
||||
.attachMember(_getter);
|
||||
@@ -1785,8 +1777,7 @@ class AbstractOrExternalFieldEncoding implements FieldEncoding {
|
||||
fileUri: fileUri,
|
||||
reference: setterReference)
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = isNonNullableByDefault;
|
||||
..fileEndOffset = charEndOffset;
|
||||
nameScheme
|
||||
.getFieldMemberName(FieldNameType.Setter, name, isSynthesized: true)
|
||||
.attachMember(_setter!);
|
||||
@@ -2028,8 +2019,7 @@ class RepresentationFieldEncoding implements FieldEncoding {
|
||||
fileUri: fileUri, reference: getterReference)
|
||||
..stubKind = ProcedureStubKind.RepresentationField
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileEndOffset = charEndOffset;
|
||||
nameScheme
|
||||
.getFieldMemberName(FieldNameType.RepresentationField, name,
|
||||
isSynthesized: true)
|
||||
|
||||
@@ -418,7 +418,6 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
}
|
||||
|
||||
void _updateLibraryNNBDSettings() {
|
||||
library.isNonNullableByDefault = true;
|
||||
switch (loader.nnbdMode) {
|
||||
case NnbdMode.Weak:
|
||||
library.nonNullableByDefaultCompiledMode =
|
||||
@@ -2259,25 +2258,12 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
// been reported.
|
||||
} else {
|
||||
bool isValid = typeEnvironment.isSubtypeOf(
|
||||
getterType,
|
||||
setterType,
|
||||
library.isNonNullableByDefault
|
||||
? SubtypeCheckMode.withNullabilities
|
||||
: SubtypeCheckMode.ignoringNullabilities);
|
||||
if (!isValid && !library.isNonNullableByDefault) {
|
||||
// Allow assignability in legacy libraries.
|
||||
isValid = typeEnvironment.isSubtypeOf(
|
||||
setterType, getterType, SubtypeCheckMode.ignoringNullabilities);
|
||||
}
|
||||
getterType, setterType, SubtypeCheckMode.withNullabilities);
|
||||
if (!isValid) {
|
||||
String getterMemberName = getterBuilder.fullNameForErrors;
|
||||
String setterMemberName = setterBuilder.fullNameForErrors;
|
||||
Template<Message Function(DartType, String, DartType, String)>
|
||||
template = library.isNonNullableByDefault
|
||||
? templateInvalidGetterSetterType
|
||||
: templateInvalidGetterSetterTypeLegacy;
|
||||
addProblem(
|
||||
template.withArguments(
|
||||
templateInvalidGetterSetterType.withArguments(
|
||||
getterType, getterMemberName, setterType, setterMemberName),
|
||||
getterBuilder.charOffset,
|
||||
getterBuilder.name.length,
|
||||
@@ -4874,7 +4860,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
List<TypeArgumentIssue> issues = findTypeArgumentIssues(
|
||||
type, typeEnvironment, SubtypeCheckMode.withNullabilities,
|
||||
allowSuperBounded: allowSuperBounded,
|
||||
isNonNullableByDefault: library.isNonNullableByDefault,
|
||||
isNonNullableByDefault: true,
|
||||
areGenericArgumentsAllowed: libraryFeatures.genericMetadata.isEnabled);
|
||||
_reportTypeArgumentIssues(issues, fileUri, offset, inferred: inferred);
|
||||
}
|
||||
@@ -4928,7 +4914,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
typeEnvironment,
|
||||
SubtypeCheckMode.withNullabilities,
|
||||
bottomType,
|
||||
isNonNullableByDefault: library.isNonNullableByDefault,
|
||||
isNonNullableByDefault: true,
|
||||
areGenericArgumentsAllowed: libraryFeatures.genericMetadata.isEnabled);
|
||||
if (issues.isNotEmpty) {
|
||||
DartType? targetReceiver;
|
||||
@@ -5003,7 +4989,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
typeEnvironment,
|
||||
SubtypeCheckMode.withNullabilities,
|
||||
bottomType,
|
||||
isNonNullableByDefault: library.isNonNullableByDefault,
|
||||
isNonNullableByDefault: true,
|
||||
areGenericArgumentsAllowed: libraryFeatures.genericMetadata.isEnabled);
|
||||
_reportTypeArgumentIssues(issues, fileUri, offset,
|
||||
typeArgumentsInfo: getTypeArgumentsInfo(arguments),
|
||||
@@ -5031,7 +5017,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
typeEnvironment,
|
||||
SubtypeCheckMode.withNullabilities,
|
||||
bottomType,
|
||||
isNonNullableByDefault: library.isNonNullableByDefault,
|
||||
isNonNullableByDefault: true,
|
||||
areGenericArgumentsAllowed: libraryFeatures.genericMetadata.isEnabled);
|
||||
_reportTypeArgumentIssues(issues, fileUri, offset,
|
||||
typeArgumentsInfo: getTypeArgumentsInfo(arguments),
|
||||
@@ -5063,7 +5049,7 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
|
||||
typeEnvironment,
|
||||
SubtypeCheckMode.withNullabilities,
|
||||
bottomType,
|
||||
isNonNullableByDefault: library.isNonNullableByDefault,
|
||||
isNonNullableByDefault: true,
|
||||
areGenericArgumentsAllowed: libraryFeatures.genericMetadata.isEnabled);
|
||||
_reportTypeArgumentIssues(issues, fileUri, offset,
|
||||
targetReceiver: functionType,
|
||||
|
||||
@@ -114,8 +114,7 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl
|
||||
isSynthetic: isSynthetic)
|
||||
..fileStartOffset = startCharOffset
|
||||
..fileOffset = charOffset
|
||||
..fileEndOffset = charEndOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileEndOffset = charEndOffset;
|
||||
nameScheme.getProcedureMemberName(kind, name).attachMember(_procedure);
|
||||
this.asyncModifier = asyncModifier;
|
||||
if ((isExtensionInstanceMember || isExtensionTypeInstanceMember) &&
|
||||
@@ -126,8 +125,7 @@ class SourceProcedureBuilder extends SourceFunctionBuilderImpl
|
||||
isExtensionMember: isExtensionInstanceMember,
|
||||
isExtensionTypeMember: isExtensionTypeInstanceMember,
|
||||
reference: _tearOffReference,
|
||||
fileUri: fileUri)
|
||||
..isNonNullableByDefault = true;
|
||||
fileUri: fileUri);
|
||||
nameScheme
|
||||
.getProcedureMemberName(ProcedureKind.Getter, name)
|
||||
.attachMember(_extensionTearOff!);
|
||||
|
||||
@@ -287,8 +287,7 @@ class _SyncClosureContext implements ClosureContext {
|
||||
} else {
|
||||
actualReturnedType = inferrer.typeSchemaEnvironment
|
||||
.getStandardUpperBound(actualReturnedType, type,
|
||||
isNonNullableByDefault:
|
||||
inferrer.libraryBuilder.library.isNonNullableByDefault);
|
||||
isNonNullableByDefault: true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -573,8 +572,7 @@ class _AsyncClosureContext implements ClosureContext {
|
||||
} else {
|
||||
inferredType = inferrer.typeSchemaEnvironment.getStandardUpperBound(
|
||||
inferredType, unwrappedType,
|
||||
isNonNullableByDefault:
|
||||
inferrer.libraryBuilder.library.isNonNullableByDefault);
|
||||
isNonNullableByDefault: true);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -748,8 +746,7 @@ class _SyncStarClosureContext implements ClosureContext {
|
||||
} else {
|
||||
inferredElementType = inferrer.typeSchemaEnvironment
|
||||
.getStandardUpperBound(inferredElementType, type,
|
||||
isNonNullableByDefault:
|
||||
inferrer.libraryBuilder.library.isNonNullableByDefault);
|
||||
isNonNullableByDefault: true);
|
||||
}
|
||||
}
|
||||
} else if (hasImplicitReturn) {
|
||||
@@ -886,8 +883,7 @@ class _AsyncStarClosureContext implements ClosureContext {
|
||||
} else {
|
||||
inferredElementType = inferrer.typeSchemaEnvironment
|
||||
.getStandardUpperBound(inferredElementType, elementType,
|
||||
isNonNullableByDefault:
|
||||
inferrer.libraryBuilder.library.isNonNullableByDefault);
|
||||
isNonNullableByDefault: true);
|
||||
}
|
||||
}
|
||||
} else if (hasImplicitReturn) {
|
||||
|
||||
@@ -599,7 +599,6 @@ class DelayedIsExpression extends AbstractDelayedExpression {
|
||||
_operand.createExpression(typeEnvironment,
|
||||
effects: effects, inCacheInitializer: inCacheInitializer),
|
||||
_type,
|
||||
forNonNullableByDefault: true,
|
||||
fileOffset: fileOffset);
|
||||
}
|
||||
|
||||
|
||||
@@ -178,10 +178,8 @@ LogicalExpression createOrExpression(Expression left, Expression right,
|
||||
|
||||
/// Creates an is-test on [operand] against [type].
|
||||
IsExpression createIsExpression(Expression operand, DartType type,
|
||||
{required bool forNonNullableByDefault, required int fileOffset}) {
|
||||
return new IsExpression(operand, type)
|
||||
..fileOffset = fileOffset
|
||||
..isForNonNullableByDefault = forNonNullableByDefault;
|
||||
{required int fileOffset}) {
|
||||
return new IsExpression(operand, type)..fileOffset = fileOffset;
|
||||
}
|
||||
|
||||
/// Creates an as-cast on [operand] against [type].
|
||||
@@ -192,7 +190,6 @@ AsExpression createAsExpression(Expression operand, DartType type,
|
||||
required int fileOffset}) {
|
||||
return new AsExpression(operand, type)
|
||||
..fileOffset = fileOffset
|
||||
..isForNonNullableByDefault = forNonNullableByDefault
|
||||
..isUnchecked = isUnchecked
|
||||
..isCovarianceCheck = isCovarianceCheck;
|
||||
}
|
||||
|
||||
@@ -3762,7 +3762,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase
|
||||
assert(fileOffset != TreeNode.noOffset);
|
||||
return new AsExpression(expression, type)
|
||||
..isTypeError = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = fileOffset;
|
||||
}
|
||||
|
||||
@@ -6276,7 +6275,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase
|
||||
binary = new AsExpression(binary, binaryType)
|
||||
..isTypeError = true
|
||||
..isCovarianceCheck = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = fileOffset;
|
||||
}
|
||||
break;
|
||||
@@ -6395,7 +6393,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase
|
||||
unary = new AsExpression(unary, unaryType)
|
||||
..isTypeError = true
|
||||
..isCovarianceCheck = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = fileOffset;
|
||||
}
|
||||
break;
|
||||
@@ -6538,7 +6535,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase
|
||||
read = new AsExpression(read, readType)
|
||||
..isTypeError = true
|
||||
..isCovarianceCheck = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = fileOffset;
|
||||
}
|
||||
break;
|
||||
@@ -8194,8 +8190,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase
|
||||
thisType!, node.interfaceTarget,
|
||||
hasNonObjectMemberAccess: true);
|
||||
DartType writeContext = writeTarget.getSetterType(this);
|
||||
writeContext = computeTypeFromSuperClass(
|
||||
node.interfaceTarget.enclosingClass!, writeContext);
|
||||
ExpressionInferenceResult rhsResult =
|
||||
inferExpression(node.value, writeContext, isVoidAllowed: true);
|
||||
rhsResult = ensureAssignableResult(writeContext, rhsResult,
|
||||
@@ -8214,8 +8208,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase
|
||||
hasNonObjectMemberAccess: true)
|
||||
: new ObjectAccessTarget.superMember(thisType!, node.interfaceTarget);
|
||||
DartType writeContext = writeTarget.getSetterType(this);
|
||||
writeContext = computeTypeFromSuperClass(
|
||||
node.interfaceTarget.enclosingClass!, writeContext);
|
||||
ExpressionInferenceResult rhsResult =
|
||||
inferExpression(node.value, writeContext, isVoidAllowed: true);
|
||||
rhsResult = ensureAssignableResult(writeContext, rhsResult,
|
||||
@@ -8508,7 +8500,6 @@ class InferenceVisitorImpl extends InferenceVisitorBase
|
||||
node.expression =
|
||||
new AsExpression(node.expression, coreTypes.objectNonNullableRawType)
|
||||
..isTypeError = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = node.expression.fileOffset
|
||||
..parent = node;
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@ import 'package:kernel/names.dart';
|
||||
import 'package:kernel/src/bounds_checks.dart'
|
||||
show calculateBounds, isGenericFunctionTypeOrAlias;
|
||||
import 'package:kernel/src/future_value_type.dart';
|
||||
import 'package:kernel/src/legacy_erasure.dart';
|
||||
import 'package:kernel/type_algebra.dart';
|
||||
import 'package:kernel/type_environment.dart';
|
||||
|
||||
@@ -452,7 +451,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
Expression asExpression =
|
||||
new AsExpression(expression, initialContextType)
|
||||
..isTypeError = true
|
||||
..isForNonNullableByDefault = true
|
||||
..isForDynamic = expressionType is DynamicType
|
||||
..fileOffset = fileOffset;
|
||||
flowAnalysis.forwardExpression(asExpression, expression);
|
||||
@@ -733,7 +731,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
? const NeverType.nonNullable()
|
||||
: contextType)
|
||||
..isTypeError = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = expression.fileOffset;
|
||||
if (contextType is! InvalidType && expressionType is! InvalidType) {
|
||||
errorNode = helper.wrapInProblem(
|
||||
@@ -1299,39 +1296,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
return null;
|
||||
}
|
||||
|
||||
/// Returns [type] as passed from [superClass] to the current class.
|
||||
///
|
||||
/// If a legacy class occurs between the current class and [superClass] then
|
||||
/// [type] needs to be legacy erased. For instance
|
||||
///
|
||||
/// // Opt in:
|
||||
/// class Super {
|
||||
/// int extendedMethod(int i, {required int j}) => i;
|
||||
/// }
|
||||
/// class Mixin {
|
||||
/// int mixedInMethod(int i, {required int j}) => i;
|
||||
/// }
|
||||
/// // Opt out:
|
||||
/// class Legacy extends Super with Mixin {}
|
||||
/// // Opt in:
|
||||
/// class Class extends Legacy {
|
||||
/// test() {
|
||||
/// // Ok to call `Legacy.extendedMethod` since its type is
|
||||
/// // `int* Function(int*, {int* j})`.
|
||||
/// super.extendedMethod(null);
|
||||
/// // Ok to call `Legacy.mixedInMethod` since its type is
|
||||
/// // `int* Function(int*, {int* j})`.
|
||||
/// super.mixedInMethod(null);
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
DartType computeTypeFromSuperClass(Class superClass, DartType type) {
|
||||
if (needsLegacyErasure(thisType!.classNode, superClass)) {
|
||||
type = legacyErasure(type);
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
/// Returns the getter type of [interfaceMember] on a receiver of type
|
||||
/// [receiverType].
|
||||
///
|
||||
@@ -1434,8 +1398,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
DartType inferDeclarationType(DartType initializerType,
|
||||
{bool forSyntheticVariable = false}) {
|
||||
if (forSyntheticVariable) {
|
||||
return normalizeNullabilityInLibrary(
|
||||
initializerType, libraryBuilder.library);
|
||||
return initializerType;
|
||||
} else if (initializerType is NullType) {
|
||||
// If the initializer type is Null or bottom, the inferred type is
|
||||
// dynamic.
|
||||
@@ -1921,10 +1884,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
calleeType = replaceReturnType(
|
||||
calleeType,
|
||||
typeSchemaEnvironment.getTypeOfSpecialCasedTernaryOperator(
|
||||
receiverType!,
|
||||
actualTypes[0],
|
||||
actualTypes[1],
|
||||
libraryBuilder.library));
|
||||
receiverType!, actualTypes[0], actualTypes[1]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2690,7 +2650,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
replacement = new AsExpression(expression, result.inferredType)
|
||||
..isTypeError = true
|
||||
..isCovarianceCheck = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = fileOffset;
|
||||
if (instrumentation != null) {
|
||||
int offset =
|
||||
@@ -2821,7 +2780,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
propertyGet = new AsExpression(propertyGet, calleeType)
|
||||
..isTypeError = true
|
||||
..isCovarianceCheck = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = fileOffset;
|
||||
if (instrumentation != null) {
|
||||
int offset =
|
||||
@@ -3010,7 +2968,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
propertyGet = new AsExpression(propertyGet, calleeType)
|
||||
..isTypeError = true
|
||||
..isCovarianceCheck = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = fileOffset;
|
||||
if (instrumentation != null) {
|
||||
int offset =
|
||||
@@ -3333,7 +3290,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
type) ??
|
||||
type;
|
||||
Expression read = new AsExpression(receiver, type)
|
||||
..isForNonNullableByDefault = true
|
||||
..isUnchecked = true
|
||||
..fileOffset = fileOffset;
|
||||
ExpressionInferenceResult readResult =
|
||||
@@ -3444,11 +3400,8 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
DartType receiverType = thisType!;
|
||||
bool isSpecialCasedBinaryOperator =
|
||||
target.isSpecialCasedBinaryOperator(this);
|
||||
DartType calleeType = computeTypeFromSuperClass(
|
||||
procedure.enclosingClass!, target.getGetterType(this));
|
||||
FunctionType functionType = computeTypeFromSuperClass(
|
||||
procedure.enclosingClass!, target.getFunctionType(this))
|
||||
as FunctionType;
|
||||
DartType calleeType = target.getGetterType(this);
|
||||
FunctionType functionType = target.getFunctionType(this);
|
||||
if (methodName == equalsName &&
|
||||
functionType.positionalParameters.length == 1) {
|
||||
// operator == always allows nullable arguments.
|
||||
@@ -3480,8 +3433,7 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
? new ObjectAccessTarget.interfaceMember(thisType!, member,
|
||||
hasNonObjectMemberAccess: true)
|
||||
: new ObjectAccessTarget.superMember(thisType!, member);
|
||||
DartType inferredType = computeTypeFromSuperClass(
|
||||
member.enclosingClass!, readTarget.getGetterType(this));
|
||||
DartType inferredType = readTarget.getGetterType(this);
|
||||
if (member is Procedure && member.kind == ProcedureKind.Method) {
|
||||
return instantiateTearOff(inferredType, typeContext, expression);
|
||||
}
|
||||
@@ -4068,7 +4020,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
read = new AsExpression(read, readType)
|
||||
..isTypeError = true
|
||||
..isCovarianceCheck = true
|
||||
..isForNonNullableByDefault = true
|
||||
..fileOffset = fileOffset;
|
||||
}
|
||||
if (member is Procedure && member.kind == ProcedureKind.Method) {
|
||||
@@ -4090,7 +4041,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
case ObjectAccessTargetKind.extensionTypeRepresentation:
|
||||
case ObjectAccessTargetKind.nullableExtensionTypeRepresentation:
|
||||
read = new AsExpression(receiver, readType)
|
||||
..isForNonNullableByDefault = true
|
||||
..isUnchecked = true
|
||||
..fileOffset = fileOffset;
|
||||
break;
|
||||
@@ -4098,7 +4048,6 @@ abstract class InferenceVisitorBase implements InferenceVisitor {
|
||||
|
||||
if (promotedReadType != null) {
|
||||
read = new AsExpression(read, promotedReadType)
|
||||
..isForNonNullableByDefault = true
|
||||
..isUnchecked = true
|
||||
..fileOffset = fileOffset;
|
||||
readType = promotedReadType;
|
||||
|
||||
@@ -43,24 +43,6 @@ DartType demoteTypeInLibrary(DartType type,
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns [type] normalized to the known nullabilities of [library].
|
||||
///
|
||||
/// If [library] is non-nullable by default [type] returned (non-nullable
|
||||
/// libraries can handle all kinds of nullability). Otherwise all
|
||||
/// non-legacy types have been replaced with legacy types (legacy libraries
|
||||
/// can only handle legacy types).
|
||||
DartType normalizeNullabilityInLibrary(DartType type, Library library) {
|
||||
if (library.isNonNullableByDefault) {
|
||||
return type;
|
||||
} else {
|
||||
return type.accept1(
|
||||
const _DemotionNullabilityNormalization(
|
||||
demoteTypeVariables: false, forNonNullableByDefault: false),
|
||||
Variance.covariant) ??
|
||||
type;
|
||||
}
|
||||
}
|
||||
|
||||
/// Visitor that replaces all promoted type variables the type variable itself
|
||||
/// and normalizes the type nullabilities.
|
||||
///
|
||||
|
||||
@@ -447,15 +447,8 @@ String procedureType(Procedure procedure) {
|
||||
return typeToText(procedure.function.positionalParameters.single.type,
|
||||
TypeRepresentation.analyzerNonNullableByDefault);
|
||||
} else {
|
||||
Nullability functionTypeNullability;
|
||||
if (procedure.enclosingLibrary.isNonNullableByDefault) {
|
||||
functionTypeNullability = procedure.enclosingLibrary.nonNullable;
|
||||
} else {
|
||||
// We don't create a member signature when the member is just
|
||||
// a substitution. We should still take the nullability to be
|
||||
// legacy, though.
|
||||
functionTypeNullability = procedure.enclosingLibrary.nonNullable;
|
||||
}
|
||||
Nullability functionTypeNullability =
|
||||
procedure.enclosingLibrary.nonNullable;
|
||||
return typeToText(
|
||||
procedure.function.computeThisFunctionType(functionTypeNullability),
|
||||
TypeRepresentation.analyzerNonNullableByDefault);
|
||||
|
||||
@@ -396,7 +396,7 @@ class TypeConstraintGathererTest {
|
||||
coreTypes, new ClassHierarchy(component, coreTypes));
|
||||
var typeConstraintGatherer = new TypeConstraintGatherer(
|
||||
typeSchemaEnvironment, typeParameterNodesToConstrain,
|
||||
isNonNullableByDefault: testLibrary.isNonNullableByDefault,
|
||||
isNonNullableByDefault: true,
|
||||
typeOperations: new OperationsCfe(typeSchemaEnvironment,
|
||||
omittedNullabilityValue: Nullability.nonNullable,
|
||||
fieldNonPromotabilityInfo: new FieldNonPromotabilityInfo(
|
||||
@@ -407,7 +407,7 @@ class TypeConstraintGathererTest {
|
||||
inferenceResultForTesting: null);
|
||||
var constraints = tryConstrain(typeConstraintGatherer, a, b)
|
||||
? typeConstraintGatherer.computeConstraints(
|
||||
isNonNullableByDefault: clientLibrary.isNonNullableByDefault)
|
||||
isNonNullableByDefault: true)
|
||||
: null;
|
||||
if (expectedConstraints == null) {
|
||||
expect(constraints, isNull);
|
||||
|
||||
@@ -304,7 +304,7 @@ class TypeConstraintGathererTest {
|
||||
coreTypes, new ClassHierarchy(component, coreTypes));
|
||||
var typeConstraintGatherer = new TypeConstraintGatherer(
|
||||
typeSchemaEnvironment, typeParameterNodesToConstrain,
|
||||
isNonNullableByDefault: testLibrary.isNonNullableByDefault,
|
||||
isNonNullableByDefault: true,
|
||||
typeOperations: new OperationsCfe(typeSchemaEnvironment,
|
||||
omittedNullabilityValue: Nullability.nonNullable,
|
||||
fieldNonPromotabilityInfo: new FieldNonPromotabilityInfo(
|
||||
@@ -315,7 +315,7 @@ class TypeConstraintGathererTest {
|
||||
inferenceResultForTesting: null);
|
||||
var constraints = tryConstrain(typeConstraintGatherer, a, b)
|
||||
? typeConstraintGatherer.computeConstraints(
|
||||
isNonNullableByDefault: clientLibrary.isNonNullableByDefault)
|
||||
isNonNullableByDefault: true)
|
||||
: null;
|
||||
if (expectedConstraints == null) {
|
||||
expect(constraints, isNull);
|
||||
|
||||
@@ -2013,7 +2013,7 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
|
||||
}
|
||||
expect(
|
||||
typeSchemaEnvironment.getStandardUpperBound(dartType1, dartType2,
|
||||
isNonNullableByDefault: testLibrary.isNonNullableByDefault),
|
||||
isNonNullableByDefault: true),
|
||||
parseType(upperBound));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -554,7 +554,7 @@ class TypeSchemaEnvironmentTest extends TypeSchemaEnvironmentTestBase {
|
||||
expect(
|
||||
typeSchemaEnvironment.getStandardUpperBound(
|
||||
parseType(type1), parseType(type2),
|
||||
isNonNullableByDefault: testLibrary.isNonNullableByDefault),
|
||||
isNonNullableByDefault: false),
|
||||
parseType(upperBound));
|
||||
});
|
||||
}
|
||||
|
||||
@@ -56,7 +56,7 @@ abstract class LegacyUpperBoundTest {
|
||||
void checkLegacyUp(String type1, String type2, String expectedType) {
|
||||
checkLegacyUpTypes(
|
||||
env.parseType(type1), env.parseType(type2), env.parseType(expectedType),
|
||||
isNonNullableByDefault: testLibrary.isNonNullableByDefault);
|
||||
isNonNullableByDefault: true);
|
||||
}
|
||||
|
||||
Future<void> test() {
|
||||
|
||||
@@ -97,7 +97,8 @@ class InheritanceDataExtractor extends CfeDataExtractor<String> {
|
||||
|
||||
@override
|
||||
String computeLibraryValue(Id id, Library node) {
|
||||
return 'nnbd=${node.isNonNullableByDefault}';
|
||||
// TODO(johnniwinther): Remove this.
|
||||
return 'nnbd=true';
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -126,8 +127,7 @@ class InheritanceDataExtractor extends CfeDataExtractor<String> {
|
||||
InterfaceType supertype = _hierarchy.getInterfaceTypeAsInstanceOfClass(
|
||||
_coreTypes.thisInterfaceType(node, node.enclosingLibrary.nonNullable),
|
||||
member.enclosingClass!,
|
||||
isNonNullableByDefault:
|
||||
node.enclosingLibrary.isNonNullableByDefault)!;
|
||||
isNonNullableByDefault: true)!;
|
||||
Substitution substitution = Substitution.fromInterfaceType(supertype);
|
||||
DartType? type;
|
||||
if (member is Procedure) {
|
||||
@@ -137,15 +137,8 @@ class InheritanceDataExtractor extends CfeDataExtractor<String> {
|
||||
type = substitution
|
||||
.substituteType(member.function.positionalParameters.single.type);
|
||||
} else {
|
||||
Nullability functionTypeNullability;
|
||||
if (node.enclosingLibrary.isNonNullableByDefault) {
|
||||
functionTypeNullability = member.enclosingLibrary.nonNullable;
|
||||
} else {
|
||||
// We don't create a member signature when the member is just
|
||||
// a substitution. We should still take the nullability to be
|
||||
// legacy, though.
|
||||
functionTypeNullability = node.enclosingLibrary.nonNullable;
|
||||
}
|
||||
Nullability functionTypeNullability =
|
||||
member.enclosingLibrary.nonNullable;
|
||||
type = substitution.substituteType(
|
||||
member.function.computeThisFunctionType(functionTypeNullability));
|
||||
}
|
||||
|
||||
@@ -2832,8 +2832,7 @@ void doSimulateTransformer(Component c) {
|
||||
getterReference: lib.reference.canonicalName
|
||||
?.getChildFromFieldGetterWithName(fieldName)
|
||||
.reference,
|
||||
fileUri: lib.fileUri)
|
||||
..isNonNullableByDefault = lib.isNonNullableByDefault;
|
||||
fileUri: lib.fileUri);
|
||||
lib.addField(field);
|
||||
for (Class c in lib.classes) {
|
||||
if (c.fields
|
||||
@@ -2851,8 +2850,7 @@ void doSimulateTransformer(Component c) {
|
||||
getterReference: c.reference.canonicalName
|
||||
?.getChildFromFieldGetterWithName(fieldName)
|
||||
.reference,
|
||||
fileUri: c.fileUri)
|
||||
..isNonNullableByDefault = lib.isNonNullableByDefault;
|
||||
fileUri: c.fileUri);
|
||||
c.addField(field);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -116,7 +116,8 @@ class PatchingDataExtractor extends CfeDataExtractor<Features> {
|
||||
@override
|
||||
Features computeLibraryValue(Id id, Library library) {
|
||||
Features features = new Features();
|
||||
features[Tags.isNonNullableByDefault] = '${library.isNonNullableByDefault}';
|
||||
// TODO(johnniwinther): Remove this.
|
||||
features[Tags.isNonNullableByDefault] = 'true';
|
||||
return features;
|
||||
}
|
||||
|
||||
|
||||
@@ -78,7 +78,8 @@ class StaticTypeDataExtractor extends CfeDataExtractor<String> {
|
||||
|
||||
@override
|
||||
String computeLibraryValue(Id id, Library node) {
|
||||
return 'nnbd=${node.isNonNullableByDefault}';
|
||||
// TODO(johnniwinther): Remove this.
|
||||
return 'nnbd=true';
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -349,11 +349,11 @@ exprNewGeneric() => new GenericClass<int, bool>();
|
||||
exprNewGenericNamed() => new GenericClass<int, bool>.named();
|
||||
|
||||
/*normal|limited.member: exprIs:o is List<int>*/
|
||||
/*verbose.member: exprIs:o is{ForNonNullableByDefault} dart.core::List<dart.core::int>*/
|
||||
/*verbose.member: exprIs:o is dart.core::List<dart.core::int>*/
|
||||
exprIs(o) => o is List<int>;
|
||||
|
||||
/*normal|limited.member: exprAs:o as List<int>*/
|
||||
/*verbose.member: exprAs:o as{ForNonNullableByDefault} dart.core::List<dart.core::int>*/
|
||||
/*verbose.member: exprAs:o as dart.core::List<dart.core::int>*/
|
||||
exprAs(o) => o as List<int>;
|
||||
|
||||
/*member: exprNullCheck:o!*/
|
||||
|
||||
@@ -128,7 +128,8 @@ class TextRepresentationDataExtractor extends CfeDataExtractor<String> {
|
||||
|
||||
@override
|
||||
String computeLibraryValue(Id id, Library node) {
|
||||
return 'nnbd=${node.isNonNullableByDefault}';
|
||||
// TODO(johnniwinther): Remove this.
|
||||
return 'nnbd=true';
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -100,9 +100,7 @@ void main() {
|
||||
|
||||
final Library firstLib = component.libraries.first;
|
||||
expect(firstLib.importUri != _nativeAssetsLibraryUri, true);
|
||||
expect(nativeAssetsLibrary!.isNonNullableByDefault,
|
||||
firstLib.isNonNullableByDefault);
|
||||
expect(nativeAssetsLibrary.nonNullable, firstLib.nonNullable);
|
||||
expect(nativeAssetsLibrary!.nonNullable, firstLib.nonNullable);
|
||||
expect(nativeAssetsLibrary.nonNullableByDefaultCompiledMode,
|
||||
firstLib.nonNullableByDefaultCompiledMode);
|
||||
|
||||
|
||||
+7
-10
@@ -147,7 +147,7 @@ type CanonicalName {
|
||||
|
||||
type ComponentFile {
|
||||
UInt32 magic = 0x90ABCDEF;
|
||||
UInt32 formatVersion = 117;
|
||||
UInt32 formatVersion = 118;
|
||||
Byte[10] shortSdkHash;
|
||||
List<String> problemsAsJson; // Described in problems.md.
|
||||
Library[] libraries;
|
||||
@@ -242,7 +242,7 @@ type Name {
|
||||
}
|
||||
|
||||
type Library {
|
||||
Byte flags (isSynthetic, isLegacy, nnbdModeBit1, nnbdModeBit2, isUnsupported);
|
||||
Byte flags (isSynthetic, nnbdModeBit1, nnbdModeBit2, isUnsupported);
|
||||
UInt languageVersionMajor;
|
||||
UInt languageVersionMinor;
|
||||
CanonicalNameReference canonicalName;
|
||||
@@ -401,8 +401,7 @@ type Field extends Member {
|
||||
FileOffset fileEndOffset;
|
||||
UInt flags (isFinal, isConst, isStatic, isCovariantByDeclaration,
|
||||
isCovariantByClass, isLate, isExtensionMember,
|
||||
isLegacy, isInternalImplementation,
|
||||
isEnumElement, isExtensionTypeMember);
|
||||
isInternalImplementation, isEnumElement, isExtensionTypeMember);
|
||||
Name name;
|
||||
List<Expression> annotations;
|
||||
DartType type;
|
||||
@@ -416,7 +415,7 @@ type Constructor extends Member {
|
||||
FileOffset startFileOffset; // Offset of the start of the constructor including any annotations.
|
||||
FileOffset fileOffset; // Offset of the constructor name.
|
||||
FileOffset fileEndOffset;
|
||||
Byte flags (isConst, isExternal, isSynthetic, isLegacy);
|
||||
Byte flags (isConst, isExternal, isSynthetic);
|
||||
Name name;
|
||||
List<Expression> annotations;
|
||||
FunctionNode function;
|
||||
@@ -456,9 +455,8 @@ type Procedure extends Member {
|
||||
Byte kind; // Index into the ProcedureKind enum above.
|
||||
Byte stubKind; // Index into the ProcedureStubKind enum above.
|
||||
UInt flags (isStatic, isAbstract, isExternal, isConst,
|
||||
isExtensionMember, isLegacy, isSynthetic,
|
||||
isInternalImplementation, isExtensionTypeMember,
|
||||
hasWeakTearoffReferencePragma, IsLoweredLateField);
|
||||
isExtensionMember, isSynthetic, isInternalImplementation,
|
||||
isExtensionTypeMember, hasWeakTearoffReferencePragma, IsLoweredLateField);
|
||||
Name name;
|
||||
List<Expression> annotations;
|
||||
MemberReference stubTarget; // May be NullReference.
|
||||
@@ -990,7 +988,6 @@ type FileUriExpression extends Expression {
|
||||
type IsExpression extends Expression {
|
||||
Byte tag = 37;
|
||||
FileOffset fileOffset;
|
||||
Byte flags (isLegacy);
|
||||
Expression operand;
|
||||
DartType type;
|
||||
}
|
||||
@@ -998,7 +995,7 @@ type IsExpression extends Expression {
|
||||
type AsExpression extends Expression {
|
||||
Byte tag = 38;
|
||||
FileOffset fileOffset;
|
||||
Byte flags (isTypeError,isCovarianceCheck,isForDynamic,isForNonNullableByDefault);
|
||||
Byte flags (isTypeError,isCovarianceCheck,isForDynamic,isUnchecked);
|
||||
Expression operand;
|
||||
DartType type;
|
||||
}
|
||||
|
||||
+18
-95
@@ -290,10 +290,10 @@ class Library extends NamedNode
|
||||
}
|
||||
|
||||
static const int SyntheticFlag = 1 << 0;
|
||||
static const int LegacyFlag = 1 << 1;
|
||||
static const int NonNullableByDefaultModeBit1 = 1 << 2;
|
||||
static const int NonNullableByDefaultModeBit2 = 1 << 3;
|
||||
static const int IsUnsupportedFlag = 1 << 4;
|
||||
|
||||
static const int NonNullableByDefaultModeBit1 = 1 << 1;
|
||||
static const int NonNullableByDefaultModeBit2 = 1 << 2;
|
||||
static const int IsUnsupportedFlag = 1 << 3;
|
||||
|
||||
int flags = 0;
|
||||
|
||||
@@ -304,11 +304,6 @@ class Library extends NamedNode
|
||||
flags = value ? (flags | SyntheticFlag) : (flags & ~SyntheticFlag);
|
||||
}
|
||||
|
||||
bool get isNonNullableByDefault => (flags & LegacyFlag) == 0;
|
||||
void set isNonNullableByDefault(bool value) {
|
||||
flags = value ? (flags & ~LegacyFlag) : (flags | LegacyFlag);
|
||||
}
|
||||
|
||||
NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode {
|
||||
bool bit1 = (flags & NonNullableByDefaultModeBit1) != 0;
|
||||
bool bit2 = (flags & NonNullableByDefaultModeBit2) != 0;
|
||||
@@ -465,15 +460,9 @@ class Library extends NamedNode
|
||||
_fields = fields;
|
||||
}
|
||||
|
||||
Nullability get nullable {
|
||||
return isNonNullableByDefault ? Nullability.nullable : Nullability.legacy;
|
||||
}
|
||||
Nullability get nullable => Nullability.nullable;
|
||||
|
||||
Nullability get nonNullable {
|
||||
return isNonNullableByDefault
|
||||
? Nullability.nonNullable
|
||||
: Nullability.legacy;
|
||||
}
|
||||
Nullability get nonNullable => Nullability.nonNullable;
|
||||
|
||||
/// Returns the top-level fields and procedures defined in this library.
|
||||
///
|
||||
@@ -2193,10 +2182,6 @@ sealed class Member extends NamedNode implements Annotatable, FileUriNode {
|
||||
///
|
||||
bool get isExtensionTypeMember;
|
||||
|
||||
/// If `true` this member is defined in a library for which non-nullable by
|
||||
/// default is enabled.
|
||||
bool get isNonNullableByDefault;
|
||||
|
||||
/// If `true` this procedure is not part of the interface but only part of the
|
||||
/// class members.
|
||||
///
|
||||
@@ -2420,10 +2405,9 @@ class Field extends Member {
|
||||
static const int FlagCovariantByClass = 1 << 4;
|
||||
static const int FlagLate = 1 << 5;
|
||||
static const int FlagExtensionMember = 1 << 6;
|
||||
static const int FlagLegacy = 1 << 7;
|
||||
static const int FlagInternalImplementation = 1 << 8;
|
||||
static const int FlagEnumElement = 1 << 9;
|
||||
static const int FlagExtensionTypeMember = 1 << 10;
|
||||
static const int FlagInternalImplementation = 1 << 7;
|
||||
static const int FlagEnumElement = 1 << 8;
|
||||
static const int FlagExtensionTypeMember = 1 << 9;
|
||||
|
||||
/// Whether the field is declared with the `covariant` keyword.
|
||||
bool get isCovariantByDeclaration => flags & FlagCovariant != 0;
|
||||
@@ -2529,13 +2513,6 @@ class Field extends Member {
|
||||
@override
|
||||
bool get isExternal => false;
|
||||
|
||||
@override
|
||||
bool get isNonNullableByDefault => flags & FlagLegacy == 0;
|
||||
|
||||
void set isNonNullableByDefault(bool value) {
|
||||
flags = value ? (flags & ~FlagLegacy) : (flags | FlagLegacy);
|
||||
}
|
||||
|
||||
@override
|
||||
R accept<R>(MemberVisitor<R> v) => v.visitField(this);
|
||||
|
||||
@@ -2650,7 +2627,6 @@ class Constructor extends Member {
|
||||
static const int FlagConst = 1 << 0; // Must match serialized bit positions.
|
||||
static const int FlagExternal = 1 << 1;
|
||||
static const int FlagSynthetic = 1 << 2;
|
||||
static const int FlagLegacy = 1 << 3;
|
||||
|
||||
@override
|
||||
bool get isConst => flags & FlagConst != 0;
|
||||
@@ -2689,13 +2665,6 @@ class Constructor extends Member {
|
||||
@override
|
||||
bool get isExtensionTypeMember => false;
|
||||
|
||||
@override
|
||||
bool get isNonNullableByDefault => flags & FlagLegacy == 0;
|
||||
|
||||
void set isNonNullableByDefault(bool value) {
|
||||
flags = value ? (flags & ~FlagLegacy) : (flags | FlagLegacy);
|
||||
}
|
||||
|
||||
@override
|
||||
R accept<R>(MemberVisitor<R> v) => v.visitConstructor(this);
|
||||
|
||||
@@ -3098,11 +3067,10 @@ class Procedure extends Member implements GenericFunction {
|
||||
static const int FlagExternal = 1 << 2;
|
||||
static const int FlagConst = 1 << 3; // Only for external const factories.
|
||||
static const int FlagExtensionMember = 1 << 4;
|
||||
static const int FlagLegacy = 1 << 5;
|
||||
static const int FlagSynthetic = 1 << 6;
|
||||
static const int FlagInternalImplementation = 1 << 7;
|
||||
static const int FlagExtensionTypeMember = 1 << 8;
|
||||
static const int FlagHasWeakTearoffReferencePragma = 1 << 9;
|
||||
static const int FlagSynthetic = 1 << 5;
|
||||
static const int FlagInternalImplementation = 1 << 6;
|
||||
static const int FlagExtensionTypeMember = 1 << 7;
|
||||
static const int FlagHasWeakTearoffReferencePragma = 1 << 8;
|
||||
|
||||
bool get isStatic => flags & FlagStatic != 0;
|
||||
|
||||
@@ -3222,13 +3190,6 @@ class Procedure extends Member implements GenericFunction {
|
||||
|
||||
bool get isFactory => kind == ProcedureKind.Factory;
|
||||
|
||||
@override
|
||||
bool get isNonNullableByDefault => flags & FlagLegacy == 0;
|
||||
|
||||
void set isNonNullableByDefault(bool value) {
|
||||
flags = value ? (flags & ~FlagLegacy) : (flags | FlagLegacy);
|
||||
}
|
||||
|
||||
Member? get concreteForwardingStubTarget =>
|
||||
stubKind == ProcedureStubKind.ConcreteForwardingStub
|
||||
? stubTargetReference?.asMember
|
||||
@@ -7501,7 +7462,6 @@ class FileUriExpression extends Expression implements FileUriNode {
|
||||
|
||||
/// Expression of form `x is T`.
|
||||
class IsExpression extends Expression {
|
||||
int flags = 0;
|
||||
Expression operand;
|
||||
DartType type;
|
||||
|
||||
@@ -7509,19 +7469,6 @@ class IsExpression extends Expression {
|
||||
operand.parent = this;
|
||||
}
|
||||
|
||||
// Must match serialized bit positions.
|
||||
static const int FlagForLegacy = 1 << 0;
|
||||
|
||||
/// If `true`, this test take the nullability of [type] into account.
|
||||
///
|
||||
/// This is the case for is-tests written in libraries that are opted in to
|
||||
/// the non nullable by default feature.
|
||||
bool get isForNonNullableByDefault => flags & FlagForLegacy == 0;
|
||||
|
||||
void set isForNonNullableByDefault(bool value) {
|
||||
flags = value ? (flags & ~FlagForLegacy) : (flags | FlagForLegacy);
|
||||
}
|
||||
|
||||
@override
|
||||
DartType getStaticType(StaticTypeContext context) =>
|
||||
getStaticTypeInternal(context);
|
||||
@@ -7566,11 +7513,7 @@ class IsExpression extends Expression {
|
||||
void toTextInternal(AstPrinter printer) {
|
||||
printer.writeExpression(operand,
|
||||
minimumPrecedence: astToText.Precedence.BITWISE_OR);
|
||||
printer.write(' is');
|
||||
if (printer.includeAuxiliaryProperties && isForNonNullableByDefault) {
|
||||
printer.write('{ForNonNullableByDefault}');
|
||||
}
|
||||
printer.write(' ');
|
||||
printer.write(' is ');
|
||||
printer.writeType(type);
|
||||
}
|
||||
}
|
||||
@@ -7589,8 +7532,7 @@ class AsExpression extends Expression {
|
||||
static const int FlagTypeError = 1 << 0;
|
||||
static const int FlagCovarianceCheck = 1 << 1;
|
||||
static const int FlagForDynamic = 1 << 2;
|
||||
static const int FlagForLegacy = 1 << 3;
|
||||
static const int FlagUnchecked = 1 << 4;
|
||||
static const int FlagUnchecked = 1 << 3;
|
||||
|
||||
/// If `true`, this test is an implicit down cast.
|
||||
///
|
||||
@@ -7635,16 +7577,6 @@ class AsExpression extends Expression {
|
||||
flags = value ? (flags | FlagForDynamic) : (flags & ~FlagForDynamic);
|
||||
}
|
||||
|
||||
/// If `true`, this test take the nullability of [type] into account.
|
||||
///
|
||||
/// This is the case for is-tests written in libraries that are opted in to
|
||||
/// the non nullable by default feature.
|
||||
bool get isForNonNullableByDefault => flags & FlagForLegacy == 0;
|
||||
|
||||
void set isForNonNullableByDefault(bool value) {
|
||||
flags = value ? (flags & ~FlagForLegacy) : (flags | FlagForLegacy);
|
||||
}
|
||||
|
||||
/// If `true`, this test is added to show the known static type of the
|
||||
/// expression and should not be performed at runtime.
|
||||
///
|
||||
@@ -7714,9 +7646,6 @@ class AsExpression extends Expression {
|
||||
if (isForDynamic) {
|
||||
flags.add('ForDynamic');
|
||||
}
|
||||
if (isForNonNullableByDefault) {
|
||||
flags.add('ForNonNullableByDefault');
|
||||
}
|
||||
if (flags.isNotEmpty) {
|
||||
printer.write('{${flags.join(',')}}');
|
||||
}
|
||||
@@ -8089,9 +8018,7 @@ class Rethrow extends Expression {
|
||||
|
||||
@override
|
||||
DartType getStaticTypeInternal(StaticTypeContext context) =>
|
||||
context.isNonNullableByDefault
|
||||
? const NeverType.nonNullable()
|
||||
: const NeverType.legacy();
|
||||
const NeverType.nonNullable();
|
||||
|
||||
@override
|
||||
R accept<R>(ExpressionVisitor<R> v) => v.visitRethrow(this);
|
||||
@@ -8150,9 +8077,7 @@ class Throw extends Expression {
|
||||
|
||||
@override
|
||||
DartType getStaticTypeInternal(StaticTypeContext context) =>
|
||||
context.isNonNullableByDefault
|
||||
? const NeverType.nonNullable()
|
||||
: const NeverType.legacy();
|
||||
const NeverType.nonNullable();
|
||||
|
||||
@override
|
||||
R accept<R>(ExpressionVisitor<R> v) => v.visitThrow(this);
|
||||
@@ -12632,9 +12557,7 @@ class TypeParameterType extends DartType {
|
||||
/// the bound of [parameter].
|
||||
TypeParameterType.withDefaultNullabilityForLibrary(
|
||||
this.parameter, Library library)
|
||||
: declaredNullability = library.isNonNullableByDefault
|
||||
? computeNullabilityFromBound(parameter)
|
||||
: Nullability.legacy;
|
||||
: declaredNullability = computeNullabilityFromBound(parameter);
|
||||
|
||||
@override
|
||||
DartType get nonTypeVariableBound {
|
||||
|
||||
@@ -2745,10 +2745,8 @@ class BinaryBuilder {
|
||||
|
||||
Expression _readIsExpression() {
|
||||
int offset = readOffset();
|
||||
int flags = readByte();
|
||||
return new IsExpression(readExpression(), readDartType())
|
||||
..fileOffset = offset
|
||||
..flags = flags;
|
||||
..fileOffset = offset;
|
||||
}
|
||||
|
||||
Expression _readAsExpression() {
|
||||
|
||||
@@ -1974,7 +1974,6 @@ class BinaryPrinter implements Visitor<void>, BinarySink {
|
||||
void visitIsExpression(IsExpression node) {
|
||||
writeByte(Tag.IsExpression);
|
||||
writeOffset(node.fileOffset);
|
||||
writeByte(node.flags);
|
||||
writeNode(node.operand);
|
||||
writeNode(node.type);
|
||||
}
|
||||
|
||||
@@ -226,7 +226,7 @@ class Tag {
|
||||
/// Internal version of kernel binary format.
|
||||
/// Bump it when making incompatible changes in kernel binaries.
|
||||
/// Keep in sync with runtime/vm/kernel_binary.h, pkg/kernel/binary.md.
|
||||
static const int BinaryFormatVersion = 117;
|
||||
static const int BinaryFormatVersion = 118;
|
||||
}
|
||||
|
||||
abstract class ConstantTag {
|
||||
|
||||
@@ -1964,31 +1964,18 @@ class _ClassInfo {
|
||||
HandleAmbiguousSupertypes onAmbiguousSupertypes) {
|
||||
Supertype? canonical = genericSuperType![cls];
|
||||
if (canonical == null) {
|
||||
if (!classNode.enclosingLibrary.isNonNullableByDefault) {
|
||||
canonical = legacyErasureSupertype(type);
|
||||
} else {
|
||||
canonical = type;
|
||||
}
|
||||
canonical = type;
|
||||
genericSuperType![cls] = canonical;
|
||||
genericSuperTypes![cls] = <Supertype>[type];
|
||||
} else {
|
||||
genericSuperTypes![cls]!.add(type);
|
||||
|
||||
if (classNode.enclosingLibrary.isNonNullableByDefault) {
|
||||
Supertype? result = nnbdTopMergeSupertype(
|
||||
coreTypes,
|
||||
normSupertype(coreTypes, type),
|
||||
normSupertype(coreTypes, canonical));
|
||||
if (result == null) {
|
||||
onAmbiguousSupertypes(classNode, canonical, type);
|
||||
} else {
|
||||
genericSuperType![cls] = result;
|
||||
}
|
||||
Supertype? result = nnbdTopMergeSupertype(coreTypes,
|
||||
normSupertype(coreTypes, type), normSupertype(coreTypes, canonical));
|
||||
if (result == null) {
|
||||
onAmbiguousSupertypes(classNode, canonical, type);
|
||||
} else {
|
||||
type = legacyErasureSupertype(type);
|
||||
if (type != canonical) {
|
||||
onAmbiguousSupertypes(classNode, canonical, type);
|
||||
}
|
||||
genericSuperType![cls] = result;
|
||||
}
|
||||
}
|
||||
assert(genericSuperType!.containsKey(cls),
|
||||
|
||||
@@ -303,8 +303,7 @@ class CloneVisitorNotMembers implements TreeVisitor<TreeNode> {
|
||||
|
||||
@override
|
||||
TreeNode visitIsExpression(IsExpression node) {
|
||||
return new IsExpression(clone(node.operand), visitType(node.type))
|
||||
..flags = node.flags;
|
||||
return new IsExpression(clone(node.operand), visitType(node.type));
|
||||
}
|
||||
|
||||
@override
|
||||
|
||||
@@ -3097,9 +3097,6 @@ class EquivalenceStrategy {
|
||||
if (other is! IsExpression) return false;
|
||||
visitor.pushNodeState(node, other);
|
||||
bool result = true;
|
||||
if (!checkIsExpression_flags(visitor, node, other)) {
|
||||
result = visitor.resultOnInequivalence;
|
||||
}
|
||||
if (!checkIsExpression_operand(visitor, node, other)) {
|
||||
result = visitor.resultOnInequivalence;
|
||||
}
|
||||
@@ -7457,11 +7454,6 @@ class EquivalenceStrategy {
|
||||
return checkExpression_fileOffset(visitor, node, other);
|
||||
}
|
||||
|
||||
bool checkIsExpression_flags(
|
||||
EquivalenceVisitor visitor, IsExpression node, IsExpression other) {
|
||||
return visitor.checkValues(node.flags, other.flags, 'flags');
|
||||
}
|
||||
|
||||
bool checkIsExpression_operand(
|
||||
EquivalenceVisitor visitor, IsExpression node, IsExpression other) {
|
||||
return visitor.checkNodes(node.operand, other.operand, 'operand');
|
||||
|
||||
@@ -72,47 +72,3 @@ class _LegacyErasure extends ReplacementVisitor {
|
||||
return const NullType();
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns `true` if a member declared in [declaringClass] inherited or
|
||||
/// mixed into [enclosingClass] needs legacy erasure to compute its inherited
|
||||
/// type.
|
||||
///
|
||||
/// For instance:
|
||||
///
|
||||
/// // Opt in:
|
||||
/// class Super {
|
||||
/// int extendedMethod(int i, {required int j}) => i;
|
||||
/// }
|
||||
/// class Mixin {
|
||||
/// int mixedInMethod(int i, {required int j}) => i;
|
||||
/// }
|
||||
/// // Opt out:
|
||||
/// class Legacy extends Super with Mixin {}
|
||||
/// // Opt in:
|
||||
/// class Class extends Legacy {
|
||||
/// test() {
|
||||
/// // Ok to call `Legacy.extendedMethod` since its type is
|
||||
/// // `int* Function(int*, {int* j})`.
|
||||
/// super.extendedMethod(null);
|
||||
/// // Ok to call `Legacy.mixedInMethod` since its type is
|
||||
/// // `int* Function(int*, {int* j})`.
|
||||
/// super.mixedInMethod(null);
|
||||
/// }
|
||||
/// }
|
||||
///
|
||||
bool needsLegacyErasure(Class enclosingClass, Class declaringClass) {
|
||||
Class? cls = enclosingClass;
|
||||
while (cls != null) {
|
||||
if (!cls.enclosingLibrary.isNonNullableByDefault) {
|
||||
return true;
|
||||
}
|
||||
if (cls == declaringClass) {
|
||||
return false;
|
||||
}
|
||||
if (cls.mixedInClass == declaringClass) {
|
||||
return false;
|
||||
}
|
||||
cls = cls.superclass;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -33,8 +33,7 @@ Library parseLibrary(Uri uri, String text,
|
||||
fileUri ??= uri;
|
||||
environment ??= new TypeParserEnvironment(uri, fileUri);
|
||||
Library library =
|
||||
new Library(uri, fileUri: fileUri, name: uri.path.replaceAll("/", "."))
|
||||
..isNonNullableByDefault = true;
|
||||
new Library(uri, fileUri: fileUri, name: uri.path.replaceAll("/", "."));
|
||||
List<ParsedType> types = type_parser.parse(text);
|
||||
for (ParsedType type in types) {
|
||||
if (type is ParsedClass) {
|
||||
@@ -87,13 +86,11 @@ class Env {
|
||||
TypeParserEnvironment coreEnvironment =
|
||||
new TypeParserEnvironment(coreUri, coreUri);
|
||||
Library coreLibrary =
|
||||
parseLibrary(coreUri, mockSdk, environment: coreEnvironment)
|
||||
..isNonNullableByDefault = isNonNullableByDefault;
|
||||
parseLibrary(coreUri, mockSdk, environment: coreEnvironment);
|
||||
_libraryEnvironment = new TypeParserEnvironment(libraryUri, libraryUri)
|
||||
._extend(coreEnvironment._declarations);
|
||||
Library library =
|
||||
parseLibrary(libraryUri, source, environment: _libraryEnvironment)
|
||||
..isNonNullableByDefault = isNonNullableByDefault;
|
||||
parseLibrary(libraryUri, source, environment: _libraryEnvironment);
|
||||
library.name = "lib";
|
||||
component = new Component(libraries: <Library>[coreLibrary, library]);
|
||||
coreTypes = new CoreTypes(component);
|
||||
|
||||
@@ -406,9 +406,6 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
|
||||
if (library.isUnsupported) {
|
||||
flags.add('isUnsupported');
|
||||
}
|
||||
if (!library.isNonNullableByDefault) {
|
||||
flags.add('isLegacy');
|
||||
}
|
||||
if (flags.isNotEmpty) {
|
||||
writeWord('/*${flags.join(',')}*/');
|
||||
}
|
||||
@@ -1092,14 +1089,6 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
|
||||
writeExpression(initializer);
|
||||
}
|
||||
List<String> features = <String>[];
|
||||
if (node.enclosingLibrary.isNonNullableByDefault !=
|
||||
node.isNonNullableByDefault) {
|
||||
if (node.isNonNullableByDefault) {
|
||||
features.add("isNonNullableByDefault");
|
||||
} else {
|
||||
features.add("isLegacy");
|
||||
}
|
||||
}
|
||||
Class? enclosingClass = node.enclosingClass;
|
||||
if ((enclosingClass == null &&
|
||||
node.enclosingLibrary.fileUri != node.fileUri) ||
|
||||
@@ -1146,14 +1135,6 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
|
||||
}
|
||||
writeWord(procedureKindToString(node.kind));
|
||||
List<String> features = <String>[];
|
||||
if (node.enclosingLibrary.isNonNullableByDefault !=
|
||||
node.isNonNullableByDefault) {
|
||||
if (node.isNonNullableByDefault) {
|
||||
features.add("isNonNullableByDefault");
|
||||
} else {
|
||||
features.add("isLegacy");
|
||||
}
|
||||
}
|
||||
Class? enclosingClass = node.enclosingClass;
|
||||
if ((enclosingClass == null &&
|
||||
node.enclosingLibrary.fileUri != node.fileUri) ||
|
||||
@@ -1200,14 +1181,6 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
|
||||
writeModifier(node.isSynthetic, 'synthetic');
|
||||
writeWord('constructor');
|
||||
List<String> features = <String>[];
|
||||
if (node.enclosingLibrary.isNonNullableByDefault !=
|
||||
node.isNonNullableByDefault) {
|
||||
if (node.isNonNullableByDefault) {
|
||||
features.add("isNonNullableByDefault");
|
||||
} else {
|
||||
features.add("isLegacy");
|
||||
}
|
||||
}
|
||||
if (features.isNotEmpty) {
|
||||
writeWord("/*${features.join(',')}*/");
|
||||
}
|
||||
@@ -1753,7 +1726,7 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
|
||||
@override
|
||||
void visitIsExpression(IsExpression node) {
|
||||
writeExpression(node.operand, Precedence.BITWISE_OR);
|
||||
writeSpaced(!node.isForNonNullableByDefault ? 'is{ForLegacy}' : 'is');
|
||||
writeSpaced('is');
|
||||
writeType(node.type);
|
||||
}
|
||||
|
||||
@@ -1770,9 +1743,6 @@ class Printer extends VisitorDefault<void> with VisitorVoidMixin {
|
||||
if (node.isForDynamic) {
|
||||
flags.add('ForDynamic');
|
||||
}
|
||||
if (!node.isForNonNullableByDefault) {
|
||||
flags.add('ForLegacy');
|
||||
}
|
||||
if (node.isUnchecked) {
|
||||
flags.add('Unchecked');
|
||||
}
|
||||
|
||||
@@ -285,39 +285,36 @@ abstract class TypeEnvironment extends Types {
|
||||
}
|
||||
|
||||
DartType getTypeOfSpecialCasedTernaryOperator(
|
||||
DartType type1, DartType type2, DartType type3, Library clientLibrary) {
|
||||
if (clientLibrary.isNonNullableByDefault) {
|
||||
// Let e be a normal invocation of the form e1.clamp(e2, e3), where the
|
||||
// static types of e1, e2 and e3 are T1, T2 and T3 respectively, and where
|
||||
// T1, T2, and T3 are all non-Never subtypes of num. Then:
|
||||
if (type1 is! NeverType && type2 is! NeverType && type3 is! NeverType
|
||||
/* We skip the check that all types are subtypes of num because, if
|
||||
DartType type1, DartType type2, DartType type3) {
|
||||
// Let e be a normal invocation of the form e1.clamp(e2, e3), where the
|
||||
// static types of e1, e2 and e3 are T1, T2 and T3 respectively, and where
|
||||
// T1, T2, and T3 are all non-Never subtypes of num. Then:
|
||||
if (type1 is! NeverType && type2 is! NeverType && type3 is! NeverType
|
||||
/* We skip the check that all types are subtypes of num because, if
|
||||
not, we'll compute the static type to be num, anyway.*/
|
||||
) {
|
||||
if (isSubtypeOf(type1, coreTypes.intNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities) &&
|
||||
isSubtypeOf(type2, coreTypes.intNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities) &&
|
||||
isSubtypeOf(type3, coreTypes.intNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities)) {
|
||||
// If T1, T2 and T3 are all subtypes of int, the static type of e is
|
||||
// int.
|
||||
return coreTypes.intNonNullableRawType;
|
||||
} else if (isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities) &&
|
||||
isSubtypeOf(type2, coreTypes.doubleNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities) &&
|
||||
isSubtypeOf(type3, coreTypes.doubleNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities)) {
|
||||
// If T1, T2 and T3 are all subtypes of double, the static type of e
|
||||
// is double.
|
||||
return coreTypes.doubleNonNullableRawType;
|
||||
}
|
||||
) {
|
||||
if (isSubtypeOf(type1, coreTypes.intNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities) &&
|
||||
isSubtypeOf(type2, coreTypes.intNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities) &&
|
||||
isSubtypeOf(type3, coreTypes.intNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities)) {
|
||||
// If T1, T2 and T3 are all subtypes of int, the static type of e is
|
||||
// int.
|
||||
return coreTypes.intNonNullableRawType;
|
||||
} else if (isSubtypeOf(type1, coreTypes.doubleNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities) &&
|
||||
isSubtypeOf(type2, coreTypes.doubleNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities) &&
|
||||
isSubtypeOf(type3, coreTypes.doubleNonNullableRawType,
|
||||
SubtypeCheckMode.withNullabilities)) {
|
||||
// If T1, T2 and T3 are all subtypes of double, the static type of e
|
||||
// is double.
|
||||
return coreTypes.doubleNonNullableRawType;
|
||||
}
|
||||
// Otherwise the static type of e is num.
|
||||
return coreTypes.numNonNullableRawType;
|
||||
}
|
||||
return coreTypes.numRawType(type1.nullability);
|
||||
// Otherwise the static type of e is num.
|
||||
return coreTypes.numNonNullableRawType;
|
||||
}
|
||||
|
||||
bool _isRawTypeArgumentEquivalent(
|
||||
@@ -931,10 +928,6 @@ abstract class StaticTypeContext {
|
||||
/// For opt out libraries this is [Nullability.legacy].
|
||||
Nullability get nullable;
|
||||
|
||||
/// Return `true` if the current library is opted in to non-nullable by
|
||||
/// default.
|
||||
bool get isNonNullableByDefault;
|
||||
|
||||
/// Returns the mode under which the current library was compiled.
|
||||
NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode;
|
||||
|
||||
@@ -1004,11 +997,6 @@ class StaticTypeContextImpl implements StaticTypeContext {
|
||||
@override
|
||||
Nullability get nullable => _library.nullable;
|
||||
|
||||
/// Return `true` if the current library is opted in to non-nullable by
|
||||
/// default.
|
||||
@override
|
||||
bool get isNonNullableByDefault => _library.isNonNullableByDefault;
|
||||
|
||||
/// Returns the mode under which the current library was compiled.
|
||||
@override
|
||||
NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode =>
|
||||
@@ -1121,9 +1109,6 @@ class _FlatStatefulStaticTypeContext extends StatefulStaticTypeContext {
|
||||
@override
|
||||
Nullability get nullable => _library.nullable;
|
||||
|
||||
@override
|
||||
bool get isNonNullableByDefault => _library.isNonNullableByDefault;
|
||||
|
||||
@override
|
||||
NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode =>
|
||||
_library.nonNullableByDefaultCompiledMode;
|
||||
@@ -1226,9 +1211,6 @@ class _StackedStatefulStaticTypeContext extends StatefulStaticTypeContext {
|
||||
@override
|
||||
Nullability get nullable => _library.nullable;
|
||||
|
||||
@override
|
||||
bool get isNonNullableByDefault => _library.isNonNullableByDefault;
|
||||
|
||||
@override
|
||||
NonNullableByDefaultCompiledMode get nonNullableByDefaultCompiledMode =>
|
||||
_library.nonNullableByDefaultCompiledMode;
|
||||
|
||||
@@ -16,17 +16,6 @@ void main() {
|
||||
}
|
||||
}
|
||||
|
||||
void setNonNullableByDefault(Library lib, bool isNonNullableByDefault) {
|
||||
lib.isNonNullableByDefault = isNonNullableByDefault;
|
||||
}
|
||||
|
||||
void verifyNonNullableByDefault(Library lib, bool isNonNullableByDefault) {
|
||||
if (lib.isNonNullableByDefault != isNonNullableByDefault) {
|
||||
throw "Serialized and re-read library had change in "
|
||||
"isNonNullableByDefault flag.";
|
||||
}
|
||||
}
|
||||
|
||||
void setNonNullableByDefaultCompiledMode(Library lib,
|
||||
NonNullableByDefaultCompiledMode nonNullableByDefaultCompiledMode) {
|
||||
lib.nonNullableByDefaultCompiledMode = nonNullableByDefaultCompiledMode;
|
||||
@@ -59,12 +48,10 @@ void main() {
|
||||
Uri uri = Uri.parse("foo://bar.dart");
|
||||
Library lib = new Library(uri, fileUri: uri);
|
||||
setSynthetic(lib, isSynthetic);
|
||||
setNonNullableByDefault(lib, isNonNullableByDefault);
|
||||
setNonNullableByDefaultCompiledMode(
|
||||
lib, nonNullableByDefaultCompiledMode);
|
||||
Library lib2 = libRoundTrip(lib);
|
||||
verifySynthetic(lib2, isSynthetic);
|
||||
verifyNonNullableByDefault(lib2, isNonNullableByDefault);
|
||||
verifyNonNullableByDefaultCompiledMode(
|
||||
lib2, nonNullableByDefaultCompiledMode);
|
||||
}
|
||||
|
||||
@@ -1347,11 +1347,11 @@ class B<T*> extends self::A<self::B::T*, core::bool*> {}
|
||||
var b_int = new InterfaceType(b, Nullability.legacy, [int]);
|
||||
expect(
|
||||
hierarchy.getInterfaceTypeAsInstanceOfClass(b_int, a,
|
||||
isNonNullableByDefault: library.isNonNullableByDefault),
|
||||
isNonNullableByDefault: true),
|
||||
new InterfaceType(a, Nullability.legacy, [int, bool]));
|
||||
expect(
|
||||
hierarchy.getInterfaceTypeAsInstanceOfClass(b_int, objectClass,
|
||||
isNonNullableByDefault: library.isNonNullableByDefault),
|
||||
isNonNullableByDefault: true),
|
||||
new InterfaceType(objectClass, Nullability.legacy));
|
||||
}
|
||||
|
||||
|
||||
@@ -380,8 +380,7 @@ class LazyTypeEnvironment {
|
||||
|
||||
LazyTypeEnvironment() {
|
||||
Uri uri = Uri.parse('file://dummy.dart');
|
||||
dummyLibrary = new Library(uri, fileUri: uri)
|
||||
..isNonNullableByDefault = true;
|
||||
dummyLibrary = new Library(uri, fileUri: uri);
|
||||
component.libraries.add(dummyLibrary..parent = component);
|
||||
dummyLibrary.name = 'lib';
|
||||
}
|
||||
|
||||
@@ -589,8 +589,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
|
||||
],
|
||||
fileUri: node.fileUri,
|
||||
reference: reference)
|
||||
..fileOffset = node.fileOffset
|
||||
..isNonNullableByDefault = node.enclosingLibrary.isNonNullableByDefault;
|
||||
..fileOffset = node.fileOffset;
|
||||
|
||||
// Struct objects are manufactured in the VM by being passed by value
|
||||
// in return position in FFI calls, and by value in arguments in FFI
|
||||
@@ -651,8 +650,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
|
||||
],
|
||||
fileUri: node.fileUri,
|
||||
reference: reference)
|
||||
..fileOffset = node.fileOffset
|
||||
..isNonNullableByDefault = node.enclosingLibrary.isNonNullableByDefault;
|
||||
..fileOffset = node.fileOffset;
|
||||
|
||||
node.addConstructor(ctor);
|
||||
}
|
||||
@@ -1001,7 +999,6 @@ class _FfiDefinitionTransformer extends FfiTransformer {
|
||||
reference: getterReference,
|
||||
)
|
||||
..fileOffset = fileOffset
|
||||
..isNonNullableByDefault = true
|
||||
..isStatic = true
|
||||
..isSynthetic = true
|
||||
..annotations = [];
|
||||
@@ -1043,7 +1040,6 @@ class _FfiDefinitionTransformer extends FfiTransformer {
|
||||
reference: getterReference,
|
||||
)
|
||||
..fileOffset = field.fileOffset
|
||||
..isNonNullableByDefault = field.isNonNullableByDefault
|
||||
..annotations = field.annotations;
|
||||
node.addProcedure(getter);
|
||||
|
||||
@@ -1078,9 +1074,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
|
||||
),
|
||||
fileUri: field.fileUri,
|
||||
reference: setterReference,
|
||||
)
|
||||
..fileOffset = field.fileOffset
|
||||
..isNonNullableByDefault = field.isNonNullableByDefault;
|
||||
)..fileOffset = field.fileOffset;
|
||||
node.addProcedure(setter);
|
||||
}
|
||||
|
||||
@@ -1110,8 +1104,7 @@ class _FfiDefinitionTransformer extends FfiTransformer {
|
||||
fileUri: compound.fileUri,
|
||||
reference: getterReference,
|
||||
isStatic: true)
|
||||
..fileOffset = compound.fileOffset
|
||||
..isNonNullableByDefault = true;
|
||||
..fileOffset = compound.fileOffset;
|
||||
addPragmaPreferInline(getter);
|
||||
compound.addProcedure(getter);
|
||||
}
|
||||
|
||||
@@ -561,9 +561,7 @@ class FfiNativeTransformer extends FfiTransformer {
|
||||
isStatic: true,
|
||||
isExternal: true,
|
||||
reference: reference,
|
||||
)
|
||||
..isNonNullableByDefault = node.isNonNullableByDefault
|
||||
..fileOffset = node.fileOffset;
|
||||
)..fileOffset = node.fileOffset;
|
||||
nonWrappedFfiNative.addAnnotation(pragmaConstant);
|
||||
|
||||
// Add procedure to the parent the FfiNative function belongs to.
|
||||
|
||||
@@ -67,9 +67,6 @@ class _DeduplicateMixinKey {
|
||||
final otherImplemented = otherClass.implementedTypes;
|
||||
if (thisImplemented.length != otherImplemented.length) return false;
|
||||
|
||||
if (thisClass.enclosingLibrary.isNonNullableByDefault !=
|
||||
otherClass.enclosingLibrary.isNonNullableByDefault) return false;
|
||||
|
||||
// Non generic classes can use equalty compares of supertypes.
|
||||
if (thisParameters.isEmpty) {
|
||||
if (thisSupertype != otherSupertype) return false;
|
||||
|
||||
@@ -3958,8 +3958,6 @@ Fragment StreamingFlowGraphBuilder::BuildIsExpression(TokenPosition* p) {
|
||||
TokenPosition position = ReadPosition(); // read position.
|
||||
if (p != nullptr) *p = position;
|
||||
|
||||
ReadFlags();
|
||||
|
||||
Fragment instructions = BuildExpression(); // read operand.
|
||||
|
||||
const AbstractType& type = T.BuildType(); // read type.
|
||||
|
||||
@@ -560,7 +560,6 @@ void KernelFingerprintHelper::CalculateExpressionFingerprint() {
|
||||
return;
|
||||
case kIsExpression:
|
||||
ReadPosition(); // read position.
|
||||
BuildHash(ReadFlags()); // read flags.
|
||||
CalculateExpressionFingerprint(); // read operand.
|
||||
CalculateDartTypeFingerprint(); // read type.
|
||||
return;
|
||||
|
||||
@@ -2738,7 +2738,6 @@ void KernelReaderHelper::SkipExpression() {
|
||||
return;
|
||||
case kIsExpression:
|
||||
ReadPosition(); // read position.
|
||||
SkipFlags(); // read flags.
|
||||
SkipExpression(); // read operand.
|
||||
SkipDartType(); // read type.
|
||||
return;
|
||||
|
||||
@@ -494,10 +494,9 @@ class FieldHelper {
|
||||
kIsGenericCovariantImpl = 1 << 4,
|
||||
kIsLate = 1 << 5,
|
||||
kExtensionMember = 1 << 6,
|
||||
kLegacy = 1 << 7,
|
||||
kInternalImplementation = 1 << 8,
|
||||
kEnumElement = 1 << 9,
|
||||
kExtensionTypeMember = 1 << 10,
|
||||
kInternalImplementation = 1 << 7,
|
||||
kEnumElement = 1 << 8,
|
||||
kExtensionTypeMember = 1 << 9,
|
||||
};
|
||||
|
||||
explicit FieldHelper(KernelReaderHelper* helper)
|
||||
@@ -594,11 +593,10 @@ class ProcedureHelper {
|
||||
kExternal = 1 << 2,
|
||||
kConst = 1 << 3, // Only for external const factories.
|
||||
kExtensionMember = 1 << 4,
|
||||
kIsLegacy = 1 << 5,
|
||||
kSyntheticProcedure = 1 << 6,
|
||||
kInternalImplementation = 1 << 7,
|
||||
kExtensionTypeMember = 1 << 8,
|
||||
kHasWeakTearoffReferencePragma = 1 << 9,
|
||||
kSyntheticProcedure = 1 << 5,
|
||||
kInternalImplementation = 1 << 6,
|
||||
kExtensionTypeMember = 1 << 7,
|
||||
kHasWeakTearoffReferencePragma = 1 << 8,
|
||||
};
|
||||
|
||||
explicit ProcedureHelper(KernelReaderHelper* helper)
|
||||
@@ -848,10 +846,9 @@ class LibraryHelper {
|
||||
|
||||
enum Flag {
|
||||
kSynthetic = 1 << 0,
|
||||
kIsLegacy = 1 << 1,
|
||||
kNonNullableByDefaultCompiledModeBit1 = 1 << 2,
|
||||
kNonNullableByDefaultCompiledModeBit2 = 1 << 3,
|
||||
kUnsupported = 1 << 4,
|
||||
kNonNullableByDefaultCompiledModeBit1 = 1 << 1,
|
||||
kNonNullableByDefaultCompiledModeBit2 = 1 << 2,
|
||||
kUnsupported = 1 << 3,
|
||||
};
|
||||
|
||||
explicit LibraryHelper(KernelReaderHelper* helper)
|
||||
@@ -867,7 +864,6 @@ class LibraryHelper {
|
||||
void SetJustRead(Field field) { next_read_ = field + 1; }
|
||||
|
||||
bool IsSynthetic() const { return (flags_ & kSynthetic) != 0; }
|
||||
bool IsNonNullableByDefault() const { return (flags_ & kIsLegacy) == 0; }
|
||||
NNBDCompiledMode GetNonNullableByDefaultCompiledMode() const {
|
||||
bool bit1 = (flags_ & kNonNullableByDefaultCompiledModeBit1) != 0;
|
||||
bool bit2 = (flags_ & kNonNullableByDefaultCompiledModeBit2) != 0;
|
||||
|
||||
@@ -862,7 +862,6 @@ void ScopeBuilder::VisitExpression() {
|
||||
case kIsExpression:
|
||||
needs_expr_temp_ = true;
|
||||
helper_.ReadPosition(); // read position.
|
||||
helper_.ReadFlags(); // read flags.
|
||||
VisitExpression(); // read operand.
|
||||
VisitDartType(); // read type.
|
||||
return;
|
||||
|
||||
@@ -168,7 +168,7 @@ namespace dart {
|
||||
V(::, _byteDataByteOffsetCheck, ByteDataByteOffsetCheck, 0xbaf71484) \
|
||||
V(::, copyRangeFromUint8ListToOneByteString, \
|
||||
CopyRangeFromUint8ListToOneByteString, 0xcc3444c2) \
|
||||
V(_StringBase, _interpolate, StringBaseInterpolate, 0x3f22ce9e) \
|
||||
V(_StringBase, _interpolate, StringBaseInterpolate, 0xa2c902d2) \
|
||||
V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 0x17dbf511) \
|
||||
V(_SuspendState, get:_functionData, SuspendState_getFunctionData, \
|
||||
0x7272eaae) \
|
||||
@@ -198,8 +198,8 @@ namespace dart {
|
||||
V(_Double, roundToDouble, DoubleRoundToDouble, 0x562cb240) \
|
||||
V(_Double, toInt, DoubleToInteger, 0x675208e9) \
|
||||
V(_Double, truncateToDouble, DoubleTruncateToDouble, 0x62b76e99) \
|
||||
V(::, min, MathMin, 0x21232beb) \
|
||||
V(::, max, MathMax, 0xcf067384) \
|
||||
V(::, min, MathMin, 0x63eb7469) \
|
||||
V(::, max, MathMax, 0xf9320c82) \
|
||||
V(::, _doublePow, MathDoublePow, 0xaeabdc94) \
|
||||
V(::, _intPow, MathIntPow, 0xab39e81a) \
|
||||
V(::, _sin, MathSin, 0x17bdb243) \
|
||||
@@ -399,7 +399,7 @@ namespace dart {
|
||||
V(_Double, >=, Double_greaterEqualThan, 0x4aa007b3) \
|
||||
V(_Double, <, Double_lessThan, 0xd2fb73b4) \
|
||||
V(_Double, <=, Double_lessEqualThan, 0x024aa595) \
|
||||
V(_Double, ==, Double_equal, 0x3694bad0) \
|
||||
V(_Double, ==, Double_equal, 0xe9189b0a) \
|
||||
V(_Double, +, Double_add, 0xa7c8119f) \
|
||||
V(_Double, -, Double_sub, 0x9ab51df0) \
|
||||
V(_Double, *, Double_mul, 0xdc3c27ed) \
|
||||
@@ -431,7 +431,7 @@ namespace dart {
|
||||
|
||||
#define CORE_INTEGER_LIB_INTRINSIC_LIST(V) \
|
||||
V(_IntegerImplementation, >, Integer_greaterThan, 0xd9c2551b) \
|
||||
V(_IntegerImplementation, ==, Integer_equal, 0xd4661e09) \
|
||||
V(_IntegerImplementation, ==, Integer_equal, 0x025d83d3) \
|
||||
V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger, \
|
||||
0x70f20102) \
|
||||
V(_IntegerImplementation, <, Integer_lessThan, 0xd2fb73b4) \
|
||||
@@ -485,8 +485,8 @@ namespace dart {
|
||||
V(_IntegerImplementation, +, Integer_add, 0x6ef8468c) \
|
||||
V(_IntegerImplementation, -, Integer_sub, 0x6301557d) \
|
||||
V(_IntegerImplementation, *, Integer_mul, 0x4670aa1a) \
|
||||
V(_IntegerImplementation, %, Integer_mod, 0x66f6edd5) \
|
||||
V(_IntegerImplementation, ~/, Integer_truncDivide, 0x70e91441) \
|
||||
V(_IntegerImplementation, %, Integer_mod, 0x708e28b9) \
|
||||
V(_IntegerImplementation, ~/, Integer_truncDivide, 0x29407b25) \
|
||||
V(_IntegerImplementation, unary-, Integer_negate, 0x9140ec93) \
|
||||
V(_IntegerImplementation, &, Integer_bitAnd, 0x42452d89) \
|
||||
V(_IntegerImplementation, |, Integer_bitOr, 0x45efa741) \
|
||||
|
||||
@@ -18,7 +18,7 @@ namespace kernel {
|
||||
// package:kernel/binary.md.
|
||||
|
||||
static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
|
||||
static const uint32_t kSupportedKernelFormatVersion = 117;
|
||||
static const uint32_t kSupportedKernelFormatVersion = 118;
|
||||
|
||||
// Keep in sync with package:kernel/lib/binary/tag.dart
|
||||
#define KERNEL_TAG_LIST(V) \
|
||||
@@ -233,13 +233,7 @@ enum AsExpressionFlags {
|
||||
kAsExpressionFlagTypeError = 1 << 0,
|
||||
kAsExpressionFlagCovarianceCheck = 1 << 1,
|
||||
kAsExpressionFlagForDynamic = 1 << 2,
|
||||
kAsExpressionFlagForLegacy = 1 << 3,
|
||||
kAsExpressionFlagUnchecked = 1 << 4,
|
||||
};
|
||||
|
||||
// Keep in sync with package:kernel/lib/ast.dart
|
||||
enum IsExpressionFlags {
|
||||
kIsExpressionFlagForLegacy = 1 << 0,
|
||||
kAsExpressionFlagUnchecked = 1 << 3,
|
||||
};
|
||||
|
||||
// Keep in sync with package:kernel/lib/ast.dart
|
||||
|
||||
@@ -810,12 +810,6 @@ LibraryPtr KernelLoader::LoadLibrary(intptr_t index) {
|
||||
|
||||
if (library.Loaded()) return library.ptr();
|
||||
|
||||
if (!library_helper.IsNonNullableByDefault()) {
|
||||
H.ReportError(
|
||||
"Library '%s' was compiled without sound null safety (in weak mode) "
|
||||
"and it cannot be used at runtime",
|
||||
String::Handle(library.url()).ToCString());
|
||||
}
|
||||
const NNBDCompiledMode mode =
|
||||
library_helper.GetNonNullableByDefaultCompiledMode();
|
||||
if (mode == NNBDCompiledMode::kInvalid) {
|
||||
|
||||
Reference in New Issue
Block a user