Skip to content

Commit 57a6b1b

Browse files
authored
Merge pull request #56 from microsoftgraph/mainer/functionComposable
Changes based on Excel updates
2 parents 331c1dd + 9ffed42 commit 57a6b1b

21 files changed

+933
-275
lines changed

Templates/CSharp/Base/CollectionRequestBuilder.Base.template.tt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,20 @@ public string GetCollectionReferencesRequestBuilder(OdcmProperty odcmProperty)
119119
// Creates the indexer property definition for a standard navigation collection
120120
public string GetCollectionIndexRequestBuilder(OdcmProperty odcmProperty)
121121
{
122+
// In case there is an action or function with the name of item. This is to avoid CS0102
123+
// https://msdn.microsoft.com/en-US/library/26f2y168%28v=VS.90%29.aspx
124+
var allMethods = new List<OdcmMethod>();
125+
foreach (var method in odcmProperty.Projection.Type.AsOdcmClass().Methods)
126+
{
127+
allMethods.Add(method);
128+
allMethods.AddRange(method.Overloads);
129+
}
130+
var renameItem = "";
131+
if (allMethods.Exists(x => x.Name.ToLower().Equals("item")))
132+
{
133+
renameItem = "\n [System.Runtime.CompilerServices.IndexerName(\"ThisItem\")]";
134+
}
135+
122136
var stringBuilder = new StringBuilder();
123137
var propTypeName = string.Concat(this.GetEntityNameString(odcmProperty.Class), this.GetPropertyTypeName(odcmProperty));
124138
var entityRequestBuilder = this.GetPropertyTypeRequestBuilderName(odcmProperty);
@@ -132,6 +146,7 @@ public string GetCollectionIndexRequestBuilder(OdcmProperty odcmProperty)
132146
stringBuilder.AppendFormat(" /// <param name=\"id\">The ID for the {0}.</param>", propTypeName);
133147
stringBuilder.Append(Environment.NewLine);
134148
stringBuilder.AppendFormat(" /// <returns>The <see cref=\"I{0}\"/>.</returns>", entityRequestBuilder);
149+
stringBuilder.Append(renameItem);
135150
stringBuilder.Append(Environment.NewLine);
136151
stringBuilder.AppendFormat(" public I{0} this[string id]", entityRequestBuilder);
137152
stringBuilder.Append(Environment.NewLine);

Templates/CSharp/Base/EntityRequest.Base.template.tt

Lines changed: 66 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,71 @@ public string GetEntityDeleteAsyncMethod(OdcmClass odcmClass)
100100
return this.GetDeleteAsyncMethod(entityName, entityName);
101101
}
102102

103+
public void AppendPutRefenceAsyncHeader(string putTargetString, StringBuilder stringBuilder, bool includeSendParams)
104+
{
105+
if (includeSendParams)
106+
{
107+
stringBuilder.AppendFormat(" ");
108+
}
109+
110+
stringBuilder.Append("/// <summary>");
111+
stringBuilder.Append(Environment.NewLine);
112+
stringBuilder.AppendFormat(" /// Puts the specified {0} reference.", putTargetString);
113+
stringBuilder.Append(Environment.NewLine);
114+
stringBuilder.Append(" /// </summary>");
115+
stringBuilder.Append(Environment.NewLine);
116+
stringBuilder.AppendFormat(" /// <param name=\"id\">The {0} reference to update.</param>", putTargetString);
117+
118+
if (includeSendParams)
119+
{
120+
stringBuilder.Append(Environment.NewLine);
121+
stringBuilder.Append(" /// <param name=\"cancellationToken\">The <see cref=\"CancellationToken\"/> for the request.</param>");
122+
}
123+
124+
stringBuilder.Append(Environment.NewLine);
125+
stringBuilder.Append(" /// <returns>The task to await.</returns>");
126+
}
127+
128+
public string GetEntityReferencePutAsyncMethod(OdcmClass odcmClass)
129+
{
130+
var entityName = this.GetEntityNameString(odcmClass);
131+
132+
var stringBuilder = new StringBuilder();
133+
134+
this.AppendPutRefenceAsyncHeader(entityName, stringBuilder, false);
135+
stringBuilder.Append(Environment.NewLine);
136+
stringBuilder.Append(" public System.Threading.Tasks.Task PutAsync(string id)");
137+
stringBuilder.Append(@"
138+
{
139+
return this.PutAsync(id, CancellationToken.None);
140+
}");
141+
stringBuilder.Append(Environment.NewLine);
142+
stringBuilder.Append(Environment.NewLine);
143+
144+
this.AppendPutRefenceAsyncHeader(entityName, stringBuilder, true);
145+
stringBuilder.Append(Environment.NewLine);
146+
stringBuilder.Append(" public async System.Threading.Tasks.Task PutAsync(string id, CancellationToken cancellationToken)");
147+
stringBuilder.Append(@"
148+
{
149+
var baseUrl = this.Client.BaseUrl;");
150+
stringBuilder.Append(Environment.NewLine);
151+
stringBuilder.Append(@" var objectUri = string.Format(@""{0}/users/{1}"", baseUrl, id);");
152+
stringBuilder.Append(Environment.NewLine);
153+
stringBuilder.Append(@" var payload = new Newtonsoft.Json.Linq.JObject(");
154+
stringBuilder.Append(Environment.NewLine);
155+
stringBuilder.Append(@" new Newtonsoft.Json.Linq.JProperty(""@odata.id"", objectUri));");
156+
stringBuilder.Append(Environment.NewLine);
157+
stringBuilder.Append(@" this.Method = ""PUT"";");
158+
stringBuilder.Append(Environment.NewLine);
159+
stringBuilder.Append(@" this.ContentType = ""application/json"";");
160+
stringBuilder.Append(Environment.NewLine);
161+
stringBuilder.AppendFormat(" await this.SendAsync(payload.ToString(), cancellationToken).ConfigureAwait(false);");
162+
stringBuilder.Append(Environment.NewLine);
163+
stringBuilder.Append(" }");
164+
165+
return stringBuilder.ToString();
166+
}
167+
103168
public void AppendCreateAsyncHeader(string entityName, string lowerCaseEntityName, StringBuilder stringBuilder, bool includeSendParams)
104169
{
105170
if (includeSendParams)
@@ -109,7 +174,7 @@ public void AppendCreateAsyncHeader(string entityName, string lowerCaseEntityNam
109174

110175
stringBuilder.Append("/// <summary>");
111176
stringBuilder.Append(Environment.NewLine);
112-
stringBuilder.AppendFormat(" /// Creates the specified {0} using PUT.", entityName);
177+
stringBuilder.AppendFormat(" /// Creates the specified {0} using POST.", entityName);
113178
stringBuilder.Append(Environment.NewLine);
114179
stringBuilder.Append(" /// </summary>");
115180
stringBuilder.Append(Environment.NewLine);

Templates/CSharp/Base/EntityRequestBuilder.Base.template.tt

Lines changed: 0 additions & 133 deletions
Original file line numberDiff line numberDiff line change
@@ -162,40 +162,6 @@ public string GetNonCollectionRequestBuilderProperty(OdcmProperty odcmProperty)
162162
return this.GetRequestBuilderProperty(propertyName, propertyRequestBuilder);
163163
}
164164

165-
166-
// -------------------------------------------------------------
167-
// Methods to create an OData method property definition within an entity class
168-
// -------------------------------------------------------------
169-
public string GetMethodRequestBuilderMethod(
170-
string methodName,
171-
string requestBuilderBaseString,
172-
string methodParamaterString,
173-
string requestBuilderInitializerString)
174-
{
175-
var requestBuilderTypeName = this.GetRequestBuilderString(requestBuilderBaseString);
176-
var stringBuilder = new StringBuilder();
177-
178-
stringBuilder.Append("/// <summary>");
179-
stringBuilder.Append(Environment.NewLine);
180-
stringBuilder.AppendFormat(" /// Gets the request builder for {0}.", requestBuilderBaseString);
181-
stringBuilder.Append(Environment.NewLine);
182-
stringBuilder.Append(" /// </summary>");
183-
stringBuilder.Append(Environment.NewLine);
184-
stringBuilder.AppendFormat(" /// <returns>The <see cref=\"I{0}\"/>.</returns>", requestBuilderTypeName);
185-
stringBuilder.Append(Environment.NewLine);
186-
stringBuilder.AppendFormat(" public I{0} {1}({2})", requestBuilderTypeName, methodName, methodParamaterString);
187-
stringBuilder.Append(Environment.NewLine);
188-
stringBuilder.Append(
189-
@" {
190-
");
191-
stringBuilder.AppendFormat(" return new {0}({1});", requestBuilderTypeName, requestBuilderInitializerString);
192-
stringBuilder.Append(
193-
@"
194-
}");
195-
196-
return stringBuilder.ToString();
197-
}
198-
199165
// Creates the set of property definitions for navigation properties on the entity
200166
public string GetNavigationProperties(OdcmClass entity)
201167
{
@@ -261,103 +227,4 @@ public string GetStreamProperties(OdcmClass entity)
261227

262228
return stringBuilder.ToString();
263229
}
264-
265-
// Creates the set of property definitions for OData method properties on the entity
266-
public string GetMethodProperties(OdcmClass entity)
267-
{
268-
var allMethods = new List<OdcmMethod>();
269-
foreach (var method in entity.Methods)
270-
{
271-
allMethods.Add(method);
272-
allMethods.AddRange(method.Overloads);
273-
}
274-
275-
var methodPropertiesStringBuilder = new StringBuilder();
276-
foreach(var method in allMethods)
277-
{
278-
var methodName = this.GetMethodName(method);
279-
var baseName = string.Concat(this.GetEntityNameString(method.Class), methodName);
280-
281-
var paramStringBuilder = new System.Text.StringBuilder();
282-
var builderInitializerStringBuilder = new StringBuilder();
283-
284-
builderInitializerStringBuilder.Append(Environment.NewLine);
285-
builderInitializerStringBuilder.Append(" ");
286-
builderInitializerStringBuilder.AppendFormat("this.AppendSegmentToRequestUrl(\"{0}.{1}\"),", method.Namespace.Name, method.Name);
287-
builderInitializerStringBuilder.Append(Environment.NewLine);
288-
builderInitializerStringBuilder.Append(" ");
289-
builderInitializerStringBuilder.Append("this.Client,");
290-
291-
var hasParameters = method.Parameters != null && method.Parameters.Any();
292-
293-
if (hasParameters)
294-
{
295-
var requiredParameters = method.Parameters.Where(param => !param.IsNullable);
296-
var optionalParameters = method.Parameters.Where(param => param.IsNullable);
297-
298-
foreach (var param in requiredParameters)
299-
{
300-
var paramVariableName = param.Name.GetSanitizedParameterName();
301-
var paramTypeString = param.Type.GetTypeString();
302-
303-
if (param.IsCollection)
304-
{
305-
paramTypeString = string.Format("IEnumerable<{0}>", paramTypeString);
306-
}
307-
308-
paramStringBuilder.Append(Environment.NewLine);
309-
paramStringBuilder.Append(" ");
310-
paramStringBuilder.AppendFormat("{0} {1},", paramTypeString, paramVariableName);
311-
312-
builderInitializerStringBuilder.Append(Environment.NewLine);
313-
builderInitializerStringBuilder.Append(" ");
314-
builderInitializerStringBuilder.AppendFormat("{0},", paramVariableName);
315-
}
316-
317-
foreach (var param in optionalParameters)
318-
{
319-
var paramVariableName = param.Name.GetSanitizedParameterName();
320-
var paramTypeString = param.Type.GetTypeString();
321-
322-
if (param.IsCollection)
323-
{
324-
paramTypeString = string.Format("IEnumerable<{0}>", paramTypeString);
325-
}
326-
else if(!param.Type.IsTypeNullable())
327-
{
328-
paramTypeString = string.Format("{0}?", paramTypeString);
329-
}
330-
331-
paramStringBuilder.Append(Environment.NewLine);
332-
paramStringBuilder.Append(" ");
333-
paramStringBuilder.AppendFormat("{0} {1} = null,", paramTypeString, paramVariableName);
334-
335-
builderInitializerStringBuilder.Append(Environment.NewLine);
336-
builderInitializerStringBuilder.Append(" ");
337-
builderInitializerStringBuilder.AppendFormat("{0},", paramVariableName);
338-
}
339-
340-
paramStringBuilder.Remove(paramStringBuilder.Length - 1, 1);
341-
}
342-
343-
builderInitializerStringBuilder.Remove(builderInitializerStringBuilder.Length - 1, 1);
344-
345-
if (methodPropertiesStringBuilder.Length > 0)
346-
{
347-
methodPropertiesStringBuilder.Append(Environment.NewLine);
348-
methodPropertiesStringBuilder.Append(Environment.NewLine);
349-
methodPropertiesStringBuilder.Append(" ");
350-
}
351-
352-
methodPropertiesStringBuilder.Append(
353-
this.GetMethodRequestBuilderMethod(
354-
methodName,
355-
baseName,
356-
paramStringBuilder.ToString(),
357-
builderInitializerStringBuilder.ToString()));
358-
}
359-
360-
return methodPropertiesStringBuilder.ToString();
361-
}
362-
363230
#>

Templates/CSharp/Base/ICollectionRequestBuilder.Base.template.tt

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,18 @@ public string GetCollectionIndexRequestBuilder(OdcmProperty odcmProperty)
2727
var propTypeName = this.GetPropertyTypeName(odcmProperty);
2828
var entityRequestBuilder = this.GetPropertyTypeRequestBuilderName(odcmProperty);
2929

30-
return this.GetIndexRequestBuilder(propTypeName, entityRequestBuilder);
30+
// In case there is an action or function with the name of item. This is to avoid CS0102
31+
// https://msdn.microsoft.com/en-US/library/26f2y168%28v=VS.90%29.aspx
32+
var allMethods = new List<OdcmMethod>();
33+
foreach (var method in odcmProperty.Projection.Type.AsOdcmClass().Methods)
34+
{
35+
allMethods.Add(method);
36+
allMethods.AddRange(method.Overloads);
37+
}
38+
39+
var hasItemMethod = allMethods.Exists(x => x.Name.ToLower().Equals("item")) ? true : false;
40+
41+
return this.GetIndexRequestBuilder(propTypeName, entityRequestBuilder, hasItemMethod);
3142
}
3243

3344

@@ -73,7 +84,7 @@ public string GetCollectionWithReferencesRequestMethodWithOptions(OdcmProperty o
7384
// Indexer properties
7485
// -------------------------------------------------------------
7586
// Creates an indexer for the specified property name and requestBuilderTypeName
76-
public string GetIndexRequestBuilder(string propertyName, string requestBuilderTypeName)
87+
public string GetIndexRequestBuilder(string propertyName, string requestBuilderTypeName, bool hasItemMethod)
7788
{
7889
var stringBuilder = new StringBuilder();
7990

@@ -87,6 +98,11 @@ public string GetIndexRequestBuilder(string propertyName, string requestBuilderT
8798
stringBuilder.Append(Environment.NewLine);
8899
stringBuilder.AppendFormat(" /// <returns>The <see cref=\"I{0}\"/>.</returns>", requestBuilderTypeName);
89100
stringBuilder.Append(Environment.NewLine);
101+
if (hasItemMethod)
102+
{
103+
stringBuilder.AppendFormat(" [System.Runtime.CompilerServices.IndexerName(\"ThisItem\")]"); // Special case for methods named Item.
104+
stringBuilder.Append(Environment.NewLine);
105+
}
90106
stringBuilder.AppendFormat(" I{0} this[string id] {{ get; }}", requestBuilderTypeName);
91107

92108
return stringBuilder.ToString();
@@ -125,7 +141,7 @@ public string GetCollectionWithReferencesIndexRequestBuilder(OdcmProperty odcmPr
125141
var propTypeName = this.GetPropertyTypeName(odcmProperty);
126142
var entityRequestBuilder = this.GetPropertyTypeWithReferenceRequestBuilderName(odcmProperty);
127143

128-
return this.GetIndexRequestBuilder(propTypeName, entityRequestBuilder);
144+
return this.GetIndexRequestBuilder(propTypeName, entityRequestBuilder, false);
129145
}
130146

131147
#>

Templates/CSharp/Base/IEntityRequest.Base.template.tt

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ public string GetEntityReferenceDeleteAsyncMethod(OdcmClass odcmClass)
2121
return this.GetDeleteAsyncMethod(string.Concat(this.GetEntityNameString(odcmClass), " reference"));
2222
}
2323

24+
public string GetEntityReferencePutAsyncMethod(OdcmClass odcmClass)
25+
{
26+
return this.GetPutAsyncMethod(string.Concat(this.GetEntityNameString(odcmClass), " reference"));
27+
}
2428

2529
// -------------------------------------------------------------
2630
// Methods for standard entity requests
@@ -118,6 +122,47 @@ public string GetDeleteAsyncMethod(string deleteTargetString)
118122
return stringBuilder.ToString();
119123
}
120124

125+
public void AppendPutAsyncMethodHeader(string putTargetString, StringBuilder stringBuilder, bool includeSendParams)
126+
{
127+
if (includeSendParams)
128+
{
129+
stringBuilder.Append(" ");
130+
}
131+
132+
stringBuilder.Append("/// <summary>");
133+
stringBuilder.Append(Environment.NewLine);
134+
stringBuilder.AppendFormat(" /// Puts the specified {0}.", putTargetString);
135+
stringBuilder.Append(Environment.NewLine);
136+
stringBuilder.Append(" /// </summary>");
137+
138+
if (includeSendParams)
139+
{
140+
stringBuilder.Append(Environment.NewLine);
141+
stringBuilder.Append(" /// <param name=\"cancellationToken\">The <see cref=\"CancellationToken\"/> for the request.</param>");
142+
}
143+
144+
stringBuilder.Append(Environment.NewLine);
145+
stringBuilder.Append(" /// <returns>The task to await.</returns>");
146+
}
147+
148+
public string GetPutAsyncMethod(string putTargetString)
149+
{
150+
var stringBuilder = new StringBuilder();
151+
152+
this.AppendPutAsyncMethodHeader(putTargetString, stringBuilder, false);
153+
stringBuilder.Append(Environment.NewLine);
154+
stringBuilder.Append(" System.Threading.Tasks.Task PutAsync(string id);");
155+
156+
stringBuilder.Append(Environment.NewLine);
157+
stringBuilder.Append(Environment.NewLine);
158+
159+
this.AppendPutAsyncMethodHeader(putTargetString, stringBuilder, true);
160+
stringBuilder.Append(Environment.NewLine);
161+
stringBuilder.Append(" System.Threading.Tasks.Task PutAsync(string id, CancellationToken cancellationToken);");
162+
163+
return stringBuilder.ToString();
164+
}
165+
121166
public string GetEntityDeleteAsyncMethod(OdcmClass odcmClass)
122167
{
123168
return this.GetDeleteAsyncMethod(this.GetEntityNameString(odcmClass));

0 commit comments

Comments
 (0)