Skip to content

Commit

Permalink
Use var instead of val for variables in bindings
Browse files Browse the repository at this point in the history
  • Loading branch information
exyi committed Mar 10, 2021
1 parent 6f36cc8 commit 50f0135
Show file tree
Hide file tree
Showing 6 changed files with 27 additions and 27 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -552,19 +552,19 @@ public void BindingCompiler_ComparisonOperators()
[TestMethod]
public void BindingCompiler_Variables()
{
Assert.AreEqual(2, ExecuteBinding("val a = 1; a + 1"));
Assert.AreEqual(typeof(int), ExecuteBinding("val a = 1; a.GetType()"));
Assert.AreEqual(2, ExecuteBinding("var a = 1; a + 1"));
Assert.AreEqual(typeof(int), ExecuteBinding("var a = 1; a.GetType()"));

var result = ExecuteBinding("val a = 1; val b = a + LongProperty; val c = b + StringProp; c", new [] { new TestViewModel { LongProperty = 1, StringProp = "X" } });
var result = ExecuteBinding("var a = 1; var b = a + LongProperty; var c = b + StringProp; c", new [] { new TestViewModel { LongProperty = 1, StringProp = "X" } });
Assert.AreEqual("2X", result);
}

[TestMethod]
public void BindingCompiler_VariableShadowing()
{
Assert.AreEqual(121L, ExecuteBinding("val LongProperty = LongProperty + 120; LongProperty", new TestViewModel { LongProperty = 1 }));
Assert.AreEqual(7, ExecuteBinding("val a = 1; val b = (val a = 5; a + 1); a + b"));
Assert.AreEqual(3, ExecuteBinding("val a = 1; val a = a + 1; val a = a + 1; a"));
Assert.AreEqual(121L, ExecuteBinding("var LongProperty = LongProperty + 120; LongProperty", new TestViewModel { LongProperty = 1 }));
Assert.AreEqual(7, ExecuteBinding("var a = 1; var b = (var a = 5; a + 1); a + b"));
Assert.AreEqual(3, ExecuteBinding("var a = 1; var a = a + 1; var a = a + 1; a"));
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -398,28 +398,28 @@ public void StaticCommandCompilation_IndexParameterInParent()
[TestMethod]
public void JavascriptCompilation_Variable()
{
var result = CompileBinding("val a = 1; val b = 2; val c = 3; a + b + c", typeof(TestViewModel));
var result = CompileBinding("var a = 1; var b = 2; var c = 3; a + b + c", typeof(TestViewModel));
Assert.AreEqual("function(a,b,c){a=1;b=2;c=3;return a+b+c;}()", result);
}

[TestMethod]
public void JavascriptCompilation_Variable_Nested()
{
var result = CompileBinding("val a = 1; val b = (val a = 5; a + 1); a + b", typeof(TestViewModel));
var result = CompileBinding("var a = 1; var b = (var a = 5; a + 1); a + b", typeof(TestViewModel));
Assert.AreEqual("function(a0,b){a0=1;b=function(a){a=5;return a+1;}();return a0+b;}()", result);
}

[TestMethod]
public void JavascriptCompilation_Variable_Property()
{
var result = CompileBinding("val a = _this.StringProp; val b = _this.StringProp2; StringProp2 = a + b", typeof(TestViewModel));
var result = CompileBinding("var a = _this.StringProp; var b = _this.StringProp2; StringProp2 = a + b", typeof(TestViewModel));
Assert.AreEqual("function(a,b){a=StringProp();b=StringProp2();return StringProp2(a+b);}()", result);
}

[TestMethod]
public void JavascriptCompilation_Variable_VM()
{
var result = CompileBinding("val a = _parent; val b = _this.StringProp2; StringProp2 = a + b", new [] { typeof(string), typeof(TestViewModel) });
var result = CompileBinding("var a = _parent; var b = _this.StringProp2; StringProp2 = a + b", new [] { typeof(string), typeof(TestViewModel) });
Assert.AreEqual("function(a,b){a=$parent;b=StringProp2();return StringProp2(a+b);}()", result);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,8 +85,8 @@ public void StaticCommandCompilation_ChainedCommands()
[TestMethod]
public void StaticCommandCompilation_MultipleCommandsWithVariable()
{
var result = CompileBinding("val lenVar = StaticCommands.GetLength(StringProp).ToString(); StringProp = StaticCommands.GetLength(lenVar).ToString();", typeof(TestViewModel));
Assert.AreEqual("(function(a,b){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[b.$data.StringProp()]).then(function(r_0){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[dotvvm.globalize.bindingNumberToString(r_0)()]).then(function(r_1){resolve(b.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_1)()).StringProp());},reject);},reject);});}(this,ko.contextFor(this)))", result);
var result = CompileBinding("var lenVar = StaticCommands.GetLength(StringProp).ToString(); StringProp = StaticCommands.GetLength(lenVar).ToString();", typeof(TestViewModel));
Assert.AreEqual("(function(a,d,b,c){return new Promise(function(resolve,reject){dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[d.$data.StringProp()]).then(function(r_0){(c=b=dotvvm.globalize.bindingNumberToString(r_0)(),dotvvm.staticCommandPostback(a,\"WARNING/NOT/ENCRYPTED+++WyJEb3RWVk0uRnJhbWV3b3JrLlRlc3RzLkJpbmRpbmcuU3RhdGljQ29tbWFuZHMsIERvdFZWTS5GcmFtZXdvcmsuVGVzdHMuQ29tbW9uIiwiR2V0TGVuZ3RoIixbXSwiQUE9PSJd\",[b]).then(function(r_1){resolve((c,d.$data.StringProp(dotvvm.globalize.bindingNumberToString(r_1)()).StringProp(),null));},reject));},reject);});}(this,ko.contextFor(this)))", result);
}

[TestMethod]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -764,9 +764,9 @@ public void BindingParser_MultiblockExpression_SemicolonEnd_Invalid(string bindi
}

[DataTestMethod]
[DataRow("val x=A(); !x", "x", DisplayName = "Variable (val) expression")]
[DataRow("val val=A(); !val", "val", DisplayName = "Variable (val) expression, name=val")]
[DataRow("val x = A(); !x", "x", DisplayName = "Variable (val) expression with whitespaces")]
[DataRow("var x=A(); !x", "x", DisplayName = "Variable (val) expression")]
[DataRow("var var=A(); !var", "var", DisplayName = "Variable (val) expression, name=val")]
[DataRow("var x = A(); !x", "x", DisplayName = "Variable (val) expression with whitespaces")]
public void BindingParser_VariableExpression_Simple(string bindingExpression, string variableName)
{
var parser = bindingParserNodeFactory.SetupParser(bindingExpression);
Expand All @@ -792,7 +792,7 @@ public void BindingParser_VariableExpression_Simple(string bindingExpression, st
[TestMethod]
public void BindingParser_VariableExpression_3Vars()
{
var parser = bindingParserNodeFactory.SetupParser("val a = 1; val b = 2; val c = 3; a+b+c");
var parser = bindingParserNodeFactory.SetupParser("var a = 1; var b = 2; var c = 3; a+b+c");
var node1 = parser.ReadExpression().CastTo<BlockBindingParserNode>();
var node2 = node1.SecondExpression.CastTo<BlockBindingParserNode>();
var node3 = node2.SecondExpression.CastTo<BlockBindingParserNode>();
Expand All @@ -805,9 +805,9 @@ public void BindingParser_VariableExpression_3Vars()
Assert.IsNotNull(node3.Variable);
Assert.AreEqual("a", node1.Variable.Name);

Assert.AreEqual("val a = 1; val b = 2; val c = 3; a + b + c", node1.ToDisplayString());
Assert.AreEqual("val b = 2; val c = 3; a + b + c", node2.ToDisplayString());
Assert.AreEqual("val c = 3; a + b + c", node3.ToDisplayString());
Assert.AreEqual("var a = 1; var b = 2; var c = 3; a + b + c", node1.ToDisplayString());
Assert.AreEqual("var b = 2; var c = 3; a + b + c", node2.ToDisplayString());
Assert.AreEqual("var c = 3; a + b + c", node3.ToDisplayString());
Assert.AreEqual("a + b + c", node3.SecondExpression.ToDisplayString());
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -361,17 +361,17 @@ private BindingParserNode ReadIdentifierExpression(bool onlyTypeName)
// we have `identifier identifier` - the first one must be a KEYWORD USAGE

var keyword = keywordNameExpression.Name;
if (keyword == "val")
if (keyword == "var")
{
return ReadVariableExpression(startIndex);
}
else if (keyword == "var" || keyword == "let")
else if (keyword == "val" || keyword == "let" || keyword == "const")
{
expression = CreateNode(expression, startIndex, $"Variable declaration using {keyword} is not supported. Did you intend to use the val keyword?");
expression = CreateNode(expression, startIndex, $"Variable declaration using {keyword} is not supported. Did you intend to use the var keyword?");
}
else
{
expression = CreateNode(expression, startIndex, $"Expression '{expression.ToDisplayString()}' can not be followed by an identifier. Did you intent to declare a variable using the val keyword?");
expression = CreateNode(expression, startIndex, $"Expression '{expression.ToDisplayString()}' can not be followed by an identifier. Did you intent to declare a variable using the var keyword?");
}
}
else
Expand All @@ -388,7 +388,7 @@ private BindingParserNode ReadVariableExpression(int startIndex)
var variableName = ReadIdentifierNameExpression();
if (!(variableName is SimpleNameBindingParserNode))
{
variableName = CreateNode(variableName, variableName.StartPosition, $"Variable name can not be generic, please use the `val {variableName.Name} = X` syntax.");
variableName = CreateNode(variableName, variableName.StartPosition, $"Variable name can not be generic, please use the `var {variableName.Name} = X` syntax.");
}

var incorrectEquals = IsCurrentTokenIncorrect(BindingTokenType.AssignOperator);
Expand All @@ -404,11 +404,11 @@ private BindingParserNode ReadVariableExpression(int startIndex)
return CreateNode(
new BlockBindingParserNode(resultBlock.FirstExpression, resultBlock.SecondExpression, variableName),
startIndex,
!incorrectEquals ? null : $"Expected variable declaration `val {variableName.Name} = {resultBlock.FirstExpression}`");
!incorrectEquals ? null : $"Expected variable declaration `var {variableName.Name} = {resultBlock.FirstExpression}`");
}
else
{
return CreateNode(value, startIndex, $"Variable declaration must be followed by a semicolon and another expression. Please add the return value after `val {variableName.Name} = {value}; ...` or remove the `val {variableName.Name} = ` in case you only want to invoke the expression.");
return CreateNode(value, startIndex, $"Variable declaration must be followed by a semicolon and another expression. Please add the return value after `var {variableName.Name} = {value}; ...` or remove the `var {variableName.Name} = ` in case you only want to invoke the expression.");
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,6 @@ public override IEnumerable<BindingParserNode> EnumerateChildNodes()
=> new [] { FirstExpression, SecondExpression };

public override string ToDisplayString()
=> (Variable is object ? $"val {Variable.Name} = " : "") + $"{FirstExpression.ToDisplayString()}; {SecondExpression.ToDisplayString()}";
=> (Variable is object ? $"var {Variable.Name} = " : "") + $"{FirstExpression.ToDisplayString()}; {SecondExpression.ToDisplayString()}";
}
}

0 comments on commit 50f0135

Please sign in to comment.