Beispiel #1
0
        public void Build(BuilderTargetCollection builderTargets, IdlNamespace idlNamespace, int indent)
        {
            var namespaceBuilderTargets = new BuilderTargetCollection
            {
                BuilderTarget.InterfaceSignatures,
                BuilderTarget.Delegates,
                BuilderTarget.Functions,
                BuilderTarget.Events,
                BuilderTarget.Types,
                BuilderTarget.Constants
            };

            namespaceBuilderTargets.Parent = builderTargets;

            foreach (var(strategy, element) in idlNamespace.Elements)
            {
                strategy.Build(element, idlNamespace.ConstantPrefixes, namespaceBuilderTargets, indent + 2);
            }

            this.BuildNamespaceConstants(namespaceBuilderTargets, idlNamespace, indent + 1);
            this.BuildNamespaceEventsClass(namespaceBuilderTargets, idlNamespace, indent + 1);
            this.BuildNamespaceNativesInterface(namespaceBuilderTargets, idlNamespace, indent + 1);
            this.BuildNamespaceNativesClass(namespaceBuilderTargets, idlNamespace, indent + 1);

            var namespaceTarget = builderTargets[BuilderTarget.Namespaces];

            namespaceTarget.AppendLine($"namespace Micky5991.Samp.Net.Core.Natives.{idlNamespace.Name.ConvertToPascalCase()}".Indent(indent));
            namespaceTarget.AppendLine("{".Indent(indent));

            namespaceTarget.AppendLine(namespaceBuilderTargets[BuilderTarget.Types].ToString());

            namespaceTarget.AppendLine("}".Indent(indent));
        }
Beispiel #2
0
        private void BuildNamespaceNativesClass(BuilderTargetCollection buildTargets, IdlNamespace idlNamespace, int indent)
        {
            var stringBuilder = buildTargets[BuilderTarget.Types];

            stringBuilder.AppendLine($"public class {idlNamespace.Name.ConvertToPascalCase()}Natives : I{idlNamespace.Name.ConvertToPascalCase()}Natives".Indent(indent));
            stringBuilder.AppendLine("{".Indent(indent));

            // Field
            stringBuilder.AppendLine("private NativeTypeConverter typeConverter;".Indent(indent + 1));
            stringBuilder.AppendLine();

            stringBuilder.AppendLine("private ISampThreadEnforcer sampThreadEnforcer;".Indent(indent + 1));
            stringBuilder.AppendLine();

            stringBuilder.Append(buildTargets[BuilderTarget.Delegates].ToString());

            // Constructor
            stringBuilder.AppendLine($@"public {idlNamespace.Name.ConvertToPascalCase()}Natives(NativeTypeConverter typeConverter, ISampThreadEnforcer sampThreadEnforcer)".Indent(indent + 1));
            stringBuilder.AppendLine("{".Indent(indent + 1));

            stringBuilder.AppendLine("this.typeConverter = typeConverter;".Indent(indent + 2));
            stringBuilder.AppendLine("this.sampThreadEnforcer = sampThreadEnforcer;".Indent(indent + 2));

            stringBuilder.AppendLine("}".Indent(indent + 1));
            stringBuilder.AppendLine();

            // Body
            stringBuilder.Append(buildTargets[BuilderTarget.Functions].ToString());

            stringBuilder.AppendLine("}".Indent(indent));
            stringBuilder.AppendLine();
        }
Beispiel #3
0
        private void BuildNamespaceConstants(BuilderTargetCollection buildTargets, IdlNamespace idlNamespace, int indent)
        {
            var stringBuilder = buildTargets[BuilderTarget.Types];

            stringBuilder.AppendLine($"public static class {idlNamespace.Name.ConvertToPascalCase()}Constants".Indent(indent));
            stringBuilder.AppendLine("{".Indent(indent));

            stringBuilder.AppendLine(buildTargets[BuilderTarget.Constants].ToString());

            stringBuilder.AppendLine("}".Indent(indent));
        }
Beispiel #4
0
        private void BuildNamespaceNativesInterface(BuilderTargetCollection buildTargets, IdlNamespace idlNamespace, int indent)
        {
            var stringBuilder = buildTargets[BuilderTarget.Types];

            stringBuilder.AppendLine($"public interface I{idlNamespace.Name.ConvertToPascalCase()}Natives : INatives".Indent(indent));
            stringBuilder.AppendLine("{".Indent(indent));

            stringBuilder.Append(buildTargets[BuilderTarget.InterfaceSignatures].ToString());

            stringBuilder.AppendLine("}".Indent(indent));
            stringBuilder.AppendLine();
        }
Beispiel #5
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();
        }
Beispiel #6
0
        private void BuildNamespaceEventsClass(BuilderTargetCollection buildTargets, IdlNamespace idlNamespace, int indent)
        {
            var stringBuilder = buildTargets[BuilderTarget.Types];

            stringBuilder.AppendLine($"public class {idlNamespace.Name.ConvertToPascalCase()}EventCollectionFactory : Micky5991.Samp.Net.Core.Interfaces.Events.INativeEventCollectionFactory".Indent(indent));
            stringBuilder.AppendLine("{".Indent(indent));

            // Constructor
            stringBuilder.AppendLine($@"public Micky5991.Samp.Net.Core.Interfaces.Events.INativeEventCollection Build()".Indent(indent + 1));
            stringBuilder.AppendLine("{".Indent(indent + 1));

            stringBuilder.AppendLine("return new Micky5991.Samp.Net.Core.Interop.Events.NativeEventCollection {".Indent(indent + 2));

            stringBuilder.Append(buildTargets[BuilderTarget.Events].ToString());

            stringBuilder.AppendLine("};".Indent(indent + 2));
            stringBuilder.AppendLine("}".Indent(indent + 1));

            stringBuilder.AppendLine("}".Indent(indent));
            stringBuilder.AppendLine();
        }
Beispiel #7
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);
            }
        }
Beispiel #8
0
 public virtual void Build(IdlNamespaceElement element, IList <string> constantPrefixes, BuilderTargetCollection builderTargets, int indent)
 {
     this.BuildFunction((IdlFunction)element, builderTargets, indent);
 }
Beispiel #9
0
 public override void BuildFunction(IdlFunction function, BuilderTargetCollection builderTargets, int indent)
 {
     this.BuildEventRegistration(function, builderTargets, indent + 2);
     this.BuildEventClass(function, builderTargets, indent - 1);
 }