@@ -78,10 +78,10 @@ public class PackageCommand {
7878
7979 static {
8080 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 );
8585 commands .put (NodeKind .FOLDER , PackageCommand ::getFolderChildren );
8686 }
8787
@@ -225,10 +225,17 @@ public static List<PackageNode> resolvePath(List<Object> arguments, IProgressMon
225225 * @throws JavaModelException when fails to get path or resource
226226 */
227227 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 ) ) {
230230 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 ) {
232239 IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot ) javaElement ;
233240 nodeList .add (0 , new PackageRootNode (pkgRoot ,
234241 element .getProjectRelativePath ().toPortableString (), NodeKind .PACKAGEROOT ));
@@ -239,12 +246,6 @@ private static List<PackageNode> getParentAncestorNodes(IResource element) throw
239246 if (packageFragment .containsJavaResources () || packageFragment .getNonJavaResources ().length > 0 ) {
240247 nodeList .add (0 , PackageNode .createNodeForPackageFragment (packageFragment ));
241248 }
242-
243- } else if (javaElement == null ) {
244- PackageNode entry = PackageNode .createNodeForResource (element );
245- if (entry != null ) {
246- nodeList .add (0 , entry );
247- }
248249 }
249250 element = element .getParent ();
250251 }
@@ -255,20 +256,28 @@ private static List<PackageNode> getParentAncestorNodes(IResource element) throw
255256 /**
256257 * Get the class path container list.
257258 */
258- private static List <PackageNode > getContainers (PackageParams query , IProgressMonitor pm ) {
259+ private static List <PackageNode > getProjectChildren (PackageParams query , IProgressMonitor pm ) {
259260 IJavaProject javaProject = getJavaProject (query .getProjectUri ());
260261 if (javaProject != null ) {
262+ refreshLocal (javaProject .getProject (), pm );
261263 List <Object > children = new LinkedList <>();
262264 boolean hasReferencedLibraries = false ;
263265 try {
264266 IClasspathEntry [] references = javaProject .getRawClasspath ();
265267 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 ) {
267273 children .add (entry );
268- } else {
274+ } else if ( entry . getEntryKind () == IClasspathEntry . CPE_LIBRARY || entry . getEntryKind () == IClasspathEntry . CPE_VARIABLE ) {
269275 hasReferencedLibraries = true ;
276+ } else {
277+ // TODO: handle IClasspathEntry.CPE_PROJECT
270278 }
271279 }
280+ children .addAll (Arrays .asList (javaProject .getNonJavaResources ()));
272281 } catch (CoreException e ) {
273282 JdtlsExtActivator .logException ("Problem load project library " , e );
274283 }
@@ -278,7 +287,7 @@ private static List<PackageNode> getContainers(PackageParams query, IProgressMon
278287 resourceSet .accept (visitor );
279288 List <PackageNode > result = visitor .getNodes ();
280289
281- // Invisble project will always have the referenced libraries entry
290+ // Invisible project will always have the referenced libraries entry
282291 if (!ProjectUtils .isVisibleProject (javaProject .getProject ())) {
283292 result .add (PackageNode .REFERENCED_LIBRARIES_CONTAINER );
284293 } else if (hasReferencedLibraries ) {
@@ -289,7 +298,7 @@ private static List<PackageNode> getContainers(PackageParams query, IProgressMon
289298 return Collections .emptyList ();
290299 }
291300
292- private static List <PackageNode > getPackageFragmentRoots (PackageParams query , IProgressMonitor pm ) {
301+ private static List <PackageNode > getContainerChildren (PackageParams query , IProgressMonitor pm ) {
293302 IJavaProject javaProject = getJavaProject (query .getProjectUri ());
294303 if (javaProject == null ) {
295304 return Collections .emptyList ();
@@ -311,6 +320,7 @@ private static List<PackageNode> getPackageFragmentRoots(PackageParams query, IP
311320
312321 for (IPackageFragmentRoot fragmentRoot : packageFragmentRoots ) {
313322 children .add (fragmentRoot );
323+ children .addAll (Arrays .asList (fragmentRoot .getNonJavaResources ()));
314324 }
315325 }
316326 } catch (CoreException e ) {
@@ -343,15 +353,15 @@ private static IPackageFragmentRoot[] findPackageFragmentRoots(IJavaProject java
343353 return null ;
344354 }
345355
346- private static List <PackageNode > getPackages (PackageParams query , IProgressMonitor pm ) {
356+ private static List <PackageNode > getPackageRootChildren (PackageParams query , IProgressMonitor pm ) {
347357 try {
348358 IPackageFragmentRoot packageRoot = getPackageFragmentRootFromQuery (query );
349359 if (packageRoot == null ) {
350360 throw new CoreException (
351361 new Status (IStatus .ERROR , JdtlsExtActivator .PLUGIN_ID , String .format ("No package root found for %s" , query .getPath ())));
352362 }
353363 List <Object > result = getPackageFragmentRootContent (packageRoot , query .isHierarchicalView (), pm );
354- ResourceSet resourceSet = new ResourceSet (result );
364+ ResourceSet resourceSet = new ResourceSet (result , query . isHierarchicalView () );
355365 ResourceVisitor visitor = new JavaResourceVisitor (packageRoot .getJavaProject ());
356366 resourceSet .accept (visitor );
357367 return visitor .getNodes ();
@@ -375,28 +385,28 @@ private static IPackageFragmentRoot getPackageFragmentRootFromQuery(PackageParam
375385 return javaProject .findPackageFragmentRoot (Path .fromPortableString (query .getRootPath ()));
376386 } catch (JavaModelException e ) {
377387 JdtlsExtActivator .log (e );
378- return null ;
379388 }
380389 }
381390 }
382391
383392 return null ;
384393 }
385394
386- private static List <PackageNode > getRootTypes (PackageParams query , IProgressMonitor pm ) {
395+ private static List <PackageNode > getPackageChildren (PackageParams query , IProgressMonitor pm ) {
387396 IPackageFragment packageFragment = (IPackageFragment ) JavaCore .create (query .getHandlerIdentifier ());
388- List <Object > children = getChildrenForPackage (packageFragment );
397+ List <Object > children = getChildrenForPackage (packageFragment , pm );
389398 ResourceSet resourceSet = new ResourceSet (children );
390399 ResourceVisitor visitor = new JavaResourceVisitor (packageFragment .getJavaProject ());
391400 resourceSet .accept (visitor );
392401 return visitor .getNodes ();
393402 }
394403
395- public static List <Object > getChildrenForPackage (IPackageFragment packageFragment ) {
404+ public static List <Object > getChildrenForPackage (IPackageFragment packageFragment , IProgressMonitor pm ) {
396405 if (packageFragment == null ) {
397406 return Collections .emptyList ();
398407 }
399408
409+ refreshLocal (packageFragment .getResource (), pm );
400410 List <Object > children = new LinkedList <>();
401411 try {
402412 for (IJavaElement element : packageFragment .getChildren ()) {
@@ -458,6 +468,7 @@ private static List<PackageNode> getFolderChildren(PackageParams query, IProgres
458468 // general resource folder.
459469 IFolder folder = ResourcesPlugin .getWorkspace ().getRoot ().getFolder (Path .fromPortableString (query .getPath ()));
460470 if (folder .exists ()) {
471+ refreshLocal (folder , pm );
461472 children .addAll (Arrays .asList (folder .members ()));
462473 javaProject = JavaCore .create (folder .getProject ());
463474 }
@@ -488,6 +499,7 @@ private static List<PackageNode> getFolderChildren(PackageParams query, IProgres
488499 */
489500 public static List <Object > getPackageFragmentRootContent (IPackageFragmentRoot root , boolean isHierarchicalView , IProgressMonitor pm ) throws CoreException {
490501 ArrayList <Object > result = new ArrayList <>();
502+ refreshLocal (root .getResource (), pm );
491503 if (isHierarchicalView ) {
492504 Map <String , IJavaElement > map = new HashMap <>();
493505 for (IJavaElement child : root .getChildren ()) {
@@ -583,4 +595,15 @@ public static IJavaProject getJavaProject(String projectUri) {
583595 }
584596 return null ;
585597 }
598+
599+ private static void refreshLocal (IResource resource , IProgressMonitor monitor ) {
600+ if (resource == null || !resource .exists ()) {
601+ return ;
602+ }
603+ try {
604+ resource .refreshLocal (IResource .DEPTH_ONE , monitor );
605+ } catch (CoreException e ) {
606+ JdtlsExtActivator .log (e );
607+ }
608+ }
586609}
0 commit comments