@@ -78,10 +78,10 @@ public class PackageCommand {
78
78
79
79
static {
80
80
commands = new HashMap <>();
81
- commands .put (NodeKind .PROJECT , PackageCommand ::getContainers );
82
- commands .put (NodeKind .CONTAINER , PackageCommand ::getPackageFragmentRoots );
83
- commands .put (NodeKind .PACKAGEROOT , PackageCommand ::getPackages );
84
- commands .put (NodeKind .PACKAGE , PackageCommand ::getRootTypes );
81
+ commands .put (NodeKind .PROJECT , PackageCommand ::getProjectChildren );
82
+ commands .put (NodeKind .CONTAINER , PackageCommand ::getContainerChildren );
83
+ commands .put (NodeKind .PACKAGEROOT , PackageCommand ::getPackageRootChildren );
84
+ commands .put (NodeKind .PACKAGE , PackageCommand ::getPackageChildren );
85
85
commands .put (NodeKind .FOLDER , PackageCommand ::getFolderChildren );
86
86
}
87
87
@@ -225,10 +225,17 @@ public static List<PackageNode> resolvePath(List<Object> arguments, IProgressMon
225
225
* @throws JavaModelException when fails to get path or resource
226
226
*/
227
227
private static List <PackageNode > getParentAncestorNodes (IResource element ) throws JavaModelException {
228
- List <PackageNode > nodeList = new ArrayList <>();
229
- while (element != null ) {
228
+ List <PackageNode > nodeList = new LinkedList <>();
229
+ while (element != null && !( element instanceof IWorkspaceRoot ) ) {
230
230
IJavaElement javaElement = JavaCore .create (element );
231
- if (javaElement instanceof IPackageFragmentRoot ) {
231
+ if (javaElement == null ) {
232
+ PackageNode entry = PackageNode .createNodeForResource (element );
233
+ if (entry != null ) {
234
+ nodeList .add (0 , entry );
235
+ }
236
+ } else if (javaElement instanceof IJavaProject ) {
237
+ nodeList .add (0 , PackageNode .createNodeForProject (javaElement ));
238
+ } else if (javaElement instanceof IPackageFragmentRoot ) {
232
239
IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot ) javaElement ;
233
240
nodeList .add (0 , new PackageRootNode (pkgRoot ,
234
241
element .getProjectRelativePath ().toPortableString (), NodeKind .PACKAGEROOT ));
@@ -239,12 +246,6 @@ private static List<PackageNode> getParentAncestorNodes(IResource element) throw
239
246
if (packageFragment .containsJavaResources () || packageFragment .getNonJavaResources ().length > 0 ) {
240
247
nodeList .add (0 , PackageNode .createNodeForPackageFragment (packageFragment ));
241
248
}
242
-
243
- } else if (javaElement == null ) {
244
- PackageNode entry = PackageNode .createNodeForResource (element );
245
- if (entry != null ) {
246
- nodeList .add (0 , entry );
247
- }
248
249
}
249
250
element = element .getParent ();
250
251
}
@@ -255,20 +256,28 @@ private static List<PackageNode> getParentAncestorNodes(IResource element) throw
255
256
/**
256
257
* Get the class path container list.
257
258
*/
258
- private static List <PackageNode > getContainers (PackageParams query , IProgressMonitor pm ) {
259
+ private static List <PackageNode > getProjectChildren (PackageParams query , IProgressMonitor pm ) {
259
260
IJavaProject javaProject = getJavaProject (query .getProjectUri ());
260
261
if (javaProject != null ) {
262
+ refreshLocal (javaProject .getProject (), pm );
261
263
List <Object > children = new LinkedList <>();
262
264
boolean hasReferencedLibraries = false ;
263
265
try {
264
266
IClasspathEntry [] references = javaProject .getRawClasspath ();
265
267
for (IClasspathEntry entry : references ) {
266
- if (entry .getEntryKind () != IClasspathEntry .CPE_LIBRARY && entry .getEntryKind () != IClasspathEntry .CPE_VARIABLE ) {
268
+ int entryKind = entry .getEntryKind ();
269
+ if (entryKind == IClasspathEntry .CPE_SOURCE ) {
270
+ IPackageFragmentRoot [] packageFragmentRoots = javaProject .findPackageFragmentRoots (entry );
271
+ children .addAll (Arrays .asList (packageFragmentRoots ));
272
+ } else if (entryKind == IClasspathEntry .CPE_CONTAINER ) {
267
273
children .add (entry );
268
- } else {
274
+ } else if ( entry . getEntryKind () == IClasspathEntry . CPE_LIBRARY || entry . getEntryKind () == IClasspathEntry . CPE_VARIABLE ) {
269
275
hasReferencedLibraries = true ;
276
+ } else {
277
+ // TODO: handle IClasspathEntry.CPE_PROJECT
270
278
}
271
279
}
280
+ Collections .addAll (children , javaProject .getNonJavaResources ());
272
281
} catch (CoreException e ) {
273
282
JdtlsExtActivator .logException ("Problem load project library " , e );
274
283
}
@@ -278,7 +287,7 @@ private static List<PackageNode> getContainers(PackageParams query, IProgressMon
278
287
resourceSet .accept (visitor );
279
288
List <PackageNode > result = visitor .getNodes ();
280
289
281
- // Invisble project will always have the referenced libraries entry
290
+ // Invisible project will always have the referenced libraries entry
282
291
if (!ProjectUtils .isVisibleProject (javaProject .getProject ())) {
283
292
result .add (PackageNode .REFERENCED_LIBRARIES_CONTAINER );
284
293
} else if (hasReferencedLibraries ) {
@@ -289,7 +298,7 @@ private static List<PackageNode> getContainers(PackageParams query, IProgressMon
289
298
return Collections .emptyList ();
290
299
}
291
300
292
- private static List <PackageNode > getPackageFragmentRoots (PackageParams query , IProgressMonitor pm ) {
301
+ private static List <PackageNode > getContainerChildren (PackageParams query , IProgressMonitor pm ) {
293
302
IJavaProject javaProject = getJavaProject (query .getProjectUri ());
294
303
if (javaProject == null ) {
295
304
return Collections .emptyList ();
@@ -311,6 +320,7 @@ private static List<PackageNode> getPackageFragmentRoots(PackageParams query, IP
311
320
312
321
for (IPackageFragmentRoot fragmentRoot : packageFragmentRoots ) {
313
322
children .add (fragmentRoot );
323
+ children .addAll (Arrays .asList (fragmentRoot .getNonJavaResources ()));
314
324
}
315
325
}
316
326
} catch (CoreException e ) {
@@ -343,15 +353,15 @@ private static IPackageFragmentRoot[] findPackageFragmentRoots(IJavaProject java
343
353
return null ;
344
354
}
345
355
346
- private static List <PackageNode > getPackages (PackageParams query , IProgressMonitor pm ) {
356
+ private static List <PackageNode > getPackageRootChildren (PackageParams query , IProgressMonitor pm ) {
347
357
try {
348
358
IPackageFragmentRoot packageRoot = getPackageFragmentRootFromQuery (query );
349
359
if (packageRoot == null ) {
350
360
throw new CoreException (
351
361
new Status (IStatus .ERROR , JdtlsExtActivator .PLUGIN_ID , String .format ("No package root found for %s" , query .getPath ())));
352
362
}
353
363
List <Object > result = getPackageFragmentRootContent (packageRoot , query .isHierarchicalView (), pm );
354
- ResourceSet resourceSet = new ResourceSet (result );
364
+ ResourceSet resourceSet = new ResourceSet (result , query . isHierarchicalView () );
355
365
ResourceVisitor visitor = new JavaResourceVisitor (packageRoot .getJavaProject ());
356
366
resourceSet .accept (visitor );
357
367
return visitor .getNodes ();
@@ -375,28 +385,28 @@ private static IPackageFragmentRoot getPackageFragmentRootFromQuery(PackageParam
375
385
return javaProject .findPackageFragmentRoot (Path .fromPortableString (query .getRootPath ()));
376
386
} catch (JavaModelException e ) {
377
387
JdtlsExtActivator .log (e );
378
- return null ;
379
388
}
380
389
}
381
390
}
382
391
383
392
return null ;
384
393
}
385
394
386
- private static List <PackageNode > getRootTypes (PackageParams query , IProgressMonitor pm ) {
395
+ private static List <PackageNode > getPackageChildren (PackageParams query , IProgressMonitor pm ) {
387
396
IPackageFragment packageFragment = (IPackageFragment ) JavaCore .create (query .getHandlerIdentifier ());
388
- List <Object > children = getChildrenForPackage (packageFragment );
397
+ List <Object > children = getChildrenForPackage (packageFragment , pm );
389
398
ResourceSet resourceSet = new ResourceSet (children );
390
399
ResourceVisitor visitor = new JavaResourceVisitor (packageFragment .getJavaProject ());
391
400
resourceSet .accept (visitor );
392
401
return visitor .getNodes ();
393
402
}
394
403
395
- public static List <Object > getChildrenForPackage (IPackageFragment packageFragment ) {
404
+ public static List <Object > getChildrenForPackage (IPackageFragment packageFragment , IProgressMonitor pm ) {
396
405
if (packageFragment == null ) {
397
406
return Collections .emptyList ();
398
407
}
399
408
409
+ refreshLocal (packageFragment .getResource (), pm );
400
410
List <Object > children = new LinkedList <>();
401
411
try {
402
412
for (IJavaElement element : packageFragment .getChildren ()) {
@@ -412,10 +422,7 @@ public static List<Object> getChildrenForPackage(IPackageFragment packageFragmen
412
422
}
413
423
}
414
424
415
- Object [] nonJavaResources = packageFragment .getNonJavaResources ();
416
- for (Object resource : nonJavaResources ) {
417
- children .add (resource );
418
- }
425
+ Collections .addAll (children , packageFragment .getNonJavaResources ());
419
426
} catch (JavaModelException e ) {
420
427
JdtlsExtActivator .log (e );
421
428
}
@@ -458,6 +465,7 @@ private static List<PackageNode> getFolderChildren(PackageParams query, IProgres
458
465
// general resource folder.
459
466
IFolder folder = ResourcesPlugin .getWorkspace ().getRoot ().getFolder (Path .fromPortableString (query .getPath ()));
460
467
if (folder .exists ()) {
468
+ refreshLocal (folder , pm );
461
469
children .addAll (Arrays .asList (folder .members ()));
462
470
javaProject = JavaCore .create (folder .getProject ());
463
471
}
@@ -488,6 +496,7 @@ private static List<PackageNode> getFolderChildren(PackageParams query, IProgres
488
496
*/
489
497
public static List <Object > getPackageFragmentRootContent (IPackageFragmentRoot root , boolean isHierarchicalView , IProgressMonitor pm ) throws CoreException {
490
498
ArrayList <Object > result = new ArrayList <>();
499
+ refreshLocal (root .getResource (), pm );
491
500
if (isHierarchicalView ) {
492
501
Map <String , IJavaElement > map = new HashMap <>();
493
502
for (IJavaElement child : root .getChildren ()) {
@@ -583,4 +592,15 @@ public static IJavaProject getJavaProject(String projectUri) {
583
592
}
584
593
return null ;
585
594
}
595
+
596
+ private static void refreshLocal (IResource resource , IProgressMonitor monitor ) {
597
+ if (resource == null || !resource .exists ()) {
598
+ return ;
599
+ }
600
+ try {
601
+ resource .refreshLocal (IResource .DEPTH_ONE , monitor );
602
+ } catch (CoreException e ) {
603
+ JdtlsExtActivator .log (e );
604
+ }
605
+ }
586
606
}
0 commit comments