blob: 2dd75a5547a37e1105e8760fad29899ced30562f [file] [log] [blame]
// Copyright (c) 2017, 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:built_value/built_value.dart';
import 'package:built_collection/built_collection.dart';
import 'package:meta/meta.dart';
import '../base.dart';
import '../mixins/generics.dart';
import '../visitors.dart';
import 'code.dart';
import 'expression.dart';
import 'reference.dart';
part 'type_reference.g.dart';
@immutable
abstract class TypeReference extends Expression
with HasGenerics
implements Built<TypeReference, TypeReferenceBuilder>, Reference, Spec {
factory TypeReference([
void Function(TypeReferenceBuilder) updates,
]) = _$TypeReference;
TypeReference._();
@override
String get symbol;
@override
String? get url;
/// Optional bound generic.
Reference? get bound;
@override
BuiltList<Reference> get types;
/// Optional nullability.
///
/// An emitter may ignore this if the output is not targeting a Dart language
/// version that supports null safety.
bool? get isNullable;
@override
R accept<R>(
SpecVisitor<R> visitor, [
R? context,
]) =>
visitor.visitType(this, context);
@override
Expression get expression => CodeExpression(Code.scope((a) => a(this)));
@override
TypeReference get type => this;
@override
Expression newInstance(
Iterable<Expression> positionalArguments, [
Map<String, Expression> namedArguments = const {},
List<Reference> typeArguments = const [],
]) =>
InvokeExpression.newOf(
this,
positionalArguments.toList(),
namedArguments,
typeArguments,
);
@override
Expression newInstanceNamed(
String name,
Iterable<Expression> positionalArguments, [
Map<String, Expression> namedArguments = const {},
List<Reference> typeArguments = const [],
]) =>
InvokeExpression.newOf(
this,
positionalArguments.toList(),
namedArguments,
typeArguments,
name,
);
@override
Expression constInstance(
Iterable<Expression> positionalArguments, [
Map<String, Expression> namedArguments = const {},
List<Reference> typeArguments = const [],
]) =>
InvokeExpression.constOf(
this,
positionalArguments.toList(),
namedArguments,
typeArguments,
);
@override
Expression constInstanceNamed(
String name,
Iterable<Expression> positionalArguments, [
Map<String, Expression> namedArguments = const {},
List<Reference> typeArguments = const [],
]) =>
InvokeExpression.constOf(
this,
positionalArguments.toList(),
namedArguments,
typeArguments,
name,
);
}
abstract class TypeReferenceBuilder extends Object
with HasGenericsBuilder
implements Builder<TypeReference, TypeReferenceBuilder> {
factory TypeReferenceBuilder() = _$TypeReferenceBuilder;
TypeReferenceBuilder._();
String? symbol;
String? url;
/// Optional bound generic.
Reference? bound;
@override
ListBuilder<Reference> types = ListBuilder<Reference>();
/// Optional nullability.
///
/// An emitter may ignore this if the output is not targeting a Dart language
/// version that supports null safety.
bool? isNullable;
}