@@ -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 ();
@@ -343,15 +352,15 @@ private static IPackageFragmentRoot[] findPackageFragmentRoots(IJavaProject java
343
352
return null ;
344
353
}
345
354
346
- private static List <PackageNode > getPackages (PackageParams query , IProgressMonitor pm ) {
355
+ private static List <PackageNode > getPackageRootChildren (PackageParams query , IProgressMonitor pm ) {
347
356
try {
348
357
IPackageFragmentRoot packageRoot = getPackageFragmentRootFromQuery (query );
349
358
if (packageRoot == null ) {
350
359
throw new CoreException (
351
360
new Status (IStatus .ERROR , JdtlsExtActivator .PLUGIN_ID , String .format ("No package root found for %s" , query .getPath ())));
352
361
}
353
362
List <Object > result = getPackageFragmentRootContent (packageRoot , query .isHierarchicalView (), pm );
354
- ResourceSet resourceSet = new ResourceSet (result );
363
+ ResourceSet resourceSet = new ResourceSet (result , query . isHierarchicalView () );
355
364
ResourceVisitor visitor = new JavaResourceVisitor (packageRoot .getJavaProject ());
356
365
resourceSet .accept (visitor );
357
366
return visitor .getNodes ();
@@ -375,28 +384,28 @@ private static IPackageFragmentRoot getPackageFragmentRootFromQuery(PackageParam
375
384
return javaProject .findPackageFragmentRoot (Path .fromPortableString (query .getRootPath ()));
376
385
} catch (JavaModelException e ) {
377
386
JdtlsExtActivator .log (e );
378
- return null ;
379
387
}
380
388
}
381
389
}
382
390
383
391
return null ;
384
392
}
385
393
386
- private static List <PackageNode > getRootTypes (PackageParams query , IProgressMonitor pm ) {
394
+ private static List <PackageNode > getPackageChildren (PackageParams query , IProgressMonitor pm ) {
387
395
IPackageFragment packageFragment = (IPackageFragment ) JavaCore .create (query .getHandlerIdentifier ());
388
- List <Object > children = getChildrenForPackage (packageFragment );
396
+ List <Object > children = getChildrenForPackage (packageFragment , pm );
389
397
ResourceSet resourceSet = new ResourceSet (children );
390
398
ResourceVisitor visitor = new JavaResourceVisitor (packageFragment .getJavaProject ());
391
399
resourceSet .accept (visitor );
392
400
return visitor .getNodes ();
393
401
}
394
402
395
- public static List <Object > getChildrenForPackage (IPackageFragment packageFragment ) {
403
+ public static List <Object > getChildrenForPackage (IPackageFragment packageFragment , IProgressMonitor pm ) {
396
404
if (packageFragment == null ) {
397
405
return Collections .emptyList ();
398
406
}
399
407
408
+ refreshLocal (packageFragment .getResource (), pm );
400
409
List <Object > children = new LinkedList <>();
401
410
try {
402
411
for (IJavaElement element : packageFragment .getChildren ()) {
@@ -412,10 +421,7 @@ public static List<Object> getChildrenForPackage(IPackageFragment packageFragmen
412
421
}
413
422
}
414
423
415
- Object [] nonJavaResources = packageFragment .getNonJavaResources ();
416
- for (Object resource : nonJavaResources ) {
417
- children .add (resource );
418
- }
424
+ Collections .addAll (children , packageFragment .getNonJavaResources ());
419
425
} catch (JavaModelException e ) {
420
426
JdtlsExtActivator .log (e );
421
427
}
@@ -458,6 +464,7 @@ private static List<PackageNode> getFolderChildren(PackageParams query, IProgres
458
464
// general resource folder.
459
465
IFolder folder = ResourcesPlugin .getWorkspace ().getRoot ().getFolder (Path .fromPortableString (query .getPath ()));
460
466
if (folder .exists ()) {
467
+ refreshLocal (folder , pm );
461
468
children .addAll (Arrays .asList (folder .members ()));
462
469
javaProject = JavaCore .create (folder .getProject ());
463
470
}
@@ -488,6 +495,7 @@ private static List<PackageNode> getFolderChildren(PackageParams query, IProgres
488
495
*/
489
496
public static List <Object > getPackageFragmentRootContent (IPackageFragmentRoot root , boolean isHierarchicalView , IProgressMonitor pm ) throws CoreException {
490
497
ArrayList <Object > result = new ArrayList <>();
498
+ refreshLocal (root .getResource (), pm );
491
499
if (isHierarchicalView ) {
492
500
Map <String , IJavaElement > map = new HashMap <>();
493
501
for (IJavaElement child : root .getChildren ()) {
@@ -583,4 +591,15 @@ public static IJavaProject getJavaProject(String projectUri) {
583
591
}
584
592
return null ;
585
593
}
594
+
595
+ private static void refreshLocal (IResource resource , IProgressMonitor monitor ) {
596
+ if (resource == null || !resource .exists ()) {
597
+ return ;
598
+ }
599
+ try {
600
+ resource .refreshLocal (IResource .DEPTH_ONE , monitor );
601
+ } catch (CoreException e ) {
602
+ JdtlsExtActivator .log (e );
603
+ }
604
+ }
586
605
}
0 commit comments