blob: f9326da7f4a1736cd0f45a6c2cdf4e450cd01c95 [file] [log] [blame]
// Copyright (c) 2015, 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.
// @dart=2.11
part of '../protoc.dart';
/// Represents the base type of a particular field in a proto definition.
/// (Doesn't include List<> for repeated fields.)
class BaseType {
final FieldDescriptorProto_Type descriptor;
/// The name of the Dart type when in the same package.
final String unprefixed;
/// The suffix of the constant for this type in PbFieldType.
/// (For example, 'B' for boolean or '3' for int32.)
final String typeConstantSuffix;
// Method name of the setter method for this type.
final String setter;
// The generator corresponding to this type.
// (Null for primitive types.)
final ProtobufContainer generator;
const BaseType._raw(this.descriptor, this.typeConstantSuffix, this.unprefixed,
this.setter, this.generator);
bool get isGroup => descriptor == FieldDescriptorProto_Type.TYPE_GROUP;
bool get isMessage => descriptor == FieldDescriptorProto_Type.TYPE_MESSAGE;
bool get isEnum => descriptor == FieldDescriptorProto_Type.TYPE_ENUM;
bool get isString => descriptor == FieldDescriptorProto_Type.TYPE_STRING;
bool get isBytes => descriptor == FieldDescriptorProto_Type.TYPE_BYTES;
bool get isPackable => (generator == null && !isString && !isBytes) || isEnum;
/// The package where this type is declared.
/// (Always the empty string for primitive types.)
String get package => generator == null ? '' : generator.package;
/// The Dart expression to use for this type when in a different file.
String get prefixed => generator == null
? unprefixed
: generator.fileImportPrefix + '.' + unprefixed;
/// Returns the name to use in generated code for this Dart type.
///
/// Doesn't include the List type for repeated fields.
/// [FileGenerator.protoFileUri] represents the current proto file where we
/// are generating code.
/// The Dart class might be imported from a different proto file.
String getDartType(FileGenerator fileGen) =>
(fileGen.protoFileUri == generator?.fileGen?.protoFileUri)
? unprefixed
: prefixed;
String getRepeatedDartType(FileGenerator fileGen) =>
'$coreImportPrefix.List<${getDartType(fileGen)}>';
String getRepeatedDartTypeIterable(FileGenerator fileGen) =>
'$coreImportPrefix.Iterable<${getDartType(fileGen)}>';
factory BaseType(FieldDescriptorProto field, GenerationContext ctx) {
String constSuffix;
switch (field.type) {
case FieldDescriptorProto_Type.TYPE_BOOL:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_BOOL, 'B',
'$coreImportPrefix.bool', r'$_setBool', null);
case FieldDescriptorProto_Type.TYPE_FLOAT:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_FLOAT, 'F',
'$coreImportPrefix.double', r'$_setFloat', null);
case FieldDescriptorProto_Type.TYPE_DOUBLE:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_DOUBLE, 'D',
'$coreImportPrefix.double', r'$_setDouble', null);
case FieldDescriptorProto_Type.TYPE_INT32:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_INT32, '3',
'$coreImportPrefix.int', r'$_setSignedInt32', null);
case FieldDescriptorProto_Type.TYPE_UINT32:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_UINT32, 'U3',
'$coreImportPrefix.int', r'$_setUnsignedInt32', null);
case FieldDescriptorProto_Type.TYPE_SINT32:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_SINT32, 'S3',
'$coreImportPrefix.int', r'$_setSignedInt32', null);
case FieldDescriptorProto_Type.TYPE_FIXED32:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_FIXED32, 'F3',
'$coreImportPrefix.int', r'$_setUnsignedInt32', null);
case FieldDescriptorProto_Type.TYPE_SFIXED32:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_SFIXED32,
'SF3', '$coreImportPrefix.int', r'$_setSignedInt32', null);
case FieldDescriptorProto_Type.TYPE_INT64:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_INT64, '6',
'$_fixnumImportPrefix.Int64', r'$_setInt64', null);
case FieldDescriptorProto_Type.TYPE_UINT64:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_UINT64, 'U6',
'$_fixnumImportPrefix.Int64', r'$_setInt64', null);
case FieldDescriptorProto_Type.TYPE_SINT64:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_SINT64, 'S6',
'$_fixnumImportPrefix.Int64', r'$_setInt64', null);
case FieldDescriptorProto_Type.TYPE_FIXED64:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_FIXED64, 'F6',
'$_fixnumImportPrefix.Int64', r'$_setInt64', null);
case FieldDescriptorProto_Type.TYPE_SFIXED64:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_SFIXED64,
'SF6', '$_fixnumImportPrefix.Int64', r'$_setInt64', null);
case FieldDescriptorProto_Type.TYPE_STRING:
return const BaseType._raw(FieldDescriptorProto_Type.TYPE_STRING, 'S',
'$coreImportPrefix.String', r'$_setString', null);
case FieldDescriptorProto_Type.TYPE_BYTES:
return const BaseType._raw(
FieldDescriptorProto_Type.TYPE_BYTES,
'Y',
'$coreImportPrefix.List<$coreImportPrefix.int>',
r'$_setBytes',
null);
case FieldDescriptorProto_Type.TYPE_GROUP:
constSuffix = 'G';
break;
case FieldDescriptorProto_Type.TYPE_MESSAGE:
constSuffix = 'M';
break;
case FieldDescriptorProto_Type.TYPE_ENUM:
constSuffix = 'E';
break;
default:
throw ArgumentError('unimplemented type: ${field.type.name}');
}
var generator = ctx.getFieldType(field.typeName);
if (generator == null) {
throw 'FAILURE: Unknown type reference ${field.typeName}';
}
return BaseType._raw(
field.type, constSuffix, generator.classname, null, generator);
}
}