Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: pkg/kernel/lib/ast.dart

Issue 3008463002: Store the covariant keyword flag for parameters and fields into Kernel and resynthesize in analyzer. (Closed)
Patch Set: Update Field in binary. Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/kernel/binary.md ('k') | pkg/kernel/lib/clone.dart » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 /// ----------------------------------------------------------------------- 5 /// -----------------------------------------------------------------------
6 /// ERROR HANDLING 6 /// ERROR HANDLING
7 /// ----------------------------------------------------------------------- 7 /// -----------------------------------------------------------------------
8 /// 8 ///
9 /// As a rule of thumb, errors that can be detected statically are handled by 9 /// As a rule of thumb, errors that can be detected statically are handled by
10 /// the frontend, typically by translating the erroneous code into a 'throw' or 10 /// the frontend, typically by translating the erroneous code into a 'throw' or
(...skipping 962 matching lines...) Expand 10 before | Expand all | Expand 10 after
973 DartType type; // Not null. Defaults to DynamicType. 973 DartType type; // Not null. Defaults to DynamicType.
974 int flags = 0; 974 int flags = 0;
975 Expression initializer; // May be null. 975 Expression initializer; // May be null.
976 976
977 /// The uri of the source file this field was loaded from. 977 /// The uri of the source file this field was loaded from.
978 String fileUri; 978 String fileUri;
979 979
980 Field(Name name, 980 Field(Name name,
981 {this.type: const DynamicType(), 981 {this.type: const DynamicType(),
982 this.initializer, 982 this.initializer,
983 bool isCovariant: false,
983 bool isFinal: false, 984 bool isFinal: false,
984 bool isConst: false, 985 bool isConst: false,
985 bool isStatic: false, 986 bool isStatic: false,
986 bool hasImplicitGetter, 987 bool hasImplicitGetter,
987 bool hasImplicitSetter, 988 bool hasImplicitSetter,
988 int transformerFlags: 0, 989 int transformerFlags: 0,
989 this.fileUri, 990 this.fileUri,
990 Reference reference}) 991 Reference reference})
991 : super(name, reference) { 992 : super(name, reference) {
992 assert(type != null); 993 assert(type != null);
993 initializer?.parent = this; 994 initializer?.parent = this;
995 this.isCovariant = isCovariant;
994 this.isFinal = isFinal; 996 this.isFinal = isFinal;
995 this.isConst = isConst; 997 this.isConst = isConst;
996 this.isStatic = isStatic; 998 this.isStatic = isStatic;
997 this.hasImplicitGetter = hasImplicitGetter ?? !isStatic; 999 this.hasImplicitGetter = hasImplicitGetter ?? !isStatic;
998 this.hasImplicitSetter = hasImplicitSetter ?? (!isStatic && !isFinal); 1000 this.hasImplicitSetter = hasImplicitSetter ?? (!isStatic && !isFinal);
999 this.transformerFlags = transformerFlags; 1001 this.transformerFlags = transformerFlags;
1000 } 1002 }
1001 1003
1002 static const int FlagFinal = 1 << 0; // Must match serialized bit positions. 1004 static const int FlagFinal = 1 << 0; // Must match serialized bit positions.
1003 static const int FlagConst = 1 << 1; 1005 static const int FlagConst = 1 << 1;
1004 static const int FlagStatic = 1 << 2; 1006 static const int FlagStatic = 1 << 2;
1005 static const int FlagHasImplicitGetter = 1 << 3; 1007 static const int FlagHasImplicitGetter = 1 << 3;
1006 static const int FlagHasImplicitSetter = 1 << 4; 1008 static const int FlagHasImplicitSetter = 1 << 4;
1009 static const int FlagCovariant = 1 << 5;
1010
1011 /// Whether the field is declared with the `covariant` keyword.
1012 bool get isCovariant => flags & FlagCovariant != 0;
1007 1013
1008 bool get isFinal => flags & FlagFinal != 0; 1014 bool get isFinal => flags & FlagFinal != 0;
1009 bool get isConst => flags & FlagConst != 0; 1015 bool get isConst => flags & FlagConst != 0;
1010 bool get isStatic => flags & FlagStatic != 0; 1016 bool get isStatic => flags & FlagStatic != 0;
1011 1017
1012 /// If true, a getter should be generated for this field. 1018 /// If true, a getter should be generated for this field.
1013 /// 1019 ///
1014 /// If false, there may or may not exist an explicit getter in the same class 1020 /// If false, there may or may not exist an explicit getter in the same class
1015 /// with the same name as the field. 1021 /// with the same name as the field.
1016 /// 1022 ///
1017 /// By default, all non-static fields have implicit getters. 1023 /// By default, all non-static fields have implicit getters.
1018 bool get hasImplicitGetter => flags & FlagHasImplicitGetter != 0; 1024 bool get hasImplicitGetter => flags & FlagHasImplicitGetter != 0;
1019 1025
1020 /// If true, a setter should be generated for this field. 1026 /// If true, a setter should be generated for this field.
1021 /// 1027 ///
1022 /// If false, there may or may not exist an explicit setter in the same class 1028 /// If false, there may or may not exist an explicit setter in the same class
1023 /// with the same name as the field. 1029 /// with the same name as the field.
1024 /// 1030 ///
1025 /// Final fields never have implicit setters, but a field without an implicit 1031 /// Final fields never have implicit setters, but a field without an implicit
1026 /// setter is not necessarily final, as it may be mutated by direct field 1032 /// setter is not necessarily final, as it may be mutated by direct field
1027 /// access. 1033 /// access.
1028 /// 1034 ///
1029 /// By default, all non-static, non-final fields have implicit setters. 1035 /// By default, all non-static, non-final fields have implicit setters.
1030 bool get hasImplicitSetter => flags & FlagHasImplicitSetter != 0; 1036 bool get hasImplicitSetter => flags & FlagHasImplicitSetter != 0;
1031 1037
1038 void set isCovariant(bool value) {
1039 flags = value ? (flags | FlagCovariant) : (flags & ~FlagCovariant);
1040 }
1041
1032 void set isFinal(bool value) { 1042 void set isFinal(bool value) {
1033 flags = value ? (flags | FlagFinal) : (flags & ~FlagFinal); 1043 flags = value ? (flags | FlagFinal) : (flags & ~FlagFinal);
1034 } 1044 }
1035 1045
1036 void set isConst(bool value) { 1046 void set isConst(bool value) {
1037 flags = value ? (flags | FlagConst) : (flags & ~FlagConst); 1047 flags = value ? (flags | FlagConst) : (flags & ~FlagConst);
1038 } 1048 }
1039 1049
1040 void set isStatic(bool value) { 1050 void set isStatic(bool value) {
1041 flags = value ? (flags | FlagStatic) : (flags & ~FlagStatic); 1051 flags = value ? (flags | FlagStatic) : (flags & ~FlagStatic);
(...skipping 2749 matching lines...) Expand 10 before | Expand all | Expand 10 after
3791 /// For parameters, this is the default value. 3801 /// For parameters, this is the default value.
3792 /// 3802 ///
3793 /// Should be null in other cases. 3803 /// Should be null in other cases.
3794 Expression initializer; // May be null. 3804 Expression initializer; // May be null.
3795 3805
3796 VariableDeclaration(this.name, 3806 VariableDeclaration(this.name,
3797 {this.initializer, 3807 {this.initializer,
3798 this.type: const DynamicType(), 3808 this.type: const DynamicType(),
3799 bool isFinal: false, 3809 bool isFinal: false,
3800 bool isConst: false, 3810 bool isConst: false,
3801 bool isFieldFormal: false}) { 3811 bool isFieldFormal: false,
3812 bool isCovariant: false}) {
3802 assert(type != null); 3813 assert(type != null);
3803 initializer?.parent = this; 3814 initializer?.parent = this;
3804 this.isFinal = isFinal; 3815 this.isFinal = isFinal;
3805 this.isConst = isConst; 3816 this.isConst = isConst;
3806 this.isFieldFormal = isFieldFormal; 3817 this.isFieldFormal = isFieldFormal;
3818 this.isCovariant = isCovariant;
3807 } 3819 }
3808 3820
3809 /// Creates a synthetic variable with the given expression as initializer. 3821 /// Creates a synthetic variable with the given expression as initializer.
3810 VariableDeclaration.forValue(this.initializer, 3822 VariableDeclaration.forValue(this.initializer,
3811 {bool isFinal: true, 3823 {bool isFinal: true,
3812 bool isConst: false, 3824 bool isConst: false,
3813 bool isFieldFormal: false, 3825 bool isFieldFormal: false,
3814 this.type: const DynamicType()}) { 3826 this.type: const DynamicType()}) {
3815 assert(type != null); 3827 assert(type != null);
3816 initializer?.parent = this; 3828 initializer?.parent = this;
3817 this.isFinal = isFinal; 3829 this.isFinal = isFinal;
3818 this.isConst = isConst; 3830 this.isConst = isConst;
3819 this.isFieldFormal = isFieldFormal; 3831 this.isFieldFormal = isFieldFormal;
3820 } 3832 }
3821 3833
3822 static const int FlagFinal = 1 << 0; // Must match serialized bit positions. 3834 static const int FlagFinal = 1 << 0; // Must match serialized bit positions.
3823 static const int FlagConst = 1 << 1; 3835 static const int FlagConst = 1 << 1;
3824 static const int FlagFieldFormal = 1 << 2; 3836 static const int FlagFieldFormal = 1 << 2;
3825 static const int FlagInScope = 1 << 3; // Temporary flag used by verifier. 3837 static const int FlagCovariant = 1 << 3;
3838 static const int FlagInScope = 1 << 4; // Temporary flag used by verifier.
3826 3839
3827 bool get isFinal => flags & FlagFinal != 0; 3840 bool get isFinal => flags & FlagFinal != 0;
3828 bool get isConst => flags & FlagConst != 0; 3841 bool get isConst => flags & FlagConst != 0;
3829 3842
3843 /// Whether the parameter is declared with the `covariant` keyword.
3844 bool get isCovariant => flags & FlagCovariant != 0;
3845
3830 /// Whether the variable is declared as a field formal parameter of 3846 /// Whether the variable is declared as a field formal parameter of
3831 /// a constructor. 3847 /// a constructor.
3832 @informative 3848 @informative
3833 bool get isFieldFormal => flags & FlagFieldFormal != 0; 3849 bool get isFieldFormal => flags & FlagFieldFormal != 0;
3834 3850
3835 void set isFinal(bool value) { 3851 void set isFinal(bool value) {
3836 flags = value ? (flags | FlagFinal) : (flags & ~FlagFinal); 3852 flags = value ? (flags | FlagFinal) : (flags & ~FlagFinal);
3837 } 3853 }
3838 3854
3839 void set isConst(bool value) { 3855 void set isConst(bool value) {
3840 flags = value ? (flags | FlagConst) : (flags & ~FlagConst); 3856 flags = value ? (flags | FlagConst) : (flags & ~FlagConst);
3841 } 3857 }
3842 3858
3859 void set isCovariant(bool value) {
3860 flags = value ? (flags | FlagCovariant) : (flags & ~FlagCovariant);
3861 }
3862
3843 @informative 3863 @informative
3844 void set isFieldFormal(bool value) { 3864 void set isFieldFormal(bool value) {
3845 flags = value ? (flags | FlagFieldFormal) : (flags & ~FlagFieldFormal); 3865 flags = value ? (flags | FlagFieldFormal) : (flags & ~FlagFieldFormal);
3846 } 3866 }
3847 3867
3848 accept(StatementVisitor v) => v.visitVariableDeclaration(this); 3868 accept(StatementVisitor v) => v.visitVariableDeclaration(this);
3849 accept1(StatementVisitor1 v, arg) => v.visitVariableDeclaration(this, arg); 3869 accept1(StatementVisitor1 v, arg) => v.visitVariableDeclaration(this, arg);
3850 3870
3851 visitChildren(Visitor v) { 3871 visitChildren(Visitor v) {
3852 type?.accept(v); 3872 type?.accept(v);
(...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after
4743 if (typedef_.canonicalName == null) { 4763 if (typedef_.canonicalName == null) {
4744 throw '$typedef_ has no canonical name'; 4764 throw '$typedef_ has no canonical name';
4745 } 4765 }
4746 return typedef_.canonicalName; 4766 return typedef_.canonicalName;
4747 } 4767 }
4748 4768
4749 /// Annotation describing information which is not part of Dart semantics; in 4769 /// Annotation describing information which is not part of Dart semantics; in
4750 /// other words, if this information (or any information it refers to) changes, 4770 /// other words, if this information (or any information it refers to) changes,
4751 /// static analysis and runtime behavior of the library are unaffected. 4771 /// static analysis and runtime behavior of the library are unaffected.
4752 const informative = null; 4772 const informative = null;
OLDNEW
« no previous file with comments | « pkg/kernel/binary.md ('k') | pkg/kernel/lib/clone.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698