@@ -13,6 +13,7 @@ import {
13
13
Method ,
14
14
Null ,
15
15
Return ,
16
+ Statement ,
16
17
StringConstant ,
17
18
Symbol ,
18
19
} from "./javaCode" ;
@@ -23,6 +24,8 @@ import { makeIdentifier, upperInitialChar } from "./utils";
23
24
export interface BeanProperty {
24
25
name : string ;
25
26
value : Value ;
27
+ isPublic : boolean ;
28
+ isField : boolean ;
26
29
}
27
30
28
31
interface Factory {
@@ -117,17 +120,49 @@ export class Bean implements IBean {
117
120
this . _exceptions = [ ] ;
118
121
const variableName = ! this . isLazyInit ? `_${ this . identifier } ` : "value" ;
119
122
const [ constructorArgs , constructorArgsExceptions ] = collectionToJava ( this . constructorArgs ) ;
120
- const [ initialisers , initialisersExceptions ] : [ FnStatement [ ] , string [ ] [ ] ] =
123
+ const [ initialisersStatements , initialisersExceptions ] : [ Statement [ ] [ ] , string [ ] [ ] ] =
121
124
this . properties . size === 0
122
125
? [ [ ] , [ ] ]
123
126
: < any > _ . unzip ( [ ...this . properties ] . map ( ( property ) => {
124
127
const [ initialiserJava , initialiserExceptions ] = property . value . toJava ( ) ;
128
+ let statements : Statement [ ] ;
129
+ if ( property . isField ) {
130
+ if ( property . isPublic )
131
+ statements = [ new Assignment ( `${ variableName } .${ property . name } ` , initialiserJava ) ] ;
132
+ else {
133
+ const fieldVariableName = `${ property . name } _field` ;
134
+ statements = [
135
+ new Declaration (
136
+ "java.lang.reflect.Field" ,
137
+ fieldVariableName ,
138
+ new FnCall ( `${ variableName } .getClass().getDeclaredField` , [ new StringConstant ( property . name ) ] ) ) ,
139
+ new FnStatement ( new FnCall ( `${ fieldVariableName } .setAccessible` , [ new Symbol ( "true" ) ] ) ) ,
140
+ new FnStatement ( new FnCall ( `${ fieldVariableName } .set` , [ new Symbol ( variableName ) , initialiserJava ] ) ) ,
141
+ ] ;
142
+ }
143
+ } else {
144
+ const setterName = `set${ upperInitialChar ( property . name ) } ` ;
145
+ if ( property . isPublic )
146
+ statements = [ new FnStatement ( new FnCall ( `${ variableName } .${ setterName } ` , [ initialiserJava ] ) ) ] ;
147
+ else {
148
+ const setterVariableName = `${ property . name } _setter` ;
149
+ statements = [
150
+ new Declaration (
151
+ "java.lang.reflect.Method" ,
152
+ setterVariableName ,
153
+ new FnCall ( `${ variableName } .getClass().getDeclaredMethod` , [ new StringConstant ( setterName ) ] ) ) ,
154
+ new FnStatement ( new FnCall ( `${ setterVariableName } .setAccessible` , [ new Symbol ( "true" ) ] ) ) ,
155
+ new FnStatement ( new FnCall ( `${ setterVariableName } .invoke` , [ new Symbol ( variableName ) , initialiserJava ] ) ) ,
156
+ ] ;
157
+ }
158
+ }
125
159
return [
126
- new FnStatement ( new FnCall ( ` ${ variableName } .set ${ upperInitialChar ( property . name ) } ` , [ initialiserJava ] ) ) ,
160
+ statements ,
127
161
initialiserExceptions ,
128
162
] ;
129
163
} ) ) ;
130
164
this . _exceptions = _ . uniq ( constructorArgsExceptions . concat ( _ . flatten ( initialisersExceptions ) ) ) ;
165
+ const initialisers = _ . flatten ( initialisersStatements ) ;
131
166
if ( this . initMethod !== undefined )
132
167
initialisers . push ( new FnStatement ( new FnCall ( `${ variableName } .${ this . initMethod } ` , [ ] ) ) ) ;
133
168
let typeName ;
0 commit comments