11using System ;
22using System . Linq ;
33using System . Text . RegularExpressions ;
4+ using System . Xml ;
45using System . Xml . Linq ;
56using Java . Interop . Tools . JavaCallableWrappers ;
67using MonoDroid . Utils ;
@@ -26,6 +27,7 @@ public static ClassGen CreateClass (XElement pkg, XElement elem, CodeGenerationO
2627 } ;
2728
2829 FillApiSince ( klass , pkg , elem ) ;
30+ SetLineInfo ( klass , elem , options ) ;
2931
3032 foreach ( var child in elem . Elements ( ) ) {
3133 switch ( child . Name . LocalName ) {
@@ -35,26 +37,26 @@ public static ClassGen CreateClass (XElement pkg, XElement elem, CodeGenerationO
3537 klass . AddImplementedInterface ( iname ) ;
3638 break ;
3739 case "method" :
38- klass . AddMethod ( CreateMethod ( klass , child ) ) ;
40+ klass . AddMethod ( CreateMethod ( klass , child , options ) ) ;
3941 break ;
4042 case "constructor" :
41- klass . Ctors . Add ( CreateCtor ( klass , child ) ) ;
43+ klass . Ctors . Add ( CreateCtor ( klass , child , options ) ) ;
4244 break ;
4345 case "field" :
44- klass . AddField ( CreateField ( klass , child ) ) ;
46+ klass . AddField ( CreateField ( klass , child , options ) ) ;
4547 break ;
4648 case "typeParameters" :
4749 break ; // handled at GenBaseSupport
4850 default :
49- Report . LogCodedWarning ( 0 , Report . WarningUnexpectedChild , child . Name . ToString ( ) ) ;
51+ Report . LogCodedWarning ( 0 , Report . WarningUnexpectedChild , klass , child . Name . ToString ( ) ) ;
5052 break ;
5153 }
5254 }
5355
5456 return klass ;
5557 }
5658
57- public static Ctor CreateCtor ( GenBase declaringType , XElement elem )
59+ public static Ctor CreateCtor ( GenBase declaringType , XElement elem , CodeGenerationOptions options = null )
5860 {
5961 var ctor = new Ctor ( declaringType ) {
6062 ApiAvailableSince = declaringType . ApiAvailableSince ,
@@ -65,6 +67,8 @@ public static Ctor CreateCtor (GenBase declaringType, XElement elem)
6567 Visibility = elem . Visibility ( )
6668 } ;
6769
70+ SetLineInfo ( ctor , elem , options ) ;
71+
6872 var idx = ctor . Name . LastIndexOf ( '.' ) ;
6973
7074 if ( idx > 0 )
@@ -81,14 +85,14 @@ public static Ctor CreateCtor (GenBase declaringType, XElement elem)
8185
8286 if ( enclosingType == null ) {
8387 ctor . MissingEnclosingClass = true ;
84- Report . LogCodedWarning ( 0 , Report . WarningMissingClassForConstructor , ctor . Name , expectedEnclosingName ) ;
88+ Report . LogCodedWarning ( 0 , Report . WarningMissingClassForConstructor , ctor , ctor . Name , expectedEnclosingName ) ;
8589 } else
86- ctor . Parameters . AddFirst ( CreateParameterFromClassElement ( enclosingType ) ) ;
90+ ctor . Parameters . AddFirst ( CreateParameterFromClassElement ( enclosingType , options ) ) ;
8791 }
8892
8993 foreach ( var child in elem . Elements ( ) ) {
9094 if ( child . Name == "parameter" )
91- ctor . Parameters . Add ( CreateParameter ( child ) ) ;
95+ ctor . Parameters . Add ( CreateParameter ( child , options ) ) ;
9296 }
9397
9498 ctor . Name = EnsureValidIdentifer ( ctor . Name ) ;
@@ -98,7 +102,7 @@ public static Ctor CreateCtor (GenBase declaringType, XElement elem)
98102 return ctor ;
99103 }
100104
101- public static Field CreateField ( GenBase declaringType , XElement elem )
105+ public static Field CreateField ( GenBase declaringType , XElement elem , CodeGenerationOptions options = null )
102106 {
103107 var field = new Field {
104108 ApiAvailableSince = declaringType . ApiAvailableSince ,
@@ -110,7 +114,7 @@ public static Field CreateField (GenBase declaringType, XElement elem)
110114 IsStatic = elem . XGetAttribute ( "static" ) == "true" ,
111115 JavaName = elem . XGetAttribute ( "name" ) ,
112116 NotNull = elem . XGetAttribute ( "not-null" ) == "true" ,
113- SetterParameter = CreateParameter ( elem ) ,
117+ SetterParameter = CreateParameter ( elem , options ) ,
114118 TypeName = elem . XGetAttribute ( "type" ) ,
115119 Value = elem . XGetAttribute ( "value" ) , // do not trim
116120 Visibility = elem . XGetAttribute ( "visibility" )
@@ -131,6 +135,7 @@ public static Field CreateField (GenBase declaringType, XElement elem)
131135 }
132136
133137 FillApiSince ( field , elem ) ;
138+ SetLineInfo ( field , elem , options ) ;
134139
135140 return field ;
136141 }
@@ -214,6 +219,7 @@ public static InterfaceGen CreateInterface (XElement pkg, XElement elem, CodeGen
214219 } ;
215220
216221 FillApiSince ( iface , pkg , elem ) ;
222+ SetLineInfo ( iface , elem , options ) ;
217223
218224 foreach ( var child in elem . Elements ( ) ) {
219225 switch ( child . Name . LocalName ) {
@@ -223,23 +229,23 @@ public static InterfaceGen CreateInterface (XElement pkg, XElement elem, CodeGen
223229 iface . AddImplementedInterface ( iname ) ;
224230 break ;
225231 case "method" :
226- iface . AddMethod ( CreateMethod ( iface , child ) ) ;
232+ iface . AddMethod ( CreateMethod ( iface , child , options ) ) ;
227233 break ;
228234 case "field" :
229- iface . AddField ( CreateField ( iface , child ) ) ;
235+ iface . AddField ( CreateField ( iface , child , options ) ) ;
230236 break ;
231237 case "typeParameters" :
232238 break ; // handled at GenBaseSupport
233239 default :
234- Report . LogCodedWarning ( 0 , Report . WarningUnexpectedInterfaceChild , child . ToString ( ) ) ;
240+ Report . LogCodedWarning ( 0 , Report . WarningUnexpectedInterfaceChild , iface , child . ToString ( ) ) ;
235241 break ;
236242 }
237243 }
238244
239245 return iface ;
240246 }
241247
242- public static Method CreateMethod ( GenBase declaringType , XElement elem )
248+ public static Method CreateMethod ( GenBase declaringType , XElement elem , CodeGenerationOptions options = null )
243249 {
244250 var method = new Method ( declaringType ) {
245251 ApiAvailableSince = declaringType . ApiAvailableSince ,
@@ -284,19 +290,20 @@ public static Method CreateMethod (GenBase declaringType, XElement elem)
284290
285291 foreach ( var child in elem . Elements ( ) ) {
286292 if ( child . Name == "parameter" )
287- method . Parameters . Add ( CreateParameter ( child ) ) ;
293+ method . Parameters . Add ( CreateParameter ( child , options ) ) ;
288294 }
289295
290296 method . Name = EnsureValidIdentifer ( method . Name ) ;
291297
292298 method . FillReturnType ( ) ;
293299
294300 FillApiSince ( method , elem ) ;
301+ SetLineInfo ( method , elem , options ) ;
295302
296303 return method ;
297304 }
298305
299- public static Parameter CreateParameter ( XElement elem )
306+ public static Parameter CreateParameter ( XElement elem , CodeGenerationOptions options = null )
300307 {
301308 string managedName = elem . XGetAttribute ( "managedName" ) ;
302309 string name = ! string . IsNullOrEmpty ( managedName ) ? managedName : TypeNameUtilities . MangleName ( EnsureValidIdentifer ( elem . XGetAttribute ( "name" ) ) ) ;
@@ -308,15 +315,19 @@ public static Parameter CreateParameter (XElement elem)
308315 var result = new Parameter ( name , enum_type ?? java_type , enum_type ?? managed_type , enum_type != null , java_type , not_null ) ;
309316 if ( elem . Attribute ( "sender" ) != null )
310317 result . IsSender = true ;
318+ SetLineInfo ( result , elem , options ) ;
311319 return result ;
312320 }
313321
314- public static Parameter CreateParameterFromClassElement ( XElement elem )
322+ public static Parameter CreateParameterFromClassElement ( XElement elem , CodeGenerationOptions options )
315323 {
316324 string name = "__self" ;
317325 string java_type = elem . XGetAttribute ( "name" ) ;
318326 string java_package = elem . Parent . XGetAttribute ( "name" ) ;
319- return new Parameter ( name , java_package + "." + java_type , null , false ) ;
327+ var p = new Parameter ( name , java_package + "." + java_type , null , false ) ;
328+
329+ SetLineInfo ( p , elem , options ) ;
330+ return p ;
320331 }
321332
322333 static string EnsureValidIdentifer ( string name )
@@ -403,5 +414,15 @@ static bool IsPrefixableName (string name)
403414 // IBlahBlah is not prefixed with 'I'
404415 return name . Length <= 2 || name [ 0 ] != 'I' || ! char . IsUpper ( name [ 1 ] ) ;
405416 }
417+
418+ static void SetLineInfo ( ISourceLineInfo model , XNode node , CodeGenerationOptions options )
419+ {
420+ model . SourceFile = options ? . ApiXmlFile ;
421+
422+ if ( node is IXmlLineInfo info && info . HasLineInfo ( ) ) {
423+ model . LineNumber = info . LineNumber ;
424+ model . LinePosition = info . LinePosition ;
425+ }
426+ }
406427 }
407428}
0 commit comments