Index: pkg/fasta/lib/src/modifier.dart |
diff --git a/pkg/fasta/lib/src/modifier.dart b/pkg/fasta/lib/src/modifier.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..8bd8eaf3289d8a268217e7225cb19aeef594d6d1 |
--- /dev/null |
+++ b/pkg/fasta/lib/src/modifier.dart |
@@ -0,0 +1,76 @@ |
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+library fasta.modifier; |
+ |
+import 'errors.dart' show |
+ internalError; |
+ |
+enum ModifierEnum { |
+ Abstract, |
+ Const, |
+ External, |
+ Final, |
+ Static, |
+ |
+ // Not a real modifier. |
+ Var, |
+} |
+ |
+const int abstractMask = 1; |
+ |
+const int constMask = abstractMask << 1; |
+ |
+const int externalMask = constMask << 1; |
+ |
+const int finalMask = externalMask << 1; |
+ |
+const int staticMask = finalMask << 1; |
+ |
+/// Not a real modifier, and by setting it to null, it is automatically |
+/// ignored by [Modifier.validate] below. |
+const int varMask = 0; |
+ |
+const Modifier Abstract = const Modifier(ModifierEnum.Abstract, abstractMask); |
+ |
+const Modifier Const = const Modifier(ModifierEnum.Const, constMask); |
+ |
+const Modifier External = const Modifier(ModifierEnum.External, externalMask); |
+ |
+const Modifier Final = const Modifier(ModifierEnum.Final, finalMask); |
+ |
+const Modifier Static = const Modifier(ModifierEnum.Static, staticMask); |
+ |
+/// Not a real modifier. |
+const Modifier Var = const Modifier(ModifierEnum.Var, varMask); |
+ |
+class Modifier { |
+ final ModifierEnum kind; |
+ |
+ final int mask; |
+ |
+ const Modifier(this.kind, this.mask); |
+ |
+ factory Modifier.fromString(String string) { |
+ if (identical('abstract', string)) return Abstract; |
+ if (identical('const', string)) return Const; |
+ if (identical('external', string)) return External; |
+ if (identical('final', string)) return Final; |
+ if (identical('static', string)) return Static; |
+ if (identical('var', string)) return Var; |
+ return internalError("Unhandled modifier: $string"); |
+ } |
+ |
+ toString() => "modifier(${'$kind'.substring('ModifierEnum.'.length)})"; |
+ |
+ static int validate(List<Modifier> modifiers, {bool isAbstract: false}) { |
+ // TODO(ahe): Implement modifier validation: ordering and uniqueness. |
+ int result = isAbstract ? abstractMask : 0; |
+ if (modifiers == null) return result; |
+ for (Modifier modifier in modifiers) { |
+ result |= modifier.mask; |
+ } |
+ return result; |
+ } |
+} |