From fc067c3677258325bcc27f677aa300da5da9b5fc Mon Sep 17 00:00:00 2001 From: andxu Date: Mon, 12 Nov 2018 11:37:41 +0800 Subject: [PATCH 1/8] show resource files in src\main\resources --- .../src/com/microsoft/jdtls/ext/core/PackageCommand.java | 6 ++++++ src/views/dependencyExplorer.ts | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index bfca48eb..f4fefcc2 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -20,6 +20,7 @@ import java.util.stream.Collectors; import org.eclipse.core.resources.IContainer; +import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; @@ -329,6 +330,11 @@ private static List convertToPackageNode(Object[] rootContent) thro if (jarNode != null) { result.add(jarNode); } + } else if (root instanceof IFile) { + IFile file = (IFile) root; + PackageNode entry = new PackageNode(file.getName(), null, NodeKind.FILE); + entry.setUri(JDTUtils.getFileURI(file)); + result.add(entry); } } diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index a3e87599..d17645ff 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -23,7 +23,7 @@ export class DependencyExplorer { this._dependencyViewer = window.createTreeView("javaDependencyExplorer", { treeDataProvider: this._dataProvider }); window.onDidChangeActiveTextEditor((textEditor: TextEditor) => { - if (textEditor && textEditor.document && textEditor.document.languageId === "java" && Settings.syncWithFolderExplorer()) { + if (textEditor && textEditor.document && Settings.syncWithFolderExplorer()) { this.reveal(textEditor.document.uri); } }); From c936ad9825626029799737c0cd421d1d4ecb0d7c Mon Sep 17 00:00:00 2001 From: andxu Date: Tue, 13 Nov 2018 10:23:19 +0800 Subject: [PATCH 2/8] show folder under resource folders --- .../jdtls/ext/core/PackageCommand.java | 26 ++++++++++++++----- .../jdtls/ext/core/model/NodeKind.java | 2 +- src/views/dependencyExplorer.ts | 2 +- src/views/folderNode.ts | 2 +- 4 files changed, 22 insertions(+), 10 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index f4fefcc2..10b11419 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -21,6 +21,7 @@ import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; +import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; @@ -73,7 +74,7 @@ public class PackageCommand { commands.put(NodeKind.CONTAINER, PackageCommand::getPackageFragmentRoots); commands.put(NodeKind.PACKAGEROOT, PackageCommand::getPackages); commands.put(NodeKind.PACKAGE, PackageCommand::getRootTypes); - commands.put(NodeKind.Folder, PackageCommand::getFolderChildren); + commands.put(NodeKind.FOLDER, PackageCommand::getFolderChildren); } /** @@ -289,6 +290,12 @@ private static List getFolderChildren(PackageParams query, IProgres if (children != null) { return convertToPackageNode(children); } + } else if (resource instanceof IFolder) { + IFolder directory = (IFolder) resource; + Object[] children = directory.members(); + if (children != null) { + return convertToPackageNode(children); + } } } @@ -330,11 +337,16 @@ private static List convertToPackageNode(Object[] rootContent) thro if (jarNode != null) { result.add(jarNode); } - } else if (root instanceof IFile) { - IFile file = (IFile) root; - PackageNode entry = new PackageNode(file.getName(), null, NodeKind.FILE); - entry.setUri(JDTUtils.getFileURI(file)); - result.add(entry); + } else if (root instanceof IFile) { + IFile file = (IFile) root; + PackageNode entry = new PackageNode(file.getName(), null, NodeKind.FILE); + entry.setUri(JDTUtils.getFileURI(file)); + result.add(entry); + } else if (root instanceof IFolder) { + IFolder folder = (IFolder) root; + PackageNode entry = new PackageNode(folder.getName(), null, NodeKind.FOLDER); + entry.setUri(JDTUtils.getFileURI(folder)); + result.add(entry); } } @@ -343,7 +355,7 @@ private static List convertToPackageNode(Object[] rootContent) thro private static PackageNode getJarEntryResource(JarEntryResource resource) { if (resource instanceof JarEntryDirectory) { - return new PackageNode(resource.getName(), resource.getFullPath().toPortableString(), NodeKind.Folder); + return new PackageNode(resource.getName(), resource.getFullPath().toPortableString(), NodeKind.FOLDER); } else if (resource instanceof JarEntryFile) { PackageNode entry = new PackageNode(resource.getName(), resource.getFullPath().toPortableString(), NodeKind.FILE); entry.setUri(ExtUtils.toUri((JarEntryFile) resource)); diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java index 5ac371de..e33ef84c 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java @@ -24,7 +24,7 @@ public enum NodeKind { TYPEROOT(6), - Folder(7), + FOLDER(7), FILE(8); diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index d17645ff..b18644a7 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -63,7 +63,7 @@ export class DependencyExplorer { private visitChildren(children: DataNode[], paths: INodeData[]): void { if (children && paths) { for (const c of children) { - if (c.path === paths[0].path) { + if (c.path === paths[0].path && c.nodeData.name === paths[0].name) { if (paths.length === 1) { if (this._dependencyViewer.visible) { this._dependencyViewer.reveal(c); diff --git a/src/views/folderNode.ts b/src/views/folderNode.ts index fe0e131d..c9ea776a 100644 --- a/src/views/folderNode.ts +++ b/src/views/folderNode.ts @@ -33,6 +33,6 @@ export class FolderNode extends DataNode { } protected get iconPath(): ThemeIcon { - return ThemeIcon.Folder; + return ExplorerNode.resolveIconPath("packagefolder"); } } From aebcc2e07bdc1886c078e737603c55308ee43d77 Mon Sep 17 00:00:00 2001 From: andxu Date: Tue, 13 Nov 2018 12:54:18 +0800 Subject: [PATCH 3/8] revert folder icon. --- src/views/folderNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/folderNode.ts b/src/views/folderNode.ts index c9ea776a..fe0e131d 100644 --- a/src/views/folderNode.ts +++ b/src/views/folderNode.ts @@ -33,6 +33,6 @@ export class FolderNode extends DataNode { } protected get iconPath(): ThemeIcon { - return ExplorerNode.resolveIconPath("packagefolder"); + return ThemeIcon.Folder; } } From 70dcfb909b3284af35babf72cb4208e71fdae55b Mon Sep 17 00:00:00 2001 From: andxu Date: Tue, 13 Nov 2018 16:18:28 +0800 Subject: [PATCH 4/8] 1. Display non-java files under package node 2. Display folders under IPackageFragmentRoot 3. Change the different display name according to normal resource folders and package folders. --- .../.settings/org.eclipse.jdt.core.prefs | 13 +++- .../.settings/org.eclipse.jdt.ui.prefs | 4 +- .../jdtls/ext/core/PackageCommand.java | 69 +++++++++++++------ src/views/packageNode.ts | 7 +- 4 files changed, 67 insertions(+), 26 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.core.prefs b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.core.prefs index 5b3d27d8..a7e5d63e 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.core.prefs +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.core.prefs @@ -104,8 +104,11 @@ org.eclipse.jdt.core.compiler.problem.unusedTypeParameter=ignore org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning org.eclipse.jdt.core.compiler.source=1.8 +org.eclipse.jdt.core.formatter.align_assignment_statements_on_columns=false org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false +org.eclipse.jdt.core.formatter.align_variable_declarations_on_columns=false +org.eclipse.jdt.core.formatter.align_with_spaces=false org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16 @@ -115,6 +118,7 @@ org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_e org.eclipse.jdt.core.formatter.alignment_for_assignment=0 org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16 org.eclipse.jdt.core.formatter.alignment_for_compact_if=16 +org.eclipse.jdt.core.formatter.alignment_for_compact_loops=16 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80 org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16 @@ -158,6 +162,8 @@ org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line +org.eclipse.jdt.core.formatter.comment.align_tags_descriptions_grouped=false +org.eclipse.jdt.core.formatter.comment.align_tags_names_descriptions=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=true @@ -382,6 +388,9 @@ org.eclipse.jdt.core.formatter.join_wrapped_lines=true org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false +org.eclipse.jdt.core.formatter.keep_simple_do_while_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_for_body_on_same_line=false +org.eclipse.jdt.core.formatter.keep_simple_while_body_on_same_line=false org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false org.eclipse.jdt.core.formatter.lineSplit=160 org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false @@ -399,10 +408,10 @@ org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true -org.eclipse.jdt.core.formatter.tabulation.char=tab +org.eclipse.jdt.core.formatter.tabulation.char=space org.eclipse.jdt.core.formatter.tabulation.size=4 org.eclipse.jdt.core.formatter.use_on_off_tags=false -org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false +org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=true org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.ui.prefs b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.ui.prefs index 9c075644..9cfef937 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.ui.prefs +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/.settings/org.eclipse.jdt.ui.prefs @@ -58,8 +58,8 @@ cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile cleanup_settings_version=2 eclipse.preferences.version=1 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true -formatter_profile=_JDTLS.EXT -formatter_settings_version=13 +formatter_profile=_Java Dependency +formatter_settings_version=14 org.eclipse.jdt.ui.javadoc=true org.eclipse.jdt.ui.text.custom_code_templates= sp_cleanup.add_default_serial_version_id=true diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 10b11419..1b7ab8f6 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -19,6 +19,7 @@ import java.util.function.BiFunction; import java.util.stream.Collectors; +import org.apache.commons.lang3.StringUtils; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; @@ -26,6 +27,7 @@ import org.eclipse.core.resources.IWorkspaceRoot; import org.eclipse.core.resources.ResourcesPlugin; import org.eclipse.core.runtime.CoreException; +import org.eclipse.core.runtime.IPath; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.OperationCanceledException; @@ -230,7 +232,7 @@ private static List getPackages(PackageParams query, IProgressMonit new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath()))); } Object[] result = getPackageFragmentRootContent(packageRoot, pm); - return convertToPackageNode(result); + return convertToPackageNode(result, packageRoot); } catch (CoreException e) { JdtlsExtActivator.logException("Problem load project package ", e); } @@ -250,7 +252,8 @@ private static List getRootTypes(PackageParams query, IProgressMoni IPackageFragment packageFragment = packageRoot.getPackageFragment(DEFAULT_PACKAGE_DISPLAYNAME.equals(query.getPath()) ? "" : query.getPath()); if (packageFragment != null) { IJavaElement[] types = packageFragment.getChildren(); - return Arrays.stream(types).filter(typeRoot -> !typeRoot.getElementName().contains("$")).map(typeRoot -> { + Object[] nonJavaResources = packageFragment.getNonJavaResources(); + List rootTypeNodes = Arrays.stream(types).filter(typeRoot -> !typeRoot.getElementName().contains("$")).map(typeRoot -> { PackageNode item = new TypeRootNode(typeRoot.getElementName(), typeRoot.getPath().toPortableString(), NodeKind.TYPEROOT, typeRoot instanceof IClassFile ? TypeRootNode.K_BINARY : TypeRootNode.K_SOURCE); if (typeRoot instanceof ICompilationUnit) { @@ -260,7 +263,17 @@ private static List getRootTypes(PackageParams query, IProgressMoni } return item; }).collect(Collectors.toList()); - + if (nonJavaResources.length == 0) { + return rootTypeNodes; + } + // when .java files and other .properties files are mixed up + rootTypeNodes.addAll(Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile).map(resource -> { + IFile file = (IFile) resource; + PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); + item.setUri(JDTUtils.getFileURI(file)); + return item; + }).collect(Collectors.toList())); + return rootTypeNodes; } } catch (CoreException e) { JdtlsExtActivator.logException("Problem load project classfile list ", e); @@ -278,23 +291,27 @@ private static List getFolderChildren(PackageParams query, IProgres throw new CoreException( new Status(IStatus.ERROR, JdtlsExtActivator.PLUGIN_ID, String.format("No package root found for %s", query.getPath()))); } - // jar file and folders - Object[] resources = packageRoot.getNonJavaResources(); - for (Object resource : resources) { - if (pm.isCanceled()) { - throw new OperationCanceledException(); - } - if (resource instanceof JarEntryDirectory) { - JarEntryDirectory directory = (JarEntryDirectory) resource; - Object[] children = findJarDirectoryChildren(directory, query.getPath()); - if (children != null) { - return convertToPackageNode(children); + if (packageRoot.getKind() == IPackageFragmentRoot.K_BINARY) { + Object[] resources = packageRoot.getNonJavaResources(); + for (Object resource : resources) { + if (pm.isCanceled()) { + throw new OperationCanceledException(); } - } else if (resource instanceof IFolder) { - IFolder directory = (IFolder) resource; - Object[] children = directory.members(); + if (resource instanceof JarEntryDirectory) { + JarEntryDirectory directory = (JarEntryDirectory) resource; + Object[] children = findJarDirectoryChildren(directory, query.getPath()); + if (children != null) { + return convertToPackageNode(children, null); + } + } + } + } else { + IFolder folder = javaProject.getProject().getFolder(new Path(query.getPath()).makeRelativeTo(javaProject.getProject().getFullPath())); + if (folder != null && folder.exists()) { + Object[] children = JavaCore.create(folder) != null ? Arrays.stream(folder.members()).filter(t -> t instanceof IFile).toArray() + : folder.members(); if (children != null) { - return convertToPackageNode(children); + return convertToPackageNode(children, null); } } } @@ -312,6 +329,8 @@ private static Object[] getPackageFragmentRootContent(IPackageFragmentRoot root, IPackageFragment fragment = (IPackageFragment) child; if (fragment.hasChildren()) { result.add(child); + } else if (fragment.getNonJavaResources().length > 0) { // some package has non-java files + result.add(fragment.getResource()); } } Object[] nonJavaResources = root.getNonJavaResources(); @@ -319,7 +338,7 @@ private static Object[] getPackageFragmentRootContent(IPackageFragmentRoot root, return result.toArray(); } - private static List convertToPackageNode(Object[] rootContent) throws JavaModelException { + private static List convertToPackageNode(Object[] rootContent, IPackageFragmentRoot packageRoot) throws JavaModelException { List result = new ArrayList<>(); for (Object root : rootContent) { if (root instanceof IPackageFragment) { @@ -339,12 +358,20 @@ private static List convertToPackageNode(Object[] rootContent) thro } } else if (root instanceof IFile) { IFile file = (IFile) root; - PackageNode entry = new PackageNode(file.getName(), null, NodeKind.FILE); + PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); entry.setUri(JDTUtils.getFileURI(file)); result.add(entry); } else if (root instanceof IFolder) { IFolder folder = (IFolder) root; - PackageNode entry = new PackageNode(folder.getName(), null, NodeKind.FOLDER); + String displayName = folder.getName(); + if (packageRoot != null) { + // together with package list, we need to provide full folder name relative to + // package root + IPath path = folder.getFullPath().makeRelativeTo(packageRoot.getPath()); + displayName = StringUtils.replace(path.toPortableString(), "/", "."); + } + + PackageNode entry = new PackageNode(displayName, folder.getFullPath().toPortableString(), NodeKind.FOLDER); entry.setUri(JDTUtils.getFileURI(folder)); result.add(entry); } diff --git a/src/views/packageNode.ts b/src/views/packageNode.ts index 0cf6de8f..aaa09c03 100644 --- a/src/views/packageNode.ts +++ b/src/views/packageNode.ts @@ -6,6 +6,7 @@ import { INodeData, NodeKind } from "../java/nodeData"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; import { TypeRootNode } from "./typeRootNode"; +import { FileNode } from "./fileNode"; export class PackageNode extends DataNode { constructor(nodeData: INodeData, parent: DataNode, private _project: DataNode, private _rootNode: DataNode) { @@ -26,7 +27,11 @@ export class PackageNode extends DataNode { if (this.nodeData.children && this.nodeData.children.length) { this.sort(); this.nodeData.children.forEach((nodeData) => { - result.push(new TypeRootNode(nodeData, this)); + if (nodeData.kind === NodeKind.File) { + result.push(new FileNode(nodeData, this)); + } else { + result.push(new TypeRootNode(nodeData, this)); + } }); } return result; From e6c94577d037ff6213a029a400b5e01f8f91f980 Mon Sep 17 00:00:00 2001 From: andxu Date: Tue, 13 Nov 2018 16:20:36 +0800 Subject: [PATCH 5/8] 1. convert tab to spaces --- .../src/com/microsoft/jdtls/ext/core/PackageCommand.java | 4 ++-- .../src/com/microsoft/jdtls/ext/core/model/NodeKind.java | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index 1b7ab8f6..f4a5be4e 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -76,7 +76,7 @@ public class PackageCommand { commands.put(NodeKind.CONTAINER, PackageCommand::getPackageFragmentRoots); commands.put(NodeKind.PACKAGEROOT, PackageCommand::getPackages); commands.put(NodeKind.PACKAGE, PackageCommand::getRootTypes); - commands.put(NodeKind.FOLDER, PackageCommand::getFolderChildren); + commands.put(NodeKind.FOLDER, PackageCommand::getFolderChildren); } /** @@ -382,7 +382,7 @@ private static List convertToPackageNode(Object[] rootContent, IPac private static PackageNode getJarEntryResource(JarEntryResource resource) { if (resource instanceof JarEntryDirectory) { - return new PackageNode(resource.getName(), resource.getFullPath().toPortableString(), NodeKind.FOLDER); + return new PackageNode(resource.getName(), resource.getFullPath().toPortableString(), NodeKind.FOLDER); } else if (resource instanceof JarEntryFile) { PackageNode entry = new PackageNode(resource.getName(), resource.getFullPath().toPortableString(), NodeKind.FILE); entry.setUri(ExtUtils.toUri((JarEntryFile) resource)); diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java index e33ef84c..a57b58e7 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/model/NodeKind.java @@ -24,7 +24,7 @@ public enum NodeKind { TYPEROOT(6), - FOLDER(7), + FOLDER(7), FILE(8); From ee32acff769adbd32b1066d24b1ac6e478aff1cc Mon Sep 17 00:00:00 2001 From: andxu Date: Tue, 13 Nov 2018 16:30:12 +0800 Subject: [PATCH 6/8] 1. fix tslint error --- src/views/packageNode.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/packageNode.ts b/src/views/packageNode.ts index aaa09c03..a453f84b 100644 --- a/src/views/packageNode.ts +++ b/src/views/packageNode.ts @@ -5,8 +5,8 @@ import { Jdtls } from "../java/jdtls"; import { INodeData, NodeKind } from "../java/nodeData"; import { DataNode } from "./dataNode"; import { ExplorerNode } from "./explorerNode"; -import { TypeRootNode } from "./typeRootNode"; import { FileNode } from "./fileNode"; +import { TypeRootNode } from "./typeRootNode"; export class PackageNode extends DataNode { constructor(nodeData: INodeData, parent: DataNode, private _project: DataNode, private _rootNode: DataNode) { From 311d09f790903ffc399704e853a7cd4d76e8c0a7 Mon Sep 17 00:00:00 2001 From: andxu Date: Wed, 14 Nov 2018 10:41:16 +0800 Subject: [PATCH 7/8] 1. avoid NPE --- src/views/dependencyExplorer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/views/dependencyExplorer.ts b/src/views/dependencyExplorer.ts index b18644a7..4c80ee89 100644 --- a/src/views/dependencyExplorer.ts +++ b/src/views/dependencyExplorer.ts @@ -63,7 +63,7 @@ export class DependencyExplorer { private visitChildren(children: DataNode[], paths: INodeData[]): void { if (children && paths) { for (const c of children) { - if (c.path === paths[0].path && c.nodeData.name === paths[0].name) { + if (paths[0] && c.path === paths[0].path && c.nodeData.name === paths[0].name) { if (paths.length === 1) { if (this._dependencyViewer.visible) { this._dependencyViewer.reveal(c); From 479900282f62bec770560cca14c938039ed16edb Mon Sep 17 00:00:00 2001 From: andxu Date: Wed, 14 Nov 2018 11:28:09 +0800 Subject: [PATCH 8/8] 1. Add logic to read common file from a jar package. 2. Provide sync to .class files --- .../ext/core/JarFileContentProvider.java | 21 +++++++ .../jdtls/ext/core/PackageCommand.java | 60 ++++++++++++++----- 2 files changed, 66 insertions(+), 15 deletions(-) diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JarFileContentProvider.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JarFileContentProvider.java index 3970b017..5be1940c 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JarFileContentProvider.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/JarFileContentProvider.java @@ -15,13 +15,16 @@ import java.io.InputStream; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.util.Arrays; import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.IJarEntryResource; +import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.internal.core.JarEntryDirectory; @@ -64,6 +67,24 @@ private String getContent(String rootId, String path, IProgressMonitor pm) { } } } + // if the file exists in the java packages + String[] segments = StringUtils.split(path, "/"); + String packageName = StringUtils.join(Arrays.asList(segments).subList(0, segments.length - 1), '.'); + IPackageFragment packageFragment = packageRoot.getPackageFragment(packageName); + if (packageFragment != null && packageFragment.exists()) { + + Object[] objs = packageFragment.getNonJavaResources(); + for (Object obj : objs) { + if (obj instanceof IJarEntryResource) { + IJarEntryResource child = (IJarEntryResource) obj; + if (child instanceof JarEntryFile && child.getFullPath().toPortableString().equals(path)) { + return readFileContent((JarEntryFile) child); + } + } + + } + } + } } catch (CoreException e) { JavaLanguageServerPlugin.logException("Problem get JarEntryFile content ", e); diff --git a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java index f4a5be4e..e45bd645 100644 --- a/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java +++ b/jdtls.ext/com.microsoft.jdtls.ext.core/src/com/microsoft/jdtls/ext/core/PackageCommand.java @@ -10,6 +10,7 @@ *******************************************************************************/ package com.microsoft.jdtls.ext.core; +import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; @@ -42,6 +43,7 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragment; import org.eclipse.jdt.core.IPackageFragmentRoot; +import org.eclipse.jdt.core.ITypeRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.JarEntryDirectory; @@ -122,26 +124,45 @@ public static List resolvePath(List arguments, IProgressMon List result = new ArrayList<>(); - ICompilationUnit cu = JDTUtils.resolveCompilationUnit(typeRootUri); - if (cu != null) { + URI uri = JDTUtils.toURI(typeRootUri); + ITypeRoot typeRoot = null; + if ("jdt".equals(uri.getScheme())) { + typeRoot = JDTUtils.resolveClassFile(uri); + } else { + typeRoot = JDTUtils.resolveCompilationUnit(uri); + } + if (typeRoot != null) { // Add project node: - IProject proj = cu.getJavaProject().getProject(); + IProject proj = typeRoot.getJavaProject().getProject(); PackageNode projectNode = new PackageNode(proj.getName(), proj.getFullPath().toPortableString(), NodeKind.PROJECT); projectNode.setUri(proj.getLocationURI().toString()); result.add(projectNode); - IPackageFragment packageFragment = (IPackageFragment) cu.getParent(); + IPackageFragment packageFragment = (IPackageFragment) typeRoot.getParent(); String packageName = packageFragment.isDefaultPackage() ? DEFAULT_PACKAGE_DISPLAYNAME : packageFragment.getElementName(); PackageNode packageNode = new PackageNode(packageName, packageFragment.getPath().toPortableString(), NodeKind.PACKAGE); IPackageFragmentRoot pkgRoot = (IPackageFragmentRoot) packageFragment.getParent(); - PackageNode rootNode = new PackageRootNode( - ExtUtils.removeProjectSegment(cu.getJavaProject().getElementName(), pkgRoot.getPath()).toPortableString(), - pkgRoot.getPath().toPortableString(), NodeKind.PACKAGEROOT, pkgRoot.getKind()); + PackageNode rootNode = null; + if (typeRoot instanceof IClassFile) { + rootNode = new PackageRootNode(pkgRoot.getElementName(), pkgRoot.getPath().toPortableString(), NodeKind.PACKAGEROOT, pkgRoot.getKind()); + } else { + rootNode = new PackageRootNode(ExtUtils.removeProjectSegment(typeRoot.getJavaProject().getElementName(), pkgRoot.getPath()).toPortableString(), + pkgRoot.getPath().toPortableString(), NodeKind.PACKAGEROOT, pkgRoot.getKind()); + } + // TODO: Let the client handle the display instead. Server side should always + // provide the container node. + if (typeRoot instanceof IClassFile) { + IClasspathEntry entry = pkgRoot.getRawClasspathEntry(); + IClasspathContainer container = JavaCore.getClasspathContainer(entry.getPath(), typeRoot.getJavaProject()); + PackageNode containerNode = new ContainerNode(container.getDescription(), container.getPath().toPortableString(), NodeKind.CONTAINER, + entry.getEntryKind()); + result.add(containerNode); + } result.add(rootNode); result.add(packageNode); - PackageNode item = new TypeRootNode(cu.getElementName(), cu.getPath().toPortableString(), NodeKind.TYPEROOT, TypeRootNode.K_SOURCE); - item.setUri(JDTUtils.toURI(cu)); + PackageNode item = new TypeRootNode(typeRoot.getElementName(), typeRoot.getPath().toPortableString(), NodeKind.TYPEROOT, TypeRootNode.K_SOURCE); + item.setUri(JDTUtils.toUri(typeRoot)); result.add(item); } @@ -267,11 +288,20 @@ private static List getRootTypes(PackageParams query, IProgressMoni return rootTypeNodes; } // when .java files and other .properties files are mixed up - rootTypeNodes.addAll(Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile).map(resource -> { - IFile file = (IFile) resource; - PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); - item.setUri(JDTUtils.getFileURI(file)); - return item; + rootTypeNodes.addAll( + Arrays.stream(nonJavaResources).filter(resource -> resource instanceof IFile || resource instanceof JarEntryFile).map(resource -> { + if (resource instanceof IFile) { + IFile file = (IFile) resource; + PackageNode item = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); + item.setUri(JDTUtils.getFileURI(file)); + return item; + } else { + JarEntryFile file = (JarEntryFile) resource; + PackageNode entry = new PackageNode(file.getName(), file.getFullPath().toPortableString(), NodeKind.FILE); + entry.setUri(ExtUtils.toUri((JarEntryFile) resource)); + return entry; + } + }).collect(Collectors.toList())); return rootTypeNodes; } @@ -330,7 +360,7 @@ private static Object[] getPackageFragmentRootContent(IPackageFragmentRoot root, if (fragment.hasChildren()) { result.add(child); } else if (fragment.getNonJavaResources().length > 0) { // some package has non-java files - result.add(fragment.getResource()); + result.add(fragment); } } Object[] nonJavaResources = root.getNonJavaResources();