From 5ae5b220108b4ee65e976d83176fa5342a35c5a7 Mon Sep 17 00:00:00 2001 From: BoykoAlex Date: Mon, 3 Jun 2019 20:48:13 -0400 Subject: [PATCH] Revert "Cache ASTParser per project to speed up CU parsing" This reverts commit cb7621b208087b5b17b16084f7c3091935a1e06e. --- .../boot/java/utils/CompilationUnitCache.java | 77 +++++++------------ 1 file changed, 26 insertions(+), 51 deletions(-) diff --git a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java index 149684ef8..ff4dc4b94 100644 --- a/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java +++ b/headless-services/spring-boot-language-server/src/main/java/org/springframework/ide/vscode/boot/java/utils/CompilationUnitCache.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2017, 2019 Pivotal, Inc. + * Copyright (c) 2017, 2018 Pivotal, Inc. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -15,7 +15,6 @@ import java.net.URI; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock; @@ -36,7 +35,6 @@ import org.springframework.ide.vscode.commons.java.IJavaProject; import org.springframework.ide.vscode.commons.languageserver.java.JavaProjectFinder; import org.springframework.ide.vscode.commons.languageserver.java.ProjectObserver; import org.springframework.ide.vscode.commons.languageserver.util.SimpleTextDocumentService; -import org.springframework.ide.vscode.commons.util.text.LanguageId; import org.springframework.ide.vscode.commons.util.text.TextDocument; import com.google.common.cache.Cache; @@ -51,7 +49,6 @@ public final class CompilationUnitCache implements DocumentContentProvider { private ProjectObserver projectObserver; private Cache uriToCu; private Cache> projectToDocs; - private Cache parsers; private ProjectObserver.Listener projectListener; private SimpleTextDocumentService documents; @@ -66,7 +63,6 @@ public final class CompilationUnitCache implements DocumentContentProvider { // PT 154618835 - Avoid retaining the CU in the cache as it consumes memory if it hasn't been // accessed after some time - parsers = CacheBuilder.newBuilder().build(); uriToCu = CacheBuilder.newBuilder() .expireAfterWrite(CU_ACCESS_EXPIRATION, TimeUnit.MINUTES) .build(); @@ -77,9 +73,8 @@ public final class CompilationUnitCache implements DocumentContentProvider { writeLock = lock.writeLock(); if (documents != null) { - documents.onDidOpen(this::handleDocOpened); - documents.onDidChangeContent(change -> handleDocChanged(change.getDocument())); - documents.onDidClose(this::handleDocClosed); + documents.onDidChangeContent(doc -> invalidateCuForJavaFile(doc.getDocument().getId().getUri())); + documents.onDidClose(doc -> invalidateCuForJavaFile(doc.getId().getUri())); } if (this.projectObserver != null) { @@ -116,9 +111,7 @@ public final class CompilationUnitCache implements DocumentContentProvider { try { cu = uriToCu.get(uri, () -> { - ASTParser parser = parser(project); - String uriPath = uri.getPath(); - CompilationUnit cUnit = parse(parser, fetchContent(uri).toCharArray(), uri.toString(), uriPath.substring(uriPath.lastIndexOf("/"))); + CompilationUnit cUnit = parse(uri.toString(), fetchContent(uri).toCharArray(), project); projectToDocs.get(project, () -> new HashSet<>()).add(uri); return cUnit; }); @@ -145,30 +138,7 @@ public final class CompilationUnitCache implements DocumentContentProvider { return requestor.apply(null); } - - private void handleDocChanged(TextDocument doc) { - if (LanguageId.JAVA.equals(doc.getLanguageId())) { - invalidateCuForJavaFile(doc.getUri()); - } - } - - private void handleDocOpened(TextDocument doc) { - } - - private void handleDocClosed(TextDocument doc) { - if (LanguageId.JAVA.equals(doc.getLanguageId())) { - invalidateCuForJavaFile(doc.getUri()); - } - } - - private ASTParser parser(IJavaProject project) { - try { - return parsers.get(project, () -> createParser(getClasspathEntries(project))); - } catch (ExecutionException e) { - logger.error("{}", e); - return null; - } - } + private void invalidateCuForJavaFile(String uriStr) { URI uri = URI.create(uriStr); @@ -180,21 +150,21 @@ public final class CompilationUnitCache implements DocumentContentProvider { } } + public static CompilationUnit parse(TextDocument document, IJavaProject project) throws Exception { + String[] classpathEntries = getClasspathEntries(project); + String docURI = document.getUri(); + String unitName = docURI.substring(docURI.lastIndexOf("/")); + char[] source = document.get(0, document.getLength()).toCharArray(); + return parse(source, docURI, unitName, classpathEntries); + } + + public static CompilationUnit parse(String uri, char[] source, IJavaProject project) throws Exception { + String[] classpathEntries = getClasspathEntries(project); + String unitName = uri.substring(uri.lastIndexOf("/")); + return parse(source, uri, unitName, classpathEntries); + } + public static CompilationUnit parse(char[] source, String docURI, String unitName, String[] classpathEntries) throws Exception { - ASTParser parser = createParser(classpathEntries); - return parse(parser, source, docURI, unitName); - } - - public static CompilationUnit parse(ASTParser parser, char[] source, String docURI, String unitName) throws Exception { - parser.setUnitName(unitName); - parser.setSource(source); - - CompilationUnit cu = (CompilationUnit) parser.createAST(null); - - return cu; - } - - public static ASTParser createParser(String[] classpathEntries) { ASTParser parser = ASTParser.newParser(AST.JLS11); Map options = JavaCore.getOptions(); JavaCore.setComplianceOptions(JavaCore.VERSION_11, options); @@ -206,7 +176,13 @@ public final class CompilationUnitCache implements DocumentContentProvider { String[] sourceEntries = new String[] {}; parser.setEnvironment(classpathEntries, sourceEntries, null, false); - return parser; + + parser.setUnitName(unitName); + parser.setSource(source); + + CompilationUnit cu = (CompilationUnit) parser.createAST(null); + + return cu; } private static String[] getClasspathEntries(IJavaProject project) throws Exception { @@ -228,7 +204,6 @@ public final class CompilationUnitCache implements DocumentContentProvider { try { uriToCu.invalidateAll(docUris); projectToDocs.invalidate(project); - parsers.invalidate(project); } finally { writeLock.unlock(); }