Skip to content

Commit 80ebf56

Browse files
authored
[Port] Forced re-execution expression within template (#1762)
* Forced re-execution expression within template * retrigger ci
1 parent bcfad6a commit 80ebf56

File tree

3 files changed

+42
-6
lines changed

3 files changed

+42
-6
lines changed

libraries/botbuilder-lg/src/evaluator.ts

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa
4949
public static readonly fromFileFunctionName = 'fromFile';
5050
public static readonly templateFunctionName = 'template';
5151
public static readonly isTemplateFunctionName = 'isTemplate';
52+
private static readonly ReExecuteSuffix = '!';
5253

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

6667
/**
6768
* Evaluate a template with given name and scope.
68-
* @param templateName template name.
69+
* @param inputTemplateName template name.
6970
* @param scope scope.
7071
* @returns Evaluate result.
7172
*/
72-
public evaluateTemplate(templateName: string, scope: any): any {
73+
public evaluateTemplate(inputTemplateName: string, scope: any): any {
74+
let templateName: string;
75+
let reExecute: boolean;
76+
({reExecute, pureTemplateName: templateName} = this.parseTemplateName(inputTemplateName));
77+
7378
if (!(templateName in this.templateMap)) {
7479
throw new Error(`No such template: ${ templateName }`);
7580
}
@@ -91,7 +96,7 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa
9196

9297
if (this.evalutationTargetStack.length !== 0) {
9398
previousEvaluateTarget = this.evalutationTargetStack[this.evalutationTargetStack.length - 1];
94-
if (previousEvaluateTarget.evaluatedChildren.has(currentEvulateId)) {
99+
if (!reExecute && previousEvaluateTarget.evaluatedChildren.has(currentEvulateId)) {
95100
return previousEvaluateTarget.evaluatedChildren.get(currentEvulateId);
96101
}
97102
}
@@ -236,7 +241,9 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa
236241
}).join('');
237242
}
238243

239-
public constructScope(templateName: string, args: any[]): any {
244+
public constructScope(inputTemplateName: string, args: any[]): any {
245+
var templateName = this.parseTemplateName(inputTemplateName).pureTemplateName;
246+
240247
if (!this.templateMap[templateName]) {
241248
throw new Error(`No such template ${ templateName }`);
242249
}
@@ -403,9 +410,10 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa
403410
return baseLookup(name.substring(prebuiltPrefix.length));
404411
}
405412

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

411419
if (name === Evaluator.templateFunctionName) {
@@ -581,4 +589,16 @@ export class Evaluator extends AbstractParseTreeVisitor<any> implements LGFilePa
581589
throw new Error(`arguments mismatch for template ${ templateName }, expect ${ expectedArgsCount } actual ${ actualArgsCount }`);
582590
}
583591
}
592+
593+
private parseTemplateName(templateName: string): { reExecute: boolean; pureTemplateName: string } {
594+
if (!templateName) {
595+
throw new Error('template name is empty.');
596+
}
597+
598+
if (templateName.endsWith(Evaluator.ReExecuteSuffix)) {
599+
return {reExecute:true, pureTemplateName: templateName.substr(0, templateName.length - Evaluator.ReExecuteSuffix.length)};
600+
} else {
601+
return {reExecute:false, pureTemplateName: templateName};
602+
}
603+
}
584604
}

libraries/botbuilder-lg/tests/lg.test.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,4 +771,11 @@ describe('LG', function() {
771771
evaled = LGFile.evaluateTemplate('T3', scope);
772772
assert.strictEqual(evaled, 'p1enum');
773773
});
774+
775+
it('TestReExecute', function() {
776+
var LGFile = LGParser.parseFile(GetExampleFilePath('ReExecute.lg'));
777+
778+
// may be has different values
779+
LGFile.evaluateTemplate('templateWithSameParams', {param1:'ms', param2:'newms'});
780+
});
774781
});
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# templateWithSameParams(param)
2+
- ${listTemplate1(param)} ${listTemplate1!(param)}
3+
4+
# listTemplate1(param)
5+
- item1
6+
- item2
7+
- item3
8+
- item4
9+
- item5

0 commit comments

Comments
 (0)