fix(compiler): fix a few non-tree-shakeable code patterns (#24677)

This change makes @angular/compiler more tree-shakeable by changing
an enum to a const enum and by getting rid of a top-level map that
the tree-shaker was seeing as a reference which caused r3_identifiers
to be retained.

This drops a few hundred bytes of JS from tree-shaken ngtsc compiled
apps.

PR Close #24677
This commit is contained in:
Alex Rickabaugh 2018-06-20 16:00:48 -07:00 committed by Miško Hevery
parent 69510acb20
commit 50d4a4fe5c
3 changed files with 16 additions and 17 deletions

View File

@ -32,12 +32,20 @@ import {htmlAstToRender3Ast} from '../r3_template_transform';
import {R3QueryMetadata} from './api'; import {R3QueryMetadata} from './api';
import {CONTEXT_NAME, I18N_ATTR, I18N_ATTR_PREFIX, ID_SEPARATOR, IMPLICIT_REFERENCE, MEANING_SEPARATOR, REFERENCE_PREFIX, RENDER_FLAGS, TEMPORARY_NAME, asLiteral, getQueryPredicate, invalid, mapToExpression, noop, temporaryAllocator, trimTrailingNulls, unsupported} from './util'; import {CONTEXT_NAME, I18N_ATTR, I18N_ATTR_PREFIX, ID_SEPARATOR, IMPLICIT_REFERENCE, MEANING_SEPARATOR, REFERENCE_PREFIX, RENDER_FLAGS, TEMPORARY_NAME, asLiteral, getQueryPredicate, invalid, mapToExpression, noop, temporaryAllocator, trimTrailingNulls, unsupported} from './util';
const BINDING_INSTRUCTION_MAP: {[type: number]: o.ExternalReference} = { function mapBindingToInstruction(type: BindingType): o.ExternalReference|undefined {
[BindingType.Property]: R3.elementProperty, switch (type) {
[BindingType.Attribute]: R3.elementAttribute, case BindingType.Property:
[BindingType.Class]: R3.elementClassNamed, return R3.elementProperty;
[BindingType.Style]: R3.elementStyleNamed, case BindingType.Attribute:
}; return R3.elementAttribute;
case BindingType.Class:
return R3.elementClassNamed;
case BindingType.Style:
return R3.elementStyleNamed;
default:
return undefined;
}
}
// `className` is used below instead of `class` because the interception // `className` is used below instead of `class` because the interception
// code (where this map is used) deals with DOM element property values // code (where this map is used) deals with DOM element property values
@ -414,7 +422,7 @@ export class TemplateDefinitionBuilder implements t.Visitor<void>, LocalResolver
return; return;
} }
const instruction = BINDING_INSTRUCTION_MAP[input.type]; const instruction = mapBindingToInstruction(input.type);
if (instruction) { if (instruction) {
// TODO(chuckj): runtime: security context? // TODO(chuckj): runtime: security context?
this.instruction( this.instruction(

View File

@ -58,7 +58,7 @@ export class AttrAst implements TemplateAst {
visit(visitor: TemplateAstVisitor, context: any): any { return visitor.visitAttr(this, context); } visit(visitor: TemplateAstVisitor, context: any): any { return visitor.visitAttr(this, context); }
} }
export enum PropertyBindingType { export const enum PropertyBindingType {
// A normal binding to a property (e.g. `[property]="expression"`). // A normal binding to a property (e.g. `[property]="expression"`).
Property, Property,
// A binding to an element attribute (e.g. `[attr.name]="expression"`). // A binding to an element attribute (e.g. `[attr.name]="expression"`).

View File

@ -356,9 +356,6 @@
{ {
"name": "CORE" "name": "CORE"
}, },
{
"name": "CORE$1"
},
{ {
"name": "CR" "name": "CR"
}, },
@ -803,9 +800,6 @@
{ {
"name": "Identifiers" "name": "Identifiers"
}, },
{
"name": "Identifiers$1"
},
{ {
"name": "IfStmt" "name": "IfStmt"
}, },
@ -1208,9 +1202,6 @@
{ {
"name": "PreparsedElementType" "name": "PreparsedElementType"
}, },
{
"name": "PropertyBindingType"
},
{ {
"name": "PropertyRead" "name": "PropertyRead"
}, },