Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feature/observability #1841

Merged
merged 3 commits into from
Sep 28, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

- Added the ability to cancel the refinement process.
- Added Java 8 generation support.
- Added tracing support for Go. [#618](https://github.com/microsoft/kiota/issues/618)

### Changed

Expand Down
40 changes: 20 additions & 20 deletions src/Kiota.Builder/Refiners/GoRefiner.cs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,6 @@ public override Task Refine(CodeNamespace generatedCode, CancellationToken cance
CorrectPropertyType,
CorrectImplements);
cancellationToken.ThrowIfCancellationRequested();
InsertOverrideMethodForBuildersAndConstructors(generatedCode);
DisableActionOf(generatedCode,
CodeParameterKind.RequestConfiguration);
AddGetterAndSetterMethods(
Expand Down Expand Up @@ -130,21 +129,39 @@ public override Task Refine(CodeNamespace generatedCode, CancellationToken cance
x => $"{x.Name}able"
);
RemoveHandlerFromRequestBuilder(generatedCode);
AddContextParameterToGeneratorMethods(generatedCode);
}, cancellationToken);
}

protected static void RenameCancellationParameter(CodeElement currentElement){
if (currentElement is CodeMethod currentMethod && currentMethod.IsOfKind(CodeMethodKind.RequestExecutor) && currentMethod.Parameters.OfKind(CodeParameterKind.Cancellation) is CodeParameter parameter)
{
parameter.Name = "ctx";
parameter.Description = "Pass a context parameter to the request";
parameter.Name = ContextParameterName;
parameter.Description = ContextVarDescription;
parameter.Kind = CodeParameterKind.Cancellation;
parameter.Optional = false;
parameter.Type.Name = conventions.ContextVarTypeName;
parameter.Type.IsNullable = false;
}
CrawlTree(currentElement, RenameCancellationParameter);
}
private const string ContextParameterName = "ctx";
private const string ContextVarDescription = "Pass a context parameter to the request";
private static void AddContextParameterToGeneratorMethods(CodeElement currentElement) {
if (currentElement is CodeMethod currentMethod && currentMethod.IsOfKind(CodeMethodKind.RequestGenerator) &&
currentMethod.Parameters.OfKind(CodeParameterKind.Cancellation) is null)
currentMethod.AddParameter(new CodeParameter {
Name = ContextParameterName,
Type = new CodeType {
Name = conventions.ContextVarTypeName,
IsNullable = false,
},
Kind = CodeParameterKind.Cancellation,
Optional = false,
Description = ContextVarDescription,
});
CrawlTree(currentElement, AddContextParameterToGeneratorMethods);
}

private void RemoveHandlerFromRequestBuilder(CodeElement currentElement)
{
Expand All @@ -160,23 +177,6 @@ private void RemoveHandlerFromRequestBuilder(CodeElement currentElement)
CrawlTree(currentElement, RemoveHandlerFromRequestBuilder);
}

private void InsertOverrideMethodForBuildersAndConstructors(CodeElement currentElement) {
if(currentElement is CodeClass currentClass) {
var codeMethods = currentClass.Methods;
if(codeMethods.Any(x => x.IsOfKind(CodeMethodKind.RequestExecutor, CodeMethodKind.RequestGenerator))) {
var originalGeneratorMethods = codeMethods.Where(x => x.IsOfKind(CodeMethodKind.RequestGenerator)).ToList();
var generatorMethodsToAdd = originalGeneratorMethods
.Select(x => GetMethodClone(x, CodeParameterKind.RequestConfiguration))
.Where(x => x != null)
.ToArray();
originalGeneratorMethods.ForEach(x => x.Name = $"{x.Name}With{nameof(CodeParameterKind.RequestConfiguration)}");
if(generatorMethodsToAdd.Any())
currentClass.AddMethod(generatorMethodsToAdd.ToArray());
}
}

CrawlTree(currentElement, InsertOverrideMethodForBuildersAndConstructors);
}
private static void RemoveModelPropertiesThatDependOnSubNamespaces(CodeElement currentElement) {
if(currentElement is CodeClass currentClass &&
currentClass.IsOfKind(CodeClassKind.Model) &&
Expand Down
13 changes: 7 additions & 6 deletions src/Kiota.Builder/Writers/Go/CodeMethodWriter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -662,16 +662,16 @@ private static void WriteMethodCall(CodeMethod codeElement, RequestParams reques
.FirstOrDefault(x => x.IsOfKind(kind) && x.HttpMethod == codeElement.HttpMethod)
?.Name
?.ToFirstCharacterUpperCase();
var paramsList = new List<CodeParameter> { requestParams.requestBody, requestParams.requestConfiguration };
var paramsList = new List<CodeParameter> { codeElement.Parameters.OfKind(CodeParameterKind.Cancellation), requestParams.requestBody, requestParams.requestConfiguration };
if(parametersPad > 0)
paramsList.AddRange(Enumerable.Range(0, parametersPad).Select<int, CodeParameter>(x => null));
var requestInfoParameters = paramsList.Where(x => x != null)
.Select(x => x.Name)
.ToList();
var skipIndex = requestParams.requestBody == null ? 1 : 0;
requestInfoParameters.AddRange(paramsList.Where(x => x == null).Skip(skipIndex).Select(x => "nil"));
requestInfoParameters.AddRange(paramsList.Where(static x => x == null).Skip(skipIndex).Select(static x => "nil"));

var paramsCall = requestInfoParameters.Any() ? requestInfoParameters.Aggregate((x,y) => $"{x}, {y}") : string.Empty;
var paramsCall = requestInfoParameters.Any() ? requestInfoParameters.Aggregate(static (x,y) => $"{x}, {y}") : string.Empty;

writer.WriteLine(template(generatorMethodName, paramsCall));
}
Expand All @@ -687,7 +687,8 @@ private void WriteRequestGeneratorBody(CodeMethod codeElement, RequestParams req

var urlTemplateParamsProperty = parentClass.GetPropertyOfKind(CodePropertyKind.PathParameters);
var urlTemplateProperty = parentClass.GetPropertyOfKind(CodePropertyKind.UrlTemplate);
var requestAdapterProperty = parentClass.GetPropertyOfKind(CodePropertyKind.RequestAdapter);
var requestAdapterPropertyName = parentClass.GetPropertyOfKind(CodePropertyKind.RequestAdapter)?.Name.ToFirstCharacterLowerCase();
var contextParameterName = codeElement.Parameters.OfKind(CodeParameterKind.Cancellation)?.Name.ToFirstCharacterLowerCase();
writer.WriteLine($"{RequestInfoVarName} := {conventions.AbstractionsHash}.NewRequestInformation()");
writer.WriteLines($"{RequestInfoVarName}.UrlTemplate = {GetPropertyCall(urlTemplateProperty, "\"\"")}",
$"{RequestInfoVarName}.PathParameters = {GetPropertyCall(urlTemplateParamsProperty, "\"\"")}",
Expand All @@ -704,9 +705,9 @@ private void WriteRequestGeneratorBody(CodeMethod codeElement, RequestParams req
WriteCollectionCast(parsableSymbol, bodyParamReference, "cast", writer, false);
bodyParamReference = "cast...";
}
writer.WriteLine($"{RequestInfoVarName}.SetContentFromParsable(m.{requestAdapterProperty.Name.ToFirstCharacterLowerCase()}, \"{codeElement.RequestBodyContentType}\", {bodyParamReference})");
writer.WriteLine($"{RequestInfoVarName}.SetContentFromParsable({contextParameterName}, m.{requestAdapterPropertyName}, \"{codeElement.RequestBodyContentType}\", {bodyParamReference})");
} else
writer.WriteLine($"{RequestInfoVarName}.SetContentFromScalar(m.{requestAdapterProperty.Name.ToFirstCharacterLowerCase()}, \"{codeElement.RequestBodyContentType}\", {bodyParamReference})");
writer.WriteLine($"{RequestInfoVarName}.SetContentFromScalar({contextParameterName}, m.{requestAdapterPropertyName}, \"{codeElement.RequestBodyContentType}\", {bodyParamReference})");
}
if(requestParams.requestConfiguration != null) {
var headers = requestParams.Headers;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -647,11 +647,10 @@ public async Task AddsMethodsOverloads()
await ILanguageRefiner.Refine(new GenerationConfiguration { Language = GenerationLanguage.Go }, root);
var childMethods = builder.Methods;
Assert.DoesNotContain(childMethods, x => x.IsOverload && x.IsOfKind(CodeMethodKind.RequestExecutor)); // no executor overloads
Assert.Contains(childMethods, x => x.IsOverload && x.IsOfKind(CodeMethodKind.RequestGenerator) && x.Parameters.Count() == 1);//body only
Assert.Empty(childMethods.Where(x => x.IsOverload && x.IsOfKind(CodeMethodKind.RequestGenerator))); // no generator overloads
Assert.Contains(childMethods, x => !x.IsOverload && x.IsOfKind(CodeMethodKind.RequestExecutor) && x.Parameters.Count() == 2);// body + query
Assert.Contains(childMethods, x => !x.IsOverload && x.IsOfKind(CodeMethodKind.RequestGenerator) && x.Parameters.Count() == 2);// body + query config
Assert.Equal(3, childMethods.Count());
Assert.Equal(1, childMethods.Count(x => x.IsOverload));
Assert.Contains(childMethods, x => !x.IsOverload && x.IsOfKind(CodeMethodKind.RequestGenerator) && x.Parameters.Count() == 3);// ctx + body + query config
Assert.Equal(2, childMethods.Count());
}
#endregion
}
Original file line number Diff line number Diff line change
Expand Up @@ -877,7 +877,7 @@ public async Task WritesRequestGeneratorBodyForScalar() {
Assert.Contains("if c.Q != nil", result);
Assert.Contains("requestInfo.AddQueryParameters(", result);
Assert.Contains("requestInfo.AddRequestOptions(", result);
Assert.Contains("requestInfo.SetContentFromScalar(m.requestAdapter", result);
Assert.Contains("requestInfo.SetContentFromScalar(ctx, m.requestAdapter", result);
Assert.Contains("return requestInfo, nil", result);
AssertExtensions.CurlyBracesAreClosed(result);
}
Expand Down Expand Up @@ -911,7 +911,7 @@ public async Task WritesRequestGeneratorBodyForParsable() {
Assert.Contains("if c.Q != nil", result);
Assert.Contains("requestInfo.AddQueryParameters(", result);
Assert.Contains("requestInfo.AddRequestOptions(", result);
Assert.Contains("requestInfo.SetContentFromParsable(m.requestAdapter", result);
Assert.Contains("requestInfo.SetContentFromParsable(ctx, m.requestAdapter", result);
Assert.Contains("return requestInfo, nil", result);
AssertExtensions.CurlyBracesAreClosed(result);
}
Expand Down