public object RecreateInterfaceProxy(SerializationInfo info, StreamingContext context)
		{
			object proxy = null;

			GeneratorContext genContext = new GeneratorContext();

			foreach(object mixin in _mixins)
			{
				genContext.AddMixinInstance(mixin);
			}

			InterfaceProxyGenerator gen = new InterfaceProxyGenerator( _scope, genContext );

			object target = info.GetValue("__target", typeof(object));

			if (_mixins.Length == 0)
			{
				Type proxy_type = gen.GenerateCode( _interfaces, target.GetType());

				proxy = Activator.CreateInstance( proxy_type, new object[] { _interceptor, target } );
			}
			else
			{
				Type proxy_type = gen.GenerateCode( _interfaces, target.GetType() );

				proxy = Activator.CreateInstance( proxy_type, new object[] { _interceptor, target, genContext.MixinsAsArray() } );
			}

			return proxy;
		}
		protected override void GeneratePropertySet (GeneratorContext ctx, CodeExpression var, PropertyDescriptor prop)
		{
			if (prop.Name == "Alpha" && Alpha == -1)
				return;
			else
				base.GeneratePropertySet (ctx, var, prop);
		}
Exemple #3
0
		public void TwoMixins()
		{
			GeneratorContext context = new GeneratorContext();
			SimpleMixin mixin1 = new SimpleMixin();
			OtherMixin mixin2 = new OtherMixin();

			context.AddMixinInstance( mixin1 );
			context.AddMixinInstance( mixin2 );

			AssertInvocationInterceptor interceptor = new AssertInvocationInterceptor();

			object proxy = _generator.CreateCustomClassProxy( 
				typeof(SimpleClass), interceptor, context );
			
			Assert.IsFalse( interceptor.Invoked );

			Assert.IsNotNull(proxy);
			Assert.IsTrue( typeof(SimpleClass).IsAssignableFrom( proxy.GetType() ) );

			ISimpleMixin mixin = proxy as ISimpleMixin;
			Assert.IsNotNull(mixin);
			Assert.AreEqual(1, mixin.DoSomething());

			Assert.IsTrue( interceptor.Invoked );
			Assert.AreSame( proxy, interceptor.proxy );
			Assert.AreSame( mixin1, interceptor.mixin );

			IOtherMixin other = proxy as IOtherMixin;
			Assert.IsNotNull(other);
			Assert.AreEqual(3, other.Sum(1,2));
			Assert.IsTrue( interceptor.Invoked );
			Assert.AreSame( proxy, interceptor.proxy );
			Assert.AreSame( mixin2, interceptor.mixin );

		}
Exemple #4
0
		internal protected override CodeExpression GenerateObjectCreation (GeneratorContext ctx)
		{
			return new CodeObjectCreateExpression (
				ClassDescriptor.WrappedTypeName.ToGlobalTypeRef (), 
				new CodePrimitiveExpression (null), 
				new CodePrimitiveExpression (null)
			);
		}
        public void Run(ServiceDefinition definition)
        {
            var context = new GeneratorContext();
            context.Definition = definition;
            context.Root = definition.Root;

            this.WriteEverything(context);

            text.Flush();
        }
Exemple #6
0
		internal protected override CodeExpression GenerateObjectCreation (GeneratorContext ctx)
		{
			if (textCombo) {
				return new CodeMethodInvokeExpression (
					new CodeTypeReferenceExpression (new CodeTypeReference ("Gtk.ComboBox", CodeTypeReferenceOptions.GlobalReference)),
					"NewText"
				);
			} else
				return base.GenerateObjectCreation (ctx);
		}
Exemple #7
0
 protected internal override CodeExpression GenerateObjectCreation(GeneratorContext ctx)
 {
     if (IsTextCombo) {
         return new CodeMethodInvokeExpression (
             new CodeTypeReferenceExpression ("Gtk.ComboBoxEntry"),
             "NewText"
         );
     } else
         return base.GenerateObjectCreation (ctx);
 }
        public void CreateCustomProxy()
        {
            GeneratorContext context = new GeneratorContext(
                new EnhanceTypeDelegate(EnhanceType),
                new ScreenInterfacesDelegate(ScreenInterfaces));

            object proxy = m_generator.CreateCustomProxy(
                typeof (IMyInterface),
                new StandardInvocationHandler(new MyInterfaceImpl()), context);

            Assert.IsTrue( m_enhanceInvoked );
            Assert.IsTrue( m_screenInvoked );
        }
		protected override void GeneratePropertySet (GeneratorContext ctx, CodeExpression var, PropertyDescriptor prop)
		{
			if (prop.Name == "Group") {
				CodeExpression groupExp = GroupManager.GenerateGroupExpression (ctx, (Gtk.Widget) Wrapped);
				ctx.Statements.Add (
					new CodeAssignStatement (
						new CodePropertyReferenceExpression (var, "Group"),
						groupExp)
				);
			}
			else
				base.GeneratePropertySet (ctx, var, prop);
		}
Exemple #10
0
 public static void Main(string[] args)
 {
     try
     {
         List<object> instances = new List<object>();
         GeneratorContext context = new GeneratorContext();
         Generator generator = new Generator(instances, context);
         generator.Execute();
     }
     catch (Exception ex)
     {
         Console.WriteLine(ex);
     }
 }
Exemple #11
0
        public void GenerateBuildCode(GeneratorContext ctx, CodeVariableReferenceExpression uiManager)
        {
            StringBuilder sb = new StringBuilder ();
            sb.Append ("<ui>");
            GenerateUiString (sb);
            sb.Append ("</ui>");

            CodeMethodInvokeExpression exp = new CodeMethodInvokeExpression (
                uiManager,
                "AddUiFromString",
                new CodePrimitiveExpression (sb.ToString ())
            );
            ctx.Statements.Add (exp);
        }
Exemple #12
0
		protected override void GenerateChildBuildCode (GeneratorContext ctx, CodeExpression parentVar, Widget wrapper)
		{
			if (wrapper.Wrapped == expander.LabelWidget) {
				CodeExpression var = ctx.GenerateNewInstanceCode (wrapper);
				CodeAssignStatement assign = new CodeAssignStatement (
					new CodePropertyReferenceExpression (
						parentVar,
						"LabelWidget"
					),
					var
				);
				ctx.Statements.Add (assign);
			} else
				base.GenerateChildBuildCode (ctx, parentVar, wrapper);
		}
Exemple #13
0
		static void Main(string[] args)
		{
			AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);

			MainOptions opts = new MainOptions();
			opts.ProcessArgs(args);

			if (args.Length == 0 || args[0].StartsWith("-"))
			{
				ShowUsage();
			}

			Console.WriteLine("Processing {0} {1}", args[0], opts.verbose);

			IGenerator generator = null;

			if (args[0] == "controller")
			{
				generator = new NewController();
			}
			else if (args[0] == "project")
			{
				generator = new NewProject();
			}
			else
			{
				Console.Error.WriteLine("Not supported");
				return;
			}

			Configure(generator, args);

			string workingDir = AppDomain.CurrentDomain.BaseDirectory;
			string templateDir = @"C:\dev\DotNet\castle\svn\trunk\MonoRail\NewGenerator\GeneratorTemplates\";

			GeneratorContext context = new GeneratorContext(workingDir, templateDir);

			ITemplateEngine engine = new NVelocityTemplateEngine(templateDir);

			if (engine is ISupportInitialize)
			{
				((ISupportInitialize)engine).BeginInit();
			}

			generator.Generate(context, new DefaultGeneratorService(context, engine));
		}
		protected override void GenerateChildBuildCode (GeneratorContext ctx, CodeExpression parentVar, Widget wrapper)
		{
			if (!HasLabel) {
				// CheckButton generates a label by default. Remove it if it is not required.
				ctx.Statements.Add (
					new CodeMethodInvokeExpression (
						parentVar,
						"Remove",
						new CodePropertyReferenceExpression (
							parentVar,
							"Child"
						)
					)
				);
			}
			base.GenerateChildBuildCode (ctx, parentVar, wrapper);
		}
		internal protected override void GenerateBuildCode (GeneratorContext ctx, CodeExpression var)
		{
			if (Text.Length > 0) {
				ctx.Statements.Add (
					new CodeAssignStatement (
						new CodePropertyReferenceExpression (
							new CodePropertyReferenceExpression (
								var,
								"Buffer"
							),
							"Text"
						),
						new CodePrimitiveExpression (Text)
					)
				);
			}
			base.GenerateBuildCode (ctx, var);
		}
Exemple #16
0
		internal protected override void GeneratePostBuildCode (GeneratorContext ctx, CodeExpression var)
		{
			if (mnem != null) {
				Widget targetWidget = GetTopLevel ().FindChild (mnem);
				if (targetWidget != null) {
					CodeExpression memVar = ctx.WidgetMap.GetWidgetExp (targetWidget);
					if (memVar != null) {
						ctx.Statements.Add (
							new CodeAssignStatement (
								new CodePropertyReferenceExpression (
									var, 
									"MnemonicWidget"
								),
								memVar
							)
						);
					}
				}
			}
			base.GeneratePostBuildCode (ctx, var);
		}
		public void Execute(object Application, int hwndOwner, ref object[] ContextParams, ref object[] CustomParams,
		                    ref wizardResult retval)
		{
			DTE dte = (DTE) Application;

			AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve);
			
			string workingDir =  (string) ContextParams[3];
			string templateDir = @"C:\dev\DotNet\castle\svn\trunk\MonoRail\NewGenerator\GeneratorTemplates\";

			context = new GeneratorContext(workingDir, templateDir);

			//Using NVelocityTemplateEngine. Since we must resolve the lib dir...
			templateEngine = new NVelocityTemplateEngine(templateDir);
			((ISupportInitialize) templateEngine).BeginInit();

			NewProject generator = CreateNewProject(ContextParams);

			generator.Generate(context, this);

			dte.Solution.Open(generator.SolutionFilePath);
		}
        public CodeExpression GenerateGroupExpression(GeneratorContext ctx, Action action)
        {
            // Returns and expression that represents the group to which the radio belongs.
            // This expression can be an empty SList, if this is the first radio of the
            // group that has been generated, or an SList taken from previously generated
            // radios from the same group.

            string group = actions [action] as string;
            if (group == null)
                return new CodePrimitiveExpression (null);

            CodeExpression var = null;

            foreach (Action a in FindActionsInGroup (group)) {
                if (a == action)
                    continue;
                var = ctx.WidgetMap.GetWidgetExp (a);
                if (var != null)
                    break;
            }

            if (var == null) {
                return new CodeObjectCreateExpression (
                    "GLib.SList",
                    new CodePropertyReferenceExpression (
                        new CodeTypeReferenceExpression (typeof(IntPtr)),
                        "Zero"
                    )
                );
            } else {
                return new CodePropertyReferenceExpression (
                    var,
                    "Group"
                );
            }
        }
Exemple #19
0
		internal protected override void GenerateBuildCode (GeneratorContext ctx, CodeExpression var)
		{
			if (textCombo && Items != null && Items.Length > 0) {
				foreach (string str in Items) {
					ctx.Statements.Add (new CodeMethodInvokeExpression (
						var,
						"AppendText",
						ctx.GenerateValue (str, typeof(string), true)
					));
				}
			}
			
			base.GenerateBuildCode (ctx, var);
		}
Exemple #20
0
 /// <summary>
 /// Emit the start of an enum declaration for 'oneof' groups, including the 0/None element
 /// </summary>
 protected override void WriteOneOfEnumHeader(GeneratorContext ctx, OneofDescriptorProto obj, ref object state)
 {
     ctx.WriteLine().WriteLine($"public enum {ctx.NameNormalizer.GetName(obj)}{OneOfEnumSuffixEnum}").WriteLine("{").Indent().WriteLine("None = 0,");
 }
 public CSharpMnemonicsTableGenerator(GeneratorContext generatorContext)
 {
     idConverter           = CSharpIdentifierConverter.Create();
     this.generatorContext = generatorContext;
 }
Exemple #22
0
        public virtual Type CreateCustomClassProxy(Type theClass, GeneratorContext context)
        {
            ClassProxyGenerator generator = new ClassProxyGenerator(_scope, context);

            return(generator.GenerateCustomCode(theClass, null));
        }
Exemple #23
0
		protected override void GeneratePropertySet (GeneratorContext ctx, CodeExpression var, PropertyDescriptor prop)
		{
			if (prop.Name != "MnemonicWidget")
				base.GeneratePropertySet (ctx, var, prop);
		}
Exemple #24
0
        /// <summary>
        /// Write a field
        /// </summary>
        protected override void WriteField(GeneratorContext ctx, FieldDescriptorProto obj, ref object state, OneOfStub[] oneOfs)
        {
            var name = ctx.NameNormalizer.GetName(obj);
            var tw   = ctx.Write($@"[global::ProtoBuf.ProtoMember({obj.Number}");

            if (name != obj.Name)
            {
                tw.Write($@", Name = @""{obj.Name}""");
            }
            var options = obj.Options?.GetOptions();

            if (options?.AsReference == true)
            {
                tw.Write($@", AsReference = true");
            }
            if (options?.DynamicType == true)
            {
                tw.Write($@", DynamicType = true");
            }

            bool isOptional = obj.label == FieldDescriptorProto.Label.LabelOptional;
            bool isRepeated = obj.label == FieldDescriptorProto.Label.LabelRepeated;

            OneOfStub oneOf = obj.ShouldSerializeOneofIndex() ? oneOfs?[obj.OneofIndex] : null;

            if (oneOf != null && !ctx.OneOfEnums && oneOf.CountTotal == 1)
            {
                oneOf = null; // not really a one-of, then!
            }
            bool explicitValues = isOptional && oneOf == null && ctx.Syntax == FileDescriptorProto.SyntaxProto2 &&
                                  obj.type != FieldDescriptorProto.Type.TypeMessage &&
                                  obj.type != FieldDescriptorProto.Type.TypeGroup;

            bool   suppressDefaultAttribute = !isOptional;
            var    typeName     = GetTypeName(ctx, obj, out var dataFormat, out var isMap);
            string defaultValue = GetDefaultValue(ctx, obj, typeName);


            if (!string.IsNullOrWhiteSpace(dataFormat))
            {
                tw.Write($", DataFormat = global::ProtoBuf.DataFormat.{dataFormat}");
            }
            if (obj.IsPacked(ctx.Syntax))
            {
                tw.Write($", IsPacked = true");
            }
            if (obj.label == FieldDescriptorProto.Label.LabelRequired)
            {
                tw.Write($", IsRequired = true");
            }
            tw.WriteLine(")]");
            if (!isRepeated && !string.IsNullOrWhiteSpace(defaultValue) && !suppressDefaultAttribute)
            {
                ctx.WriteLine($"[global::System.ComponentModel.DefaultValue({defaultValue})]");
            }
            WriteOptions(ctx, obj.Options);
            if (isRepeated)
            {
                var mapMsgType = isMap ? ctx.TryFind <DescriptorProto>(obj.TypeName) : null;
                if (mapMsgType != null)
                {
                    var keyTypeName = GetTypeName(ctx, mapMsgType.Fields.Single(x => x.Number == 1),
                                                  out var keyDataFormat, out var _);
                    var valueTypeName = GetTypeName(ctx, mapMsgType.Fields.Single(x => x.Number == 2),
                                                    out var valueDataFormat, out var _);

                    bool first = true;
                    tw = ctx.Write($"[global::ProtoBuf.ProtoMap");
                    if (!string.IsNullOrWhiteSpace(keyDataFormat))
                    {
                        tw.Write($"{(first ? "(" : ", ")}KeyFormat = global::ProtoBuf.DataFormat.{keyDataFormat}");
                        first = false;
                    }
                    if (!string.IsNullOrWhiteSpace(valueDataFormat))
                    {
                        tw.Write($"{(first ? "(" : ", ")}ValueFormat = global::ProtoBuf.DataFormat.{valueDataFormat}");
                        first = false;
                    }
                    tw.WriteLine(first ? "]" : ")]");
                    if (ctx.Supports(CSharp6))
                    {
                        ctx.WriteLine($"{GetAccess(GetAccess(obj))} global::System.Collections.Generic.Dictionary<{keyTypeName}, {valueTypeName}> {Escape(name)} {{ get; }} = new global::System.Collections.Generic.Dictionary<{keyTypeName}, {valueTypeName}>();");
                    }
                    else
                    {
                        ctx.WriteLine($"{GetAccess(GetAccess(obj))} global::System.Collections.Generic.Dictionary<{keyTypeName}, {valueTypeName}> {Escape(name)} {{ get; private set; }}");
                    }
                }
                else if (UseArray(obj))
                {
                    ctx.WriteLine($"{GetAccess(GetAccess(obj))} {typeName}[] {Escape(name)} {{ get; set; }}");
                }
                else if (ctx.Supports(CSharp6))
                {
                    ctx.WriteLine($"{GetAccess(GetAccess(obj))} global::System.Collections.Generic.List<{typeName}> {Escape(name)} {{ get; }} = new global::System.Collections.Generic.List<{typeName}>();");
                }
                else
                {
                    ctx.WriteLine($"{GetAccess(GetAccess(obj))} global::System.Collections.Generic.List<{typeName}> {Escape(name)} {{ get; private set; }}");
                }
            }
            else if (oneOf != null)
            {
                var defValue  = string.IsNullOrWhiteSpace(defaultValue) ? (ctx.Supports(CSharp7_1) ? "default" : $"default({typeName})") : defaultValue;
                var fieldName = GetOneOfFieldName(oneOf.OneOf);
                var storage   = oneOf.GetStorage(obj.type, obj.TypeName);
                ctx.WriteLine($"{GetAccess(GetAccess(obj))} {typeName} {Escape(name)}").WriteLine("{").Indent();

                switch (obj.type)
                {
                case FieldDescriptorProto.Type.TypeMessage:
                case FieldDescriptorProto.Type.TypeGroup:
                case FieldDescriptorProto.Type.TypeEnum:
                case FieldDescriptorProto.Type.TypeBytes:
                case FieldDescriptorProto.Type.TypeString:
                    ctx.WriteLine($"get {{ return {fieldName}.Is({obj.Number}) ? (({typeName}){fieldName}.{storage}) : {defValue}; }}");
                    break;

                default:
                    ctx.WriteLine($"get {{ return {fieldName}.Is({obj.Number}) ? {fieldName}.{storage} : {defValue}; }}");
                    break;
                }
                var unionType = oneOf.GetUnionType();
                var cast      = obj.type == FieldDescriptorProto.Type.TypeEnum ? "(int)" : "";
                ctx.WriteLine($"set {{ {fieldName} = new global::ProtoBuf.{unionType}({obj.Number}, {cast}value); }}")
                .Outdent().WriteLine("}");

                if (ctx.Supports(CSharp6))
                {
                    ctx.WriteLine($"{GetAccess(GetAccess(obj))} bool ShouldSerialize{name}() => {fieldName}.Is({obj.Number});")
                    .WriteLine($"{GetAccess(GetAccess(obj))} void Reset{name}() => global::ProtoBuf.{unionType}.Reset(ref {fieldName}, {obj.Number});");
                }
                else
                {
                    ctx.WriteLine($"{GetAccess(GetAccess(obj))} bool ShouldSerialize{name}()").WriteLine("{").Indent()
                    .WriteLine($"return {fieldName}.Is({obj.Number});").Outdent().WriteLine("}")
                    .WriteLine($"{GetAccess(GetAccess(obj))} void Reset{name}()").WriteLine("{").Indent()
                    .WriteLine($"global::ProtoBuf.{unionType}.Reset(ref {fieldName}, {obj.Number});").Outdent().WriteLine("}");
                }

                if (oneOf.IsFirst())
                {
                    ctx.WriteLine().WriteLine($"private global::ProtoBuf.{unionType} {fieldName};");
                }
            }
            else if (explicitValues)
            {
                string fieldName = FieldPrefix + name, fieldType;
                bool   isRef = false;
                switch (obj.type)
                {
                case FieldDescriptorProto.Type.TypeString:
                case FieldDescriptorProto.Type.TypeBytes:
                    fieldType = typeName;
                    isRef     = true;
                    break;

                default:
                    fieldType = typeName + "?";
                    break;
                }
                ctx.WriteLine($"{GetAccess(GetAccess(obj))} {typeName} {Escape(name)}").WriteLine("{").Indent();
                tw = ctx.Write($"get {{ return {fieldName}");
                if (!string.IsNullOrWhiteSpace(defaultValue))
                {
                    tw.Write(" ?? ");
                    tw.Write(defaultValue);
                }
                else if (!isRef)
                {
                    tw.Write(".GetValueOrDefault()");
                }
                tw.WriteLine("; }");
                ctx.WriteLine($"set {{ {fieldName} = value; }}")
                .Outdent().WriteLine("}");
                if (ctx.Supports(CSharp6))
                {
                    ctx.WriteLine($"{GetAccess(GetAccess(obj))} bool ShouldSerialize{name}() => {fieldName} != null;")
                    .WriteLine($"{GetAccess(GetAccess(obj))} void Reset{name}() => {fieldName} = null;");
                }
                else
                {
                    ctx.WriteLine($"{GetAccess(GetAccess(obj))} bool ShouldSerialize{name}()").WriteLine("{").Indent()
                    .WriteLine($"return {fieldName} != null;").Outdent().WriteLine("}")
                    .WriteLine($"{GetAccess(GetAccess(obj))} void Reset{name}()").WriteLine("{").Indent()
                    .WriteLine($"{fieldName} = null;").Outdent().WriteLine("}");
                }
                ctx.WriteLine($"private {fieldType} {fieldName};");
            }
            else
            {
                tw = ctx.Write($"{GetAccess(GetAccess(obj))} {typeName} {Escape(name)} {{ get; set; }}");
                if (!string.IsNullOrWhiteSpace(defaultValue) && ctx.Supports(CSharp6))
                {
                    tw.Write($" = {defaultValue};");
                }
                tw.WriteLine();
            }
            ctx.WriteLine();
        }
 public RustInstructionOpCountsGenerator(GeneratorContext generatorContext)
 {
     idConverter           = RustIdentifierConverter.Create();
     this.generatorContext = generatorContext;
 }
Exemple #26
0
        /// <summary>
        /// Emit a field-based entry for a 'oneof' groups's enum
        /// </summary>
        protected override void WriteOneOfEnumValue(GeneratorContext ctx, FieldDescriptorProto field, ref object state)
        {
            var name = ctx.NameNormalizer.GetName(field);

            ctx.WriteLine($"{Escape(name)} = {field.Number}");
        }
Exemple #27
0
 /// <summary>
 /// End a message
 /// </summary>
 protected override void WriteMessageFooter(GeneratorContext ctx, DescriptorProto message, ref object state)
 {
     ctx.Outdent().WriteLine("End Class").WriteLine();
 }
Exemple #28
0
 /// <summary>
 /// Emit the end of an enum declaration for 'oneof' groups
 /// </summary>
 protected override void WriteOneOfEnumFooter(GeneratorContext ctx, OneofDescriptorProto oneof, ref object state)
 {
     ctx.Outdent().WriteLine("End Enum").WriteLine();
 }
Exemple #29
0
 /// <summary>
 /// Emit the start of an enum declaration for 'oneof' groups, including the 0/None element
 /// </summary>
 protected override void WriteOneOfEnumHeader(GeneratorContext ctx, OneofDescriptorProto oneof, ref object state)
 {
     ctx.WriteLine($"Public Enum {Escape(ctx.NameNormalizer.GetName(oneof))}{OneOfEnumSuffixEnum}").Indent().WriteLine("None = 0");
 }
Exemple #30
0
        /// <summary>
        /// End an enum
        /// </summary>

        protected override void WriteEnumFooter(GeneratorContext ctx, EnumDescriptorProto @enum, ref object state)
        {
            ctx.Outdent().WriteLine("End Enum").WriteLine();
        }
        protected override void WriteFile(GeneratorContext ctx, FileDescriptorProto obj)
        {
            var file = ctx.File;

            var ast = new ProtoFile
            {
                Filename    = file.Name,
                PackageName = file.Package,
                CsNamespace = file.Options?.CsharpNamespace ?? file.Package,
                Messages    = file
                              .MessageTypes
                              .ToArray()
                              .Select(mt => new ProtoMessage
                {
                    Name   = mt.Name,
                    Fields = mt.Fields.Select(f => new ProtoField()
                    {
                        TypeName   = f.TypeName,
                        Name       = f.Name,
                        Number     = f.Number,
                        IsRepeated = f.label == FieldDescriptorProto.Label.LabelRepeated,
                        OneOfIndex = f.OneofIndex,
                        Type       = f.type,
                        Object     = ctx.TryFind <DescriptorProto>(f.TypeName),
                    }).ToArray()
                })
                              .ToArray(),
                Services = file
                           .Services
                           .ToArray()
                           .Select(
                    s => new ProtoService
                {
                    Name    = s.Name,
                    Methods = s.Methods.ToArray()
                              .Select(
                        (m, i) => new ProtoMethod
                    {
                        Index         = i,
                        Name          = m.Name,
                        InputNameRaw  = RemovePackageName(m.InputType),
                        OutputNameRaw = RemovePackageName(m.OutputType),
                        InputObject   = ctx.TryFind <DescriptorProto>(m.InputType),
                        OutputObject  = ctx.TryFind <DescriptorProto>(m.OutputType),
                    }
                        )
                              .ToArray()
                }
                    )
                           .ToArray()
            };

            Handlebars.RegisterHelper("StringEquality", (output, options, context, arguments) =>
            {
                if (arguments.Length != 2)
                {
                    throw new HandlebarsException("{{#StringEquality}} helper must have exactly two arguments");
                }

                var left  = arguments.At <string>(0);
                var right = arguments[1] as string;
                if (left == right)
                {
                    options.Template(output, context);
                }
                else
                {
                    options.Inverse(output, context);
                }
            });

            var f = Handlebars.Compile(_template);

            var result = f(ast);

            ctx.WriteLine(result);
Exemple #32
0
        private string GetTypeName(GeneratorContext ctx, FieldDescriptorProto field, out string dataFormat, out bool isMap)
        {
            dataFormat = "";
            isMap      = false;
            switch (field.type)
            {
            case FieldDescriptorProto.Type.TypeDouble:
                return("double");

            case FieldDescriptorProto.Type.TypeFloat:
                return("float");

            case FieldDescriptorProto.Type.TypeBool:
                return("bool");

            case FieldDescriptorProto.Type.TypeString:
                return("string");

            case FieldDescriptorProto.Type.TypeSint32:
                dataFormat = nameof(DataFormat.ZigZag);
                return("int");

            case FieldDescriptorProto.Type.TypeInt32:
                return("int");

            case FieldDescriptorProto.Type.TypeSfixed32:
                dataFormat = nameof(DataFormat.FixedSize);
                return("int");

            case FieldDescriptorProto.Type.TypeSint64:
                dataFormat = nameof(DataFormat.ZigZag);
                return("long");

            case FieldDescriptorProto.Type.TypeInt64:
                return("long");

            case FieldDescriptorProto.Type.TypeSfixed64:
                dataFormat = nameof(DataFormat.FixedSize);
                return("long");

            case FieldDescriptorProto.Type.TypeFixed32:
                dataFormat = nameof(DataFormat.FixedSize);
                return("uint");

            case FieldDescriptorProto.Type.TypeUint32:
                return("uint");

            case FieldDescriptorProto.Type.TypeFixed64:
                dataFormat = nameof(DataFormat.FixedSize);
                return("ulong");

            case FieldDescriptorProto.Type.TypeUint64:
                return("ulong");

            case FieldDescriptorProto.Type.TypeBytes:
                return("byte[]");

            case FieldDescriptorProto.Type.TypeEnum:
                switch (field.TypeName)
                {
                case ".bcl.DateTime.DateTimeKind":
                    return("global::System.DateTimeKind");
                }
                var enumType = ctx.TryFind <EnumDescriptorProto>(field.TypeName);
                return(MakeRelativeName(field, enumType, ctx.NameNormalizer));

            case FieldDescriptorProto.Type.TypeGroup:
            case FieldDescriptorProto.Type.TypeMessage:
                switch (field.TypeName)
                {
                case WellKnownTypeTimestamp:
                    dataFormat = "WellKnown";
                    return("global::System.DateTime?");

                case WellKnownTypeDuration:
                    dataFormat = "WellKnown";
                    return("global::System.TimeSpan?");

                case ".bcl.NetObjectProxy":
                    return("object");

                case ".bcl.DateTime":
                    return("global::System.DateTime?");

                case ".bcl.TimeSpan":
                    return("global::System.TimeSpan?");

                case ".bcl.Decimal":
                    return("decimal?");

                case ".bcl.Guid":
                    return("global::System.Guid?");
                }
                var msgType = ctx.TryFind <DescriptorProto>(field.TypeName);
                if (field.type == FieldDescriptorProto.Type.TypeGroup)
                {
                    dataFormat = nameof(DataFormat.Group);
                }
                isMap = msgType?.Options?.MapEntry ?? false;
                return(MakeRelativeName(field, msgType, ctx.NameNormalizer));

            default:
                return(field.TypeName);
            }
        }
Exemple #33
0
		public void MixinForInterfaces()
		{
			GeneratorContext context = new GeneratorContext();
			SimpleMixin mixin_instance = new SimpleMixin();
			context.AddMixinInstance( mixin_instance );

			AssertInvocationInterceptor interceptor = new AssertInvocationInterceptor();

			MyInterfaceImpl target = new MyInterfaceImpl();
			
			object proxy = _generator.CreateCustomProxy( 
				typeof(IMyInterface), interceptor, target, context );
			
			Assert.IsNotNull(proxy);
			Assert.IsTrue( typeof(IMyInterface).IsAssignableFrom( proxy.GetType() ) );

			Assert.IsFalse( interceptor.Invoked );

			ISimpleMixin mixin = proxy as ISimpleMixin;
			Assert.IsNotNull(mixin);
			Assert.AreEqual(1, mixin.DoSomething());

			Assert.IsTrue( interceptor.Invoked );
			Assert.AreSame( proxy, interceptor.proxy );
			Assert.AreSame( mixin_instance, interceptor.mixin );
		}
Exemple #34
0
 public RustTableGen(GeneratorContext generatorContext)
     : base(generatorContext.Types)
 {
     this.generatorContext = generatorContext;
     idConverter           = RustIdentifierConverter.Create();
 }
Exemple #35
0
		internal protected override CodeExpression GenerateObjectCreation (GeneratorContext ctx)
		{
			CodeObjectCreateExpression exp = new CodeObjectCreateExpression ();
			
			PropertyDescriptor prop = (PropertyDescriptor) ClassDescriptor ["Name"];
			exp.Parameters.Add (ctx.GenerateValue (prop.GetValue (Wrapped), prop.RuntimePropertyType));
			
			prop = (PropertyDescriptor) ClassDescriptor ["Label"];
			string lab = (string) prop.GetValue (Wrapped);
			if (lab == "") lab = null;
			exp.Parameters.Add (ctx.GenerateValue (lab, prop.RuntimePropertyType, prop.Translatable));
			
			prop = (PropertyDescriptor) ClassDescriptor ["Tooltip"];
			exp.Parameters.Add (ctx.GenerateValue (prop.GetValue (Wrapped), prop.RuntimePropertyType, prop.Translatable));
			
			prop = (PropertyDescriptor) ClassDescriptor ["StockId"];
			exp.Parameters.Add (ctx.GenerateValue (prop.GetValue (Wrapped), prop.RuntimePropertyType, prop.Translatable));
			
			if (type == ActionType.Action)
				exp.CreateType = new CodeTypeReference ("Gtk.Action", CodeTypeReferenceOptions.GlobalReference);
			else if (type == ActionType.Toggle)
				exp.CreateType = new CodeTypeReference ("Gtk.ToggleAction", CodeTypeReferenceOptions.GlobalReference);
			else {
				exp.CreateType = new CodeTypeReference ("Gtk.RadioAction", CodeTypeReferenceOptions.GlobalReference);
				prop = (PropertyDescriptor) ClassDescriptor ["Value"];
				exp.Parameters.Add (ctx.GenerateValue (prop.GetValue (Wrapped), typeof(int)));
			}
			return exp;
		}
        private void WriteMethod(GeneratorContext context, ApiGroup apiGroup, int indent)
        {
            foreach (var method in apiGroup.Methods)
            {
                var        returnType     = "void";
                ReturnType returnTypeType = null;
                if (method.ReturnType != null)
                {
                    returnTypeType = context.Definition.FindReturnType(method.ReturnType, apiGroup.Name);
                    if (returnTypeType != null)
                    {
                        returnType = this.GetPropertyName(returnTypeType.ClassName, returnTypeType.Name);
                        if (method.IsValueType)
                        {
                            returnType = returnType.ToLower();
                        }
                        else
                        {
                            returnType = returnTypeType.ApiGroup + "." + returnType;
                        }
                    }
                }

                string     postReturnType     = null;
                ReturnType postReturnTypeType = null;
                if (method.PostReturnType != null)
                {
                    postReturnTypeType = context.Definition.FindReturnType(method.PostReturnType, apiGroup.Name);
                    if (postReturnTypeType != null)
                    {
                        postReturnType = this.GetPropertyName(postReturnTypeType.ClassName, postReturnTypeType.Name);
                        postReturnType = postReturnTypeType.ApiGroup + "." + postReturnType;
                    }
                }

                var parameters = new List <Parameter>();

                if (method.RequiresUserAuthentication)
                {
                    parameters.Add(new Parameter("user", "UserAuthorization"));
                }

                var urlParams = this.GetUrlPathParameters(method.Path, NameTransformation.PascalCase);
                foreach (var urlParam in urlParams)
                {
                    parameters.Add(urlParam.Value);
                }

                if (method.UsesAcceptLanguage)
                {
                    parameters.Add(new Parameter("acceptLanguages", "string[]", originalName: "acceptLanguages = null"));
                }

                // doc
                this.text.WriteLine(indent, "/// <summary>");
                this.text.WriteLine(indent, "/// " + method.Title);
                this.text.WriteLine(indent, "/// </summary>");

                if (method.Remark != null)
                {
                    this.text.WriteLine(indent, "/// <remarks>");
                    this.text.WriteLine(indent, "/// " + method.Remark + "");
                    this.text.WriteLine(indent, "/// </remarks>");
                }

                // name and arguments
                this.text.WriteLine(indent++, "public " + returnType + " " + this.GetPropertyName(method.MethodName, method.Path) + "(");

                var sep = "  ";
                foreach (var parameter in parameters)
                {
                    this.text.WriteLine(indent, sep + (parameter.Type ?? "string") + " "
                                        + parameter.Name + " "
                                        + (parameter.Value != null ? ("= " + parameter.Value) : string.Empty));
                    sep = ", ";
                }

                if (postReturnTypeType != null)
                {
                    this.text.WriteLine(indent, ", " + postReturnType + " postData");
                }

                if (returnType != null && method.UseFieldSelectors)
                {
                    this.text.WriteLine(indent, ", FieldSelector<" + returnType + "> fields = null");
                }

                this.text.WriteLine(--indent, ")");
                this.text.WriteLine(indent++, "{");

                // body / format url
                if (urlParams.Count > 0)
                {
                    this.text.WriteLine(indent, "string urlFormat = \"" + method.Path + "\";");

                    this.text.WriteLine(indent, "var url = FormatUrl(urlFormat, " + (method.UseFieldSelectors ? "fields" : "default(FieldSelector)") + ", " + string.Join(", ", urlParams.Values.Select(p => "\"" + p.OriginalName + "\", " + p.Name).ToArray()) + ");");
                }
                else if (method.Path.Contains("FieldSelector"))
                {
                    this.text.WriteLine(indent, "string urlFormat = \"" + method.Path + "\";");
                    this.text.WriteLine(indent, "var url = FormatUrl(urlFormat, fields);");
                }
                else
                {
                    this.text.WriteLine(indent, "var url = \"" + method.Path + "\";");
                }

                // body / create context
                this.text.WriteLine();
                text.WriteLine(indent, "var context = new RequestContext();");

                if (method.RequiresUserAuthentication)
                {
                    text.WriteLine(indent, "context.UserAuthorization = user;");
                }

                if (method.UsesAcceptLanguage)
                {
                    text.WriteLine(indent, "context.AcceptLanguages = acceptLanguages;");
                }

                text.WriteLine(indent, "context.Method =  \"" + method.HttpMethod + "\";");
                text.WriteLine(indent, "context.UrlPath = this.LinkedInApi.Configuration.BaseApiUrl + url;");

                if (postReturnTypeType != null)
                {
                    if (postReturnTypeType.IsMultiPartStream)
                    {
                        this.text.WriteLine(indent, "this.CreateMultiPartStream(context, postData);");
                    }
                    else if (postReturnTypeType.IsOctetStream)
                    {
                        this.text.WriteLine(indent, "this.CreateOctetStream(context, postData);");
                    }
                    else
                    {
                        this.text.WriteLine(indent, "this.CreateJsonPostStream(context, postData);");
                    }
                }

                // body / execute
                this.text.WriteLine();
                text.WriteLine(indent++, "if (!this.ExecuteQuery(context))");
                ////text.WriteLine(indent--, "this.HandleXmlErrorResponse(context);");
                ////text.WriteLine(indent, "return this.HandleXmlResponse<" + returnType + ">(context);");
                text.WriteLine(indent--, "this.HandleJsonErrorResponse(context);");
                text.WriteLine(indent, "");
                if (method.IsStreamOctetResultHandeling)
                {
                    text.WriteLine(indent, @"            
                        var result = string.Empty;
                        var headerETag = context.ResponseHeaders.GetValues(""eTag"");
                        if (headerETag.Length > 0)
                        {
                            result = headerETag.First();
                            result = result.TrimEnd('""').TrimStart('""');
                        }"
                                   );
                }
                else if (method.IsUGCPostHandeling)
                {
                    text.WriteLine(indent, @"            
                        var result = string.Empty;
                        var headerETag = context.ResponseHeaders.GetValues(""X-RestLi-Id"");
                        if (headerETag.Length > 0)
                        {
                            result = headerETag.First();
                            result = result.TrimEnd('""').TrimStart('""');
                        }"
                                   );
                }
                else if (method.IsIntResultHandeling)
                {
                    text.WriteLine(indent, "var result = (int)context.HttpStatusCode;");
                }
                else if (method.IsStringResultHandeling)
                {
                    text.WriteLine(indent, "var result = this.HandleRawResponse(context, System.Text.Encoding.UTF8);");
                }
                else
                {
                    text.WriteLine(indent, "var result = this.HandleJsonResponse<" + returnType + ">(context);");
                }

                if (returnTypeType != null && returnTypeType.Headers != null)
                {
                    foreach (var header in returnTypeType.Headers)
                    {
                        text.WriteLine(indent, "result." + header.PropertyName + " = this.ReadHeader<" + (header.Type ?? "string") + ">(context, \"" + header.Name + "\");");
                    }
                }

                text.WriteLine(indent, "return result;");

                // body / handle


                // body / return

                ////this.text.WriteLine(indent, "throw new NotImplementedException(url);");
                this.text.WriteLine(--indent, "}");



                this.text.WriteLine();
                //this.text.WriteLine(--indent, "#if ASYNCTASKS");
                indent++;
                // doc
                this.text.WriteLine(indent, "/// <summary>");
                this.text.WriteLine(indent, "/// " + method.Title);
                this.text.WriteLine(indent, "/// </summary>");

                if (method.Remark != null)
                {
                    this.text.WriteLine(indent, "/// <remarks>");
                    this.text.WriteLine(indent, "/// " + method.Remark + "");
                    this.text.WriteLine(indent, "/// </remarks>");
                }

                // name and arguments
                this.text.WriteLine(indent++, "public async Task<" + returnType + "> " + this.GetPropertyName(method.MethodName, method.Path) + "Async(");

                sep = "  ";
                foreach (var parameter in parameters)
                {
                    this.text.WriteLine(indent, sep + (parameter.Type ?? "string") + " "
                                        + parameter.Name + " "
                                        + (parameter.Value != null ? ("= " + parameter.Value) : string.Empty));
                    sep = ", ";
                }

                if (postReturnTypeType != null)
                {
                    this.text.WriteLine(indent, ", " + postReturnType + " postData");
                }

                if (returnType != null && method.UseFieldSelectors)
                {
                    this.text.WriteLine(indent, ", FieldSelector<" + returnType + "> fields = null");
                }

                this.text.WriteLine(--indent, ")");
                this.text.WriteLine(indent++, "{");

                // body / format url
                if (urlParams.Count > 0)
                {
                    this.text.WriteLine(indent, "string urlFormat = \"" + method.Path + "\";");

                    this.text.WriteLine(indent, "var url = FormatUrl(urlFormat, " + (method.UseFieldSelectors ? "fields" : "default(FieldSelector)") + ", " + string.Join(", ", urlParams.Values.Select(p => "\"" + p.OriginalName + "\", " + p.Name).ToArray()) + ");");
                }
                else if (method.Path.Contains("FieldSelector"))
                {
                    this.text.WriteLine(indent, "string urlFormat = \"" + method.Path + "\";");
                    this.text.WriteLine(indent, "var url = FormatUrl(urlFormat, fields);");
                }
                else
                {
                    this.text.WriteLine(indent, "var url = \"" + method.Path + "\";");
                }

                // body / create context
                this.text.WriteLine();
                text.WriteLine(indent, "var context = new RequestContext();");

                if (method.RequiresUserAuthentication)
                {
                    text.WriteLine(indent, "context.UserAuthorization = user;");
                }

                if (method.UsesAcceptLanguage)
                {
                    text.WriteLine(indent, "context.AcceptLanguages = acceptLanguages;");
                }

                text.WriteLine(indent, "context.Method =  \"" + method.HttpMethod + "\";");
                text.WriteLine(indent, "context.UrlPath = this.LinkedInApi.Configuration.BaseApiUrl + url;");

                if (postReturnTypeType != null)
                {
                    if (postReturnTypeType.IsMultiPartStream)
                    {
                        this.text.WriteLine(indent, "this.CreateMultiPartStream(context, postData);");
                    }
                    else if (postReturnTypeType.IsOctetStream)
                    {
                        this.text.WriteLine(indent, "this.CreateOctetStream(context, postData);");
                    }
                    else
                    {
                        this.text.WriteLine(indent, "this.CreateJsonPostStream(context, postData);");
                    }
                }

                // body / execute
                this.text.WriteLine();
                text.WriteLine(indent, "var exec = await this.ExecuteQueryAsync(context);");
                text.WriteLine(indent++, "if (!exec)");
                ////text.WriteLine(indent--, "this.HandleXmlErrorResponse(context);");
                ////text.WriteLine(indent, "return this.HandleXmlResponse<" + returnType + ">(context);");
                text.WriteLine(indent--, "this.HandleJsonErrorResponse(context);");
                text.WriteLine(indent, "");
                if (method.IsStreamOctetResultHandeling)
                {
                    text.WriteLine(indent, @"            
                        var result = string.Empty;
                        var headerETag = context.ResponseHeaders.GetValues(""eTag"");
                        if (headerETag.Length > 0)
                        {
                            result = headerETag.First();
                            result = result.TrimEnd('""').TrimStart('""');
                        }"
                                   );
                }
                else if (method.IsUGCPostHandeling)
                {
                    text.WriteLine(indent, @"            
                        var result = string.Empty;
                        var headerETag = context.ResponseHeaders.GetValues(""X-RestLi-Id"");
                        if (headerETag.Length > 0)
                        {
                            result = headerETag.First();
                            result = result.TrimEnd('""').TrimStart('""');
                        }"
                                   );
                }
                else if (method.IsIntResultHandeling)
                {
                    text.WriteLine(indent, "var result = (int)context.HttpStatusCode;");
                }
                else if (method.IsStringResultHandeling)
                {
                    text.WriteLine(indent, "var result = this.HandleRawResponse(context, System.Text.Encoding.UTF8);");
                }
                else
                {
                    text.WriteLine(indent, "var result = this.HandleJsonResponse<" + returnType + ">(context);");
                }

                if (returnTypeType != null && returnTypeType.Headers != null)
                {
                    foreach (var header in returnTypeType.Headers)
                    {
                        text.WriteLine(indent, "result." + header.PropertyName + " = this.ReadHeader<" + (header.Type ?? "string") + ">(context, \"" + header.Name + "\");");
                    }
                }

                text.WriteLine(indent, "return result;");

                // body / handle


                // body / return

                ////this.text.WriteLine(indent, "throw new NotImplementedException(url);");
                this.text.WriteLine(--indent, "}");
                //this.text.WriteLine(--indent, "#endif");
                indent++;


                this.text.WriteLine(indent, "");
            }
        }
Exemple #37
0
        private string GetDefaultValue(GeneratorContext ctx, FieldDescriptorProto obj, string typeName)
        {
            string defaultValue = null;
            bool   isOptional   = obj.label == FieldDescriptorProto.Label.LabelOptional;

            if (isOptional || ctx.EmitRequiredDefaults || obj.type == FieldDescriptorProto.Type.TypeEnum)
            {
                defaultValue = obj.DefaultValue;

                if (obj.type == FieldDescriptorProto.Type.TypeString)
                {
                    defaultValue = string.IsNullOrEmpty(defaultValue) ? "\"\""
                        : ("@\"" + (defaultValue ?? "").Replace("\"", "\"\"") + "\"");
                }
                else if (obj.type == FieldDescriptorProto.Type.TypeDouble)
                {
                    switch (defaultValue)
                    {
                    case "inf": defaultValue = "double.PositiveInfinity"; break;

                    case "-inf": defaultValue = "double.NegativeInfinity"; break;

                    case "nan": defaultValue = "double.NaN"; break;
                    }
                }
                else if (obj.type == FieldDescriptorProto.Type.TypeFloat)
                {
                    switch (defaultValue)
                    {
                    case "inf": defaultValue = "float.PositiveInfinity"; break;

                    case "-inf": defaultValue = "float.NegativeInfinity"; break;

                    case "nan": defaultValue = "float.NaN"; break;
                    }
                }
                else if (obj.type == FieldDescriptorProto.Type.TypeEnum)
                {
                    var enumType = ctx.TryFind <EnumDescriptorProto>(obj.TypeName);
                    if (enumType != null)
                    {
                        EnumValueDescriptorProto found = null;
                        if (!string.IsNullOrEmpty(defaultValue))
                        {
                            found = enumType.Values.FirstOrDefault(x => x.Name == defaultValue);
                        }
                        else if (ctx.Syntax == FileDescriptorProto.SyntaxProto2)
                        {
                            // find the first one; if that is a zero, we don't need it after all
                            found = enumType.Values.FirstOrDefault();
                            if (found != null && found.Number == 0)
                            {
                                if (!isOptional)
                                {
                                    found = null;              // we don't need it after all
                                }
                            }
                        }
                        // for proto3 the default is 0, so no need to do anything - GetValueOrDefault() will do it all

                        if (found != null)
                        {
                            defaultValue = ctx.NameNormalizer.GetName(found);
                        }
                        if (!string.IsNullOrWhiteSpace(defaultValue))
                        {
                            defaultValue = typeName + "." + defaultValue;
                        }
                    }
                }
            }

            return(defaultValue);
        }
		internal protected override void GenerateBuildCode (GeneratorContext ctx, CodeExpression var)
		{
			if (!String.IsNullOrEmpty (UIManagerName)) {
				// Create an UI manager
				CodeFieldReferenceExpression uixp = new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), UIManagerName);
				CodeAssignStatement uim_init = new CodeAssignStatement (uixp, new CodeObjectCreateExpression (typeof (Gtk.UIManager).ToGlobalTypeRef ()));
				ctx.Statements.Add (uim_init);
				
				includedActionGroups = new ArrayList ();
				
				// Generate action group creation
				foreach (ActionGroup actionGroup in actionGroups) {
					
					// Create the action group
					string grpVar = ctx.NewId ();
					CodeVariableDeclarationStatement uidec = new CodeVariableDeclarationStatement (
						typeof (Gtk.ActionGroup).ToGlobalTypeRef (),
						grpVar,
						actionGroup.GenerateObjectCreation (ctx)
					);
					ctx.Statements.Add (uidec);
					actionGroup.GenerateBuildCode (ctx, new CodeVariableReferenceExpression (grpVar));
					
					// Insert the action group in the UIManager
					CodeMethodInvokeExpression mi = new CodeMethodInvokeExpression (
						uixp,
						"InsertActionGroup",
						new CodeVariableReferenceExpression (grpVar),
						new CodePrimitiveExpression (includedActionGroups.Count)
					);
					ctx.Statements.Add (mi);
				
					includedActionGroups.Add (actionGroup);
				}
				
				// Adds the accel group to the window
				Window w = GetTopLevel () as Window;
				if (w != null) {
					CodeMethodInvokeExpression ami = new CodeMethodInvokeExpression (
						ctx.WidgetMap.GetWidgetExp (w),
						"AddAccelGroup",
						new CodePropertyReferenceExpression (
							uixp,
							"AccelGroup"
						)
					);
					ctx.Statements.Add (ami);
				} else {
					// There is no top level window, this must be a custom widget.
					// The only option is to register the accel group when
					// the widget is realized. This is done by the Bin wrapper.
				}
			}
			
			if (tooltip != null && tooltip.Length > 0)
				GetTopLevel().GenerateTooltip (ctx, this);
			
			base.GenerateBuildCode (ctx, var);
		}
Exemple #39
0
 internal protected override CodeExpression GenerateObjectCreation(GeneratorContext ctx)
 {
     return(new CodeObjectCreateExpression(ClassDescriptor.WrappedTypeName.ToGlobalTypeRef(), new CodePrimitiveExpression(null)));
 }
		protected override void GeneratePropertySet (GeneratorContext ctx, CodeExpression var, PropertyDescriptor prop)
		{
			// Those properties are handled in GeneratePostBuildCode
			if (prop.Name == "Visible" || prop.Name == "HasDefault")
				return;
			
			// Don't generate a name for unselectable widgets
			if (prop.Name == "Name" && Unselectable)
				return;
			
			base.GeneratePropertySet (ctx, var, prop);
		}
Exemple #41
0
        public virtual Type CreateCustomInterfaceProxy(Type[] interfaces, Type type, GeneratorContext context)
        {
            InterfaceProxyGenerator generator = new InterfaceProxyGenerator(_scope, context);

            return(generator.GenerateCode(interfaces, type));
        }
Exemple #42
0
		public ClassProxyGenerator(ModuleScope scope, GeneratorContext context) : base(scope, context)
		{
		}
        private void WriteReturnTypes(GeneratorContext context, ReturnType returnType, ApiGroup apiGroup)
        {
            int indent = 0;

            this.text.WriteLine(indent, "// WriteReturnTypes(" + apiGroup.Name + ", " + returnType.Name + ")");
            this.text.WriteLine(indent, "namespace " + this.RootNamespace + "." + apiGroup.Name);
            this.text.WriteLine(indent++, "{");
            this.WriteNamespace(indent, "System");
            this.WriteNamespace(indent, "System.Collections.Generic");
            this.WriteNamespace(indent, "System.Xml.Serialization");
            this.WriteNamespace(indent, "Newtonsoft.Json");
            this.WriteNamespace(indent, "Newtonsoft.Json.Linq");
            this.text.WriteLine();
            this.text.WriteLine(indent, "/// <summary>");
            this.text.WriteLine(indent, "/// Name: '" + returnType.Name + "'");
            this.text.WriteLine(indent, "/// </summary>");

            if (returnType.Remark != null)
            {
                this.text.WriteLine(indent, "/// <remarks>");
                this.text.WriteLine(indent, "/// " + returnType.Remark + "");
                this.text.WriteLine(indent, "/// </remarks>");
            }

            var className = this.GetPropertyName(returnType.ClassName, returnType.Name);

            this.text.WriteLine(indent, "[Serializable, XmlRoot(\"" + returnType.Name + "\")]");
            this.text.WriteLine(indent, "public class " + className);
            this.text.WriteLine(indent++, "{");

            foreach (var itemGroup in returnType.Fields.GroupBy(f => f.FieldName.PropertyName).ToArray())
            {
                var item         = itemGroup.First();
                var isCollection = item.IsCollection;

                var        type            = item.Type ?? item.FieldName.ClassName ?? "string";
                ReturnType fieldReturnType = null;
                if (!csharpTypes.Contains(type))
                {
                    fieldReturnType = context.Definition.FindReturnType(type);

                    if (fieldReturnType != null && !type.Contains('.'))
                    {
                        type = fieldReturnType.ClassName ?? Namify(fieldReturnType.Name);
                    }
                }

                if (isCollection)
                {
                    type = "List<" + type + ">";
                }

                this.text.WriteLine(indent, "/// <summary>");
                foreach (var subItem in itemGroup)
                {
                    this.text.WriteLine(indent, "/// Field: '" + subItem.Name + "' (" + (subItem.IsDefault ? "default" : "on-demand") + ")");
                }

                foreach (var subItem in itemGroup.Where(f => f.Selectors != null).SelectMany(f => f.Selectors))
                {
                    this.text.WriteLine(indent, "/// Field: '" + subItem.Name + "'");
                }

                var xmlAttribute         = item.IsAttribute ? "XmlAttribute" : "XmlElement";
                var xmlAttributeNameProp = item.IsAttribute ? "AttributeName" : "ElementName";
                var jsonName             = (item.IsAttribute ? "_" : "") + item.FieldName.ApiName; // Namify(item.FieldName.ApiName, NameTransformation.PascalCase);
                //if (item.IsCollection)
                //    jsonName = "values";

                this.text.WriteLine(indent, "/// </summary>");
                this.text.WriteLine(indent, (item.Ignore ? "////" : "") + "[" + xmlAttribute + "(" + xmlAttributeNameProp + " = \"" + item.FieldName.ApiName + "\")]");
                this.text.WriteLine(indent, (item.Ignore ? "////" : "") + "[JsonProperty(PropertyName = \"" + jsonName + "\")]");
                this.text.WriteLine(indent, "public " + type + " " + item.FieldName.PropertyName + " { get; set; }");
                this.text.WriteLine();
            }

            if (returnType.Headers != null)
            {
                foreach (var item in returnType.Headers)
                {
                    var isCollection = item.IsCollection;

                    var        type            = item.Type ?? item.FieldName.ClassName ?? "string";
                    ReturnType fieldReturnType = null;
                    if (!csharpTypes.Contains(type))
                    {
                        fieldReturnType = context.Definition.FindReturnType(type);
                        if (fieldReturnType != null)
                        {
                            type = fieldReturnType.ClassName ?? Namify(fieldReturnType.Name);
                        }
                    }

                    if (isCollection)
                    {
                        type = "List<" + type + ">";
                    }

                    this.text.WriteLine(indent, "/// <summary>");
                    this.text.WriteLine(indent, "/// HTTP header '" + item.Name + "'");
                    this.text.WriteLine(indent, "/// </summary>");
                    this.text.WriteLine(indent, "public " + type + " " + item.FieldName.PropertyName + " { get; set; }");
                    this.text.WriteLine();
                }
            }

            this.text.WriteLine(--indent, "}");
            this.text.WriteLine(--indent, "}");
            this.text.WriteLine();
        }
Exemple #44
0
 /// <summary>
 /// Ends an extensions block
 /// </summary>
 protected override void WriteExtensionsFooter(GeneratorContext ctx, DescriptorProto obj, ref object state)
 {
     ctx.Outdent().WriteLine("}");
 }
		internal protected override void GeneratePostBuildCode (GeneratorContext ctx, CodeExpression var)
		{
			base.GeneratePostBuildCode (ctx, var);
			
			// The visible property is generated here to ensure that widgets are made visible
			// after they have been fully built
			
			PropertyDescriptor prop = ClassDescriptor ["Visible"] as PropertyDescriptor;
			if (prop != null && prop.PropertyType == typeof(bool) && !(bool) prop.GetValue (Wrapped)) {
				ctx.Statements.Add (
					new CodeMethodInvokeExpression (
						var, 
						"Hide"
					)
				);
			}
			
			// The HasDefault property can only be assigned when the widget is added to the window
			prop = ClassDescriptor ["HasDefault"] as PropertyDescriptor;
			if (prop != null && (bool) prop.GetValue (Wrapped)) {
				ctx.Statements.Add (
					new CodeAssignStatement (
						new CodePropertyReferenceExpression (
							var,
							"HasDefault"
						),
						new CodePrimitiveExpression (true)
					)
				);
			}
		}
Exemple #46
0
 protected override void WriteMessageHeader(GeneratorContext ctx, DescriptorProto obj, ref object state)
 {
     throw new NotImplementedException();
 }
		protected CodeExpression GenerateUiManagerElement (GeneratorContext ctx, ActionTree tree)
		{
			Widget topLevel = GetTopLevel ();
			string uiName = topLevel.UIManagerName;
			if (uiName != null) {
				CodeFieldReferenceExpression uiManager = new CodeFieldReferenceExpression (new CodeThisReferenceExpression (), uiName);
				if (topLevel.includedActionGroups == null)
					topLevel.includedActionGroups = new ArrayList ();
				
				// Add to the uimanager all action groups required by the 
				// actions of the tree
				
				foreach (ActionGroup grp in tree.GetRequiredGroups ()) {
					if (!topLevel.includedActionGroups.Contains (grp)) {
						// Insert the action group in the UIManager
						CodeMethodInvokeExpression mi = new CodeMethodInvokeExpression (
							uiManager,
							"InsertActionGroup",
							ctx.GenerateValue (grp, typeof(ActionGroup)),
							new CodePrimitiveExpression (topLevel.includedActionGroups.Count)
						);
						ctx.Statements.Add (mi);
						topLevel.includedActionGroups.Add (grp);
					}
				}
				
				tree.GenerateBuildCode (ctx, uiManager);
				return new CodeMethodInvokeExpression (
					uiManager,
					"GetWidget",
					new CodePrimitiveExpression ("/" + Wrapped.Name)
				);
			}
			return null;
		}
Exemple #48
0
 public virtual Expression OnCreateGetBytes(ParameterExpression obj, GeneratorContext context, Expression lastResult)
 {
     return(lastResult);
 }
Exemple #49
0
		public object RecreateClassProxy(SerializationInfo info, StreamingContext context)
		{
			bool delegateBaseSer = info.GetBoolean("__delegateToBase");

			if (!delegateBaseSer)
			{
				_data = (object[]) info.GetValue("__data", typeof(object[]) );
			}

			object proxy = null;

			GeneratorContext genContext = new GeneratorContext();
			
			if (_mixins.Length != 0)
			{
				foreach(object mixin in _mixins)
				{
					genContext.AddMixinInstance(mixin);
				}
			}

			ClassProxyGenerator cpGen = new ClassProxyGenerator( _scope, genContext );

			Type proxy_type;

			if (_mixins.Length == 0)
			{
				proxy_type = cpGen.GenerateCode( _baseType, _interfaces );
			}
			else
			{
				proxy_type = cpGen.GenerateCustomCode( _baseType, _interfaces );
			}

			if (delegateBaseSer)
			{
				proxy = Activator.CreateInstance( proxy_type, new object[] { info, context } );
			}
			else
			{
				if (_mixins.Length == 0)
				{
					proxy = Activator.CreateInstance( proxy_type, new object[] { _interceptor } );
				}
				else
				{
					ArrayList args = new ArrayList();
					args.Add(_interceptor);
					args.Add(genContext.MixinsAsArray());
					
					proxy = Activator.CreateInstance( proxy_type, args.ToArray() );
				}

				MemberInfo[] members = FormatterServices.GetSerializableMembers( _baseType );
				FormatterServices.PopulateObjectMembers(proxy, members, _data);
			}

			return proxy;
		}
Exemple #50
0
 public virtual void AfterAllCreateGetBytes(GeneratorContext context)
 {
 }
 public MarkdownProcessor(IFileSystem fileSystem, ILogger logger, IUrlProvider urlProvider, GeneratorContext context)
 {
     this._log         = logger;
     this._fileSystem  = fileSystem;
     this._urlProvider = urlProvider;
     this._context     = context;
 }
Exemple #52
0
 public virtual Func <Expression, Expression> OnGetLoopController(ParameterExpression bytes, ParameterExpression startIndex, GeneratorContext context, Func <Expression, Expression> lastResult)
 {
     return(lastResult);
 }
Exemple #53
0
		public void MixinImplementingMoreThanOneInterface()
		{
			GeneratorContext context = new GeneratorContext();
			ComplexMixin mixin_instance = new ComplexMixin();
			context.AddMixinInstance( mixin_instance );

			AssertInvocationInterceptor interceptor = new AssertInvocationInterceptor();

			object proxy = _generator.CreateCustomClassProxy( 
				typeof(SimpleClass), interceptor, context );
			
			Assert.IsNotNull(proxy);
			Assert.IsTrue( typeof(SimpleClass).IsAssignableFrom( proxy.GetType() ) );

			Assert.IsFalse( interceptor.Invoked );

			IThird inter3 = proxy as IThird;
			Assert.IsNotNull(inter3);
			inter3.DoThird();

			Assert.IsTrue( interceptor.Invoked );
			Assert.AreSame( proxy, interceptor.proxy );
			Assert.AreSame( mixin_instance, interceptor.mixin );

			ISecond inter2 = proxy as ISecond;
			Assert.IsNotNull(inter2);
			inter2.DoSecond();

			Assert.IsTrue( interceptor.Invoked );
			Assert.AreSame( proxy, interceptor.proxy );
			Assert.AreSame( mixin_instance, interceptor.mixin );

			IFirst inter1 = proxy as IFirst;
			Assert.IsNotNull(inter1);
			inter1.DoFirst();

			Assert.IsTrue( interceptor.Invoked );
			Assert.AreSame( proxy, interceptor.proxy );
			Assert.AreSame( mixin_instance, interceptor.mixin );
		}
Exemple #54
0
 public virtual Expression OnCreateToObject(ParameterExpression bytes, ParameterExpression startIndex, GeneratorContext context, Expression lastResult)
 {
     return(lastResult);
 }
 public InterfaceProxyGenerator(ModuleScope scope, GeneratorContext context) : base(scope, context)
 {
 }
Exemple #56
0
 protected override void WriteField(GeneratorContext ctx, FieldDescriptorProto obj, ref object state, OneOfStub[] oneOfs)
 {
     throw new NotImplementedException();
 }
Exemple #57
0
		internal protected override void GenerateBuildCode (GeneratorContext ctx, CodeExpression var)
		{
			if (Type == ActionType.Radio) {
				CodeExpression groupExp = GroupManager.GenerateGroupExpression (ctx, this);
				ctx.Statements.Add (
					new CodeAssignStatement (
						new CodePropertyReferenceExpression (var, "Group"),
						groupExp)
				);
			}
			else if (type == ActionType.Toggle) {
				if (Active) {
					ctx.Statements.Add (
						new CodeAssignStatement (
							new CodePropertyReferenceExpression (var, "Active"),
							new CodePrimitiveExpression (true))
					);
				}
				if (DrawAsRadio) {
					ctx.Statements.Add (
						new CodeAssignStatement (
							new CodePropertyReferenceExpression (var, "DrawAsRadio"),
							new CodePrimitiveExpression (true))
					);
				}
			}
			base.GenerateBuildCode (ctx, var);
		}
Exemple #58
0
 public override object Generate(GeneratorContext context)
 {
     return(Random.Next(int.MinValue, int.MaxValue));
 }
        private void WriteReturnTypeFields(GeneratorContext context, ApiGroup apiGroup, ReturnType[] returnTypes)
        {
            int indent = 0;

            this.text.WriteLine(indent, "// WriteReturnTypeFields(" + apiGroup.Name + ")");
            this.text.WriteLine(indent, "namespace " + this.RootNamespace + "." + apiGroup.Name);
            this.text.WriteLine(indent++, "{");
            this.WriteNamespace(indent, "System");
            this.WriteNamespace(indent, "System.Collections.Generic");
            this.WriteNamespace(indent, "System.Xml.Serialization");
            this.text.WriteLine();

            this.text.WriteLine(indent, "/// <summary>");
            this.text.WriteLine(indent, "/// Field selectors for the '" + string.Join("', '", returnTypes.Select(r => r.Name).ToArray()) + "' return types.");
            this.text.WriteLine(indent, "/// </summary>");
            this.text.WriteLine(indent++, "public static class " + apiGroup.Name + "Fields {");

            foreach (var returnType in returnTypes)
            {
                ////var returnTypeName = this.GetPropertyName(returnType.ClassName, returnType.Name);
                ////this.text.WriteLine(indent++, "public static FieldSelector<" + returnTypeName + "> Fields(this FieldSelector<" + returnTypeName + "> me) {");
                ////this.text.WriteLine(indent, "return me.Add(\"" + field.Name + "\");");
                ////this.text.WriteLine(--indent, "}");
                ////this.text.WriteLine(indent, "");
                var returnTypeName = this.GetPropertyName(returnType.ClassName, returnType.Name);

                ////this.text.WriteLine(indent, "// return type: " + (returnType.ClassName ?? returnType.Name));

                var allFields = new List <string>();
                foreach (var fieldGroup in returnType.Fields.GroupBy(f => f.Name).ToArray())
                {
                    var field     = fieldGroup.First();
                    var selectors = fieldGroup.Where(f => f.Selectors != null).SelectMany(f => f.Selectors).ToArray();

                    if (selectors.Length == 0 && returnType.AutoGenerateFieldSelectors && !field.IsAttribute)
                    {
                        var name      = field.Name;
                        var fieldName = this.GetPropertyName(null, field.Name);
                        allFields.Add(name);

                        WriteReturnTypeField(indent, returnTypeName, fieldName, name);
                    }
                    else
                    {
                        foreach (var selector in selectors)
                        {
                            var name      = selector.Name;
                            var fieldName = this.GetPropertyName(selector.PropertyName, name);
                            allFields.Add(name);

                            WriteReturnTypeField(indent, returnTypeName, fieldName, name);
                        }
                    }
                }

                if (returnType.Selectors != null)
                {
                    foreach (var customSelector in returnType.Selectors)
                    {
                        if (!allFields.Contains(customSelector.Name))
                        {
                            var fieldName = this.GetPropertyName(customSelector.PropertyName, customSelector.Name);
                            WriteReturnTypeField(indent, returnTypeName, fieldName, customSelector.Name);

                            allFields.Add(customSelector.Name);
                        }
                    }
                }

                if (returnType.ImportFieldSelectors != null)
                {
                    foreach (var import in returnType.ImportFieldSelectors)
                    {
                        if (import.ReturnType != null)
                        {
                            var type = context.Definition.FindReturnType(import.ReturnType);
                            if (type != null)
                            {
                                foreach (var field in type.Fields)
                                {
                                    var fullName         = import.Name + ":(" + field.Name + ")";
                                    var fullPropertyName = this.GetPropertyName(null, import.Name) + this.GetPropertyName(field.PropertyName, field.Name);
                                    WriteReturnTypeField(indent, returnTypeName, fullPropertyName, fullName);
                                    allFields.Add(fullName);
                                }
                            }
                        }
                    }
                }

                if (allFields.Count > 0)
                {
                    this.text.WriteLine(indent, "/// <summary>");
                    this.text.WriteLine(indent, "/// Includes all the fields.");
                    this.text.WriteLine(indent, "/// </summary>");
                    this.text.WriteLine(indent, "/// <param name=\"me\">The field selector.</param>");
                    this.text.WriteLine(indent, "/// <returns>The field selector.</returns>");
                    this.text.Write(indent++, "public static FieldSelector<" + returnTypeName + "> WithAllFields(this FieldSelector<" + returnTypeName + "> me) { ");
                    this.text.Write(@"return me.AddRange(""");
                    var sep = "";
                    for (int i = 0; i < allFields.Count; i++)
                    {
                        var name  = allFields[i];
                        var slash = name.IndexOf('/');
                        if (slash > 0)
                        {
                            name = name.Substring(0, slash);
                        }

                        this.text.Write(sep);
                        this.text.Write(name);
                        sep = "\", \"";
                    }

                    this.text.Write("\"); ");
                    this.text.WriteLine("}");
                    indent--;
                    this.text.WriteLine(indent, "");
                }
                else
                {
                    ////this.text.WriteLine(indent, "// allFields.Count == 0");
                }

                ////this.text.WriteLine(indent, "");
            }

            this.text.WriteLine(--indent, "}");
            this.text.WriteLine(--indent, "}");
            this.text.WriteLine();
        }
Exemple #60
0
 protected override void WriteEnumFooter(GeneratorContext ctx, EnumDescriptorProto obj, ref object state)
 {
     throw new NotImplementedException();
 }