blob: c88e521da63751d577e46dc763819684d00a4d8e [file] [log] [blame]
// Copyright (c) 2012, 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.
part of ssa;
class TypeMaskFactory {
static TypeMask fromInferredType(TypeMask mask, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
if (mask == null) return backend.dynamicType;
return mask;
}
static TypeMask inferredReturnTypeForElement(
Element element, Compiler compiler) {
return fromInferredType(
compiler.typesTask.getGuaranteedReturnTypeOfElement(element),
compiler);
}
static TypeMask inferredTypeForElement(Element element, Compiler compiler) {
return fromInferredType(
compiler.typesTask.getGuaranteedTypeOfElement(element),
compiler);
}
static TypeMask inferredTypeForSelector(Selector selector, Compiler compiler) {
return fromInferredType(
compiler.typesTask.getGuaranteedTypeOfSelector(selector),
compiler);
}
static TypeMask inferredForNode(Element owner, ast.Node node,
Compiler compiler) {
return fromInferredType(
compiler.typesTask.getGuaranteedTypeOfNode(owner, node),
compiler);
}
static TypeMask fromNativeBehavior(native.NativeBehavior nativeBehavior,
Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
if (nativeBehavior.typesReturned.isEmpty) return backend.dynamicType;
TypeMask result = nativeBehavior.typesReturned
.map((type) => fromNativeType(type, compiler))
.reduce((t1, t2) => t1.union(t2, compiler));
assert(!(result.isEmpty && !result.isNullable));
return result;
}
// [type] is either an instance of [DartType] or special objects
// like [native.SpecialType.JsObject].
static TypeMask fromNativeType(type, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
if (type == native.SpecialType.JsObject) {
return new TypeMask.nonNullExact(compiler.objectClass);
} else if (type.isVoid) {
return backend.nullType;
} else if (type.element == compiler.nullClass) {
return backend.nullType;
} else if (type.treatAsDynamic) {
return backend.dynamicType;
} else if (compiler.world.hasAnySubtype(type.element)) {
return new TypeMask.nonNullSubtype(type.element);
} else if (compiler.world.hasAnySubclass(type.element)) {
return new TypeMask.nonNullSubclass(type.element);
} else {
return new TypeMask.nonNullExact(type.element);
}
}
}