/CSharpFactoryVS2010/CSharpTreeBuilderTest/CSharpSemanticGraphBuilder/TypeResolutionTest.cs
C# | 2727 lines | 1888 code | 301 blank | 538 comment | 3 complexity | 5a952e316211ba313b425e7aa8124f4f MD5 | raw file
Large files files are truncated, but you can click here to view the full file
- using System.Linq;
- using System.Reflection;
- using CSharpTreeBuilder.CSharpSemanticGraph;
- using CSharpTreeBuilder.CSharpSemanticGraphBuilder;
- using CSharpTreeBuilder.ProjectContent;
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- using SoftwareApproach.TestingExtensions;
-
- namespace CSharpTreeBuilderTest.CSharpSemanticGraphBuilder
- {
- // ================================================================================================
- /// <summary>
- /// Tests the type resolution logic.
- /// </summary>
- // ================================================================================================
- [TestClass]
- public class TypeResolutionTest : ParserTestBed
- {
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// No type arguments (§4.4.1) can be present in a namespace-name (only types can have type arguments).
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void Error_NoTypeArgumentsCanBePresentInANamespaceName()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\Error_NoTypeArgumentsCanBePresentInANamespaceName.cs");
- InvokeParser(project).ShouldBeFalse();
-
- project.Errors.Count.ShouldEqual(1);
- project.Errors[0].Code.ShouldEqual("TBD001");
- project.Warnings.Count.ShouldEqual(0);
-
- project.SemanticGraph.GlobalNamespace.UsingNamespaces.ToArray()[0].NamespaceReference.ResolutionState.ShouldEqual(ResolutionState.Unresolvable);
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving a type to type parameter.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void TypeParameter()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\TypeParameter.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A", 1);
- var fieldEntity = classEntity.OwnMembers.ToArray()[0] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- fieldEntity.TypeReference.Target.ToString().ShouldEqual("global::A`1.T1");
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving types in type parameter constraints.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void TypeParameterConstraints()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\TypeParameterConstraints.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var global = project.SemanticGraph.GlobalNamespace;
- var classA = global.GetSingleChildType<ClassEntity>("A", 4);
-
- // where T1 : B, T2, I1, I2, T4, new()
- {
- var typeParameter = classA.GetOwnTypeParameterByName("T1");
- typeParameter.ClassTypeConstraint.ToString().ShouldEqual("global::B");
- typeParameter.ClassTypeConstraints.Count().ShouldEqual(1);
-
- var interfaceTypes = typeParameter.InterfaceTypeConstraints.ToList();
- interfaceTypes.Count().ShouldEqual(2);
- interfaceTypes[0].ToString().ShouldEqual("global::I1");
- interfaceTypes[1].ToString().ShouldEqual("global::I2`1[global::System.Int32]");
-
- var typeParams = typeParameter.TypeParameterConstraints.ToList();
- typeParams.Count().ShouldEqual(2);
- typeParams[0].ShouldEqual(classA.GetOwnTypeParameterByName("T2"));
- typeParams[1].ShouldEqual(classA.GetOwnTypeParameterByName("T4"));
-
- typeParameter.BaseClass.ToString().ShouldEqual("global::B");
-
- typeParameter.BaseInterfaces.Count.ShouldEqual(2);
- var interfaces = typeParameter.BaseInterfaces.OrderBy(x => x.ToString()).ToList();
- interfaces[0].ToString().ShouldEqual("global::I1");
- interfaces[1].ToString().ShouldEqual("global::I2`1[global::System.Int32]");
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Test the resolution of single-tag namespace names in using namespace entities.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void UsingNamespaceNames_SingleTag()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\UsingNamespaceNames_SingleTag.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var global = project.SemanticGraph.GlobalNamespace;
- var namespaceA = global.GetChildNamespace("A");
- var namespaceB = namespaceA.GetChildNamespace("B");
-
- // using A;
- {
- var usingNamespace = global.UsingNamespaces.ToArray()[0];
- usingNamespace.NamespaceReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- usingNamespace.NamespaceReference.Target.ShouldEqual(namespaceA);
- usingNamespace.ImportedNamespace.ShouldEqual(namespaceA);
- }
- // using B;
- {
- var usingNamespace = namespaceA.UsingNamespaces.ToArray()[0];
- usingNamespace.NamespaceReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- usingNamespace.NamespaceReference.Target.ShouldEqual(namespaceB);
- usingNamespace.ImportedNamespace.ShouldEqual(namespaceB);
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Error CS0576: Namespace 'namespace' contains a definition conflicting with alias 'identifier' (using alias)
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void CS0576_UsingAliasConflictsWithNamespaceDeclaration()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\CS0576_UsingAliasConflictsWithNamespaceDeclaration.cs");
- InvokeParser(project).ShouldBeFalse();
-
- project.Errors.Count.ShouldEqual(1);
- project.Errors[0].Code.ShouldEqual("CS0576");
- project.Warnings.Count.ShouldEqual(0);
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Error CS0576: Namespace 'namespace' contains a definition conflicting with alias 'identifier' (using alias)
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void CS0576_UsingAliasConflictsWithTypeDeclaration()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\CS0576_UsingAliasConflictsWithTypeDeclaration.cs");
- InvokeParser(project).ShouldBeFalse();
-
- project.Errors.Count.ShouldEqual(1);
- project.Errors[0].Code.ShouldEqual("CS0576");
- project.Warnings.Count.ShouldEqual(0);
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// error CS0246: The type or namespace name 'A' could not be found (are you missing a using directive or an assembly reference?)
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void CS0246_NamespaceNameCouldNotBeFound()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\CS0246_NamespaceNameCouldNotBeFound.cs");
- InvokeParser(project).ShouldBeFalse();
-
- project.Errors.Count.ShouldEqual(1);
- project.Errors[0].Code.ShouldEqual("CS0246");
- project.Warnings.Count.ShouldEqual(0);
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving builtin types.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void BuiltInTypes()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\BuiltInTypes.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A");
-
- int i = 0;
-
- // sbyte a1;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a1");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.SByte");
- typeEntity.BuiltInTypeValue = BuiltInType.Sbyte;
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeTrue();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // byte a2;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a2");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Byte");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeTrue();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // short a3;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a3");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Int16");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeTrue();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // ushort a4;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a4");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.UInt16");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeTrue();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // int a5;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a5");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Int32");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeTrue();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // uint a6;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a6");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.UInt32");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeTrue();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // long a7;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a7");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Int64");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeTrue();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // ulong a8;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a8");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.UInt64");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeTrue();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // char a9;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a9");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Char");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeTrue();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // float a10;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a10");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Single");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeFalse();
- typeEntity.IsFloatingPointType.ShouldBeTrue();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // double a11;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a11");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Double");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeFalse();
- typeEntity.IsFloatingPointType.ShouldBeTrue();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // bool a12;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a12");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Boolean");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeFalse();
- typeEntity.IsIntegralType.ShouldBeFalse();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // decimal a13;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a13");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Decimal");
- typeEntity.IsSimpleType.ShouldBeTrue();
- typeEntity.IsNumericType.ShouldBeTrue();
- typeEntity.IsIntegralType.ShouldBeFalse();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // object a14;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a14");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as ClassEntity;
- typeEntity.ToString().ShouldEqual("global::System.Object");
- typeEntity.IsSimpleType.ShouldBeFalse();
- typeEntity.IsNumericType.ShouldBeFalse();
- typeEntity.IsIntegralType.ShouldBeFalse();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
- // string a15;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a15");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as ClassEntity;
- typeEntity.ToString().ShouldEqual("global::System.String");
- typeEntity.IsSimpleType.ShouldBeFalse();
- typeEntity.IsNumericType.ShouldBeFalse();
- typeEntity.IsIntegralType.ShouldBeFalse();
- typeEntity.IsFloatingPointType.ShouldBeFalse();
- typeEntity.IsNullableType.ShouldBeFalse();
- }
-
- // int? a16;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a16");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var nullable = fieldEntity.TypeReference.Target as StructEntity;
- nullable.ToString().ShouldEqual("global::System.Nullable`1[global::System.Int32]");
- nullable.IsSimpleType.ShouldBeFalse();
- nullable.IsNumericType.ShouldBeFalse();
- nullable.IsIntegralType.ShouldBeFalse();
- nullable.IsFloatingPointType.ShouldBeFalse();
- nullable.IsNullableType.ShouldBeTrue();
- }
-
- // int*[] a17;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[i++] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a17");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var array = fieldEntity.TypeReference.Target as ArrayTypeEntity;
- var pointer = array.UnderlyingType as PointerTypeEntity;
- var typeEntity = pointer.UnderlyingType as StructEntity;
- typeEntity.ToString().ShouldEqual("global::System.Int32");
- }
-
- // delegate void D();
- {
- var delegateEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<DelegateEntity>("D");
- delegateEntity.Name.ShouldEqual("D");
- delegateEntity.ReturnTypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = delegateEntity.ReturnType as StructEntity;
- typeEntity.FullyQualifiedName.ShouldEqual("System.Void");
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Tests the resolution of built-in base types
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void BuiltInBaseTypes()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\BuiltInBaseTypes.cs");
- InvokeParser(project).ShouldBeTrue();
-
- // class A1 : object
- {
- var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A1");
- var baseTypeRef = classEntity.BaseTypeReferences.ToArray()[0];
- baseTypeRef.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- baseTypeRef.Target.FullyQualifiedName.ShouldEqual("System.Object");
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving pointer-to-type references.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void PointerToType()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\PointerToType.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var underlyingType = project.SemanticGraph.GlobalNamespace.GetSingleChildType<StructEntity>("A2");
-
- var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A1");
- var fieldEntity = classEntity.OwnMembers.ToArray()[0] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var pointer1 = fieldEntity.TypeReference.Target as PointerTypeEntity;
- pointer1.BaseTypeReferences.Count().ShouldEqual(0);
- pointer1.OwnMembers.Count().ShouldEqual(0);
- pointer1.Name.ShouldEqual("A2");
- pointer1.FullyQualifiedName.ShouldEqual("A2");
- pointer1.ToString().ShouldEqual("global::A2**");
- pointer1.Parent.ShouldEqual(underlyingType.Parent);
- pointer1.SyntaxNodes.Count.ShouldEqual(0);
- pointer1.IsPointerType.ShouldBeTrue();
- pointer1.IsReferenceType.ShouldBeFalse();
- pointer1.IsValueType.ShouldBeFalse();
-
- var pointer2 = pointer1.UnderlyingType as PointerTypeEntity;
- pointer2.BaseTypeReferences.Count().ShouldEqual(0);
- pointer2.OwnMembers.Count().ShouldEqual(0);
- pointer2.Name.ShouldEqual("A2");
- pointer2.FullyQualifiedName.ShouldEqual("A2");
- pointer2.ToString().ShouldEqual("global::A2*");
- pointer2.Parent.ShouldEqual(underlyingType.Parent);
- pointer2.SyntaxNodes.Count.ShouldEqual(0);
- pointer2.UnderlyingType.PointerType.ShouldEqual(pointer2);
-
- underlyingType.PointerType.ShouldEqual(pointer2);
- pointer2.PointerType.ShouldEqual(pointer1);
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving pointer-to-unknown (void*) references.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void PointerToUnknown()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\PointerToUnknown.cs");
- InvokeParser(project).ShouldBeTrue();
-
- {
- var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A1");
- var fieldEntity = classEntity.OwnMembers.ToArray()[0] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var pointer1 = fieldEntity.TypeReference.Target as PointerTypeEntity;
- pointer1.BaseTypeReferences.Count().ShouldEqual(0);
- pointer1.OwnMembers.Count().ShouldEqual(0);
- pointer1.FullyQualifiedName.ShouldEqual("System.Void");
- pointer1.ToString().ShouldEqual("global::System.Void*");
- pointer1.Name.ShouldEqual("Void");
- pointer1.Parent.ToString().ShouldEqual("global::System");
- pointer1.SyntaxNodes.Count.ShouldEqual(0);
- pointer1.IsPointerType.ShouldBeTrue();
- pointer1.IsReferenceType.ShouldBeFalse();
- pointer1.IsValueType.ShouldBeFalse();
- var underlyingType = pointer1.UnderlyingType as StructEntity;
- underlyingType.ToString().ShouldEqual("global::System.Void");
- underlyingType.PointerType.ShouldEqual(pointer1);
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving nullable type references.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void NullableType()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\NullableType.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A1");
- var structA2 = project.SemanticGraph.GlobalNamespace.GetSingleChildType<StructEntity>("A2");
-
- // A2? a1;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[0] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a1");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var nullable = fieldEntity.TypeReference.Target;
- nullable.Name.ShouldEqual("Nullable");
- nullable.FullyQualifiedName.ShouldEqual("System.Nullable");
- nullable.ToString().ShouldEqual("global::System.Nullable`1[global::A2]");
- nullable.Parent.ToString().ShouldEqual("global::System");
- nullable.SyntaxNodes.Count.ShouldEqual(0);
- nullable.IsPointerType.ShouldBeFalse();
- nullable.IsReferenceType.ShouldBeFalse();
- nullable.IsValueType.ShouldBeTrue();
-
- nullable.IsNullableType.ShouldBeTrue();
- nullable.UnderlyingOfNullableType.ToString().ShouldEqual("global::A2");
-
- var underlyingType = nullable.DirectGenericTemplate as StructEntity;
- underlyingType.FullyQualifiedName.ShouldEqual("System.Nullable");
- underlyingType.ToString().ShouldEqual("global::System.Nullable`1");
- }
- // A2?[] a2;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[1] as FieldEntity;
- fieldEntity.Name.ShouldEqual("a2");
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var array = fieldEntity.TypeReference.Target as ArrayTypeEntity;
- array.IsNullableType.ShouldBeFalse();
- array.UnderlyingOfNullableType.ShouldBeNull();
- var nullable = array.UnderlyingType;
- nullable.DirectGenericTemplate.ShouldEqual(project.SemanticGraph.NullableGenericTypeDefinition);
- nullable.ShouldEqual(classEntity.GetOwnMember<FieldEntity>("a1").Type);
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving array type references.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void ArrayType()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\ArrayType.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A1");
-
- // A2[][,] a1;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[0] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var array1 = fieldEntity.TypeReference.Target as ArrayTypeEntity;
- array1.BaseClass.FullyQualifiedName.ShouldEqual("System.Array");
- array1.OwnMembers.Count().ShouldEqual(0);
- array1.Name.ShouldEqual("A2");
- array1.FullyQualifiedName.ShouldEqual("A2");
- array1.ToString().ShouldEqual("global::A2[][,]");
- array1.Parent.ShouldEqual(project.SemanticGraph.GlobalNamespace.ChildTypes.ToList()[1].Parent);
- array1.Rank.ShouldEqual(2);
- array1.SyntaxNodes.Count.ShouldEqual(0);
- array1.IsPointerType.ShouldBeFalse();
- array1.IsReferenceType.ShouldBeTrue();
- array1.IsValueType.ShouldBeFalse();
- array1.UnderlyingType.GetArrayTypeByRank(2).ShouldEqual(array1);
-
- var array2 = array1.UnderlyingType as ArrayTypeEntity;
- array2.Name.ShouldEqual("A2");
- array2.FullyQualifiedName.ShouldEqual("A2");
- array2.ToString().ShouldEqual("global::A2[]");
- array2.Parent.ShouldEqual(project.SemanticGraph.GlobalNamespace.ChildTypes.ToList()[1].Parent);
- array2.Rank.ShouldEqual(1);
- array2.SyntaxNodes.Count.ShouldEqual(0);
- array2.UnderlyingType.GetArrayTypeByRank(1).ShouldEqual(array2);
- }
- // A2**[][,] a2;
- {
- var fieldEntity = classEntity.OwnMembers.ToArray()[1] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var array1 = fieldEntity.TypeReference.Target as ArrayTypeEntity;
- array1.ToString().ShouldEqual("global::A2**[][,]");
- var array2 = array1.UnderlyingType as ArrayTypeEntity;
- array2.ToString().ShouldEqual("global::A2**[]");
- var pointer1 = array2.UnderlyingType as PointerTypeEntity;
- pointer1.ToString().ShouldEqual("global::A2**");
- var pointer2 = pointer1.UnderlyingType as PointerTypeEntity;
- pointer2.ToString().ShouldEqual("global::A2*");
- var structEntity = pointer2.UnderlyingType as StructEntity;
- structEntity.ToString().ShouldEqual("global::A2");
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Test the resolution of namespace names in using namespace entities.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void UsingNamespaceNames_MultiTag()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\UsingNamespaceNames_MultiTag.cs");
- InvokeParser(project).ShouldBeTrue();
-
- project.Errors.Count.ShouldEqual(0);
- project.Warnings.Count.ShouldEqual(0);
-
- var global = project.SemanticGraph.GlobalNamespace;
- var namespaceA = global.GetChildNamespace("A");
- var namespaceB = namespaceA.GetChildNamespace("B");
- var namespaceC = namespaceB.GetChildNamespace("C");
-
- // using A.B;
- {
- var usingNamespace = global.UsingNamespaces.ToArray()[0];
- usingNamespace.NamespaceReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- usingNamespace.NamespaceReference.Target.ShouldEqual(namespaceB);
- usingNamespace.ImportedNamespace.ShouldEqual(namespaceB);
- }
- // using B.C;
- {
- var usingNamespace = namespaceA.UsingNamespaces.ToArray()[0];
- usingNamespace.NamespaceReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- usingNamespace.NamespaceReference.Target.ShouldEqual(namespaceC);
- usingNamespace.ImportedNamespace.ShouldEqual(namespaceC);
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving to type declared in base class.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void DeclaredInBaseClass()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\DeclaredInBaseClass.cs");
- InvokeParser(project).ShouldBeTrue();
-
- int i = 0;
-
- var classA = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A");
-
- // E x1;
- {
- var field = classA.OwnMembers.ToArray()[i++] as FieldEntity;
- field.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- field.TypeReference.Target.ToString().ShouldEqual("global::C+E");
- }
- // E<int> x2;
- {
- var field = classA.OwnMembers.ToArray()[i++] as FieldEntity;
- field.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- field.TypeReference.Target.ToString().ShouldEqual("global::C+E`1[global::System.Int32]");
- field.TypeReference.Target.DirectGenericTemplate.ToString().ShouldEqual("global::C+E`1");
- }
- // F.G x3;
- {
- var field = classA.OwnMembers.ToArray()[i++] as FieldEntity;
- field.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- field.TypeReference.Target.ToString().ShouldEqual("global::D+F+G");
- }
- // F<int>.G x4;
- {
- var field = classA.OwnMembers.ToArray()[i++] as FieldEntity;
- field.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- field.TypeReference.Target.ToString().ShouldEqual("global::D+F`1[global::System.Int32]+G");
- }
- // F<int>.G<int> x5;
- {
- var field = classA.OwnMembers.ToArray()[i++] as FieldEntity;
- field.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- field.TypeReference.Target.ToString().ShouldEqual("global::D+F`1[global::System.Int32]+G`1[global::System.Int32]");
- field.TypeReference.Target.DirectGenericTemplate.ToString().ShouldEqual("global::D+F`1[global::System.Int32]+G`1[global::D+F`1+G`1.T3]");
- field.TypeReference.Target.OriginalGenericTemplate.ToString().ShouldEqual("global::D+F`1+G`1");
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Error CS0118: 'A' is a 'namespace' but is used like a 'type'
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void CS0118_NamespaceIsUsedLikeAType()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\CS0118_NamespaceIsUsedLikeAType.cs");
- InvokeParser(project).ShouldBeFalse();
-
- project.Errors.Count.ShouldEqual(1);
- project.Errors[0].Code.ShouldEqual("CS0118");
- project.Warnings.Count.ShouldEqual(0);
-
- var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("B");
- var baseTypeRef = classEntity.BaseTypeReferences.ToArray()[0];
- baseTypeRef.ResolutionState.ShouldEqual(ResolutionState.Unresolvable);
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving a constructed generic class in mscorlib.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void ConstructedGenericClassInMscorlib()
- {
- var project = new CSharpProject(WorkingFolder);
- InvokeParser(project).ShouldBeTrue();
-
- var comparer = project.SemanticGraph.GlobalNamespace.GetChildNamespace("System").GetChildNamespace("Collections").
- GetChildNamespace("Generic").GetSingleChildType<ClassEntity>("Comparer", 1);
- var icomparer = comparer.BaseInterfaces.Where(x => x.Name == "IComparer" && x.AllTypeParameterCount == 1).First();
- icomparer.ToString().ShouldEqual("global::System.Collections.Generic.IComparer`1[global::System.Collections.Generic.Comparer`1.T]");
- icomparer.IsOpen.ShouldBeTrue();
- icomparer.IsGenericClone.ShouldBeTrue();
- icomparer.IsUnboundGeneric.ShouldBeFalse();
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving a constructed generic class.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void ConstructedGenericClass()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\ConstructedGenericClass.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var classA = project.SemanticGraph.GlobalNamespace.GetChildNamespace("N").GetSingleChildType<ClassEntity>("A", 2);
- var fields = classA.OwnMembers.ToArray();
- var classB1 = classA.GetSingleChildType<ClassEntity>("B1");
- var classB2 = classA.GetSingleChildType<ClassEntity>("B2", 1);
- var classB3 = classA.GetSingleChildType<ClassEntity>("B3", 1);
-
- // public class B1
- {
- classB1.ToString().ShouldEqual("global::N.A`2+B1");
- classB1.IsGenericClone.ShouldBeFalse();
- classB1.DirectGenericTemplate.ShouldBeNull();
- classB1.IsGeneric.ShouldBeTrue();
- classB1.IsUnboundGeneric.ShouldBeTrue();
- classB1.IsOpen.ShouldBeTrue();
-
- var typeParameterMap = classB1.TypeParameterMap;
- typeParameterMap.IsEmpty.ShouldBeFalse();
- typeParameterMap.Count.ShouldEqual(2);
- var typeParameters = typeParameterMap.TypeParameters.ToList();
- typeParameters[0].ToString().ShouldEqual("global::N.A`2.T1");
- typeParameters[1].ToString().ShouldEqual("global::N.A`2.T2");
- var typeArguments = typeParameterMap.TypeArguments.ToList();
- typeArguments[0].ShouldBeNull();
- typeArguments[1].ShouldBeNull();
- }
-
- // public class B2<T1>
- {
- classB2.ToString().ShouldEqual("global::N.A`2+B2`1");
- classB2.IsGenericClone.ShouldBeFalse();
- classB2.DirectGenericTemplate.ShouldBeNull();
- classB2.IsGeneric.ShouldBeTrue();
- classB2.IsUnboundGeneric.ShouldBeTrue();
- classB2.IsOpen.ShouldBeTrue();
-
- var typeParameterMap = classB2.TypeParameterMap;
- typeParameterMap.IsEmpty.ShouldBeFalse();
- typeParameterMap.Count.ShouldEqual(3);
- var typeParameters = typeParameterMap.TypeParameters.ToList();
- typeParameters[0].ToString().ShouldEqual("global::N.A`2.T1");
- typeParameters[1].ToString().ShouldEqual("global::N.A`2.T2");
- typeParameters[2].ToString().ShouldEqual("global::N.A`2+B2`1.T1");
- var typeArguments = typeParameterMap.TypeArguments.ToList();
- typeArguments[0].ShouldBeNull();
- typeArguments[1].ShouldBeNull();
- typeArguments[2].ShouldBeNull();
- }
-
- // public class B3<T3>
- {
- classB3.ToString().ShouldEqual("global::N.A`2+B3`1");
- var typeParameterMap = classB3.TypeParameterMap;
- typeParameterMap.IsEmpty.ShouldBeFalse();
- typeParameterMap.Count.ShouldEqual(3);
- var typeParameters = typeParameterMap.TypeParameters.ToList();
- typeParameters[0].ToString().ShouldEqual("global::N.A`2.T1");
- typeParameters[1].ToString().ShouldEqual("global::N.A`2.T2");
- typeParameters[2].ToString().ShouldEqual("global::N.A`2+B3`1.T3");
- var typeArguments = typeParameterMap.TypeArguments.ToList();
- typeArguments[0].ShouldBeNull();
- typeArguments[1].ShouldBeNull();
- typeArguments[2].ShouldBeNull();
- }
-
- int i = 0;
-
- // A<A1, A2> a1;
- {
- var fieldEntity = fields[i++] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as ClassEntity;
- typeEntity.Name.ShouldEqual("A");
- typeEntity.FullyQualifiedName.ShouldEqual("N.A");
- typeEntity.ToString().ShouldEqual("global::N.A`2[global::N.A1,global::N.A2]");
- typeEntity.IsGenericClone.ShouldBeTrue();
- typeEntity.DirectGenericTemplate.ShouldEqual(classA);
- classA.GetGenericClone(typeEntity.TypeParameterMap).ShouldEqual(typeEntity);
- }
- // A<T1, T2> a2;
- {
- var fieldEntity = fields[i++] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as ClassEntity;
- typeEntity.Name.ShouldEqual("A");
- typeEntity.FullyQualifiedName.ShouldEqual("N.A");
- typeEntity.ToString().ShouldEqual("global::N.A`2[global::N.A`2.T1,global::N.A`2.T2]");
- typeEntity.DirectGenericTemplate.ShouldEqual(classA);
- classA.GetGenericClone(typeEntity.TypeParameterMap).ShouldEqual(typeEntity);
- }
- // A<T1, T2> a3;
- {
- var fieldEntity = fields[i++] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as ClassEntity;
- typeEntity.ToString().ShouldEqual("global::N.A`2[global::N.A`2.T1,global::N.A`2.T2]");
- typeEntity.DirectGenericTemplate.ShouldEqual(classA);
- // Should not create a new constructed entity because the previous field has the same type.
- classA.GenericClones.Count().ShouldEqual(2);
- }
- // A<A1, A2>.B1 b1;
- {
- var fieldEntity = fields[i++] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as ClassEntity;
- typeEntity.Name.ShouldEqual("B1");
- typeEntity.FullyQualifiedName.ShouldEqual("N.A.B1");
- typeEntity.ToString().ShouldEqual("global::N.A`2[global::N.A1,global::N.A2]+B1");
- typeEntity.DirectGenericTemplate.ShouldEqual(classB1);
- classB1.GetGenericClone(typeEntity.TypeParameterMap).ShouldEqual(typeEntity);
- }
- // A<A1, A2>.B2<A3> b2;
- {
- var fieldEntity = fields[i++] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as ClassEntity;
- typeEntity.Name.ShouldEqual("B2");
- typeEntity.FullyQualifiedName.ShouldEqual("N.A.B2");
- typeEntity.ToString().ShouldEqual("global::N.A`2[global::N.A1,global::N.A2]+B2`1[global::N.A3]");
- typeEntity.DirectGenericTemplate.ToString().ShouldEqual("global::N.A`2[global::N.A1,global::N.A2]+B2`1[global::N.A`2+B2`1.T1]");
- typeEntity.OriginalGenericTemplate.ToString().ShouldEqual("global::N.A`2+B2`1");
- }
- // A<A1, A2>.B3<A4> b3;
- {
- var fieldEntity = fields[i++] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as ClassEntity;
- typeEntity.Name.ShouldEqual("B3");
- typeEntity.FullyQualifiedName.ShouldEqual("N.A.B3");
- typeEntity.ToString().ShouldEqual("global::N.A`2[global::N.A1,global::N.A2]+B3`1[global::N.A4]");
- typeEntity.DirectGenericTemplate.ToString().ShouldEqual("global::N.A`2[global::N.A1,global::N.A2]+B3`1[global::N.A`2+B3`1.T3]");
- typeEntity.OriginalGenericTemplate.ToString().ShouldEqual("global::N.A`2+B3`1");
- }
-
- // A<A1, A2> a1; --> public class B1
- {
- var type = (classA.GetOwnMember<FieldEntity>("a1").Type as ClassEntity).GetSingleChildType<ClassEntity>("B1");
- type.ToString().ShouldEqual("global::N.A`2[global::N.A1,global::N.A2]+B1");
- type.IsOpen.ShouldBeFalse();
- type.IsGenericClone.ShouldBeTrue();
- type.IsUnboundGeneric.ShouldBeFalse();
- }
-
- // A<A1, A2> a1; --> public class B2<T1>
- {
- var type = (classA.GetOwnMember<FieldEntity>("a1").Type as ClassEntity).GetSingleChildType<ClassEntity>("B2", 1);
- type.ToString().ShouldEqual("global::N.A`2[global::N.A1,global::N.A2]+B2`1[global::N.A`2+B2`1.T1]");
- type.IsOpen.ShouldBeTrue();
- type.IsGenericClone.ShouldBeTrue();
- type.IsUnboundGeneric.ShouldBeFalse();
- }
-
- // A<A1, A2> a1; --> A<A1, A2>.B2<A3> b2;
- {
- var type = classA.GetOwnMember<FieldEntity>("a1").Type.GetOwnMember<FieldEntity>("b2").Type;
- type.ToString().ShouldEqual("global::N.A`2[global::N.A1,global::N.A2]+B2`1[global::N.A3]");
- type.IsOpen.ShouldBeFalse();
- type.IsGenericClone.ShouldBeTrue();
- type.IsUnboundGeneric.ShouldBeFalse();
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving a constructed generic struct.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void ConstructedGenericStruct()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\ConstructedGenericStruct.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var structEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<StructEntity>("A");
- var fields = structEntity.OwnMembers.ToArray();
- int i = 0;
-
- // B<int> a;
- {
- var fieldEntity = fields[i++] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as StructEntity;
- typeEntity.Name.ShouldEqual("B");
- typeEntity.FullyQualifiedName.ShouldEqual("B");
- typeEntity.ToString().ShouldEqual("global::B`1[global::System.Int32]");
- typeEntity.Parent.ShouldEqual(project.SemanticGraph.GlobalNamespace);
- typeEntity.IsPointerType.ShouldBeFalse();
- typeEntity.IsReferenceType.ShouldBeFalse();
- typeEntity.IsValueType.ShouldBeTrue();
- typeEntity.TypeParameterMap.TypeArguments.ToList()[0].ToString().ShouldEqual("global::System.Int32");
- typeEntity.DirectGenericTemplate.ToString().ShouldEqual("global::B`1");
- }
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Resolving a generic type, where the type argument is also a generic type.
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void GenericTypeArgument()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\GenericTypeArgument.cs");
- InvokeParser(project).ShouldBeTrue();
-
- var classEntity = project.SemanticGraph.GlobalNamespace.GetSingleChildType<ClassEntity>("A1");
-
- var fieldEntity = classEntity.OwnMembers.ToArray()[0] as FieldEntity;
- fieldEntity.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- var typeEntity = fieldEntity.TypeReference.Target as ClassEntity;
- typeEntity.ShouldNotBeNull();
- typeEntity.Name.ShouldEqual("A3");
- typeEntity.FullyQualifiedName.ShouldEqual("A2.A3");
- typeEntity.ToString().ShouldEqual("global::A2+A3`1[global::A2+A3`1[global::A4]]");
- typeEntity.DirectGenericTemplate.ToString().ShouldEqual("global::A2+A3`1");
-
- var typeArgTypeEntity = typeEntity.TypeParameterMap.TypeArguments.ToList()[0] as ClassEntity;
- typeArgTypeEntity.ToString().ShouldEqual("global::A2+A3`1[global::A4]");
- typeArgTypeEntity.DirectGenericTemplate.ToString().ShouldEqual("global::A2+A3`1");
-
- var typeArgTypeEntity2 = typeArgTypeEntity.TypeParameterMap.TypeArguments.ToList()[0] as ClassEntity;
- typeArgTypeEntity2.ToString().ShouldEqual("global::A4");
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Precedence rule 1: name in local declaration space has precedence 1
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void Precedence1_Local()
- {
- var project = new CSharpProject(WorkingFolder);
- project.AddFile(@"TypeResolution\Precedence1_Local.cs");
- InvokeParser(project).ShouldBeTrue();
-
- project.Errors.Count.ShouldEqual(0);
- project.Warnings.Count.ShouldEqual(0);
-
- var field = project.SemanticGraph.GlobalNamespace.GetChildNamespace("A").ChildTypes.ToList()[0].OwnMembers.ToList()[0] as FieldEntity;
- field.TypeReference.ResolutionState.ShouldEqual(ResolutionState.Resolved);
- field.TypeReference.Target.ToString().ShouldEqual("global::A.B+C");
- }
-
- // ----------------------------------------------------------------------------------------------
- /// <summary>
- /// Precedence rule 2: name in base type's declaration space has precedence 2
- /// </summary>
- // ----------------------------------------------------------------------------------------------
- [TestMethod]
- public void Precedence2_BaseType()
- {
- …
Large files files are truncated, but you can click here to view the full file