From 6d46da6a634c0d9509311e87b7c3611ccfca257e Mon Sep 17 00:00:00 2001 From: Sheng Chen Date: Sun, 23 Apr 2023 13:02:07 +0800 Subject: [PATCH] Store the uri of document into CompletionResponse - instead of storing the uri into the data field of each completion item, now we store the uri into the CompletionResponse, and get it during resolving. - Triggering completion via 'S' in Spring Petclinic project, the data size can be reduced from 3.05MB to 2.63MB. (Directly copy the trace to a text file) Signed-off-by: Sheng Chen --- .../CompletionProposalRequestor.java | 2 +- .../JavadocCompletionProposal.java | 1 - .../SnippetCompletionProposal.java | 4 ++-- .../handlers/CompletionResolveHandler.java | 6 +++--- .../internal/handlers/CompletionResponse.java | 13 +++++++++++++ .../internal/syntaxserver/SyntaxServerTest.java | 1 - .../handlers/CompletionHandlerTest.java | 17 +++++++---------- 7 files changed, 26 insertions(+), 18 deletions(-) diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/CompletionProposalRequestor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/CompletionProposalRequestor.java index 1081c0907a..9fd8a09179 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/CompletionProposalRequestor.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/CompletionProposalRequestor.java @@ -280,6 +280,7 @@ public List getCompletionItems(IProgressMonitor monitor) { response.setProposals(proposals); } response.setItems(completionItems); + response.setUri(this.uri); CompletionResponses.store(response); return completionItems; @@ -339,7 +340,6 @@ public CompletionItem toCompletionItem(CompletionProposal proposal, int index) { } Map data = new HashMap<>(); // append data field so that resolve request can use it. - data.put(CompletionResolveHandler.DATA_FIELD_URI, uri); data.put(CompletionResolveHandler.DATA_FIELD_REQUEST_ID, String.valueOf(response.getId())); data.put(CompletionResolveHandler.DATA_FIELD_PROPOSAL_ID, String.valueOf(index)); $.setData(data); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/JavadocCompletionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/JavadocCompletionProposal.java index 4759c1d8fc..ffb17e8a29 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/JavadocCompletionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/JavadocCompletionProposal.java @@ -123,7 +123,6 @@ public List getProposals(ICompilationUnit cu, int offset, Comple } ci.setDocumentation(documentation); Map data = new HashMap<>(3); - data.put(CompletionResolveHandler.DATA_FIELD_URI, JDTUtils.toURI(cu)); data.put(CompletionResolveHandler.DATA_FIELD_REQUEST_ID, "0"); data.put(CompletionResolveHandler.DATA_FIELD_PROPOSAL_ID, "0"); ci.setData(data); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/SnippetCompletionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/SnippetCompletionProposal.java index 797b2e9be5..8be4d57ff5 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/SnippetCompletionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/SnippetCompletionProposal.java @@ -346,8 +346,7 @@ private static List getGenericSnippets(SnippetCompletionContext item.setLabelDetails(itemLabelDetails); } - Map data = new HashMap<>(3); - data.put(CompletionResolveHandler.DATA_FIELD_URI, uri); + Map data = new HashMap<>(2); data.put(CompletionResolveHandler.DATA_FIELD_REQUEST_ID, String.valueOf(response.getId())); data.put(CompletionResolveHandler.DATA_FIELD_PROPOSAL_ID, String.valueOf(i)); item.setData(data); @@ -358,6 +357,7 @@ private static List getGenericSnippets(SnippetCompletionContext response.setProposals(proposals); response.setItems(res); + response.setUri(uri); CompletionResponses.store(response); return res; } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResolveHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResolveHandler.java index 6488a2b09d..9e8d6c254c 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResolveHandler.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResolveHandler.java @@ -84,7 +84,6 @@ public CompletionResolveHandler(PreferenceManager manager) { this.manager = manager; } - public static final String DATA_FIELD_URI = "uri"; public static final String DATA_FIELD_DECLARATION_SIGNATURE = "decl_signature"; public static final String DATA_FIELD_SIGNATURE= "signature"; public static final String DATA_FIELD_NAME = "name"; @@ -99,7 +98,7 @@ public CompletionItem resolve(CompletionItem param, IProgressMonitor monitor) { Map data = JSONUtility.toModel(param.getData(),Map.class); // clean resolve data param.setData(null); - if (!CompletionProposalRequestor.SUPPORTED_KINDS.contains(param.getKind()) || data == null || !data.containsKey(DATA_FIELD_URI) || !data.containsKey(DATA_FIELD_REQUEST_ID) || !data.containsKey(DATA_FIELD_PROPOSAL_ID)) { + if (!CompletionProposalRequestor.SUPPORTED_KINDS.contains(param.getKind()) || data == null || !data.containsKey(DATA_FIELD_REQUEST_ID) || !data.containsKey(DATA_FIELD_PROPOSAL_ID)) { return param; } int proposalId = Integer.parseInt(data.get(DATA_FIELD_PROPOSAL_ID)); @@ -108,7 +107,8 @@ public CompletionItem resolve(CompletionItem param, IProgressMonitor monitor) { if (completionResponse == null || completionResponse.getProposals().size() <= proposalId) { throw new IllegalStateException("Invalid completion proposal"); } - String uri = data.get(DATA_FIELD_URI); + + String uri = completionResponse.getUri(); ICompilationUnit unit = JDTUtils.resolveCompilationUnit(uri); if (unit == null) { throw new IllegalStateException(NLS.bind("Unable to match Compilation Unit from {0} ", uri)); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResponse.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResponse.java index 3ecd5e3c5b..c2584fc89b 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResponse.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionResponse.java @@ -30,6 +30,7 @@ public class CompletionResponse { private Long id; private int offset; private CompletionContext context; + private String uri; private List proposals; private List items; @@ -56,6 +57,18 @@ public CompletionContext getContext() { public void setContext(CompletionContext context) { this.context = context; } + /** + * the uri of the document. + */ + public String getUri() { + return uri; + } + /** + * @param uri the document uri to set. + */ + public void setUri(String uri) { + this.uri = uri; + } /** * @return the proposals */ diff --git a/org.eclipse.jdt.ls.tests.syntaxserver/src/org/eclipse/jdt/ls/core/internal/syntaxserver/SyntaxServerTest.java b/org.eclipse.jdt.ls.tests.syntaxserver/src/org/eclipse/jdt/ls/core/internal/syntaxserver/SyntaxServerTest.java index 9a41dd0bac..b4184d9aa1 100644 --- a/org.eclipse.jdt.ls.tests.syntaxserver/src/org/eclipse/jdt/ls/core/internal/syntaxserver/SyntaxServerTest.java +++ b/org.eclipse.jdt.ls.tests.syntaxserver/src/org/eclipse/jdt/ls/core/internal/syntaxserver/SyntaxServerTest.java @@ -316,7 +316,6 @@ public void testCompletionOnSingleName() throws Exception{ @SuppressWarnings("unchecked") Map data = (Map) item.getData(); assertNotNull(data); - assertTrue(StringUtils.isNotBlank(data.get(CompletionResolveHandler.DATA_FIELD_URI))); assertTrue(StringUtils.isNotBlank(data.get(CompletionResolveHandler.DATA_FIELD_PROPOSAL_ID))); assertTrue(StringUtils.isNotBlank(data.get(CompletionResolveHandler.DATA_FIELD_REQUEST_ID))); } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionHandlerTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionHandlerTest.java index dccbb53430..9c37328afb 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionHandlerTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/CompletionHandlerTest.java @@ -264,7 +264,6 @@ public void testCompletion_object() throws Exception{ @SuppressWarnings("unchecked") Map data = (Map) item.getData(); assertNotNull(data); - assertTrue(isNotBlank(data.get(CompletionResolveHandler.DATA_FIELD_URI))); assertTrue(isNotBlank(data.get(CompletionResolveHandler.DATA_FIELD_PROPOSAL_ID))); assertTrue(isNotBlank(data.get(CompletionResolveHandler.DATA_FIELD_REQUEST_ID))); } @@ -283,15 +282,13 @@ public void testCompletion_dataFieldURI() throws Exception { assertNotNull(list); assertFalse("No proposals were found",list.getItems().isEmpty()); - List items = new ArrayList<>(list.getItems()); - for ( CompletionItem item : items) { - @SuppressWarnings("unchecked") - Map data = (Map) item.getData(); - assertNotNull(data); - String uri = data.get(CompletionResolveHandler.DATA_FIELD_URI); - assertTrue(isNotBlank(uri)); - assertTrue("unexpected URI prefix: " + uri, uri.matches("file://.*/src/java/Foo\\.java")); - } + Map data = (Map) list.getItems().get(0).getData(); + long requestId = Long.parseLong(data.get(CompletionResolveHandler.DATA_FIELD_REQUEST_ID)); + CompletionResponse completionResponse = CompletionResponses.get(requestId); + assertNotNull(completionResponse); + String uri = completionResponse.getUri(); + assertNotNull(uri); + assertTrue("unexpected URI prefix: " + uri, uri.matches("file://.*/src/java/Foo\\.java")); }