4141import org .eclipse .jdt .core .IJarEntryResource ;
4242import org .eclipse .jdt .core .IJavaElement ;
4343import org .eclipse .jdt .core .IJavaProject ;
44+ import org .eclipse .jdt .core .IModuleDescription ;
4445import org .eclipse .jdt .core .IPackageFragment ;
4546import org .eclipse .jdt .core .IPackageFragmentRoot ;
4647import org .eclipse .jdt .core .IType ;
@@ -125,8 +126,8 @@ public static List<PackageNode> resolvePath(List<Object> arguments, IProgressMon
125126 if (typeRoot != null && typeRoot .findPrimaryType () != null ) {
126127 // Add project node:
127128 result .add (PackageNode .createNodeForProject (typeRoot ));
128- IPackageFragment packageFragment = (IPackageFragment ) typeRoot .getParent ( );
129- IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot ) packageFragment .getParent ( );
129+ IPackageFragment packageFragment = (IPackageFragment ) typeRoot .getAncestor ( IJavaElement . PACKAGE_FRAGMENT );
130+ IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot ) packageFragment .getAncestor ( IJavaElement . PACKAGE_FRAGMENT_ROOT );
130131 // TODO: Let the client handle the display instead. Server side should always
131132 // provide the container node.
132133 boolean isClassFile = typeRoot instanceof IClassFile ;
@@ -280,6 +281,7 @@ private static List<PackageNode> getPackageFragmentRoots(PackageParams query, IP
280281 displayName = ExtUtils .removeProjectSegment (javaProject .getElementName (), fragmentRoot .getPath ()).toPortableString ();
281282 }
282283 PackageRootNode node = new PackageRootNode (fragmentRoot , displayName , NodeKind .PACKAGEROOT );
284+ node .setHandlerIdentifier (fragmentRoot .getHandleIdentifier ());
283285 children .add (node );
284286 if (fragmentRoot instanceof JrtPackageFragmentRoot ) {
285287 node .setModuleName (fragmentRoot .getModuleDescription ().getElementName ());
@@ -317,117 +319,103 @@ private static List<PackageNode> getPackageFragmentRoots(PackageParams query, IP
317319 }
318320
319321 private static List <PackageNode > getPackages (PackageParams query , IProgressMonitor pm ) {
320- IJavaProject javaProject = getJavaProject (query .getProjectUri ());
321- if (javaProject != null ) {
322- try {
323- IPackageFragmentRoot packageRoot = javaProject .findPackageFragmentRoot (Path .fromPortableString (query .getRootPath ()));
324- if (packageRoot == null ) {
325- throw new CoreException (
326- new Status (IStatus .ERROR , JdtlsExtActivator .PLUGIN_ID , String .format ("No package root found for %s" , query .getPath ())));
327- }
328- Object [] result = getPackageFragmentRootContent (packageRoot , pm );
329- return convertToPackageNode (result , packageRoot );
330- } catch (CoreException e ) {
331- JdtlsExtActivator .logException ("Problem load project package " , e );
322+ try {
323+ IPackageFragmentRoot packageRoot = (IPackageFragmentRoot ) JavaCore .create (query .getHandlerIdentifier ());
324+ if (packageRoot == null ) {
325+ throw new CoreException (
326+ new Status (IStatus .ERROR , JdtlsExtActivator .PLUGIN_ID , String .format ("No package root found for %s" , query .getPath ())));
332327 }
328+ Object [] result = getPackageFragmentRootContent (packageRoot , pm );
329+ return convertToPackageNode (result , packageRoot );
330+ } catch (CoreException e ) {
331+ JdtlsExtActivator .logException ("Problem load project package " , e );
333332 }
334333 return Collections .emptyList ();
335334 }
336335
337336 private static List <PackageNode > getRootTypes (PackageParams query , IProgressMonitor pm ) {
338- IJavaProject javaProject = getJavaProject (query .getProjectUri ());
339- if (javaProject != null ) {
340- try {
341- IPackageFragmentRoot packageRoot = javaProject .findPackageFragmentRoot (Path .fromPortableString (query .getRootPath ()));
342- if (packageRoot == null ) {
343- throw new CoreException (
344- new Status (IStatus .ERROR , JdtlsExtActivator .PLUGIN_ID , String .format ("No package root found for %s" , query .getPath ())));
345- }
346- IPackageFragment packageFragment = packageRoot
347- .getPackageFragment (PackageNode .DEFAULT_PACKAGE_DISPLAYNAME .equals (query .getPath ()) ? "" : query .getPath ());
348- if (packageFragment != null ) {
349- List <IType > primaryTypes = new ArrayList <>();
350- for (IJavaElement element : packageFragment .getChildren ()) {
351- if (element instanceof ITypeRoot ) {
352- // Filter out the inner class files
353- if (element instanceof IClassFile && element .getElementName ().contains ("$" )) {
354- continue ;
355- }
356- IType primaryType = ((ITypeRoot ) element ).findPrimaryType ();
357- if (primaryType != null ) {
358- primaryTypes .add (primaryType );
359- }
337+ try {
338+ IPackageFragment packageFragment = (IPackageFragment ) JavaCore .create (query .getHandlerIdentifier ());
339+ if (packageFragment != null ) {
340+ List <IType > primaryTypes = new ArrayList <>();
341+ for (IJavaElement element : packageFragment .getChildren ()) {
342+ if (element instanceof ITypeRoot ) {
343+ // Filter out the inner class files
344+ if (element instanceof IClassFile && element .getElementName ().contains ("$" )) {
345+ continue ;
346+ }
347+ IType primaryType = ((ITypeRoot ) element ).findPrimaryType ();
348+ if (primaryType != null ) {
349+ primaryTypes .add (primaryType );
360350 }
361351 }
362- Object [] nonJavaResources = packageFragment .getNonJavaResources ();
363- List <PackageNode > rootTypeNodes = primaryTypes .stream ()
364- .map (PackageNode ::createNodeForPrimaryType )
365- .collect (Collectors .toList ());
366- if (nonJavaResources .length == 0 ) {
367- return rootTypeNodes ;
368- }
369- // when .java files and other .properties files are mixed up
370- rootTypeNodes .addAll (
371- Arrays .stream (nonJavaResources ).filter (resource -> resource instanceof IFile || resource instanceof JarEntryFile ).map (resource -> {
372- if (resource instanceof IFile ) {
373- IFile file = (IFile ) resource ;
374- PackageNode item = new PackageNode (file .getName (), file .getFullPath ().toPortableString (), NodeKind .FILE );
375- item .setUri (JDTUtils .getFileURI (file ));
376- return item ;
377- } else {
378- JarEntryFile file = (JarEntryFile ) resource ;
379- PackageNode entry = new PackageNode (file .getName (), file .getFullPath ().toPortableString (), NodeKind .FILE );
380- entry .setUri (ExtUtils .toUri ((JarEntryFile ) resource ));
381- return entry ;
382- }
383-
384- }).collect (Collectors .toList ()));
352+ }
353+ Object [] nonJavaResources = packageFragment .getNonJavaResources ();
354+ List <PackageNode > rootTypeNodes = primaryTypes .stream ()
355+ .map (PackageNode ::createNodeForPrimaryType )
356+ .collect (Collectors .toList ());
357+ if (nonJavaResources .length == 0 ) {
385358 return rootTypeNodes ;
386359 }
387- } catch (CoreException e ) {
388- JdtlsExtActivator .logException ("Problem load project classfile list " , e );
360+ // when .java files and other .properties files are mixed up
361+ rootTypeNodes .addAll (
362+ Arrays .stream (nonJavaResources ).filter (resource -> resource instanceof IFile || resource instanceof JarEntryFile ).map (resource -> {
363+ if (resource instanceof IFile ) {
364+ IFile file = (IFile ) resource ;
365+ PackageNode item = new PackageNode (file .getName (), file .getFullPath ().toPortableString (), NodeKind .FILE );
366+ item .setUri (JDTUtils .getFileURI (file ));
367+ return item ;
368+ } else {
369+ JarEntryFile file = (JarEntryFile ) resource ;
370+ PackageNode entry = new PackageNode (file .getName (), file .getFullPath ().toPortableString (), NodeKind .FILE );
371+ entry .setUri (ExtUtils .toUri ((JarEntryFile ) resource ));
372+ return entry ;
373+ }
374+
375+ }).collect (Collectors .toList ()));
376+ return rootTypeNodes ;
389377 }
378+ } catch (CoreException e ) {
379+ JdtlsExtActivator .logException ("Problem load project classfile list " , e );
390380 }
391381 return Collections .emptyList ();
392382 }
393383
394384 private static List <PackageNode > getFolderChildren (PackageParams query , IProgressMonitor pm ) {
395- IJavaProject javaProject = getJavaProject (query .getProjectUri ());
396- if (javaProject != null ) {
397- try {
398- IPackageFragmentRoot packageRoot = javaProject .findPackageFragmentRoot (Path .fromPortableString (query .getRootPath ()));
399- if (packageRoot == null ) {
400- throw new CoreException (
401- new Status (IStatus .ERROR , JdtlsExtActivator .PLUGIN_ID , String .format ("No package root found for %s" , query .getPath ())));
402- }
403- if (packageRoot .getKind () == IPackageFragmentRoot .K_BINARY ) {
404- Object [] resources = packageRoot .getNonJavaResources ();
405- for (Object resource : resources ) {
406- if (pm .isCanceled ()) {
407- throw new OperationCanceledException ();
408- }
409- if (resource instanceof JarEntryDirectory ) {
410- JarEntryDirectory directory = (JarEntryDirectory ) resource ;
411- Object [] children = findJarDirectoryChildren (directory , query .getPath ());
412- if (children != null ) {
413- return convertToPackageNode (children , null );
414- }
415- }
385+ try {
386+ IPackageFragmentRoot packageRoot = (IPackageFragmentRoot ) JavaCore .create (query .getHandlerIdentifier ());
387+ if (packageRoot == null ) {
388+ throw new CoreException (
389+ new Status (IStatus .ERROR , JdtlsExtActivator .PLUGIN_ID , String .format ("No package root found for %s" , query .getPath ())));
390+ }
391+ if (packageRoot .getKind () == IPackageFragmentRoot .K_BINARY ) {
392+ Object [] resources = packageRoot .getNonJavaResources ();
393+ for (Object resource : resources ) {
394+ if (pm .isCanceled ()) {
395+ throw new OperationCanceledException ();
416396 }
417- } else {
418- IFolder folder = javaProject .getProject ().getFolder (new Path (query .getPath ()).makeRelativeTo (javaProject .getProject ().getFullPath ()));
419- if (folder != null && folder .exists ()) {
420- Object [] children = JavaCore .create (folder ) != null ? Arrays .stream (folder .members ()).filter (t -> t instanceof IFile ).toArray ()
421- : folder .members ();
397+ if (resource instanceof JarEntryDirectory ) {
398+ JarEntryDirectory directory = (JarEntryDirectory ) resource ;
399+ Object [] children = findJarDirectoryChildren (directory , query .getPath ());
422400 if (children != null ) {
423401 return convertToPackageNode (children , null );
424402 }
425403 }
426404 }
427-
428- } catch (CoreException e ) {
429- JdtlsExtActivator .logException ("Problem load project classfile list " , e );
405+ } else {
406+ IJavaProject javaProject = packageRoot .getJavaProject ();
407+ IFolder folder = javaProject .getProject ().getFolder (new Path (query .getPath ()).makeRelativeTo (javaProject .getProject ().getFullPath ()));
408+ if (folder != null && folder .exists ()) {
409+ Object [] children = JavaCore .create (folder ) != null ? Arrays .stream (folder .members ()).filter (t -> t instanceof IFile ).toArray ()
410+ : folder .members ();
411+ if (children != null ) {
412+ return convertToPackageNode (children , null );
413+ }
414+ }
430415 }
416+
417+ } catch (CoreException e ) {
418+ JdtlsExtActivator .logException ("Problem load project classfile list " , e );
431419 }
432420 return Collections .emptyList ();
433421 }
@@ -446,6 +434,14 @@ private static Object[] getPackageFragmentRootContent(IPackageFragmentRoot root,
446434 }
447435 Object [] nonJavaResources = root .getNonJavaResources ();
448436 Collections .addAll (result , nonJavaResources );
437+
438+ IModuleDescription moduleDescription = root .getModuleDescription ();
439+ if (moduleDescription != null ) {
440+ IClassFile moduleInfo = moduleDescription .getClassFile ();
441+ if (moduleInfo != null ) {
442+ result .add (moduleDescription .getClassFile ());
443+ }
444+ }
449445 return result .toArray ();
450446 }
451447
@@ -463,7 +459,7 @@ private static List<PackageNode> convertToPackageNode(Object[] rootContent, IPac
463459 result .add (entry );
464460 } else if (root instanceof IClassFile ) {
465461 IClassFile classFile = (IClassFile ) root ;
466- PackageNode entry = new PackageNode (classFile .getElementName (), null , NodeKind .PRIMARYTYPE );
462+ PackageNode entry = new PackageNode (classFile .getElementName (), null , NodeKind .FILE );
467463 entry .setUri (JDTUtils .toUri (classFile ));
468464 result .add (entry );
469465 } else if (root instanceof JarEntryResource ) {
0 commit comments