public BoundInterfaceMethodDeclaration(Method method, string adapter, CodeGenerationOptions opt) { this.method = method; this.opt = opt; Name = method.AdjustedName; ReturnType = new TypeReferenceWriter(opt.GetTypeReferenceName(method.RetVal)); IsDeclaration = true; if (method.DeclaringType.IsGeneratable) { Comments.Add($"// Metadata.xml XPath method reference: path=\"{method.GetMetadataXPathReference (method.DeclaringType)}\""); } if (method.Deprecated != null) { Attributes.Add(new ObsoleteAttr(method.Deprecated.Replace("\"", "\"\""))); } if (method.IsReturnEnumified) { Attributes.Add(new GeneratedEnumAttr(true)); } if (method.IsInterfaceDefaultMethod) { Attributes.Add(new CustomAttr("[global::Java.Interop.JavaInterfaceDefaultMethod]")); } Attributes.Add(new RegisterAttr(method.JavaName, method.JniSignature, method.ConnectorName + ":" + method.GetAdapterName(opt, adapter), additionalProperties: method.AdditionalAttributeString())); SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method); this.AddMethodParameters(method.Parameters, opt); }
public BoundAbstractProperty(GenBase gen, Property property, CodeGenerationOptions opt) { Name = property.AdjustedName; PropertyType = new TypeReferenceWriter(opt.GetTypeReferenceName(property.Getter.RetVal)); SetVisibility(property.Getter.RetVal.IsGeneric ? "protected" : property.Getter.Visibility); IsAbstract = true; HasGet = true; var baseProp = gen.BaseSymbol != null?gen.BaseSymbol.GetPropertyByName(property.Name, true) : null; if (baseProp != null) { IsOverride = true; } else { IsShadow = gen.RequiresNew(property); getter_callback = new MethodCallback(gen, property.Getter, opt, property.AdjustedName, false); if (property.Setter != null) { setter_callback = new MethodCallback(gen, property.Setter, opt, property.AdjustedName, false); } } if (gen.IsGeneratable) { GetterComments.Add($"// Metadata.xml XPath method reference: path=\"{gen.MetadataXPathReference}/method[@name='{property.Getter.JavaName}'{property.Getter.Parameters.GetMethodXPathPredicate ()}]\""); } if (property.Getter.IsReturnEnumified) { GetterAttributes.Add(new GeneratedEnumAttr(true)); } SourceWriterExtensions.AddSupportedOSPlatform(GetterAttributes, property.Getter, opt); GetterAttributes.Add(new RegisterAttr(property.Getter.JavaName, property.Getter.JniSignature, property.Getter.GetConnectorNameFull(opt), additionalProperties: property.Getter.AdditionalAttributeString())); SourceWriterExtensions.AddMethodCustomAttributes(GetterAttributes, property.Getter); if (property.Setter != null) { HasSet = true; if (gen.IsGeneratable) { SetterComments.Add($"// Metadata.xml XPath method reference: path=\"{gen.MetadataXPathReference}/method[@name='{property.Setter.JavaName}'{property.Setter.Parameters.GetMethodXPathPredicate ()}]\""); } SourceWriterExtensions.AddSupportedOSPlatform(SetterAttributes, property.Setter, opt); SourceWriterExtensions.AddMethodCustomAttributes(SetterAttributes, property.Setter); SetterAttributes.Add(new RegisterAttr(property.Setter.JavaName, property.Setter.JniSignature, property.Setter.GetConnectorNameFull(opt), additionalProperties: property.Setter.AdditionalAttributeString())); } }
public MethodExplicitInterfaceImplementation(GenBase iface, Method method, CodeGenerationOptions opt) { this.method = method; this.opt = opt; Name = method.Name; ReturnType = new TypeReferenceWriter(opt.GetTypeReferenceName(method.RetVal)); ExplicitInterfaceImplementation = opt.GetOutputName(iface.FullName); SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method); this.AddMethodParameters(method.Parameters, opt); }
public BoundMethodAbstractDeclaration(GenBase gen, Method method, CodeGenerationOptions opt, GenBase impl) { this.method = method; this.opt = opt; ReturnType = new TypeReferenceWriter(opt.GetTypeReferenceName(method.RetVal)); this.AddMethodParameters(method.Parameters, opt); if (method.RetVal.IsGeneric && gen != null) { Name = method.Name; ExplicitInterfaceImplementation = opt.GetOutputName(gen.FullName); SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method); Body.Add("throw new NotImplementedException ();"); return; } Name = method.AdjustedName; IsAbstract = true; IsShadow = impl.RequiresNew(method.Name, method); SetVisibility(method.Visibility); NewFirst = true; if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1) { method_callback = new MethodCallback(impl, method, opt, null, method.IsReturnCharSequence); } method.JavadocInfo?.AddJavadocs(Comments); if (method.DeclaringType.IsGeneratable) { Comments.Add($"// Metadata.xml XPath method reference: path=\"{method.GetMetadataXPathReference (method.DeclaringType)}\""); } SourceWriterExtensions.AddSupportedOSPlatform(Attributes, method, opt); if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1) { Attributes.Add(new RegisterAttr(method.JavaName, method.JniSignature, method.ConnectorName, additionalProperties: method.AdditionalAttributeString())); } SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method); }
public GenericExplicitInterfaceImplementationMethod(Method method, GenericSymbol gen, CodeGenerationOptions opt) { this.method = method; this.opt = opt; this.gen = gen; Name = method.Name; ReturnType = new TypeReferenceWriter(opt.GetTypeReferenceName(method.RetVal)); ExplicitInterfaceImplementation = opt.GetOutputName(gen.Gen.FullName); Comments.Add($"// This method is explicitly implemented as a member of an instantiated {gen.FullName}"); SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method); this.AddMethodParameters(method.Parameters, opt); }
public BoundProperty(GenBase gen, Property property, CodeGenerationOptions opt, bool withCallbacks = true, bool forceOverride = false) { Name = property.AdjustedName; PropertyType = new TypeReferenceWriter(opt.GetTypeReferenceName(property.Getter.RetVal)); SetVisibility(gen is InterfaceGen ? string.Empty : property.Getter.IsAbstract && property.Getter.RetVal.IsGeneric ? "protected" : (property.Setter ?? property.Getter).Visibility); IsUnsafe = true; HasGet = true; var is_virtual = property.Getter.IsVirtual && (property.Setter == null || property.Setter.IsVirtual); if (is_virtual && withCallbacks) { IsVirtual = true; IsShadow = gen.RequiresNew(property); if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1) { getter_callback = new MethodCallback(gen, property.Getter, opt, property.AdjustedName, false); } if (property.Setter != null && opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1) { setter_callback = new MethodCallback(gen, property.Setter, opt, property.AdjustedName, false); } } if (forceOverride || ShouldForceOverride(property)) { IsVirtual = false; IsOverride = true; } if ((property.Getter ?? property.Setter).IsStatic) { IsStatic = true; IsVirtual = false; IsOverride = false; } else if (gen.BaseSymbol != null) { // It should be using AdjustedName instead of Name, but ICharSequence ("Formatted") properties are not caught by this... var base_prop = gen.BaseSymbol.GetPropertyByName(property.Name, true); // If the matching base getter we found is a DIM, we do not override it, it should stay virtual if (base_prop != null && !base_prop.Getter.IsInterfaceDefaultMethod) { IsVirtual = false; IsOverride = true; } } // Allow user to override our virtual/override logic if (!forceOverride && (property.Getter ?? property.Setter).ManagedOverride?.ToLowerInvariant() == "virtual") { IsVirtual = true; IsOverride = false; } else if (!forceOverride && (property.Getter ?? property.Setter).ManagedOverride?.ToLowerInvariant() == "override") { IsVirtual = false; IsOverride = true; } // Unlike [Register], [Obsolete] cannot be put on property accessors, so we can apply them only under limited condition... if (property.Getter.Deprecated != null && (property.Setter == null || property.Setter.Deprecated != null)) { Attributes.Add(new ObsoleteAttr(property.Getter.Deprecated.Replace("\"", "\"\"").Trim() + (property.Setter != null && property.Setter.Deprecated != property.Getter.Deprecated ? " " + property.Setter.Deprecated.Replace("\"", "\"\"").Trim() : null))); } SourceWriterExtensions.AddSupportedOSPlatform(Attributes, property.Getter, opt); SourceWriterExtensions.AddMethodCustomAttributes(GetterAttributes, property.Getter); if (gen.IsGeneratable) { GetterComments.Add($"// Metadata.xml XPath method reference: path=\"{gen.MetadataXPathReference}/method[@name='{property.Getter.JavaName}'{property.Getter.Parameters.GetMethodXPathPredicate ()}]\""); } if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1) { GetterAttributes.Add(new RegisterAttr(property.Getter.JavaName, property.Getter.JniSignature, property.Getter.IsVirtual ? property.Getter.GetConnectorNameFull(opt) : string.Empty, additionalProperties: property.Getter.AdditionalAttributeString())); } SourceWriterExtensions.AddMethodBody(GetBody, property.Getter, opt); if (property.Setter != null) { HasSet = true; if (gen.IsGeneratable) { SetterComments.Add($"// Metadata.xml XPath method reference: path=\"{gen.MetadataXPathReference}/method[@name='{property.Setter.JavaName}'{property.Setter.Parameters.GetMethodXPathPredicate ()}]\""); } SourceWriterExtensions.AddSupportedOSPlatform(SetterAttributes, property.Setter, opt); SourceWriterExtensions.AddMethodCustomAttributes(SetterAttributes, property.Setter); if (opt.CodeGenerationTarget != CodeGenerationTarget.JavaInterop1) { SetterAttributes.Add(new RegisterAttr(property.Setter.JavaName, property.Setter.JniSignature, property.Setter.IsVirtual ? property.Setter.GetConnectorNameFull(opt) : string.Empty, additionalProperties: property.Setter.AdditionalAttributeString())); } var pname = property.Setter.Parameters [0].Name; property.Setter.Parameters [0].Name = "value"; SourceWriterExtensions.AddMethodBody(SetBody, property.Setter, opt); property.Setter.Parameters [0].Name = pname; } else if (property.GenerateDispatchingSetter) { HasSet = true; SetterComments.Add("// This is a dispatching setter"); SetBody.Add($"Set{property.Name} (value);"); } AddJavadocs(property); }
public BoundMethod(GenBase type, Method method, CodeGenerationOptions opt, bool generateCallbacks) { JavaMethod = method; if (generateCallbacks && method.IsVirtual) { callback = new MethodCallback(type, method, opt, null, method.IsReturnCharSequence); } Name = method.AdjustedName; IsStatic = method.IsStatic; IsSealed = method.IsOverride && method.IsFinal; IsUnsafe = true; SetVisibility(type is InterfaceGen && !IsStatic ? string.Empty : method.Visibility); // TODO: Clean up this logic var is_explicit = opt.SupportDefaultInterfaceMethods && type is InterfaceGen && method.OverriddenInterfaceMethod != null; var virt_ov = is_explicit ? string.Empty : method.IsOverride ? (opt.SupportDefaultInterfaceMethods && method.OverriddenInterfaceMethod != null ? " virtual" : " override") : method.IsVirtual ? " virtual" : string.Empty; IsVirtual = virt_ov.Trim() == "virtual"; IsOverride = virt_ov.Trim() == "override"; // When using DIM, don't generate "virtual sealed" methods, remove both modifiers instead if (opt.SupportDefaultInterfaceMethods && method.OverriddenInterfaceMethod != null && IsVirtual && IsSealed) { IsVirtual = false; IsSealed = false; } if (is_explicit) { ExplicitInterfaceImplementation = GetDeclaringTypeOfExplicitInterfaceMethod(method.OverriddenInterfaceMethod); } if ((IsVirtual || !IsOverride) && type.RequiresNew(method.AdjustedName, method)) { IsShadow = true; } // Allow user to override our virtual/override logic if (method.ManagedOverride?.ToLowerInvariant() == "virtual") { IsVirtual = true; IsOverride = false; } else if (method.ManagedOverride?.ToLowerInvariant() == "override") { IsVirtual = false; IsOverride = true; } ReturnType = new TypeReferenceWriter(opt.GetTypeReferenceName(method.RetVal)); method.JavadocInfo?.AddJavadocs(Comments); if (method.DeclaringType.IsGeneratable) { Comments.Add($"// Metadata.xml XPath method reference: path=\"{method.GetMetadataXPathReference (method.DeclaringType)}\""); } if (method.Deprecated.HasValue()) { Attributes.Add(new ObsoleteAttr(method.Deprecated.Replace("\"", "\"\""))); } if (method.IsReturnEnumified) { Attributes.Add(new GeneratedEnumAttr(true)); } SourceWriterExtensions.AddSupportedOSPlatform(Attributes, method, opt); Attributes.Add(new RegisterAttr(method.JavaName, method.JniSignature, method.IsVirtual ? method.GetConnectorNameFull(opt) : string.Empty, additionalProperties: method.AdditionalAttributeString())); SourceWriterExtensions.AddMethodCustomAttributes(Attributes, method); this.AddMethodParameters(method.Parameters, opt); SourceWriterExtensions.AddMethodBody(Body, method, opt); }