Skip to content

Commit

Permalink
[Port] Forced re-execution expression within template (#1762)
Browse files Browse the repository at this point in the history
* Forced re-execution expression within template

* retrigger ci
  • Loading branch information
Danieladu authored Feb 22, 2020
1 parent bcfad6a commit 80ebf56
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 6 deletions.
32 changes: 26 additions & 6 deletions libraries/botbuilder-lg/src/evaluator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa
public static readonly fromFileFunctionName = 'fromFile';
public static readonly templateFunctionName = 'template';
public static readonly isTemplateFunctionName = 'isTemplate';
private static readonly ReExecuteSuffix = '!';

public constructor(templates: LGTemplate[], expressionEngine: ExpressionEngine) {
super();
Expand All @@ -65,11 +66,15 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa

/**
* Evaluate a template with given name and scope.
* @param templateName template name.
* @param inputTemplateName template name.
* @param scope scope.
* @returns Evaluate result.
*/
public evaluateTemplate(templateName: string, scope: any): any {
public evaluateTemplate(inputTemplateName: string, scope: any): any {
let templateName: string;
let reExecute: boolean;
({reExecute, pureTemplateName: templateName} = this.parseTemplateName(inputTemplateName));

if (!(templateName in this.templateMap)) {
throw new Error(`No such template: ${ templateName }`);
}
Expand All @@ -91,7 +96,7 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa

if (this.evalutationTargetStack.length !== 0) {
previousEvaluateTarget = this.evalutationTargetStack[this.evalutationTargetStack.length - 1];
if (previousEvaluateTarget.evaluatedChildren.has(currentEvulateId)) {
if (!reExecute && previousEvaluateTarget.evaluatedChildren.has(currentEvulateId)) {
return previousEvaluateTarget.evaluatedChildren.get(currentEvulateId);
}
}
Expand Down Expand Up @@ -236,7 +241,9 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa
}).join('');
}

public constructScope(templateName: string, args: any[]): any {
public constructScope(inputTemplateName: string, args: any[]): any {
var templateName = this.parseTemplateName(inputTemplateName).pureTemplateName;

if (!this.templateMap[templateName]) {
throw new Error(`No such template ${ templateName }`);
}
Expand Down Expand Up @@ -403,9 +410,10 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa
return baseLookup(name.substring(prebuiltPrefix.length));
}

if (this.templateMap[name]) {
var templateName = this.parseTemplateName(name).pureTemplateName;
if (templateName in this.templateMap) {
// tslint:disable-next-line: max-line-length
return new ExpressionEvaluator(name, ExpressionFunctions.apply(this.templateEvaluator(name)), ReturnType.Object, this.validTemplateReference);
return new ExpressionEvaluator(templateName, ExpressionFunctions.apply(this.templateEvaluator(name)), ReturnType.Object, this.validTemplateReference);
}

if (name === Evaluator.templateFunctionName) {
Expand Down Expand Up @@ -581,4 +589,16 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa
throw new Error(`arguments mismatch for template ${ templateName }, expect ${ expectedArgsCount } actual ${ actualArgsCount }`);
}
}

private parseTemplateName(templateName: string): { reExecute: boolean; pureTemplateName: string } {
if (!templateName) {
throw new Error('template name is empty.');
}

if (templateName.endsWith(Evaluator.ReExecuteSuffix)) {
return {reExecute:true, pureTemplateName: templateName.substr(0, templateName.length - Evaluator.ReExecuteSuffix.length)};
} else {
return {reExecute:false, pureTemplateName: templateName};
}
}
}
7 changes: 7 additions & 0 deletions libraries/botbuilder-lg/tests/lg.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -771,4 +771,11 @@ describe('LG', function() {
evaled = LGFile.evaluateTemplate('T3', scope);
assert.strictEqual(evaled, 'p1enum');
});

it('TestReExecute', function() {
var LGFile = LGParser.parseFile(GetExampleFilePath('ReExecute.lg'));

// may be has different values
LGFile.evaluateTemplate('templateWithSameParams', {param1:'ms', param2:'newms'});
});
});
9 changes: 9 additions & 0 deletions libraries/botbuilder-lg/tests/testData/examples/ReExecute.lg
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# templateWithSameParams(param)
- ${listTemplate1(param)} ${listTemplate1!(param)}

# listTemplate1(param)
- item1
- item2
- item3
- item4
- item5

0 comments on commit 80ebf56

Please sign in to comment.