public void BaseTypesAreRegisteredBeforeDerivedTypesGeneric() { var sourceFile = new MockSourceFile("file.cs", @" public class B<T> {} public interface I<T> {} public class A : B<int>, I<int> {} "); var nc = new MetadataImporter.ScriptSharpMetadataImporter(false); var n = new MockNamer(); var er = new MockErrorReporter(true); var compilation = new Saltarelle.Compiler.Compiler.Compiler(nc, n, new MockRuntimeLibrary(), er, allowUserDefinedStructs: false).CreateCompilation(new[] { sourceFile }, new[] { Common.Mscorlib }, new string[0]); AssertCorrect( @"//////////////////////////////////////////////////////////////////////////////// // A var $A = function() { }; //////////////////////////////////////////////////////////////////////////////// // B var $B = function() { }; //////////////////////////////////////////////////////////////////////////////// // I var $I = function() { }; {Type}.registerClass(global, 'B', $B); {Type}.registerInterface(global, 'I', $I, []); {Type}.registerClass(global, 'A', $A, {C}, {I}); ", new JsClass(ReflectionHelper.ParseReflectionName("A").Resolve(compilation.Compilation).GetDefinition(), JsClass.ClassTypeEnum.Class, null, new JsTypeReferenceExpression(Common.CreateMockType("C")), new JsExpression[] { new JsTypeReferenceExpression(Common.CreateMockType("I")) }), new JsClass(ReflectionHelper.ParseReflectionName("B`1").Resolve(compilation.Compilation).GetDefinition(), JsClass.ClassTypeEnum.Class, null, null, new JsExpression[0]), new JsClass(ReflectionHelper.ParseReflectionName("I`1").Resolve(compilation.Compilation).GetDefinition(), JsClass.ClassTypeEnum.Interface, null, null, new JsExpression[0])); }
public void GenericMethodTypeArgumentsAreIgnoredForStaticMethodsIfTheMethodImplOptionsSaySo() { var metadataImporter = new MockMetadataImporter { GetMethodSemantics = m => MethodScriptSemantics.NormalMethod("X", ignoreGenericArguments: true) }; var namer = new MockNamer { GetTypeParameterName = tp => "$$" + tp.Name }; Compile(new[] { "class C { public static void X<U, V>() {} }" }, metadataImporter: metadataImporter, namer: namer); FindStaticMethod("C.X").TypeParameterNames.Should().BeEmpty(); }
public void BaseTypesAreRegisteredBeforeDerivedTypesGeneric() { var sourceFile = new MockSourceFile("file.cs", @" class B<T> {} interface I<T> {} class A : B<int>, I<int> {} "); var nc = new MetadataImporter.ScriptSharpMetadataImporter(false); var n = new MockNamer(); var er = new MockErrorReporter(true); var compilation = new Saltarelle.Compiler.Compiler.Compiler(nc, n, new MockRuntimeLibrary(), er, allowUserDefinedStructs: false).CreateCompilation(new[] { sourceFile }, new[] { Common.Mscorlib }, new string[0]); AssertCorrect( @"//////////////////////////////////////////////////////////////////////////////// // A {A} = function() { }; //////////////////////////////////////////////////////////////////////////////// // B {B} = function() { }; //////////////////////////////////////////////////////////////////////////////// // I {I} = function() { }; {B}.registerClass('B'); {I}.registerClass('I'); {A}.registerClass('A', {C}, {I}); ", new JsClass(ReflectionHelper.ParseReflectionName("A").Resolve(compilation.Compilation).GetDefinition(), "A", JsClass.ClassTypeEnum.Class, null, new JsTypeReferenceExpression(compilation.Compilation.MainAssembly, "C"), new JsExpression[] { new JsTypeReferenceExpression(compilation.Compilation.MainAssembly, "I") }), new JsClass(ReflectionHelper.ParseReflectionName("B`1").Resolve(compilation.Compilation).GetDefinition(), "B", JsClass.ClassTypeEnum.Class, null, null, new JsExpression[0]), new JsClass(ReflectionHelper.ParseReflectionName("I`1").Resolve(compilation.Compilation).GetDefinition(), "I", JsClass.ClassTypeEnum.Class, null, null, new JsExpression[0])); }
public void GenericMethodTypeArgumentsAreIncludedForStaticMethods() { var namer = new MockNamer { GetTypeParameterName = tp => "$$" + tp.Name }; Compile(new[] { "class C { public static void X<U, V>() {} }" }, namer: namer); FindStaticMethod("C.X").TypeParameterNames.Should().Equal(new[] { "$$U", "$$V" }); }
public void BaseTypesAreRegisteredBeforeDerivedTypes() { var sourceFile = new MockSourceFile("file.cs", @" public class C3 {} public interface I1 {} public class C2 : C3 {} public class C1 : C2, I1 {} "); var nc = new MetadataImporter.ScriptSharpMetadataImporter(false); var n = new MockNamer(); var er = new MockErrorReporter(true); var compilation = new Saltarelle.Compiler.Compiler.Compiler(nc, n, new MockRuntimeLibrary(), er, allowUserDefinedStructs: false).CreateCompilation(new[] { sourceFile }, new[] { Common.Mscorlib }, new string[0]); AssertCorrect( @"//////////////////////////////////////////////////////////////////////////////// // C1 var $C1 = function() { }; //////////////////////////////////////////////////////////////////////////////// // C2 var $C2 = function() { }; //////////////////////////////////////////////////////////////////////////////// // C3 var $C3 = function() { }; //////////////////////////////////////////////////////////////////////////////// // I1 var $I1 = function() { }; {Type}.registerClass(global, 'C3', $C3); {Type}.registerInterface(global, 'I1', $I1, []); {Type}.registerClass(global, 'C2', $C2, {C3}); {Type}.registerClass(global, 'C1', $C1, {C2}, {I1}); ", new JsClass(ReflectionHelper.ParseReflectionName("C1").Resolve(compilation.Compilation).GetDefinition(), JsClass.ClassTypeEnum.Class, null, new JsTypeReferenceExpression(Common.CreateMockType("C2")), new JsExpression[] { new JsTypeReferenceExpression(Common.CreateMockType("I1")) }), new JsClass(ReflectionHelper.ParseReflectionName("C2").Resolve(compilation.Compilation).GetDefinition(), JsClass.ClassTypeEnum.Class, null, new JsTypeReferenceExpression(Common.CreateMockType("C3")), new JsExpression[0]), new JsClass(ReflectionHelper.ParseReflectionName("C3").Resolve(compilation.Compilation).GetDefinition(), JsClass.ClassTypeEnum.Class, null, null, new JsExpression[0]), new JsClass(ReflectionHelper.ParseReflectionName("I1").Resolve(compilation.Compilation).GetDefinition(), JsClass.ClassTypeEnum.Interface, null, null, new JsExpression[0])); }
public void BaseTypesAreRegisteredBeforeDerivedTypes() { var sourceFile = new MockSourceFile("file.cs", @" class C3 {} interface I1 {} class C2 : C3 {} class C1 : C2, I1 {} "); var nc = new MetadataImporter.ScriptSharpMetadataImporter(false); var n = new MockNamer(); var er = new MockErrorReporter(true); var compilation = new Saltarelle.Compiler.Compiler.Compiler(nc, n, new MockRuntimeLibrary(), er).CreateCompilation(new[] { sourceFile }, new[] { Common.Mscorlib }, new string[0]); AssertCorrect( @"//////////////////////////////////////////////////////////////////////////////// // C1 {C1} = function() { }; //////////////////////////////////////////////////////////////////////////////// // C2 {C2} = function() { }; //////////////////////////////////////////////////////////////////////////////// // C3 {C3} = function() { }; //////////////////////////////////////////////////////////////////////////////// // I1 {I1} = function() { }; {C3}.registerClass('C3'); {I1}.registerInterface('I1', []); {C2}.registerClass('C2', {C3}); {C1}.registerClass('C1', {C2}, {I1}); ", new JsClass(ReflectionHelper.ParseReflectionName("C1").Resolve(compilation.Compilation).GetDefinition(), "C1", JsClass.ClassTypeEnum.Class, null, new JsTypeReferenceExpression(compilation.Compilation.MainAssembly, "C2"), new JsExpression[] { new JsTypeReferenceExpression(compilation.Compilation.MainAssembly, "I1") }), new JsClass(ReflectionHelper.ParseReflectionName("C2").Resolve(compilation.Compilation).GetDefinition(), "C2", JsClass.ClassTypeEnum.Class, null, new JsTypeReferenceExpression(compilation.Compilation.MainAssembly, "C3"), new JsExpression[0]), new JsClass(ReflectionHelper.ParseReflectionName("C3").Resolve(compilation.Compilation).GetDefinition(), "C3", JsClass.ClassTypeEnum.Class, null, null, new JsExpression[0]), new JsClass(ReflectionHelper.ParseReflectionName("I1").Resolve(compilation.Compilation).GetDefinition(), "I1", JsClass.ClassTypeEnum.Interface, null, null, new JsExpression[0])); }