Browse Source

Implement EnvDTE.CodeType.IsDerivedFrom()

The T4MVC template checks that controller action methods return a class derived from System.Web.Mvc.ActionResult.
pull/28/head
Matt Ward 14 years ago
parent
commit
f8a9a0cff6
  1. 1
      src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj
  2. 9
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs
  3. 43
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IClassExtensions.cs
  4. 5
      src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs
  5. 75
      src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeTests.cs
  6. 33
      src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs

1
src/AddIns/Misc/PackageManagement/Project/PackageManagement.csproj

@ -125,6 +125,7 @@ @@ -125,6 +125,7 @@
<Compile Include="Src\EnvDTE\FileCodeModelCodeElements.cs" />
<Compile Include="Src\EnvDTE\FileCodeModelCodeNamespace.cs" />
<Compile Include="Src\EnvDTE\FileCodeModelCodeNamespaceMembers.cs" />
<Compile Include="Src\EnvDTE\IClassExtensions.cs" />
<Compile Include="Src\EnvDTE\ImplementedInterfacesOnClass.cs" />
<Compile Include="Src\EnvDTE\IReturnTypeExtensions.cs" />
<Compile Include="Src\EnvDTE\NamespaceName.cs" />

9
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/CodeType.cs

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Linq;
using ICSharpCode.SharpDevelop.Dom;
using ICSharpCode.SharpDevelop.Project;
@ -72,15 +73,19 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -72,15 +73,19 @@ namespace ICSharpCode.PackageManagement.EnvDTE
public virtual ProjectItem ProjectItem {
get {
if (ProjectContent.Project != null) {
return new ProjectItem((MSBuildBasedProject)ProjectContent.Project, Class);
return new ProjectItem(ProjectContent, Class);
}
return null;
}
}
/// <summary>
/// Returns true if the current type matches the fully qualified name or any of its
/// base types are a match.
/// </summary>
public virtual bool IsDerivedFrom(string fullName)
{
throw new NotImplementedException();
return Class.IsDerivedFrom(fullName);
}
}
}

43
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/IClassExtensions.cs

@ -0,0 +1,43 @@ @@ -0,0 +1,43 @@
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Linq;
using ICSharpCode.SharpDevelop.Dom;
namespace ICSharpCode.PackageManagement.EnvDTE
{
public static class IClassExtensions
{
/// <summary>
/// Returns true if the class fully qualified name matches the name or
/// any class in the inheritance tree matches the name.
/// </summary>
public static bool IsDerivedFrom(this IClass c, string typeName)
{
if (c.FullyQualifiedName == typeName) {
return true;
}
if (TypeNameMatchesBaseType(c.BaseType, typeName)) {
return true;
}
return IsTypeInClassInheritanceTree(c, typeName);
}
static bool TypeNameMatchesBaseType(IReturnType baseType, string typeName)
{
return
(baseType != null) &&
(baseType.FullyQualifiedName == typeName);
}
static bool IsTypeInClassInheritanceTree(IClass c, string typeName)
{
return c
.ClassInheritanceTreeClassesOnly
.Any(inheritedClass => inheritedClass.FullyQualifiedName == typeName);
}
}
}

5
src/AddIns/Misc/PackageManagement/Project/Src/EnvDTE/ProjectItem.cs

@ -34,6 +34,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE @@ -34,6 +34,11 @@ namespace ICSharpCode.PackageManagement.EnvDTE
{
}
internal ProjectItem(IProjectContent projectContent, IClass c)
: this((MSBuildBasedProject)projectContent.Project, c)
{
}
string GetKindFromFileProjectItemType()
{
if (IsDirectory) {

75
src/AddIns/Misc/PackageManagement/Test/Src/EnvDTE/CodeTypeTests.cs

@ -46,7 +46,15 @@ namespace PackageManagement.Tests.EnvDTE @@ -46,7 +46,15 @@ namespace PackageManagement.Tests.EnvDTE
SDProject.FileProjectItem AddFileToProjectAndProjectContent(TestableProject project, string fileName)
{
helper.CompilationUnitHelper.SetFileName(fileName);
return project.AddFile(fileName);
return project.AddFile(fileName);
}
/// <summary>
/// Classes at the end of the array are at the top of the inheritance tree.
/// </summary>
void AddClassInheritanceTree(params string[] classNames)
{
helper.AddClassInheritanceTreeClassesOnly(classNames);
}
[Test]
@ -121,5 +129,70 @@ namespace PackageManagement.Tests.EnvDTE @@ -121,5 +129,70 @@ namespace PackageManagement.Tests.EnvDTE
Assert.AreEqual("test.cs", item.Name);
}
[Test]
public void IsDerivedFrom_ClassFullyQualifiedNameMatchesTypeNameBeingChecked_ReturnsTrue()
{
CreateProjectContent();
CreateClass("System.Web.Mvc.ActionResult");
CreateCodeType();
bool derivedFrom = codeType.IsDerivedFrom("System.Web.Mvc.ActionResult");
Assert.IsTrue(derivedFrom);
}
[Test]
public void IsDerivedFrom_ClassFullyQualifiedNameDoesNotMatcheTypeNameBeingChecked_ReturnsFalse()
{
CreateProjectContent();
CreateClass("TestClass");
AddClassInheritanceTree("System.Object");
CreateCodeType();
bool derivedFrom = codeType.IsDerivedFrom("System.Web.Mvc.ActionResult");
Assert.IsFalse(derivedFrom);
}
[Test]
public void IsDerivedFrom_ClassBaseTypeFullyQualifiedNameMatchesTypeName_ReturnsTrue()
{
CreateProjectContent();
CreateClass("CustomActionResult");
helper.AddBaseTypeToClass("System.Web.Mvc.ActionResult");
CreateCodeType();
bool derivedFrom = codeType.IsDerivedFrom("System.Web.Mvc.ActionResult");
Assert.IsTrue(derivedFrom);
}
[Test]
public void IsDerivedFrom_ClassHasTypeInClassInheritanceTreeButNotImmediateBaseType_ReturnsTrue()
{
CreateProjectContent();
CreateClass("CustomActionResult");
AddClassInheritanceTree("CustomActionResultBase", "System.Web.Mvc.ActionResult");
CreateCodeType();
bool derivedFrom = codeType.IsDerivedFrom("System.Web.Mvc.ActionResult");
Assert.IsTrue(derivedFrom);
}
[Test]
public void IsDerivedFrom_ClassHasClassInInheritanceTreeButNotImmediateParentAndClassBaseTypePropertyIsNotNull_ReturnsTrue()
{
CreateProjectContent();
CreateClass("CustomActionResult");
helper.AddBaseTypeToClass("CustomActionResultBase");
AddClassInheritanceTree("CustomActionResultBase", "System.Web.Mvc.ActionResult");
CreateCodeType();
bool derivedFrom = codeType.IsDerivedFrom("System.Web.Mvc.ActionResult");
Assert.IsTrue(derivedFrom);
}
}
}

33
src/AddIns/Misc/PackageManagement/Test/Src/Helpers/ClassHelper.cs

@ -3,6 +3,7 @@ @@ -3,6 +3,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using ICSharpCode.SharpDevelop.Dom;
using Rhino.Mocks;
@ -66,13 +67,18 @@ namespace PackageManagement.Tests.Helpers @@ -66,13 +67,18 @@ namespace PackageManagement.Tests.Helpers
Class.Stub(c => c.BaseTypes).Return(baseTypes);
}
IReturnType CreateBaseType(IClass baseTypeClass, string baseTypeFullName, string baseTypeDotNetName)
ReturnTypeHelper CreateBaseTypeHelper(IClass baseTypeClass, string baseTypeFullName, string baseTypeDotNetName)
{
var returnTypeHelper = new ReturnTypeHelper();
returnTypeHelper.CreateReturnType(baseTypeFullName);
returnTypeHelper.AddUnderlyingClass(baseTypeClass);
returnTypeHelper.AddDotNetName(baseTypeDotNetName);
return returnTypeHelper.ReturnType;
return returnTypeHelper;
}
IReturnType CreateBaseType(IClass baseTypeClass, string baseTypeFullName, string baseTypeDotNetName)
{
return CreateBaseTypeHelper(baseTypeClass, baseTypeFullName, baseTypeDotNetName).ReturnType;
}
public void AddClassToClassBaseTypes(string fullName)
@ -185,5 +191,28 @@ namespace PackageManagement.Tests.Helpers @@ -185,5 +191,28 @@ namespace PackageManagement.Tests.Helpers
{
Class.Stub(c => c.DotNetName).Return(className);
}
/// <summary>
/// Classes at the end of the array are at the top of the inheritance tree.
/// </summary>
public void AddClassInheritanceTreeClassesOnly(params string[] classNames)
{
List<IClass> classes = CreateClassInheritanceTree(classNames);
Class.Stub(c => c.ClassInheritanceTreeClassesOnly).Return(classes);
}
List<IClass> CreateClassInheritanceTree(string[] classNames)
{
return classNames
.Select(name => CreateClassHelperWithPublicClass(name).Class)
.ToList();
}
ClassHelper CreateClassHelperWithPublicClass(string name)
{
var classHelper = new ClassHelper();
classHelper.CreatePublicClass(name);
return classHelper;
}
}
}

Loading…
Cancel
Save