[cfe] Add class modifiers to AST and dill files.

TEST=pkg/front_end/testcases/class_modifiers/...

Change-Id: I8befd64c359eb33a6acf003525b0c8cc6096df3d
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/279331
Reviewed-by: Alexander Markov <alexmarkov@google.com>
Commit-Queue: Kallen Tu <kallentu@google.com>
Reviewed-by: Johnni Winther <johnniwinther@google.com>
This commit is contained in:
Kallen Tu 2023-01-19 22:55:20 +00:00 committed by Commit Queue
parent 9c7662cd7d
commit 1cdd496a51
29 changed files with 184 additions and 90 deletions

View file

@ -93,6 +93,13 @@ abstract class ClassBuilder implements DeclarationBuilder, ClassMemberAccess {
bool get isSealed;
bool get isBase;
bool get isInterface;
@override
bool get isFinal;
bool get isAugmentation;
bool get declaresConstConstructor;

View file

@ -66,6 +66,15 @@ class DillClassBuilder extends ClassBuilderImpl {
@override
bool get isSealed => cls.isSealed;
@override
bool get isBase => cls.isBase;
@override
bool get isInterface => cls.isInterface;
@override
bool get isFinal => cls.isFinal;
@override
bool get isAugmentation => false;

View file

@ -1297,12 +1297,8 @@ class OutlineBuilder extends StackListenerImpl {
TypeBuilder? supertype = nullIfParserRecovery(pop()) as TypeBuilder?;
Token? mixinToken = pop(NullValues.Token) as Token?;
Token? augmentToken = pop(NullValues.Token) as Token?;
// TODO(kallentu): AST work for class modifiers.
// ignore: unused_local_variable
Token? finalToken = pop(NullValues.Token) as Token?;
// ignore: unused_local_variable
Token? interfaceToken = pop(NullValues.Token) as Token?;
// ignore: unused_local_variable
Token? baseToken = pop(NullValues.Token) as Token?;
Token? sealedToken = pop(NullValues.Token) as Token?;
// TODO(johnniwinther): Create builder for inline.
@ -1403,6 +1399,9 @@ class OutlineBuilder extends StackListenerImpl {
supertypeOffset,
isMacro: macroToken != null,
isSealed: sealedToken != null,
isBase: baseToken != null,
isInterface: interfaceToken != null,
isFinal: finalToken != null,
isAugmentation: augmentToken != null,
isMixinClass: mixinToken != null);
}
@ -1441,12 +1440,8 @@ class OutlineBuilder extends StackListenerImpl {
nullIfParserRecovery(pop()) as List<TypeBuilder>?;
List<TypeVariableBuilder>? typeVariables =
pop(NullValues.TypeVariables) as List<TypeVariableBuilder>?;
// TODO(kallentu): Add AST support for mixin modifiers
// ignore: unused_local_variable
Token? finalToken = pop(NullValues.Token) as Token?;
// ignore: unused_local_variable
Token? interfaceToken = pop(NullValues.Token) as Token?;
// ignore: unused_local_variable
Token? baseToken = pop(NullValues.Token) as Token?;
Token? sealedToken = pop(NullValues.Token) as Token?;
Token? augmentToken = pop(NullValues.Token) as Token?;
@ -1505,6 +1500,9 @@ class OutlineBuilder extends StackListenerImpl {
endToken.charOffset,
-1,
isSealed: sealedToken != null,
isBase: baseToken != null,
isInterface: interfaceToken != null,
isFinal: finalToken != null,
isAugmentation: augmentToken != null);
}
libraryBuilder.setCurrentClassName(null);
@ -2293,12 +2291,8 @@ class OutlineBuilder extends StackListenerImpl {
Object? supertype = pop();
Token? mixinToken = pop(NullValues.Token) as Token?;
Token? augmentToken = pop(NullValues.Token) as Token?;
// TODO(kallentu): AST work for class modifiers.
// ignore: unused_local_variable
Token? finalToken = pop(NullValues.Token) as Token?;
// ignore: unused_local_variable
Token? interfaceToken = pop(NullValues.Token) as Token?;
// ignore: unused_local_variable
Token? baseToken = pop(NullValues.Token) as Token?;
Token? sealedToken = pop(NullValues.Token) as Token?;
// TODO(johnniwinther): Report error on 'inline' here; it can't be used on
@ -2381,6 +2375,9 @@ class OutlineBuilder extends StackListenerImpl {
charEndOffset,
isMacro: macroToken != null,
isSealed: sealedToken != null,
isBase: baseToken != null,
isInterface: interfaceToken != null,
isFinal: finalToken != null,
isAugmentation: augmentToken != null,
isMixinClass: mixinToken != null);
}

View file

@ -110,6 +110,15 @@ class SourceClassBuilder extends ClassBuilderImpl
@override
final bool isSealed;
@override
final bool isBase;
@override
final bool isInterface;
@override
final bool isFinal;
@override
final bool isAugmentation;
@ -158,6 +167,9 @@ class SourceClassBuilder extends ClassBuilderImpl
this.isMixinDeclaration = false,
this.isMacro = false,
this.isSealed = false,
this.isBase = false,
this.isInterface = false,
this.isFinal = false,
this.isAugmentation = false,
this.isMixinClass = false})
: actualCls = initializeClass(cls, typeVariables, name, parent,
@ -278,6 +290,9 @@ class SourceClassBuilder extends ClassBuilderImpl
cls.isMacro = isMacro;
cls.isMixinClass = isMixinClass;
cls.isSealed = isSealed;
cls.isBase = isBase;
cls.isInterface = isInterface;
cls.isFinal = isFinal;
if (interfaceBuilders != null) {
for (int i = 0; i < interfaceBuilders!.length; ++i) {
interfaceBuilders![i] = _checkSupertype(interfaceBuilders![i]);

View file

@ -1795,6 +1795,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
int supertypeOffset,
{required bool isMacro,
required bool isSealed,
required bool isBase,
required bool isInterface,
required bool isFinal,
required bool isAugmentation,
required bool isMixinClass}) {
_addClass(
@ -1812,6 +1815,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
supertypeOffset,
isMacro: isMacro,
isSealed: isSealed,
isBase: isBase,
isInterface: isInterface,
isFinal: isFinal,
isAugmentation: isAugmentation,
isMixinClass: isMixinClass);
}
@ -1828,6 +1834,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
int endOffset,
int supertypeOffset,
{required bool isSealed,
required bool isBase,
required bool isInterface,
required bool isFinal,
required bool isAugmentation}) {
TypeBuilder? supertype;
MixinApplicationBuilder? mixinApplication;
@ -1855,6 +1864,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
supertypeOffset,
isMacro: false,
isSealed: isSealed,
isBase: isBase,
isInterface: isInterface,
isFinal: isFinal,
isAugmentation: isAugmentation,
isMixinClass: false);
}
@ -1874,6 +1886,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
int supertypeOffset,
{required bool isMacro,
required bool isSealed,
required bool isBase,
required bool isInterface,
required bool isFinal,
required bool isAugmentation,
required bool isMixinClass}) {
// Nested declaration began in `OutlineBuilder.beginClassDeclaration`.
@ -1914,6 +1929,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
typeVariables: typeVariables,
isMacro: false,
isSealed: false,
isBase: false,
isInterface: false,
isFinal: false,
// TODO(johnniwinther): How can we support class with mixins?
isAugmentation: false,
isMixinClass: false),
@ -1932,6 +1950,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
isMixinDeclaration: isMixinDeclaration,
isMacro: isMacro,
isSealed: isSealed,
isBase: isBase,
isInterface: isInterface,
isFinal: isFinal,
isAugmentation: isAugmentation,
isMixinClass: isMixinClass);
@ -2286,6 +2307,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
List<TypeBuilder>? interfaces,
required bool isMacro,
required bool isSealed,
required bool isBase,
required bool isInterface,
required bool isFinal,
required bool isAugmentation,
required bool isMixinClass}) {
if (name == null) {
@ -2523,6 +2547,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
mixedInTypeBuilder: isMixinDeclaration ? null : mixin,
isMacro: isNamedMixinApplication && isMacro,
isSealed: isNamedMixinApplication && isSealed,
isBase: isNamedMixinApplication && isBase,
isInterface: isNamedMixinApplication && isInterface,
isFinal: isNamedMixinApplication && isFinal,
isAugmentation: isNamedMixinApplication && isAugmentation,
isMixinClass: isNamedMixinApplication && isMixinClass);
// TODO(ahe, kmillikin): Should always be true?
@ -2584,6 +2611,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
int charEndOffset,
{required bool isMacro,
required bool isSealed,
required bool isBase,
required bool isInterface,
required bool isFinal,
required bool isAugmentation,
required bool isMixinClass}) {
// Nested declaration began in `OutlineBuilder.beginNamedMixinApplication`.
@ -2598,6 +2628,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
interfaces: interfaces,
isMacro: isMacro,
isSealed: isSealed,
isBase: isBase,
isInterface: isInterface,
isFinal: isFinal,
isAugmentation: isAugmentation,
isMixinClass: isMixinClass)!;
checkTypeVariables(typeVariables, supertype.declaration);
@ -3100,6 +3133,9 @@ class SourceLibraryBuilder extends LibraryBuilderImpl {
typeVariables: typeVariables,
isMacro: false,
isSealed: false,
isBase: false,
isInterface: false,
isFinal: false,
isAugmentation: false,
isMixinClass: false),
interfaceBuilders,

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
base class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract base class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract base class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
base class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
base class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract base class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract base class M extends core::Object /*isMixinDeclaration*/ {
}
class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
base class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
base class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract base class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract base class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
base class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
base class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract base class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract base class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
base class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,17 +2,17 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
base class A extends core::Object {
synthetic constructor •() → self::A
;
}
abstract class B extends core::Object {
abstract base class B extends core::Object {
synthetic constructor •() → self::B
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract base class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
base class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
base class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract base class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract base class M extends core::Object /*isMixinDeclaration*/ {
}
class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
base class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
final class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract final class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract final class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
final class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
final class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract final class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract final class M extends core::Object /*isMixinDeclaration*/ {
}
class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
final class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
final class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract final class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract final class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
final class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
final class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract final class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract final class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
final class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,17 +2,17 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
final class A extends core::Object {
synthetic constructor •() → self::A
;
}
abstract class B extends core::Object {
abstract final class B extends core::Object {
synthetic constructor •() → self::B
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract final class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
final class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
final class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract final class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract final class M extends core::Object /*isMixinDeclaration*/ {
}
class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
final class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
interface class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract interface class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract interface class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
interface class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
interface class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract interface class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract interface class M extends core::Object /*isMixinDeclaration*/ {
}
class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
interface class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
interface class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract interface class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract interface class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
interface class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
interface class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract interface class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract interface class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
interface class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,17 +2,17 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
interface class A extends core::Object {
synthetic constructor •() → self::A
;
}
abstract class B extends core::Object {
abstract interface class B extends core::Object {
synthetic constructor •() → self::B
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract interface class M extends core::Object /*isMixinDeclaration*/ {
}
class C = core::Object with self::M /*hasConstConstructor*/ {
interface class C = core::Object with self::M /*hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -2,19 +2,19 @@ library /*isNonNullableByDefault*/;
import self as self;
import "dart:core" as core;
class A extends core::Object {
interface class A extends core::Object {
synthetic constructor •() → self::A
: super core::Object::•()
;
}
abstract class B extends core::Object {
abstract interface class B extends core::Object {
synthetic constructor •() → self::B
: super core::Object::•()
;
}
abstract class M extends core::Object /*isMixinDeclaration*/ {
abstract interface class M extends core::Object /*isMixinDeclaration*/ {
}
class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
interface class C extends core::Object implements self::M /*isEliminatedMixin,hasConstConstructor*/ {
const synthetic constructor •() → self::C
: super core::Object::•()
;

View file

@ -147,7 +147,7 @@ type CanonicalName {
type ComponentFile {
UInt32 magic = 0x90ABCDEF;
UInt32 formatVersion = 92;
UInt32 formatVersion = 93;
Byte[10] shortSdkHash;
List<String> problemsAsJson; // Described in problems.md.
Library[] libraries;
@ -320,7 +320,7 @@ type Class extends Node {
FileOffset fileEndOffset;
UInt flags (isAbstract, isEnum, isAnonymousMixin, isEliminatedMixin,
isMixinDeclaration, hasConstConstructor, isMacro, isSealed,
isMixinClass);
isMixinClass, isBase, isInterface, isFinal);
StringReference name;
List<Expression> annotations;
List<TypeParameter> typeParameters;

View file

@ -1027,6 +1027,9 @@ class Class extends NamedNode implements Annotatable, FileUriNode {
static const int FlagMacro = 1 << 6;
static const int FlagSealed = 1 << 7;
static const int FlagMixinClass = 1 << 8;
static const int FlagBase = 1 << 9;
static const int FlagInterface = 1 << 10;
static const int FlagFinal = 1 << 11;
int flags = 0;
@ -1050,13 +1053,34 @@ class Class extends NamedNode implements Annotatable, FileUriNode {
flags = value ? (flags | FlagMacro) : (flags & ~FlagMacro);
}
/// Whether this class is a macro class.
/// Whether this class is a sealed class.
bool get isSealed => flags & FlagSealed != 0;
void set isSealed(bool value) {
flags = value ? (flags | FlagSealed) : (flags & ~FlagSealed);
}
/// Whether this class is a base class.
bool get isBase => flags & FlagBase != 0;
void set isBase(bool value) {
flags = value ? (flags | FlagBase) : (flags & ~FlagBase);
}
/// Whether this class is an interface class.
bool get isInterface => flags & FlagInterface != 0;
void set isInterface(bool value) {
flags = value ? (flags | FlagInterface) : (flags & ~FlagInterface);
}
/// Whether this class is a final class.
bool get isFinal => flags & FlagFinal != 0;
void set isFinal(bool value) {
flags = value ? (flags | FlagFinal) : (flags & ~FlagFinal);
}
/// Whether this class is a synthetic implementation created for each
/// mixed-in class. For example the following code:
/// class Z extends A with B, C, D {}

View file

@ -195,7 +195,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 = 92;
static const int BinaryFormatVersion = 93;
}
abstract class ConstantTag {

View file

@ -1307,6 +1307,9 @@ class Printer extends Visitor<void> with VisitorVoidMixin {
writeModifier(node.isAbstract, 'abstract');
writeModifier(node.isMacro, 'macro');
writeModifier(node.isSealed, 'sealed');
writeModifier(node.isBase, 'base');
writeModifier(node.isInterface, 'interface');
writeModifier(node.isFinal, 'final');
writeModifier(node.isMixinClass, 'mixin');
writeWord('class');
writeWord(getClassName(node));

View file

@ -755,8 +755,11 @@ class ClassHelper {
kFlagMixinDeclaration = 1 << 4,
kHasConstConstructor = 1 << 5,
kIsMacro = 1 << 6,
kisSealed = 1 << 7,
kIsSealed = 1 << 7,
kIsMixinClass = 1 << 8,
kIsBase = 1 << 9,
kIsInterface = 1 << 10,
kIsFinal = 1 << 11,
};
explicit ClassHelper(KernelReaderHelper* helper)

View file

@ -18,7 +18,7 @@ namespace kernel {
// package:kernel/binary.md.
static const uint32_t kMagicProgramFile = 0x90ABCDEFu;
static const uint32_t kSupportedKernelFormatVersion = 92;
static const uint32_t kSupportedKernelFormatVersion = 93;
// Keep in sync with package:kernel/lib/binary/tag.dart
#define KERNEL_TAG_LIST(V) \