Skip to content

Commit f10c7da

Browse files
committed
RDS: add option if generated code should be for a single or multiple inputs
1 parent a9795b0 commit f10c7da

24 files changed

+380
-177
lines changed
Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
22

3+
using RevitDBExplorer.Domain.RevitDatabaseScripting;
4+
35
namespace RevitDBExplorer.Domain.DataModel.Accessors
46
{
57
internal interface IAccessorWithCodeGeneration : IAccessor
68
{
7-
string GenerateInvocationForScript();
9+
string GenerateInvocationForScript(TemplateInputsKind inputsKind);
810
}
911
}

sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRef.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,9 @@ private object[] ResolveArguments(ParameterInfo[] paramsDef, Document doc, objec
8282
}
8383

8484

85-
public string GenerateInvocationForScript()
85+
public string GenerateInvocationForScript(TemplateInputsKind inputsKind)
8686
{
87-
return new MemberInvocation_Template().Evaluate(getMethod, null);
87+
return new MemberInvocationTemplateSelector().Evaluate(getMethod, null, inputsKind);
8888
}
8989
}
9090
}

sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorByRefCompiled.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,9 @@ public override IEnumerable<SnoopableObject> Snoop(SnoopableContext context, TSn
3434
}
3535

3636

37-
public string GenerateInvocationForScript()
37+
public string GenerateInvocationForScript(TemplateInputsKind inputsKind)
3838
{
39-
return new MemberInvocation_Template().Evaluate(getMethod, null);
39+
return new MemberInvocationTemplateSelector().Evaluate(getMethod, null, inputsKind);
4040
}
4141
}
4242
}

sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorForNotExposed.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ public IValueViewModel CreatePresenter(SnoopableContext context, object @object)
2525
{
2626
return EmptyPresenter.Instance;
2727
}
28-
public string GenerateInvocationForScript()
28+
public string GenerateInvocationForScript(TemplateInputsKind inputsKind)
2929
{
30-
return new MemberInvocation_Template().Evaluate(getMethod, null);
30+
return new MemberInvocationTemplateSelector().Evaluate(getMethod, null, inputsKind);
3131
}
3232
}
3333
}

sources/RevitDBExplorer/Domain/DataModel/MemberAccessors/MemberAccessorForStatic.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,9 @@ public IValueViewModel CreatePresenter(SnoopableContext context, object @object)
2525
{
2626
return EmptyPresenter.Instance;
2727
}
28-
public string GenerateInvocationForScript()
28+
public string GenerateInvocationForScript(TemplateInputsKind inputsKind)
2929
{
30-
return new MemberInvocation_Template().Evaluate(getMethod, "");
30+
return new MemberInvocationTemplateSelector().Evaluate(getMethod, "", inputsKind);
3131
}
3232
}
3333
}

sources/RevitDBExplorer/Domain/DataModel/Parameters/ParameterAccessor.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -70,22 +70,22 @@ public IEnumerable<SnoopableObject> Snoop(SnoopableContext context, object @obje
7070
}
7171

7272

73-
public string GenerateInvocationForScript()
73+
public string GenerateInvocationForScript(TemplateInputsKind inputsKind)
7474
{
7575
string paramValue = parameter.StorageType switch { StorageType.String => @"""""", StorageType.Integer => "0", StorageType.Double => "0.0", _ => "new ElementId(0)" };
7676

7777
if (parameter.IsShared)
7878
{
79-
return new ParameterShared_UpdateTemplate().Evaluate(parameter.GUID, paramValue);
79+
return new ParameterShared_UpdateTemplate().Evaluate(parameter.GUID, paramValue, inputsKind);
8080
}
8181
if (parameter.Definition is InternalDefinition internalDef)
8282
{
8383
if (internalDef.BuiltInParameter != BuiltInParameter.INVALID)
8484
{
85-
return new ParameterBuiltIn_UpdateTemplate().Evaluate(internalDef.BuiltInParameter, paramValue);
85+
return new ParameterBuiltIn_UpdateTemplate().Evaluate(internalDef.BuiltInParameter, paramValue, inputsKind);
8686
}
8787
}
88-
return new ParameterProject_UpdateTemplate().Evaluate(parameter.Definition.Name, paramValue);
88+
return new ParameterProject_UpdateTemplate().Evaluate(parameter.Definition.Name, paramValue, inputsKind);
8989
}
9090

9191

sources/RevitDBExplorer/Domain/DataModel/SnoopableItem.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -110,15 +110,15 @@ public void Freeze(int candies)
110110
public abstract bool Equals(SnoopableItem other);
111111

112112

113-
public string GenerateScript()
113+
public string GenerateScript(TemplateInputsKind inputsKind)
114114
{
115115
if (accessor is IAccessorWithCodeGeneration accessorWithCodeGeneration)
116116
{
117-
return accessorWithCodeGeneration.GenerateInvocationForScript();
117+
return accessorWithCodeGeneration.GenerateInvocationForScript(inputsKind);
118118
}
119119
var invocation = accessor.DefaultInvocation ?? Name;
120120

121-
return new MemberInvocation_SelectTemplate().Evaluate(parent.Object.GetType(), invocation);
121+
return new MemberInvocationTemplateSelector().Evaluate(parent.Object.GetType(), invocation, TemplateCmdKind.Select, inputsKind);
122122
}
123123
}
124124
}

sources/RevitDBExplorer/Domain/DataModel/SnoopableMember.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
using RevitDBExplorer.Domain.DataModel.Streams.Base;
1+
using System.Collections.Generic;
2+
using System.Windows.Documents;
3+
using RevitDBExplorer.Domain.DataModel.Streams.Base;
24

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

@@ -25,15 +27,17 @@ public SnoopableMember(SnoopableObject parent, MemberDescriptor memberDescriptor
2527
public override SourceOfObjects Snoop()
2628
{
2729
var fullTitle = Name;
30+
IEnumerable<Inline> fullTitleColored = new[] { new Run(Name) };
2831
if (!string.IsNullOrEmpty(Documentation.Name))
2932
{
30-
fullTitle = $"{Documentation.ReturnType} {Documentation.Name}{Documentation.Invocation}";
33+
fullTitle = Documentation.Title;
34+
fullTitleColored = Documentation.TitleCollored;
3135
}
3236

3337
var title = $"{parent.Name}.{this.Name}";
3438

3539

36-
return new SourceOfObjects(this) { Info = new InfoAboutSource(title, fullTitle) };
40+
return new SourceOfObjects(this) { Info = new InfoAboutSource(title) { FullTitleColored = fullTitleColored } };
3741
}
3842

3943

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
using System;
2+
using System.Reflection;
3+
using NSourceGenerators;
4+
5+
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
6+
7+
namespace RevitDBExplorer.Domain.RevitDatabaseScripting
8+
{
9+
public enum TemplateCmdKind { Select, Update };
10+
public enum TemplateInputsKind { Single, Multiple };
11+
12+
internal class MemberInvocationTemplateSelector
13+
{
14+
public string Evaluate(MethodInfo getMethod, string invocation, TemplateInputsKind inputsKind)
15+
{
16+
invocation ??= getMethod.GenerateInvocation();
17+
var cmdkind = getMethod.ReturnType == typeof(void) ? TemplateCmdKind.Update : TemplateCmdKind.Select;
18+
19+
return Evaluate(getMethod.DeclaringType, invocation, cmdkind, inputsKind);
20+
}
21+
public string Evaluate(Type type, string invocation, TemplateCmdKind cmdkind, TemplateInputsKind inputsKind)
22+
{
23+
var template = GetTemplateType(cmdkind, inputsKind);
24+
25+
return Evaluate(template, type, invocation);
26+
}
27+
private Type GetTemplateType(TemplateCmdKind cmdKind, TemplateInputsKind inputsKind)
28+
{
29+
if ((inputsKind == TemplateInputsKind.Single) && (cmdKind == TemplateCmdKind.Select))
30+
{
31+
return typeof(MemberInvocation_SelectSingle_Template);
32+
}
33+
if ((inputsKind == TemplateInputsKind.Single) && (cmdKind == TemplateCmdKind.Update))
34+
{
35+
return typeof(MemberInvocation_UpdateSingle_Template);
36+
}
37+
if ((inputsKind == TemplateInputsKind.Multiple) && (cmdKind == TemplateCmdKind.Select))
38+
{
39+
return typeof(MemberInvocation_SelectMultiple_Template);
40+
}
41+
if ((inputsKind == TemplateInputsKind.Multiple) && (cmdKind == TemplateCmdKind.Update))
42+
{
43+
return typeof(MemberInvocation_UpdateMultiple_Template);
44+
}
45+
46+
throw new NotImplementedException();
47+
}
48+
49+
50+
51+
private string Evaluate(System.Type templateType, System.Type type, string invocation)
52+
{
53+
var template = CodeToStringRepo.GetText(templateType.Name, true);
54+
var result = template.ReplaceMany(new[]
55+
{
56+
("TypePlaceholder", type.GetCSharpName()),
57+
("MethodPlaceholder()", invocation)
58+
});
59+
60+
return result;
61+
}
62+
}
63+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
using System.Collections.Generic;
2+
using System.Linq;
3+
using Autodesk.Revit.DB;
4+
using NSourceGenerators;
5+
using RevitDBExplorer.Domain.RevitDatabaseScripting.Dummies;
6+
7+
// (c) Revit Database Explorer https://github.com/NeVeSpl/RevitDBExplorer/blob/main/license.md
8+
9+
namespace RevitDBExplorer.Domain.RevitDatabaseScripting
10+
{
11+
internal class MemberInvocation_SelectMultiple_Template
12+
{
13+
[CodeToString(nameof(MemberInvocation_SelectMultiple_Template))]
14+
IEnumerable<object> Select(Document document, IEnumerable<TypePlaceholder> inputs)
15+
{
16+
foreach (var item in inputs)
17+
{
18+
yield return item.MethodPlaceholder();
19+
}
20+
}
21+
}
22+
23+
24+
internal class MemberInvocation_SelectSingle_Template
25+
{
26+
[CodeToString(nameof(MemberInvocation_SelectSingle_Template))]
27+
object Select(Document document, IEnumerable<TypePlaceholder> inputs)
28+
{
29+
var input = inputs.FirstOrDefault();
30+
return input.MethodPlaceholder();
31+
}
32+
}
33+
34+
35+
internal class MemberInvocation_UpdateMultiple_Template
36+
{
37+
[CodeToString(nameof(MemberInvocation_UpdateMultiple_Template))]
38+
void Update(Document document, IEnumerable<TypePlaceholder> inputs)
39+
{
40+
foreach (var item in inputs)
41+
{
42+
item.MethodPlaceholder();
43+
}
44+
}
45+
}
46+
47+
48+
internal class MemberInvocation_UpdateSingle_Template
49+
{
50+
[CodeToString(nameof(MemberInvocation_UpdateSingle_Template))]
51+
void Update(Document document, IEnumerable<TypePlaceholder> inputs)
52+
{
53+
var input = inputs.FirstOrDefault();
54+
input.MethodPlaceholder();
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)