public virtual void BuildFunction(IdlFunction function, BuilderTargetCollection builderTargets, int indent) { var functionTargets = new BuilderTargetCollection { BuilderTarget.Parameters, BuilderTarget.FunctionBody, }; functionTargets.Parent = builderTargets; for (var i = 0; i < function.Parameters.Count; i++) { var parameter = function.Parameters[i]; this.parameterBuildStrategy.Build(parameter, function, functionTargets, indent + 1); if (i < function.Parameters.Count - 1) { functionTargets[BuilderTarget.Parameters].Append(", "); } } this.BuildFunctionBody(function, functionTargets[BuilderTarget.FunctionBody], indent + 1); if (functionTargets[BuilderTarget.FunctionBody].Length == 0) { functionTargets[BuilderTarget.FunctionBody].Append("throw new System.NotImplementedException();".Indent(indent)); } var signature = $"{this.MapReturnType(function.ReturnType)} {function.Name}({functionTargets[BuilderTarget.Parameters]})"; builderTargets[BuilderTarget.InterfaceSignatures].AppendLine($"{signature};".Indent(indent + 1)); builderTargets[BuilderTarget.Functions].AppendLine($"public virtual {signature}".Indent(indent)); builderTargets[BuilderTarget.Functions].AppendLine("{".Indent(indent)); builderTargets[BuilderTarget.Functions].AppendLine(functionTargets[BuilderTarget.FunctionBody].ToString()); builderTargets[BuilderTarget.Functions].AppendLine("}".Indent(indent)); builderTargets[BuilderTarget.Functions].AppendLine(); }
public void Build(IdlFunctionParameter parameter, IdlFunction function, BuilderTargetCollection functionTargets, int indent) { if (functionTargets.TryGetValue(BuilderTarget.Parameters, out var parameterTarget)) { this.BuildParameterDeclaration(parameter, parameterTarget); } if (functionTargets.TryGetValue(BuilderTarget.FunctionBody, out var bodyTarget)) { this.BuildBodyInstructions(parameter, bodyTarget, indent); } if (functionTargets.TryGetValue(BuilderTarget.EventProperties, out var propertyTarget)) { this.BuildEventProperties(parameter, propertyTarget, indent); } if (functionTargets.TryGetValue(BuilderTarget.EventBody, out var eventBodyTarget)) { this.BuildPropertyAssignment(parameter, eventBodyTarget, indent + 1); } }
public virtual void BuildFunctionBody(IdlFunction function, StringBuilder bodyBuilder, int indent) { // empty }
protected abstract bool IsFunctionAccepted(IdlFunction function);
public override void BuildFunction(IdlFunction function, BuilderTargetCollection builderTargets, int indent) { this.BuildEventRegistration(function, builderTargets, indent + 2); this.BuildEventClass(function, builderTargets, indent - 1); }
protected override bool IsFunctionAccepted(IdlFunction function) { return function.Attribute.TryGetValue("callback", out _) && function.Attribute.TryGetValue("noimpl", out _) == false; }
public override void BuildFunctionBody(IdlFunction function, StringBuilder bodyBuilder, int indent) { var expectsResult = function.ReturnType != "void"; bodyBuilder.AppendLine("this.sampThreadEnforcer.EnforceMainThread();".Indent(indent)); bodyBuilder.AppendLine(); bodyBuilder.AppendLine("var (arguments, elements) = typeConverter.WriteNativeArguments(new (object Value, int Size)[] {".Indent(indent)); for (var i = 0; i < function.Parameters.Count; i++) { var parameter = function.Parameters[i]; var name = this.parameterBuildStrategy.BuildParameterName(parameter.Name); var type = this.parameterBuildStrategy.BuildParameterType(parameter.Type); var size = $"sizeof({type})"; if (type == "string") { var followingParameter = function.Parameters.ElementAtOrDefault(i + 1); if (parameter.Attribute.IsOut() && followingParameter != null && this.parameterBuildStrategy.BuildParameterType(followingParameter.Type) == "int") { var followingParameterName = this.parameterBuildStrategy.BuildParameterName(followingParameter.Name); size = $"{followingParameterName}"; } else { size = $"{name}.Length + 1"; } } bodyBuilder.AppendLine($"({name}, {size}),".Indent(indent + 1)); } bodyBuilder.AppendLine("});".Indent(indent)); bodyBuilder.AppendLine(); bodyBuilder.AppendLine($"var nativeResult = Native.InvokeNative(\"{function.Name}\", \"{BuildNativeInvokeFormat(function.Parameters)}\", arguments);".Indent(indent)); bodyBuilder.AppendLine(); bodyBuilder.AppendLine("var data = typeConverter.ReadNativeArguments(elements);".Indent(indent)); bodyBuilder.AppendLine(); for (var i = 0; i < function.Parameters.Count; i++) { var parameter = function.Parameters[i]; if (parameter.Attribute.IsOut() == false) { continue; } var name = this.parameterBuildStrategy.BuildParameterName(parameter.Name); var type = this.parameterBuildStrategy.BuildParameterType(parameter.Type); bodyBuilder.AppendLine($"{name} = ({type}) data[{i}];".Indent(indent)); } if (expectsResult == false) { return; } bodyBuilder.AppendLine($"var result = ({function.ReturnType}) Convert.ChangeType(nativeResult, typeof({function.ReturnType}));".Indent(indent)); bodyBuilder.AppendLine(); bodyBuilder.Append("return result;".Indent(indent)); }
protected override bool IsFunctionAccepted(IdlFunction function) { return(function.Attribute.TryGetValue("native", out _) && function.Attribute.TryGetValue("noimpl", out _) == false); }