Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ xa-gendarme.html
packages
.vs/
*.userprefs
*.user
Resource.designer.cs
57 changes: 46 additions & 11 deletions tools/generator/CodeGenerator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -695,22 +695,57 @@ protected CodeGenerator ()
{
}

internal abstract void WriteClassHandle (ClassGen type, StreamWriter sw, string indent, CodeGenerationOptions opt, bool requireNew);
internal abstract void WriteClassHandle (ClassGen type, TextWriter writer, string indent, CodeGenerationOptions opt, bool requireNew);

internal abstract void WriteClassHandle (InterfaceGen type, StreamWriter sw, string indent, CodeGenerationOptions opt, string declaringType);
internal abstract void WriteClassHandle (InterfaceGen type, TextWriter writer, string indent, CodeGenerationOptions opt, string declaringType);

internal abstract void WriteClassInvokerHandle (ClassGen type, StreamWriter sw, string indent, CodeGenerationOptions opt, string declaringType);
internal abstract void WriteInterfaceInvokerHandle (InterfaceGen type, StreamWriter sw, string indent, CodeGenerationOptions opt, string declaringType);
internal abstract void WriteClassInvokerHandle (ClassGen type, TextWriter writer, string indent, CodeGenerationOptions opt, string declaringType);
internal abstract void WriteInterfaceInvokerHandle (InterfaceGen type, TextWriter writer, string indent, CodeGenerationOptions opt, string declaringType);

internal abstract void WriteConstructorIdField (Ctor ctor, StreamWriter sw, string indent, CodeGenerationOptions opt);
internal abstract void WriteConstructorBody (Ctor ctor, StreamWriter sw, string indent, CodeGenerationOptions opt, StringCollection call_cleanup);
internal abstract void WriteConstructorIdField (Ctor ctor, TextWriter writer, string indent, CodeGenerationOptions opt);
internal abstract void WriteConstructorBody (Ctor ctor, TextWriter writer, string indent, CodeGenerationOptions opt, StringCollection call_cleanup);

internal abstract void WriteMethodIdField (Method method, StreamWriter sw, string indent, CodeGenerationOptions opt);
internal abstract void WriteMethodBody (Method method, StreamWriter sw, string indent, CodeGenerationOptions opt);
internal abstract void WriteMethodIdField (Method method, TextWriter writer, string indent, CodeGenerationOptions opt);
internal abstract void WriteMethodBody (Method method, TextWriter writer, string indent, CodeGenerationOptions opt);

internal abstract void WriteFieldIdField (Field field, StreamWriter sw, string indent, CodeGenerationOptions opt);
internal abstract void WriteFieldGetBody (Field field, StreamWriter sw, string indent, CodeGenerationOptions opt);
internal abstract void WriteFieldSetBody (Field field, StreamWriter sw, string indent, CodeGenerationOptions opt);
internal abstract void WriteFieldIdField (Field field, TextWriter writer, string indent, CodeGenerationOptions opt);
internal abstract void WriteFieldGetBody (Field field, TextWriter writer, string indent, CodeGenerationOptions opt, GenBase type);
internal abstract void WriteFieldSetBody (Field field, TextWriter writer, string indent, CodeGenerationOptions opt, GenBase type);

internal virtual void WriteField (Field field, TextWriter writer, string indent, CodeGenerationOptions opt, GenBase type)
{
if (field.IsEnumified)
writer.WriteLine ("[global::Android.Runtime.GeneratedEnum]");
if (field.NeedsProperty) {
string fieldType = field.Symbol.IsArray ? "IList<" + field.Symbol.ElementType + ">" : opt.GetOutputName (field.Symbol.FullName);
WriteFieldIdField (field, writer, indent, opt);
writer.WriteLine ();
writer.WriteLine ("{0}// Metadata.xml XPath field reference: path=\"{1}/field[@name='{2}']\"", indent, type.MetadataXPathReference, field.JavaName);
writer.WriteLine ("{0}[Register (\"{1}\"{2})]", indent, field.JavaName, field.AdditionalAttributeString ());
writer.WriteLine ("{0}{1} {2}{3} {4} {{", indent, field.Visibility, field.IsStatic ? "static " : String.Empty, fieldType, field.Name);
writer.WriteLine ("{0}\tget {{", indent);
WriteFieldGetBody (field, writer, indent + "\t\t", opt, type);
writer.WriteLine ("{0}\t}}", indent);

if (!field.IsConst) {
writer.WriteLine ("{0}\tset {{", indent);
WriteFieldSetBody (field, writer, indent + "\t\t", opt, type);
writer.WriteLine ("{0}\t}}", indent);
}
writer.WriteLine ("{0}}}", indent);
}
else {
writer.WriteLine ("{0}// Metadata.xml XPath field reference: path=\"{1}/field[@name='{2}']\"", indent, type.MetadataXPathReference, field.JavaName);
writer.WriteLine ("{0}[Register (\"{1}\"{2})]", indent, field.JavaName, field.AdditionalAttributeString ());
if (field.IsDeprecated)
writer.WriteLine ("{0}[Obsolete (\"{1}\")]", indent, field.DeprecatedComment);
if (field.Annotation != null)
writer.WriteLine ("{0}{1}", indent, field.Annotation);

// the Value complication is due to constant enum from negative integer value (C# compiler requires explicit parenthesis).
writer.WriteLine ("{0}{1} const {2} {3} = ({2}) {4};", indent, field.Visibility, opt.GetOutputName (field.Symbol.FullName), field.Name, field.Value.Contains ('-') && field.Symbol.FullName.Contains ('.') ? '(' + field.Value + ')' : field.Value);
}
}
}
}

39 changes: 0 additions & 39 deletions tools/generator/Field.cs
Original file line number Diff line number Diff line change
Expand Up @@ -234,45 +234,6 @@ internal ParameterList SetParameters {

public string Annotation { get; internal set; }

void GenerateProperty (StreamWriter sw, string indent, CodeGenerationOptions opt, GenBase gen)
{
string type = Symbol.IsArray ? "IList<" + Symbol.ElementType + ">" : opt.GetOutputName (Symbol.FullName);
opt.CodeGenerator.WriteFieldIdField (this, sw, indent, opt);
sw.WriteLine ();
sw.WriteLine ("{0}// Metadata.xml XPath field reference: path=\"{1}/field[@name='{2}']\"", indent, gen.MetadataXPathReference, JavaName);
sw.WriteLine ("{0}[Register (\"{1}\"{2})]", indent, JavaName, this.AdditionalAttributeString ());
sw.WriteLine ("{0}{1} {2}{3} {4} {{", indent, Visibility, IsStatic ? "static " : String.Empty, type, Name);
sw.WriteLine ("{0}\tget {{", indent);
opt.CodeGenerator.WriteFieldGetBody (this, sw, indent + "\t\t", opt);
sw.WriteLine ("{0}\t}}", indent);

if (!IsConst) {
sw.WriteLine ("{0}\tset {{", indent);
opt.CodeGenerator.WriteFieldSetBody (this, sw, indent + "\t\t", opt);
sw.WriteLine ("{0}\t}}", indent);
}
sw.WriteLine ("{0}}}", indent);
}

public void Generate (StreamWriter sw, string indent, CodeGenerationOptions opt, GenBase type)
{
if (IsEnumified)
sw.WriteLine ("[global::Android.Runtime.GeneratedEnum]");
if (NeedsProperty)
GenerateProperty (sw, indent, opt, type);
else {
sw.WriteLine ("{0}// Metadata.xml XPath field reference: path=\"{1}/field[@name='{2}']\"", indent, type.MetadataXPathReference, JavaName);
sw.WriteLine ("{0}[Register (\"{1}\"{2})]", indent, JavaName, this.AdditionalAttributeString ());
if (IsDeprecated)
sw.WriteLine ("{0}[Obsolete (\"{1}\")]", indent, DeprecatedComment);
if (Annotation != null)
sw.WriteLine ("{0}{1}", indent, Annotation);

// the Value complication is due to constant enum from negative integer value (C# compiler requires explicit parenthesis).
sw.WriteLine ("{0}{1} const {2} {3} = ({2}) {4};", indent, Visibility, opt.GetOutputName (Symbol.FullName), Name, Value.Contains ('-') && Symbol.FullName.Contains ('.') ? '(' + Value + ')' : Value);
}
}

public bool Validate (CodeGenerationOptions opt, GenericParameterDefinitionList type_params)
{
symbol = SymbolTable.Lookup (TypeName, type_params);
Expand Down
2 changes: 1 addition & 1 deletion tools/generator/GenBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -577,7 +577,7 @@ public bool GenFields (StreamWriter sw, string indent, CodeGenerationOptions opt
seen.Add (f.Name);
needsProperty = needsProperty || f.NeedsProperty;
sw.WriteLine ();
f.Generate (sw, indent, opt, this);
opt.CodeGenerator.WriteField (f, sw, indent, opt, this);
}
}
return needsProperty;
Expand Down
Loading