blob: cfd35fb107f9f331ca0c708f0f6a6c6c2a68ec5f [file] [log] [blame]
// 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.dill_member_builder;
import 'package:kernel/ast.dart'
show Constructor, Field, Member, Procedure, ProcedureKind;
import '../kernel/kernel_builder.dart'
show
Declaration,
MemberBuilder,
isRedirectingGenerativeConstructorImplementation;
import '../modifier.dart'
show abstractMask, constMask, externalMask, finalMask, staticMask;
import '../problems.dart' show unhandled;
class DillMemberBuilder extends MemberBuilder {
final int modifiers;
final Member member;
DillMemberBuilder(Member member, Declaration parent)
: modifiers = computeModifiers(member),
member = member,
super(parent, member.fileOffset);
String get debugName => "DillMemberBuilder";
Member get target => member;
String get name => member.name.name;
bool get isConstructor => member is Constructor;
ProcedureKind get kind {
final member = this.member;
return member is Procedure ? member.kind : null;
}
bool get isRegularMethod => identical(ProcedureKind.Method, kind);
bool get isGetter => identical(ProcedureKind.Getter, kind);
bool get isSetter => identical(ProcedureKind.Setter, kind);
bool get isOperator => identical(ProcedureKind.Operator, kind);
bool get isFactory => identical(ProcedureKind.Factory, kind);
bool get isRedirectingGenerativeConstructor {
return isConstructor &&
isRedirectingGenerativeConstructorImplementation(member);
}
bool get isSynthetic {
// TODO(ahe): Kernel should eventually support a synthetic bit.
return isConstructor &&
name == "" &&
(charOffset == parent.charOffset || charOffset == -1);
}
bool get isField => member is Field;
}
int computeModifiers(Member member) {
int modifier = member.isAbstract ? abstractMask : 0;
modifier |= member.isExternal ? externalMask : 0;
if (member is Field) {
modifier |= member.isConst ? constMask : 0;
modifier |= member.isFinal ? finalMask : 0;
modifier |= member.isStatic ? staticMask : 0;
} else if (member is Procedure) {
modifier |= member.isConst ? constMask : 0;
modifier |= member.isStatic ? staticMask : 0;
} else if (member is Constructor) {
modifier |= member.isConst ? constMask : 0;
} else {
dynamic parent = member.parent;
unhandled("${member.runtimeType}", "computeModifiers", member.fileOffset,
Uri.base.resolve(parent.fileUri));
}
return modifier;
}