Skip to content

Commit 3e00f64

Browse files
committed
improve generation of invocations for static methods
1 parent 8db0aff commit 3e00f64

12 files changed

+146
-126
lines changed
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
7+
namespace RevitDBExplorer.Domain.DataModel.Accessors
8+
{
9+
internal class ExecuteResultCollection
10+
{
11+
public List<(object Arg, object Result)> Results { get; } = new List<(object, object)> ();
12+
public string Label { get; init; }
13+
public string Param_0_Name { get; init; }
14+
15+
16+
public static ExecuteResultCollection Create<T>(string param_0_Name)
17+
{
18+
return new ExecuteResultCollection()
19+
{
20+
Param_0_Name = param_0_Name,
21+
Label = $"[{typeof(T).GetCSharpName()}]",
22+
};
23+
}
24+
25+
26+
public void Add<TParam0Type, TReturnType>(TParam0Type arg, TReturnType result)
27+
{
28+
Results.Add ((arg, result));
29+
}
30+
}
31+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Autodesk.Revit.DB;
4+
using RevitDBExplorer.Domain.DataModel.Accessors;
5+
using RevitDBExplorer.Domain.DataModel.ValueContainers.Base;
6+
7+
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
8+
9+
namespace RevitDBExplorer.Domain.DataModel.Members.Accessors
10+
{
11+
internal class MemberAccessorByFuncUltra<TSnoopedObjectType, TParam0Type, TReturnType> : MemberAccessorTypedWithDefaultPresenter<TSnoopedObjectType>
12+
{
13+
private readonly Func<Document, TSnoopedObjectType, TParam0Type, TReturnType> get;
14+
private readonly IEnumerable<TParam0Type> param_0_arguments;
15+
private readonly string param_0_Name;
16+
17+
18+
public MemberAccessorByFuncUltra(Func<Document, TSnoopedObjectType, TParam0Type, TReturnType> get, IEnumerable<TParam0Type> param_0_arguments, string param_0_Name)
19+
{
20+
this.get = get;
21+
this.param_0_arguments = param_0_arguments;
22+
this.param_0_Name = param_0_Name;
23+
}
24+
25+
26+
protected override ReadResult Read(SnoopableContext context, TSnoopedObjectType snoopedObject)
27+
{
28+
var value = new ValueContainer<ExecuteResultCollection>();
29+
var resultCollection = ExecuteResultCollection.Create<TReturnType>(param_0_Name);
30+
31+
foreach (var arg in param_0_arguments)
32+
{
33+
var result = get(context.Document, snoopedObject, arg);
34+
resultCollection.Add(arg, result);
35+
}
36+
37+
value.SetValueTyped(context, resultCollection);
38+
39+
return new ReadResult(value.ValueAsString, "[ByFuncUltra] " + value.TypeHandlerName, value.CanBeSnooped, value.CanBeVisualized, value);
40+
}
41+
}
42+
}

sources/RevitDBExplorer/Domain/DataModel/Members/Base/MemberTemplate.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Collections.Generic;
23
using System.Linq.Expressions;
34
using Autodesk.Revit.DB;
45
using RevitDBExplorer.Domain.DataModel.Accessors;
@@ -38,6 +39,22 @@ public static ISnoopableMemberTemplate Create<TReturnType>(Expression<Func<Docum
3839
var compiledGetter = getter.Compile();
3940
var methodCallExpression = getter.Body as MethodCallExpression;
4041
var memberAccessor = new MemberAccessorByFunc<TForType, TReturnType>(compiledGetter);
42+
43+
memberAccessor.UniqueId = $"{typeof(TForType).Name}_{getter.GetUniqueId()}";
44+
memberAccessor.DefaultInvocation.Syntax = getter.ToCeSharp();
45+
46+
return WithCustomAC(methodCallExpression.Method.DeclaringType, methodCallExpression.Method.Name, memberAccessor, canBeUsed, kind, () => RevitDocumentationReader.GetMethodComments(methodCallExpression.Method));
47+
}
48+
49+
public static ISnoopableMemberTemplate Create<TParam0Type, TReturnType>(Expression<Func<Document, TForType, TParam0Type, TReturnType>> getter,
50+
IEnumerable<TParam0Type> param_0_arguments,
51+
Func<TForType, bool> canBeUsed = null,
52+
MemberKind kind = MemberKind.StaticMethod)
53+
{
54+
var compiledGetter = getter.Compile();
55+
var methodCallExpression = getter.Body as MethodCallExpression;
56+
var param_0_name = getter.Parameters[2].Name;
57+
var memberAccessor = new MemberAccessorByFuncUltra<TForType, TParam0Type, TReturnType>(compiledGetter, param_0_arguments, param_0_name);
4158

4259
memberAccessor.UniqueId = $"{typeof(TForType).Name}_{getter.GetUniqueId()}";
4360
memberAccessor.DefaultInvocation.Syntax = getter.ToCeSharp();

sources/RevitDBExplorer/Domain/DataModel/MembersTemplates/Accessors/AnalyticalToPhysicalAssociationManager_GetAssociatedElementId.cs

Lines changed: 0 additions & 27 deletions
This file was deleted.

sources/RevitDBExplorer/Domain/DataModel/MembersTemplates/Accessors/AnalyticalToPhysicalAssociationManager_GetAssociatedElementIds.cs

Lines changed: 0 additions & 27 deletions
This file was deleted.

sources/RevitDBExplorer/Domain/DataModel/MembersTemplates/Accessors/AnalyticalToPhysicalAssociationManager_HasAssociation.cs

Lines changed: 0 additions & 27 deletions
This file was deleted.

sources/RevitDBExplorer/Domain/DataModel/MembersTemplates/Accessors/HostObjectUtils_GetSideFaces.cs

Lines changed: 0 additions & 34 deletions
This file was deleted.

sources/RevitDBExplorer/Domain/DataModel/MembersTemplates/Element_Templates.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using Autodesk.Revit.DB.Structure;
44
using RevitDBExplorer.Domain.DataModel.Members;
55
using RevitDBExplorer.Domain.DataModel.Members.Base;
6-
using RevitDBExplorer.Domain.DataModel.MembersTemplates.Accessors;
76

87
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
98

@@ -17,14 +16,14 @@ public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
1716
MemberTemplate<Element>.Create((doc, target) => doc.GetWorksetId(target.Id), kind: MemberKind.AsArgument),
1817

1918
#if R2023_MIN
20-
MemberTemplate<Element>.WithCustomAC(typeof(AnalyticalToPhysicalAssociationManager), nameof(AnalyticalToPhysicalAssociationManager.HasAssociation), new AnalyticalToPhysicalAssociationManager_HasAssociation(), kind: MemberKind.AsArgument),
21-
MemberTemplate<Element>.WithCustomAC(typeof(AnalyticalToPhysicalAssociationManager), nameof(AnalyticalToPhysicalAssociationManager.GetAssociatedElementId), new AnalyticalToPhysicalAssociationManager_GetAssociatedElementId(), kind: MemberKind.AsArgument),
19+
MemberTemplate<Element>.Create((doc, target) => AnalyticalToPhysicalAssociationManager.GetAnalyticalToPhysicalAssociationManager(doc).HasAssociation(target.Id), kind: MemberKind.AsArgument),
20+
MemberTemplate<Element>.Create((doc, target) => AnalyticalToPhysicalAssociationManager.GetAnalyticalToPhysicalAssociationManager(doc).GetAssociatedElementId(target.Id), kind: MemberKind.AsArgument),
2221
#endif
2322

2423
#if R2024_MIN
2524
MemberTemplate<Element>.Create((doc, target) => AnalyticalToPhysicalAssociationManager.IsAnalyticalElement(doc, target.Id), kind: MemberKind.StaticMethod),
2625
MemberTemplate<Element>.Create((doc, target) => AnalyticalToPhysicalAssociationManager.IsPhysicalElement(doc, target.Id), kind: MemberKind.StaticMethod),
27-
MemberTemplate<Element>.WithCustomAC(typeof(AnalyticalToPhysicalAssociationManager), nameof(AnalyticalToPhysicalAssociationManager.GetAssociatedElementIds), new AnalyticalToPhysicalAssociationManager_GetAssociatedElementIds(), kind: MemberKind.AsArgument),
26+
MemberTemplate<Element>.Create((doc, target) => AnalyticalToPhysicalAssociationManager.GetAnalyticalToPhysicalAssociationManager(doc).GetAssociatedElementIds(target.Id), kind: MemberKind.AsArgument),
2827
#endif
2928

3029
MemberTemplate<Element>.Create((document, target) => SolidSolidCutUtils.IsAllowedForSolidCut(target)),

sources/RevitDBExplorer/Domain/DataModel/MembersTemplates/HostObject_Templates.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using Autodesk.Revit.DB;
33
using RevitDBExplorer.Domain.DataModel.Members;
44
using RevitDBExplorer.Domain.DataModel.Members.Base;
5-
using RevitDBExplorer.Domain.DataModel.MembersTemplates.Accessors;
65

76
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
87

@@ -12,9 +11,9 @@ internal class HostObject_Templates : IHaveMemberTemplates
1211
{
1312
public IEnumerable<ISnoopableMemberTemplate> GetTemplates() =>
1413
[
15-
MemberTemplate<HostObject>.Create((doc, target) => HostObjectUtils.GetTopFaces(target), kind: MemberKind.StaticMethod),
16-
MemberTemplate<HostObject>.Create((doc, target) => HostObjectUtils.GetBottomFaces(target), kind: MemberKind.StaticMethod),
17-
MemberTemplate<HostObject>.WithCustomAC(typeof(HostObjectUtils), "GetSideFaces", new HostObjectUtils_GetSideFaces(), kind: MemberKind.StaticMethod ),
14+
MemberTemplate<HostObject>.Create((doc, target) => HostObjectUtils.GetTopFaces(target), kind: MemberKind.StaticMethod),
15+
MemberTemplate<HostObject>.Create((doc, target) => HostObjectUtils.GetBottomFaces(target), kind: MemberKind.StaticMethod),
16+
MemberTemplate<HostObject>.Create((doc, target, side) => HostObjectUtils.GetSideFaces(target, side), [ShellLayerType.Interior, ShellLayerType.Exterior]),
1817
];
1918
}
2019
}

sources/RevitDBExplorer/Domain/DataModel/ValueContainers/Base/ValueContainerFactory.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ internal static class ValueContainerFactory
6767
new ElementHandler(),
6868

6969
// collections
70+
new ExecuteResultCollectionHandler(),
7071
new IListElementIdHandler(),
7172
new IEnumerableHandler(),
7273

0 commit comments

Comments
 (0)