| // Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file | |
| // for details. All rights reserved. Use of this source code is governed by a | |
| // BSD-style license that can be found in the LICENSE file. | |
| import 'package:kernel/ast.dart'; | |
| /// Represents the nullability modifiers encountered while parsing the types. | |
| /// | |
| /// The syntactic nullability needs to be interpreted, that is, built, into the | |
| /// semantic nullability used on [DartType]s of Kernel. | |
| enum SyntacticNullability { | |
| /// Used when the type is declared with '?' suffix after it. | |
| nullable, | |
| /// Used when the type is declared without any nullability suffixes. | |
| omitted, | |
| /// Used when the type is nullable without any nullability suffix. | |
| inherent, | |
| } | |
| class NullabilityBuilder { | |
| final SyntacticNullability _syntacticNullability; | |
| const new nullable() : _syntacticNullability = SyntacticNullability.nullable; | |
| const new omitted() : _syntacticNullability = SyntacticNullability.omitted; | |
| const new inherent() : _syntacticNullability = SyntacticNullability.inherent; | |
| bool get isOmitted => _syntacticNullability == SyntacticNullability.omitted; | |
| bool get isNullable => _syntacticNullability == SyntacticNullability.nullable; | |
| factory fromNullability(Nullability nullability) { | |
| switch (nullability) { | |
| case Nullability.nullable: | |
| return const NullabilityBuilder.nullable(); | |
| case Nullability.nonNullable: | |
| case Nullability.undetermined: | |
| return const NullabilityBuilder.omitted(); | |
| } | |
| } | |
| Nullability build() { | |
| switch (_syntacticNullability) { | |
| case SyntacticNullability.nullable: | |
| return Nullability.nullable; | |
| case SyntacticNullability.inherent: | |
| return Nullability.nullable; | |
| case SyntacticNullability.omitted: | |
| return Nullability.nonNullable; | |
| } | |
| } | |
| void writeNullabilityOn(StringBuffer sb) { | |
| switch (_syntacticNullability) { | |
| case SyntacticNullability.nullable: | |
| sb.write("?"); | |
| return; | |
| case SyntacticNullability.omitted: | |
| case SyntacticNullability.inherent: | |
| // Do nothing. | |
| return; | |
| } | |
| } | |
| @override | |
| String toString() { | |
| StringBuffer buffer = new StringBuffer(); | |
| writeNullabilityOn(buffer); | |
| return "$buffer"; | |
| } | |
| } |