Ejemplo n.º 1
0
        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();
        }
Ejemplo n.º 2
0
        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);
            }
        }
Ejemplo n.º 3
0
 public virtual void BuildFunctionBody(IdlFunction function, StringBuilder bodyBuilder, int indent)
 {
     // empty
 }
Ejemplo n.º 4
0
 protected abstract bool IsFunctionAccepted(IdlFunction function);
Ejemplo n.º 5
0
 public override void BuildFunction(IdlFunction function, BuilderTargetCollection builderTargets, int indent)
 {
     this.BuildEventRegistration(function, builderTargets, indent + 2);
     this.BuildEventClass(function, builderTargets, indent - 1);
 }
Ejemplo n.º 6
0
 protected override bool IsFunctionAccepted(IdlFunction function)
 {
     return function.Attribute.TryGetValue("callback", out _) && function.Attribute.TryGetValue("noimpl", out _) == false;
 }
Ejemplo n.º 7
0
        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));
        }
Ejemplo n.º 8
0
 protected override bool IsFunctionAccepted(IdlFunction function)
 {
     return(function.Attribute.TryGetValue("native", out _) && function.Attribute.TryGetValue("noimpl", out _) == false);
 }