Skip to content

Commit 695ea4b

Browse files
committed
Hot fix for missing ko.unwrap in Linq Last,First,ElementA translations
This is a lighterweight alternative to #1870, which we might not want to merge to 4.3. This PR does only fixes the 4.3 regression, the problem with .Select(...).ToArray()[0] is not fixed
1 parent f73922b commit 695ea4b

File tree

3 files changed

+16
-9
lines changed

3 files changed

+16
-9
lines changed

src/Framework/Framework/Compilation/Javascript/JavascriptTranslatableMethodCollection.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -556,32 +556,32 @@ string GetDelegateReturnTypeHash(Type type)
556556
check: (method, target, arguments) => EnsureIsComparableInJavascript(method, ReflectionUtils.GetEnumerableType(arguments.First().Type).NotNull())));
557557

558558
AddMethodTranslator(() => Enumerable.Empty<Generic.T>().ElementAt(0),
559-
new GenericMethodCompiler((args, method) => BuildIndexer(args[1], args[2], method)));
559+
new GenericMethodCompiler((args, method) => BuildIndexer(args[1], args[2], method).WithAnnotation(ResultMayBeObservableAnnotation.Instance)));
560560
AddMethodTranslator(() => Enumerable.Empty<Generic.T>().ElementAtOrDefault(0),
561-
new GenericMethodCompiler((args, method) => BuildIndexer(args[1], args[2], method)));
561+
new GenericMethodCompiler((args, method) => BuildIndexer(args[1], args[2], method).WithAnnotation(ResultMayBeObservableAnnotation.Instance)));
562562
AddMethodTranslator(() => ImmutableArrayExtensions.ElementAt(default(ImmutableArray<Generic.T>), 0),
563-
new GenericMethodCompiler((args, method) => BuildIndexer(args[1], args[2], method)));
563+
new GenericMethodCompiler((args, method) => BuildIndexer(args[1], args[2], method).WithAnnotation(ResultMayBeObservableAnnotation.Instance)));
564564
AddMethodTranslator(() => ImmutableArrayExtensions.ElementAtOrDefault(default(ImmutableArray<Generic.T>), 0),
565-
new GenericMethodCompiler((args, method) => BuildIndexer(args[1], args[2], method)));
565+
new GenericMethodCompiler((args, method) => BuildIndexer(args[1], args[2], method).WithAnnotation(ResultMayBeObservableAnnotation.Instance)));
566566

567-
var firstOrDefault = new GenericMethodCompiler((args, m) => BuildIndexer(args[1], new JsLiteral(0), m).WithAnnotation(MayBeNullAnnotation.Instance));
567+
var firstOrDefault = new GenericMethodCompiler((args, m) => BuildIndexer(args[1], new JsLiteral(0), m).WithAnnotation(MayBeNullAnnotation.Instance).WithAnnotation(ResultMayBeObservableAnnotation.Instance));
568568
AddMethodTranslator(() => Enumerable.Empty<Generic.T>().FirstOrDefault(), firstOrDefault);
569569
AddMethodTranslator(() => Enumerable.Empty<Generic.T>().First(), firstOrDefault);
570570
AddMethodTranslator(() => ImmutableArrayExtensions.FirstOrDefault(default(ImmutableArray<Generic.T>)), firstOrDefault);
571571
AddMethodTranslator(() => ImmutableArrayExtensions.First(default(ImmutableArray<Generic.T>)), firstOrDefault);
572572

573573
var firstOrDefaultPred = new GenericMethodCompiler(args =>
574-
args[1].Member("find").Invoke(args[2]).WithAnnotation(MayBeNullAnnotation.Instance));
574+
args[1].Member("find").Invoke(args[2]).WithAnnotation(MayBeNullAnnotation.Instance).WithAnnotation(ResultMayBeObservableAnnotation.Instance));
575575
AddMethodTranslator(() => Enumerable.Empty<Generic.T>().FirstOrDefault(_ => true), firstOrDefaultPred);
576576
AddMethodTranslator(() => Enumerable.Empty<Generic.T>().First(_ => true), firstOrDefaultPred);
577577
AddMethodTranslator(() => ImmutableArrayExtensions.FirstOrDefault(default(ImmutableArray<Generic.T>), _ => true), firstOrDefaultPred);
578578
AddMethodTranslator(() => ImmutableArrayExtensions.First(default(ImmutableArray<Generic.T>), _ => true), firstOrDefaultPred);
579579

580-
var lastOrDefault = new GenericMethodCompiler(args => args[1].Member("at").Invoke(new JsLiteral(-1)).WithAnnotation(MayBeNullAnnotation.Instance));
580+
var lastOrDefault = new GenericMethodCompiler(args => args[1].Member("at").Invoke(new JsLiteral(-1)).WithAnnotation(MayBeNullAnnotation.Instance).WithAnnotation(ResultMayBeObservableAnnotation.Instance));
581581
AddMethodTranslator(() => Enumerable.Empty<Generic.T>().LastOrDefault(), lastOrDefault);
582582
AddMethodTranslator(() => ImmutableArrayExtensions.LastOrDefault(default(ImmutableArray<Generic.T>)), lastOrDefault);
583583
var lastOrDefaultPred = new GenericMethodCompiler(args =>
584-
args[1].Member("findLast").Invoke(args[2]).WithAnnotation(MayBeNullAnnotation.Instance));
584+
args[1].Member("findLast").Invoke(args[2]).WithAnnotation(MayBeNullAnnotation.Instance).WithAnnotation(ResultMayBeObservableAnnotation.Instance));
585585
AddMethodTranslator(() => Enumerable.Empty<Generic.T>().LastOrDefault(_ => false), lastOrDefaultPred);
586586
AddMethodTranslator(() => ImmutableArrayExtensions.LastOrDefault(default(ImmutableArray<Generic.T>), _ => false), lastOrDefaultPred);
587587

src/Tests/Binding/JavascriptCompilationTests.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,13 @@ public void JsTranslator_EnumerableLastOrDefaultParametrized(string binding)
773773
Assert.AreEqual("LongArray().findLast((item)=>ko.unwrap(item)>0)", result);
774774
}
775775

776+
[TestMethod]
777+
public void JsTranslator_EnumerableLastOrDefaultObservable()
778+
{
779+
var result = CompileBinding("LongArray.LastOrDefault()==1", new[] { new NamespaceImport("System.Linq"), new NamespaceImport("System.Collections.Immutable") }, new[] { typeof(TestViewModel) });
780+
Assert.AreEqual("ko.unwrap(LongArray().at(-1))==1", result);
781+
}
782+
776783
[TestMethod]
777784
[DataRow("Enumerable.Distinct(VmArray)", DisplayName = "Regular call of Enumerable.Distinct")]
778785
[DataRow("VmArray.Distinct()", DisplayName = "Syntax sugar - extension method")]

src/Tests/Binding/StaticCommandCompilationTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ public void StaticCommandCompilation_LinqTranslations()
369369
Console.WriteLine(result);
370370
var expectedResult = @"{
371371
let vm = options.viewModel;
372-
vm.StringProp(vm.VmArray.state.filter((x) => ko.unwrap(x).ChildObject.SomeString == ""x"")[0].SomeString);
372+
vm.StringProp(ko.unwrap(vm.VmArray.state.filter((x) => ko.unwrap(x).ChildObject.SomeString == ""x"")[0]).SomeString);
373373
}";
374374

375375
AreEqual(expectedResult, result);

0 commit comments

Comments
 (0)