public void JsonConstructorWithParameterToMemberMapWorksWithReorderedAndDefaultArguments() { AssertCorrect( @"class X { public int a2, b2, c2, d2, e2, f2, g2, h2; public X(int a = 1, int b = 2, int c = 3, int d = 4, int e = 5, int f = 6, int g = 7) {} } int P { get; set; } int F1() { return 0; } int F2() { return 0; } int F3() { return 0; } int F4() { return 0; } public void M() { int a = 0, b = 0, c = 0; // BEGIN var x = new X(d: F1(), g: (P = F2()), f: F3(), b: F4()); // END }", @" var $tmp2 = this.F1(); var $tmp1 = this.F2(); this.set_P($tmp1); var $x = { $d2: $tmp2, $g2: $tmp1, $f2: this.F3(), $b2: this.F4(), $a2: 1, $c2: 3, $e2: 5 }; ", metadataImporter: new MockMetadataImporter { GetConstructorSemantics = c => ConstructorScriptSemantics.Json(c.Parameters.Select(p => c.DeclaringType.GetFields().Single(f => f.Name == p.Name + "2"))) }); }
public void ConstructorImplementedAsJsonDoesNotAppearOnTheType() { var metadataImporter = new MockMetadataImporter { GetConstructorSemantics = ctor => ConstructorScriptSemantics.Json(new IMember[0]) }; Compile(new[] { "class C { public C() {} }" }, metadataImporter: metadataImporter); FindClass("C").UnnamedConstructor.Should().BeNull(); }
public MockMetadataImporter() { GetTypeSemantics = t => { if (t.DeclaringTypeDefinition == null) { return(TypeScriptSemantics.NormalType(t.FullName)); } else { return(TypeScriptSemantics.NormalType(GetTypeSemantics(t.DeclaringTypeDefinition).Name + "$" + t.Name)); } }; GetMethodSemantics = m => MethodScriptSemantics.NormalMethod(m.Name); GetConstructorSemantics = c => { if (c.DeclaringType.Kind == TypeKind.Anonymous) { return(ConstructorScriptSemantics.Json(new IMember[0])); } else if (c.DeclaringType.GetConstructors().Count() == 1 || c.Parameters.Count == 0) { return(ConstructorScriptSemantics.Unnamed()); } else { return(ConstructorScriptSemantics.Named("ctor$" + String.Join("$", c.Parameters.Select(p => p.Type.Name)))); } }; GetPropertySemantics = p => { if (p.DeclaringType.Kind == TypeKind.Anonymous || (p.DeclaringType.FullName == "System.Array" && p.Name == "Length")) { string name = p.Name.Replace("<>", "$"); return(PropertyScriptSemantics.Field(name.StartsWith("$") ? name : ("$" + name))); } else { return(PropertyScriptSemantics.GetAndSetMethods(MethodScriptSemantics.NormalMethod("get_" + p.Name), MethodScriptSemantics.NormalMethod("set_" + p.Name))); } }; GetDelegateSemantics = d => new DelegateScriptSemantics(); GetAutoPropertyBackingFieldName = p => "$" + p.Name; ShouldGenerateAutoPropertyBackingField = p => true; GetFieldSemantics = f => FieldScriptSemantics.Field("$" + f.Name); GetEventSemantics = e => EventScriptSemantics.AddAndRemoveMethods(MethodScriptSemantics.NormalMethod("add_" + e.Name), MethodScriptSemantics.NormalMethod("remove_" + e.Name)); GetAutoEventBackingFieldName = e => "$" + e.Name; ShouldGenerateAutoEventBackingField = e => true; }
public void MemberCorrespondingToOptionalNonSpecifiedArgumentToJsonConstructorCanBeInitialized() { AssertCorrect( @"class X { public int a2, b2, c2, d2; public X(int a, int b = 0) {} } public void M() { // BEGIN var x = new X(123) { c2 = 789, b2 = 987 }; // END }", @" var $x = { $a2: 123, $c2: 789, $b2: 987 }; ", metadataImporter: new MockMetadataImporter { GetConstructorSemantics = c => ConstructorScriptSemantics.Json(c.Parameters.Select(p => c.DeclaringType.GetFields().Single(f => f.Name == p.Name + "2"))) }); }
public void JsonConstructorWithParameterToMemberMapWorksWithObjectInitializers() { AssertCorrect( @"class X { public int a2, b2, c2, d2; public X(int a, int b) {} } public void M() { // BEGIN var x = new X(123, 456) { c2 = 789, d2 = 987 }; // END }", @" var $x = { $a2: 123, $b2: 456, $c2: 789, $d2: 987 }; ", metadataImporter: new MockMetadataImporter { GetConstructorSemantics = c => ConstructorScriptSemantics.Json(c.Parameters.Select(p => c.DeclaringType.GetFields().Single(f => f.Name == p.Name + "2"))) }); }
public void CreatingObjectWithJsonConstructorWorks() { AssertCorrect( @"class C1 { public int a; public string b; } public int F() { return 0; } public int P { get; set; } public void M() { // BEGIN var c = new C1 { a = (P = F()), b = ""X"" }; // END }", @" var $tmp1 = this.F(); this.set_P($tmp1); var $c = { $a: $tmp1, $b: 'X' }; ", metadataImporter: new MockMetadataImporter { GetConstructorSemantics = c => ConstructorScriptSemantics.Json(new IMember[0]) }); }
public void JsonConstructorWithParameterToMemberMapWorks() { AssertCorrect( @"class C1 { public C1(int a, int b) {} public int a2, int b2; } public int F1() { return 0; } public int F2() { return 0; } public int P { get; set; } public void M() { // BEGIN var c = new C1(F1(), P = F2()); // END }", @" var $tmp2 = this.F1(); var $tmp1 = this.F2(); this.set_P($tmp1); var $c = { $a2: $tmp2, $b2: $tmp1 }; ", metadataImporter: new MockMetadataImporter { GetConstructorSemantics = c => c.DeclaringType.Name == "C1" ? ConstructorScriptSemantics.Json(new[] { c.DeclaringType.GetFields().Single(f => f.Name == "a2"), c.DeclaringType.GetFields().Single(f => f.Name == "b2") }) : ConstructorScriptSemantics.Unnamed() }); }
public void InitializingMemberThatIsAlsoInitializedWithParameterToMemberMapIsAnError() { var er = new MockErrorReporter(false); Compile(new[] { @"class X { public int a2; public X(int a) {} } class C { public void M() { // BEGIN var x = new X(123) { a2 = 789 }; // END } }" }, metadataImporter: new MockMetadataImporter { GetConstructorSemantics = c => ConstructorScriptSemantics.Json(c.Parameters.Select(p => c.DeclaringType.GetFields().Single(f => f.Name == p.Name + "2"))) }, errorReporter: er); Assert.That(er.AllMessagesText.Count, Is.EqualTo(1)); Assert.That(er.AllMessagesText[0].Contains("a2") && er.AllMessagesText[0].Contains("initializer") && er.AllMessagesText[0].Contains("constructor call")); }
public void ChainingToJsonConstructorFromStaticMethodConstructorWorks() { AssertCorrect( @"class C { static int F1() { return 0; } static int F2() { return 0; } static int F3() { return 0; } static int F4() { return 0; } public int A, B, C, D, E, F, G; public void M() {} public C(int a = 1, int b = 2, int c = 3, int d = 4, int e = 5, int f = 6, int g = 7) { } [System.Runtime.CompilerServices.CompilerGenerated] public C() : this(d: F1(), g: F2(), f: F3(), b: F4()) { M(); } }", @"function() { var $this = { $D: {sm_C}.F1(), $G: {sm_C}.F2(), $F: {sm_C}.F3(), $B: {sm_C}.F4(), $A: 1, $C: 3, $E: 5 }; $this.M(); return $this; }", metadataImporter: new MockMetadataImporter { GetConstructorSemantics = c => c.Parameters.Count == 0 ? ConstructorScriptSemantics.StaticMethod("X") : ConstructorScriptSemantics.Json(c.Parameters.Select(p => c.DeclaringType.GetFields().Single(x => x.Name.Equals(p.Name, StringComparison.InvariantCultureIgnoreCase)))) }); }
public void ChainingToConstructorImplementedAsJsonFromUnnamedConstructorIsAnError() { var rpt = new MockErrorReporter(false); Compile(new[] { @"class C { public void M() {} [System.Runtime.CompilerServices.CompilerGenerated] public C() : this(0, ""X"") { M(); } public C(int x, string s) { } }" }, errorReporter: rpt, metadataImporter: new MockMetadataImporter { GetConstructorSemantics = c => c.Parameters.Count == 0 ? ConstructorScriptSemantics.Unnamed() : ConstructorScriptSemantics.Json(new IMember[0]) }); Assert.That(rpt.AllMessagesText.Any(msg => msg.StartsWith("Error", StringComparison.InvariantCultureIgnoreCase) && msg.IndexOf("not supported", StringComparison.InvariantCultureIgnoreCase) >= 0)); }
public void ChainingToConstructorImplementedAsJsonFromUnnamedConstructorWorks() { AssertCorrect( @"class C { public int X; public string S; static int P { get; set; } public void M() {} [System.Runtime.CompilerServices.CompilerGenerated] public C() : this(P = 42, ""X"") { M(); } public C(int x, string s) { } }", @"function() { {sm_C}.set_P(42); $ShallowCopy({ $X: 42, $S: 'X' }, this); this.M(); }", metadataImporter: new MockMetadataImporter { GetConstructorSemantics = c => c.Parameters.Count == 0 ? ConstructorScriptSemantics.Unnamed() : ConstructorScriptSemantics.Json(c.Parameters.Select(p => c.DeclaringType.GetFields().Single(x => x.Name.Equals(p.Name, StringComparison.InvariantCultureIgnoreCase)))) }); }