test(ivy): add html to ivy ast transformer tests (#23546)

PR Close #23546
This commit is contained in:
Victor Berchet
2018-04-24 14:22:55 -07:00
committed by Igor Minar
parent c5ca5c0d9f
commit 46674d5fac
15 changed files with 567 additions and 67 deletions

View File

@ -7,7 +7,7 @@
*/
import {SecurityContext} from '../core';
import {AST, BoundElementBindingType, BoundElementProperty, ParsedEvent, ParsedEventType} from '../expression_parser/ast';
import {AST, BindingType, BoundElementProperty, ParsedEvent, ParsedEventType} from '../expression_parser/ast';
import {ParseSourceSpan} from '../parse_util';
export interface Node {
@ -29,14 +29,13 @@ export class TextAttribute implements Node {
constructor(
public name: string, public value: string, public sourceSpan: ParseSourceSpan,
public valueSpan?: ParseSourceSpan) {}
visit<Result>(visitor: Visitor<Result>): Result { return visitor.visitAttribute(this); }
visit<Result>(visitor: Visitor<Result>): Result { return visitor.visitTextAttribute(this); }
}
export class BoundAttribute implements Node {
constructor(
public name: string, public type: BoundElementBindingType,
public securityContext: SecurityContext, public value: AST, public unit: string|null,
public sourceSpan: ParseSourceSpan) {}
public name: string, public type: BindingType, public securityContext: SecurityContext,
public value: AST, public unit: string|null, public sourceSpan: ParseSourceSpan) {}
static fromBoundElementProperty(prop: BoundElementProperty) {
return new BoundAttribute(
@ -106,7 +105,7 @@ export interface Visitor<Result = any> {
visitContent(content: Content): Result;
visitVariable(variable: Variable): Result;
visitReference(reference: Reference): Result;
visitAttribute(attribute: TextAttribute): Result;
visitTextAttribute(attribute: TextAttribute): Result;
visitBoundAttribute(attribute: BoundAttribute): Result;
visitBoundEvent(attribute: BoundEvent): Result;
visitText(text: Text): Result;
@ -119,7 +118,7 @@ export class NullVisitor implements Visitor<void> {
visitContent(content: Content): void {}
visitVariable(variable: Variable): void {}
visitReference(reference: Reference): void {}
visitAttribute(attribute: TextAttribute): void {}
visitTextAttribute(attribute: TextAttribute): void {}
visitBoundAttribute(attribute: BoundAttribute): void {}
visitBoundEvent(attribute: BoundEvent): void {}
visitText(text: Text): void {}
@ -141,7 +140,7 @@ export class RecursiveVisitor implements Visitor<void> {
visitContent(content: Content): void {}
visitVariable(variable: Variable): void {}
visitReference(reference: Reference): void {}
visitAttribute(attribute: TextAttribute): void {}
visitTextAttribute(attribute: TextAttribute): void {}
visitBoundAttribute(attribute: BoundAttribute): void {}
visitBoundEvent(attribute: BoundEvent): void {}
visitText(text: Text): void {}
@ -185,7 +184,7 @@ export class TransformVisitor implements Visitor<Node> {
visitVariable(variable: Variable): Node { return variable; }
visitReference(reference: Reference): Node { return reference; }
visitAttribute(attribute: TextAttribute): Node { return attribute; }
visitTextAttribute(attribute: TextAttribute): Node { return attribute; }
visitBoundAttribute(attribute: BoundAttribute): Node { return attribute; }
visitBoundEvent(attribute: BoundEvent): Node { return attribute; }
visitText(text: Text): Node { return text; }

View File

@ -111,9 +111,12 @@ export class HtmlToTemplateTransform implements html.Visitor {
inlineTemplateSourceSpan = attribute.valueSpan || attribute.sourceSpan;
const parsedVariables: ParsedVariable[] = [];
this.bindingParser.parseInlineTemplateBinding(
templateKey, templateValue, attribute.sourceSpan, templateMatchableAttributes,
templateParsedProperties, templateVariables);
templateParsedProperties, parsedVariables);
templateVariables.push(
...parsedVariables.map(v => new t.Variable(v.name, v.value, v.sourceSpan)));
} else {
// Check for variables, events, property bindings, interpolation
hasBinding = this.parseAttribute(
@ -272,7 +275,6 @@ export class HtmlToTemplateTransform implements html.Visitor {
return hasBinding;
}
private parseVariable(
identifier: string, value: string, sourceSpan: ParseSourceSpan, variables: t.Variable[]) {
if (identifier.indexOf('-') > -1) {

View File

@ -11,7 +11,7 @@ import {CompileReflector} from '../../compile_reflector';
import {BindingForm, BuiltinFunctionCall, LocalResolver, convertActionBinding, convertPropertyBinding} from '../../compiler_util/expression_converter';
import {ConstantPool} from '../../constant_pool';
import * as core from '../../core';
import {AST, AstMemoryEfficientTransformer, BindingPipe, BoundElementBindingType, FunctionCall, ImplicitReceiver, LiteralArray, LiteralMap, LiteralPrimitive, PropertyRead} from '../../expression_parser/ast';
import {AST, AstMemoryEfficientTransformer, BindingPipe, BindingType, FunctionCall, ImplicitReceiver, LiteralArray, LiteralMap, LiteralPrimitive, PropertyRead} from '../../expression_parser/ast';
import * as o from '../../output/output_ast';
import {ParseSourceSpan} from '../../parse_util';
import {CssSelector, SelectorMatcher} from '../../selector';
@ -23,10 +23,10 @@ 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} = {
[BoundElementBindingType.Property]: R3.elementProperty,
[BoundElementBindingType.Attribute]: R3.elementAttribute,
[BoundElementBindingType.Class]: R3.elementClassNamed,
[BoundElementBindingType.Style]: R3.elementStyleNamed,
[BindingType.Property]: R3.elementProperty,
[BindingType.Attribute]: R3.elementAttribute,
[BindingType.Class]: R3.elementClassNamed,
[BindingType.Style]: R3.elementStyleNamed,
};
export class TemplateDefinitionBuilder implements t.Visitor<void>, LocalResolver {
@ -331,7 +331,7 @@ export class TemplateDefinitionBuilder implements t.Visitor<void>, LocalResolver
// Generate element input bindings
element.inputs.forEach((input: t.BoundAttribute) => {
if (input.type === BoundElementBindingType.Animation) {
if (input.type === BindingType.Animation) {
this._unsupported('animations');
}
const convertedBinding = this.convertPropertyBinding(implicit, input.value);
@ -431,7 +431,7 @@ export class TemplateDefinitionBuilder implements t.Visitor<void>, LocalResolver
// These should be handled in the template or element directly.
readonly visitReference = invalid;
readonly visitVariable = invalid;
readonly visitAttribute = invalid;
readonly visitTextAttribute = invalid;
readonly visitBoundAttribute = invalid;
readonly visitBoundEvent = invalid;

View File

@ -12,12 +12,9 @@ import * as t from '../r3_ast';
import {R3QueryMetadata} from './api';
/** Name of the temporary to use during data binding */
export const TEMPORARY_NAME = '_t';
/** Name of the context parameter passed into a template function */
export const CONTEXT_NAME = 'ctx';