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 {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} = {
[BindingType.Property]: R3.elementProperty,
[BindingType.Attribute]: R3.elementAttribute,
[BindingType.Class]: R3.elementClassNamed,
[BindingType.Style]: R3.elementStyleNamed,
};
function mapBindingToInstruction(type: BindingType): o.ExternalReference|undefined {
switch (type) {
case BindingType.Property:
return R3.elementProperty;
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
// 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;
}
const instruction = BINDING_INSTRUCTION_MAP[input.type];
const instruction = mapBindingToInstruction(input.type);
if (instruction) {
// TODO(chuckj): runtime: security context?
this.instruction(

View File

@ -58,7 +58,7 @@ export class AttrAst implements TemplateAst {
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"`).
Property,
// A binding to an element attribute (e.g. `[attr.name]="expression"`).

View File

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