@@ -73,7 +73,7 @@ const mods = {
73
73
let isTest = isTestRule ( rule )
74
74
75
75
addSourceFolders ( m . srcs , rule , isTest )
76
- mergeDeps ( m . deps , depsOf ( rule , isTest ) )
76
+ mergeDeps ( m . deps , depsOf ( t , rule , isTest ) )
77
77
78
78
moduleByTarget [ String ( t ) ] = m
79
79
}
@@ -134,7 +134,7 @@ const mods = {
134
134
}
135
135
}
136
136
137
- function depsOf ( rule , isTestRule ) {
137
+ function depsOf ( target , rule , isTestRule ) {
138
138
let plainDeps = rule [ buck . attr . deps ] || [ ]
139
139
let providedDeps = rule [ buck . attr . providedDeps ] || [ ]
140
140
let exportedDeps = rule [ buck . attr . exportedDeps ] || [ ]
@@ -144,10 +144,11 @@ const mods = {
144
144
...plainDeps ,
145
145
...providedDeps ,
146
146
...exportedDeps ,
147
- ...exportedProvidedDeps ] . reduce ( ( ds , d ) => ( ds [ d ] = { } , ds ) , { } )
147
+ ...exportedProvidedDeps ]
148
+ . map ( d => target . resolve ( buck . target ( d ) ) )
149
+ . reduce ( ( ds , d ) => ( ds [ d ] = { target :d } , ds ) , { } )
148
150
149
151
for ( let [ k , dep ] of Object . entries ( deps ) ) {
150
- dep . target = buck . target ( k )
151
152
dep . test = isTestRule
152
153
dep . provided = providedDeps . includes ( k ) || exportedProvidedDeps . includes ( k )
153
154
dep . exported = exportedDeps . includes ( k ) || exportedProvidedDeps . includes ( k )
@@ -212,19 +213,28 @@ const mods = {
212
213
}
213
214
}
214
215
215
- function collectTransitiveDependencies ( target ) {
216
- let result = new Set ( )
217
- let toProcess = [ target ]
218
- while ( toProcess . length > 0 ) {
219
- let d = toProcess . shift ( )
220
- if ( result . has ( d ) ) continue
221
- result . add ( d )
222
- let deplib = libs . byTarget [ d ]
223
- if ( deplib ) {
224
- toProcess . push ( ...( ( deplib . options . deps || [ ] ) . map ( buck . target ) . map ( String ) ) )
216
+ function collectLibraryTransitiveDependencies ( target ) {
217
+ if ( ! ( target in libs . byTarget ) ) throw `Not in libs.byTarget: ${ target } `
218
+
219
+ let results = new Set ( )
220
+ let unprocessed = [ target ]
221
+
222
+ do {
223
+ let l = unprocessed . shift ( )
224
+ results . add ( l )
225
+ let deplib = libs . byTarget [ l ]
226
+ for ( let d of ( deplib . options . deps || [ ] ) ) {
227
+ let t = deplib . target . resolve ( d ) . toString ( )
228
+ if ( ( t in libs . byTarget ) && ! results . has ( l ) ) {
229
+ unprocessed . push ( t )
230
+ }
231
+ // it occurs to me that under current model, we cannot
232
+ // properly propagate library's dependency on a [ide] module,
233
+ // only to other external or internal libraries, should be fine though
225
234
}
226
- }
227
- return [ ...result ]
235
+ } while ( unprocessed . length > 0 )
236
+
237
+ return [ ...results ]
228
238
}
229
239
230
240
function wireDependencies ( ) {
@@ -234,30 +244,37 @@ const mods = {
234
244
// resolve dependency as sibling module in project workspace
235
245
if ( t in moduleByTarget ) {
236
246
let mod = moduleByTarget [ t ]
237
- m . depmods [ mod . path ] = Object . assign ( { } , dep , { mod} )
247
+ if ( mod !== m ) {
248
+ // in case of local dependency, we cannot add dependency on self module
249
+ // only dependency on local internal libs (to be jar compiled) are supported
250
+ // but we mark dependency resolved anyway
251
+ m . depmods [ mod . path ] = Object . assign ( { } , dep , { mod} )
252
+ }
238
253
resolved = true
239
254
}
240
255
// and / or as dependency to a jar library (external/3rdparty or prebuilt internal)
241
256
// if both module and library dependency are not desired at the same time
242
257
// it's better to manage these dependencies, potentially, by
243
258
// making module reexport same dependencies instead of using library directly
259
+
244
260
if ( t in libs . byTarget ) {
245
- let deplibs = collectTransitiveDependencies ( t )
246
- . filter ( dk => ! ! libs . byTarget [ dk ] )
261
+ let deplibs = collectLibraryTransitiveDependencies ( t )
247
262
. reduce ( ( r , depkey ) => {
248
263
r [ depkey ] = Object . assign ( { } , dep , { lib : libs . byTarget [ depkey ] } )
249
264
return r
250
265
} , { } )
266
+
251
267
mergeDeps ( m . deplibs , deplibs )
252
268
253
269
resolved = true
254
270
}
271
+
255
272
if ( ! resolved ) {
256
- if ( buck . target ( t ) . isLocal ) {
257
- // local dependency should be implicit in IDE
258
- } else {
259
- err ( ` ${ p } : Unresolvable dependency ${ t } ` )
260
- }
273
+ let t = buck . target ( t )
274
+ if ( t . isLocal || t . path == m . path ) {
275
+ // local dependency should be implicit in IDE module
276
+ // or it should have been an internal library
277
+ } else err ( ` ${ p } : Unresolvable dependency ${ t } ` )
261
278
}
262
279
}
263
280
}
0 commit comments