public void InvokingConstructorImplementedAsInlineCodeWorks()
        {
            AssertCorrect(
                @"class X {
	public X(int a = 1, int b = 2, int c = 3, int d = 4, int e = 5, int f = 6, int g = 7) {}
}
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: F2(), f: F3(), b: F4());
	// END
}",
                @"	var $tmp1 = this.$F1();
	var $tmp2 = this.$F2();
	var $tmp3 = this.$F3();
	var $x = __CreateX_(1)._(this.$F4())._(3)._($tmp1)._(5)._($tmp3)._($tmp2);
", metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => ConstructorScriptSemantics.InlineCode("__CreateX_({a})._({b})._({c})._({d})._({e})._({f})._({g})"), GetMethodSemantics = m => MethodScriptSemantics.NormalMethod("$" + m.Name)
            });
        }
        public void ConstructorImplementedAsInlineCodeDoesNotAppearOnTheType()
        {
            var metadataImporter = new MockMetadataImporter {
                GetConstructorSemantics = ctor => ConstructorScriptSemantics.InlineCode("X")
            };

            Compile(new[] { "class C { public C() {} }" }, metadataImporter: metadataImporter);
            FindClass("C").UnnamedConstructor.Should().BeNull();
        }
        public void InvokingConstructorImplementedAsInlineCodeWorksForGenericType()
        {
            AssertCorrect(
                @"class X<T1, T2> {
	public X(int a, int b) {}
}
public void M() {
	// BEGIN
	var x = new X<string, int>(13, 42);
	// END
}",
                @"	var $x = __CreateX_({ga_String})._({ga_Int32})._(13)._(42);
", metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => ConstructorScriptSemantics.InlineCode("__CreateX_({T1})._({T2})._({a})._({b})"), GetMethodSemantics = m => MethodScriptSemantics.NormalMethod("$" + m.Name)
            });
        }
        public void InvokingConstructorImplementedAsInlineCodeInNonExpandedFormUsesTheNonExpandedCode()
        {
            AssertCorrect(
                @"public C(params int[] args) {}
public void M() {
	int[] a = new[] { 1, 2, 3 };
	// BEGIN
	var c = new C(a);
	// END
}
",
                @"	var $c = _2($a);
", metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => ConstructorScriptSemantics.InlineCode("_({*args})", nonExpandedFormLiteralCode: "_2({args})")
            });
        }
Beispiel #5
0
        public void ChainingToInlineCodeConstructorInNonExpandedFormUsesNonExpandedPattern()
        {
            AssertCorrect(
                @"class C {
	public static int[] a = null;
	public C(params int[] args) {}
	[System.Runtime.CompilerServices.CompilerGenerated]
	public C() : this(a) {
	}
}",
                @"function() {
	$ShallowCopy(_2({sm_C}.$a), this);
}", metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => c.Parameters.Count == 1 ? ConstructorScriptSemantics.InlineCode("_({*args})", nonExpandedFormLiteralCode: "_2({args})") : ConstructorScriptSemantics.Unnamed()
            });
        }
        public void InvokingConstructorImplementedAsInlineCodeWithExpandedParamArrayParameterInNonExpandedFormIsAnError()
        {
            var er = new MockErrorReporter(false);

            Compile(new[] {
                @"class C1 {
	public C1(params int[] args) {}
	public void M() {
		var a = new[] { 1, 2, 3 };
		var c = new C1(a);
	}
}"
            }, metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => ConstructorScriptSemantics.InlineCode("_({*args})")
            }, errorReporter: er);
            Assert.That(er.AllMessages.Any(msg => msg.Severity == MessageSeverity.Error && msg.FormattedMessage.Contains("constructor") && msg.FormattedMessage.Contains("C1") && msg.FormattedMessage.Contains("params parameter expanded")));
        }
Beispiel #7
0
        public void ChainingToInlineCodeConstructorThatUsesExpandedParameterPlaceholderInNonExpandedFormIsAnError()
        {
            var er = new MockErrorReporter(false);

            Compile(new[] {
                @"class C1 {
	public static int[] a = null;

	public C1(params int[] args) {}

	[System.Runtime.CompilerServices.CompilerGenerated]
	public C1() : this(a) {
	}
}"
            }, metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => c.Parameters.Count == 1 ? ConstructorScriptSemantics.InlineCode("_({*args})") : ConstructorScriptSemantics.Unnamed()
            }, errorReporter: er);
            Assert.That(er.AllMessages.Any(msg => msg.Severity == MessageSeverity.Error && msg.FormattedMessage.Contains("constructor") && msg.FormattedMessage.Contains("C1") && msg.FormattedMessage.Contains("params parameter expanded")));
        }
        public void UsingCollectionInitializerWithInlineCodeConstructorWorks()
        {
            AssertCorrect(
                @"class X : System.Collections.IEnumerable {
	public void Add(int a) {}
	public IEnumerator GetEnumerator() { return null; }
}
public void M() {
	int i = 0, j = 0;
	// BEGIN
	var x = new X { i, j };
	// END
}",
                @"	var $tmp1 = __X__;
	$tmp1.Add($i);
	$tmp1.Add($j);
	var $x = $tmp1;
", metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => ConstructorScriptSemantics.InlineCode("__X__")
            });
        }
        public void CreatingObjectWithDynamicArgumentGivesAnErrorWhenTheApplicableMethodsUseInlineCode()
        {
            var er = new MockErrorReporter();

            Compile(new[] {
                @"public class C1 {
	public C1(int x) {}
	public C1(string x) {}
}

public class C {
	public void M() {
		dynamic d = null;
		// BEGIN
		var c = new C1(d);
		// END
	}
}"
            }, metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => ConstructorScriptSemantics.InlineCode("X")
            }, errorReporter: er);
            Assert.That(er.AllMessages.Count, Is.EqualTo(1));
            Assert.That(er.AllMessages.Any(m => m.Code == 7531));
        }
Beispiel #10
0
        public void ChainingToConstructorImplementedAsInlineCodeFromStaticMethodConstructorWorks()
        {
            AssertCorrect(
                @"class C {
	public void M() {}

	[System.Runtime.CompilerServices.CompilerGenerated]
	public C() : this(0, ""X"") {
		M();
	}

	public C(int x, string s) {
	}
}",
                @"function() {
	var $this = __Literal_(0)._X__;
	$this.M();
	return $this;
}", metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => c.Parameters.Count == 0 ? ConstructorScriptSemantics.StaticMethod("M") : ConstructorScriptSemantics.InlineCode("__Literal_({x})._{@s}__")
            });
        }
Beispiel #11
0
        public void ChainingToConstructorImplementedAsInlineCodeFromUnnamedConstructorIsAnError()
        {
            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.InlineCode("__Literal_{x}_{s}__")
            });
            Assert.That(rpt.AllMessagesText.Any(msg => msg.StartsWith("Error", StringComparison.InvariantCultureIgnoreCase) && msg.IndexOf("not supported", StringComparison.InvariantCultureIgnoreCase) >= 0));
        }
Beispiel #12
0
        public void ChainingToConstructorImplementedAsInlineCodeFromUnnamedConstructorWprks()
        {
            AssertCorrect(
                @"class C {
	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(_(42)._('X'), this);
	this.M();
}", metadataImporter: new MockMetadataImporter {
                GetConstructorSemantics = c => c.Parameters.Count == 0 ? ConstructorScriptSemantics.Unnamed() : ConstructorScriptSemantics.InlineCode("_({x})._({s})")
            });
        }