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"));
        }
Beispiel #9
0
        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))))
            });
        }
Beispiel #10
0
        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));
        }
Beispiel #11
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))))
            });
        }