diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java index 40c18e0ad2..3cd74ea569 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/JavaLanguageServerPlugin.java @@ -39,6 +39,7 @@ import org.eclipse.core.runtime.Status; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.WorkingCopyOwner; +import org.eclipse.jdt.core.manipulation.JavaManipulation; import org.eclipse.jdt.ls.core.internal.JavaClientConnection.JavaLanguageClient; import org.eclipse.jdt.ls.core.internal.handlers.JDTLanguageServer; import org.eclipse.jdt.ls.core.internal.managers.ContentProviderManager; @@ -142,6 +143,9 @@ public void start(BundleContext bundleContext) throws BackingStoreException { preferenceManager.addPreferencesChangeListener(preferencesChangeListener); logInfo(getClass() + " is started"); configureProxy(); + + // Set the ID to use for preference lookups + JavaManipulation.setPreferenceNodeId(PLUGIN_ID); } private void configureProxy() { @@ -429,5 +433,4 @@ public JavaClientConnection getClientConnection() { } return null; } - } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/SharedASTProvider.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/SharedASTProvider.java deleted file mode 100644 index c229192b0c..0000000000 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/SharedASTProvider.java +++ /dev/null @@ -1,223 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2017 Red Hat Inc. and others. - * 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Red Hat Inc. - initial API and implementation - *******************************************************************************/ -package org.eclipse.jdt.ls.core.internal; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; - -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.ISafeRunnable; -import org.eclipse.core.runtime.IStatus; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.SafeRunner; -import org.eclipse.core.runtime.Status; -import org.eclipse.core.runtime.SubMonitor; -import org.eclipse.jdt.core.ICompilationUnit; -import org.eclipse.jdt.core.IJavaElement; -import org.eclipse.jdt.core.ITypeRoot; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.ASTParser; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.internal.corext.dom.ASTNodes; -import org.eclipse.jdt.internal.corext.dom.IASTSharedValues; - -/** - * AST provider that caches the AST generated for files that are known to be - * open. - */ -@SuppressWarnings("restriction") -public final class SharedASTProvider { - - private static SharedASTProvider instance = new SharedASTProvider(); - - private ConcurrentMap<String, CompilationUnit> cache = new ConcurrentHashMap<>(); - private int astCreationCount; // to testing purposes - - - private SharedASTProvider() { - astCreationCount = 0; - } - - public void dispose() { - invalidateAll(); - } - - public static SharedASTProvider getInstance(){ - return instance; - } - - public CompilationUnit getAST(final ITypeRoot input, IProgressMonitor progressMonitor) { - if (progressMonitor != null && progressMonitor.isCanceled()) { - return null; - } - if (!shouldCache(input)) { - JavaLanguageServerPlugin.logInfo("Creating uncached AST for " + input.getPath().toString()); - return createAST(input, progressMonitor); - } - - final String identifier = input.getHandleIdentifier(); - return cache.computeIfAbsent(identifier, k -> { - JavaLanguageServerPlugin.logInfo("Caching AST for " + input.getPath().toString()); - CompilationUnit astRoot = createAST(input, progressMonitor); - astCreationCount++; - return astRoot; - }); - } - - public List<CompilationUnit> getASTs(List<ICompilationUnit> inputs, IProgressMonitor progressMonitor) { - if (progressMonitor != null && progressMonitor.isCanceled() || inputs.isEmpty()) { - return Collections.emptyList(); - } - List<CompilationUnit> result = new ArrayList<>(); - SubMonitor subMonitor = SubMonitor.convert(progressMonitor, inputs.size()); - - for (ICompilationUnit input : inputs) { - result.add(getAST(input, subMonitor.split(1))); - } - return result; - } - - public void setAST(CompilationUnit astRoot) { - ITypeRoot typeRoot = astRoot.getTypeRoot(); - if (shouldCache(typeRoot)) { - cache.put(typeRoot.getHandleIdentifier(), astRoot); - } - } - - /** - * Only cache ASTs for compilation units in working copy mode (open in a - * buffer) - */ - private boolean shouldCache(ITypeRoot input) { - if (input.getElementType() != IJavaElement.COMPILATION_UNIT) { - return false; - } - ICompilationUnit cu = (ICompilationUnit) input; - return cu.getOwner() == null && cu.isWorkingCopy(); - } - - public void invalidate(ITypeRoot root){ - if(root != null){ - CompilationUnit removed = cache.remove(root.getHandleIdentifier()); - if (removed != null) { - JavaLanguageServerPlugin.logInfo("Releasing AST for " + root.getPath().toString()); - } - } - } - - public void invalidateAll() { - cache.clear(); - JavaLanguageServerPlugin.logInfo("Releasing all ASTs"); - } - - /** - * Creates a new compilation unit AST. - * - * @param input the Java element for which to create the AST - * @param progressMonitor the progress monitor - * @return AST - */ - private static CompilationUnit createAST(final ITypeRoot input, final IProgressMonitor progressMonitor) { - if (!hasSource(input)) { - return null; - } - - if (progressMonitor != null && progressMonitor.isCanceled()) { - return null; - } - - final CompilationUnit root[]= new CompilationUnit[1]; - - SafeRunner.run(new ISafeRunnable() { - @Override - public void run() { - try { - if (progressMonitor != null && progressMonitor.isCanceled()) { - return; - } - final ASTParser parser = newASTParser(); - parser.setSource(input); - root[0] = (CompilationUnit) parser.createAST(progressMonitor); - //mark as unmodifiable - ASTNodes.setFlagsToAST(root[0], ASTNode.PROTECT); - } catch (OperationCanceledException ex) { - return; - } - } - @Override - public void handleException(Throwable ex) { - IStatus status= new Status(IStatus.ERROR, JavaLanguageServerPlugin.PLUGIN_ID, IStatus.OK, "Error in JDT Core during AST creation", ex); //$NON-NLS-1$ - JavaLanguageServerPlugin.log(status); - } - }); - return root[0]; - } - - public static ASTParser newASTParser() { - final ASTParser parser = ASTParser.newParser(IASTSharedValues.SHARED_AST_LEVEL); - parser.setResolveBindings(true); - parser.setStatementsRecovery(IASTSharedValues.SHARED_AST_STATEMENT_RECOVERY); - parser.setBindingsRecovery(IASTSharedValues.SHARED_BINDING_RECOVERY); - return parser; - } - - /** - * Checks whether the given Java element has accessible source. - * - * @param je the Java element to test - * @return <code>true</code> if the element has source - */ - private static boolean hasSource(ITypeRoot je) { - if (je == null || !je.exists()) { - return false; - } - - try { - return je.getBuffer() != null; - } catch (JavaModelException ex) { - IStatus status= new Status(IStatus.ERROR, JavaLanguageServerPlugin.PLUGIN_ID, IStatus.OK, "Error in JDT Core during AST creation", ex); //$NON-NLS-1$ - JavaLanguageServerPlugin.log(status); - } - return false; - } - - /** - * For testing purposes - * - * @return the number of elements currently in the cache - */ - public int getCacheSize() { - return cache.size(); - } - - /** - * For testing purposes - * - * @return the number of ASTs created - */ - public int getASTCreationCount() { - return astCreationCount; - } - - /** - * For testing purposes - * - * Sets the counter for ASTs created to 0 - */ - public void clearASTCreationCount() { - astCreationCount = 0; - } - -} diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/OrganizeImportsCommand.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/OrganizeImportsCommand.java index 390fefaeed..3725f38347 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/OrganizeImportsCommand.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/commands/OrganizeImportsCommand.java @@ -30,11 +30,11 @@ import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.manipulation.OrganizeImportsOperation; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.ResourceUtils; import org.eclipse.jdt.ls.core.internal.TextEditConverter; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.OrganizeImportsOperation; import org.eclipse.jdt.ls.core.internal.corrections.InnovationContext; import org.eclipse.jdt.ls.core.internal.corrections.proposals.CUCorrectionProposal; import org.eclipse.jdt.ls.core.internal.corrections.proposals.IProposalRelevance; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/AnonymousTypeCompletionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/AnonymousTypeCompletionProposal.java index e1f3821dad..70f623de8a 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/AnonymousTypeCompletionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/AnonymousTypeCompletionProposal.java @@ -30,19 +30,22 @@ import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; +import org.eclipse.jdt.core.dom.AnonymousClassDeclaration; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.dom.FieldDeclaration; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.jdt.core.dom.NodeFinder; +import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ITrackedNodePosition; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; import org.eclipse.jdt.core.formatter.CodeFormatter; -import org.eclipse.jdt.internal.corext.dom.ASTNodes; import org.eclipse.jdt.internal.corext.dom.IASTSharedValues; import org.eclipse.jdt.internal.corext.util.CodeFormatterUtil; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; @@ -183,7 +186,7 @@ private String createNewBody(ImportRewrite importRewrite) throws CoreException { IBinding contextBinding = null; // used to find @NonNullByDefault effective at that current context if (fCompilationUnit.getJavaProject().getOption(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, true).equals(JavaCore.ENABLED)) { ASTNode focusNode = NodeFinder.perform(astRoot, fReplacementOffset + dummyClassContent.length(), 0); - contextBinding = ASTNodes.getEnclosingDeclaration(focusNode); + contextBinding = getEnclosingDeclaration(focusNode); } ASTRewrite rewrite = ASTRewrite.create(astRoot.getAST()); ITrackedNodePosition trackedDeclaration = rewrite.track(declaration); @@ -213,6 +216,32 @@ private String createNewBody(ImportRewrite importRewrite) throws CoreException { } } + // TODO Remove this by addressing https://bugs.eclipse.org/bugs/show_bug.cgi?id=531511 + private IBinding getEnclosingDeclaration(ASTNode node) { + while (node != null) { + if (node instanceof AbstractTypeDeclaration) { + return ((AbstractTypeDeclaration) node).resolveBinding(); + } else if (node instanceof AnonymousClassDeclaration) { + return ((AnonymousClassDeclaration) node).resolveBinding(); + } else if (node instanceof MethodDeclaration) { + return ((MethodDeclaration) node).resolveBinding(); + } else if (node instanceof FieldDeclaration) { + List<?> fragments = ((FieldDeclaration) node).fragments(); + if (fragments.size() > 0) { + return ((VariableDeclarationFragment) fragments.get(0)).resolveBinding(); + } + } else if (node instanceof VariableDeclarationFragment) { + IVariableBinding variableBinding = ((VariableDeclarationFragment) node).resolveBinding(); + if (variableBinding.getDeclaringMethod() != null || variableBinding.getDeclaringClass() != null) { + return variableBinding; + // workaround for incomplete wiring of DOM bindings: keep searching when variableBinding is unparented + } + } + node = node.getParent(); + } + return null; + } + private String createDummyType(String name) throws JavaModelException { StringBuffer buffer = new StringBuffer(); buffer.append("abstract class "); //$NON-NLS-1$ diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/OverrideCompletionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/OverrideCompletionProposal.java index 853679730e..6aab16f05d 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/OverrideCompletionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/contentassist/OverrideCompletionProposal.java @@ -36,11 +36,11 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; import org.eclipse.jdt.core.formatter.IndentManipulation; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.corext.dom.Bindings; import org.eclipse.jdt.internal.corext.dom.IASTSharedValues; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.CodeGenerationSettings; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility2; @@ -75,7 +75,7 @@ public OverrideCompletionProposal(ICompilationUnit cu, String methodName, String } private CompilationUnit getRecoveredAST(IDocument document, int offset, Document recoveredDocument) { - CompilationUnit ast = SharedASTProvider.getInstance().getAST(fCompilationUnit, null); + CompilationUnit ast = CoreASTProvider.getInstance().getAST(fCompilationUnit, CoreASTProvider.WAIT_YES, null); if (ast != null) { recoveredDocument.set(document.get()); return ast; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/ContextSensitiveImportRewriteContext.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/ContextSensitiveImportRewriteContext.java index 3ae25be1d6..b4c0c93372 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/ContextSensitiveImportRewriteContext.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/ContextSensitiveImportRewriteContext.java @@ -36,6 +36,7 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; +import org.eclipse.jdt.core.manipulation.ImportReferencesCollector; import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/ImportReferencesCollector.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/ImportReferencesCollector.java deleted file mode 100644 index d9f5ca94b9..0000000000 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/ImportReferencesCollector.java +++ /dev/null @@ -1,548 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2018 IBM Corporation and others. - * 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Code copied from org.eclipse.jdt.internal.corext.codemanipulation.ImportReferencesCollector - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jdt.ls.core.internal.corext.codemanipulation; - -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.dom.AST; -import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.AnnotatableType; -import org.eclipse.jdt.core.dom.BreakStatement; -import org.eclipse.jdt.core.dom.ClassInstanceCreation; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.ContinueStatement; -import org.eclipse.jdt.core.dom.CreationReference; -import org.eclipse.jdt.core.dom.Expression; -import org.eclipse.jdt.core.dom.ExpressionMethodReference; -import org.eclipse.jdt.core.dom.FieldAccess; -import org.eclipse.jdt.core.dom.IBinding; -import org.eclipse.jdt.core.dom.IMethodBinding; -import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.IVariableBinding; -import org.eclipse.jdt.core.dom.ImportDeclaration; -import org.eclipse.jdt.core.dom.LabeledStatement; -import org.eclipse.jdt.core.dom.MarkerAnnotation; -import org.eclipse.jdt.core.dom.MemberRef; -import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.MethodInvocation; -import org.eclipse.jdt.core.dom.MethodRef; -import org.eclipse.jdt.core.dom.MethodRefParameter; -import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.core.dom.Name; -import org.eclipse.jdt.core.dom.NameQualifiedType; -import org.eclipse.jdt.core.dom.NormalAnnotation; -import org.eclipse.jdt.core.dom.PackageDeclaration; -import org.eclipse.jdt.core.dom.ProvidesDirective; -import org.eclipse.jdt.core.dom.QualifiedName; -import org.eclipse.jdt.core.dom.QualifiedType; -import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.core.dom.SimpleType; -import org.eclipse.jdt.core.dom.SingleMemberAnnotation; -import org.eclipse.jdt.core.dom.SuperConstructorInvocation; -import org.eclipse.jdt.core.dom.SuperFieldAccess; -import org.eclipse.jdt.core.dom.SuperMethodReference; -import org.eclipse.jdt.core.dom.TagElement; -import org.eclipse.jdt.core.dom.ThisExpression; -import org.eclipse.jdt.core.dom.TypeDeclaration; -import org.eclipse.jdt.core.dom.TypeMethodReference; -import org.eclipse.jdt.core.dom.UsesDirective; -import org.eclipse.jdt.internal.corext.dom.GenericVisitor; -import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer; -import org.eclipse.jdt.internal.corext.util.JavaModelUtil; -import org.eclipse.jface.text.Region; - -public class ImportReferencesCollector extends GenericVisitor { - - public static void collect(ASTNode node, IJavaProject project, Region rangeLimit, Collection<SimpleName> resultingTypeImports, Collection<SimpleName> resultingStaticImports) { - collect(node, project, rangeLimit, false, resultingTypeImports, resultingStaticImports); - } - - public static void collect(ASTNode node, IJavaProject project, Region rangeLimit, boolean skipMethodBodies, Collection<SimpleName> resultingTypeImports, Collection<SimpleName> resultingStaticImports) { - ASTNode root= node.getRoot(); - CompilationUnit astRoot= root instanceof CompilationUnit ? (CompilationUnit) root : null; - node.accept(new ImportReferencesCollector(project, astRoot, rangeLimit, skipMethodBodies, resultingTypeImports, resultingStaticImports)); - } - - private CompilationUnit fASTRoot; - private Region fSubRange; - private Collection<SimpleName> fTypeImports; - private Collection<SimpleName> fStaticImports; - private boolean fSkipMethodBodies; - - private ImportReferencesCollector(IJavaProject project, CompilationUnit astRoot, Region rangeLimit, boolean skipMethodBodies, Collection<SimpleName> resultingTypeImports, Collection<SimpleName> resultingStaticImports) { - super(processJavadocComments(astRoot)); - fTypeImports= resultingTypeImports; - fStaticImports= resultingStaticImports; - fSubRange= rangeLimit; - if (project == null || !JavaModelUtil.is50OrHigher(project)) { - fStaticImports= null; // do not collect - } - fASTRoot= astRoot; // can be null - fSkipMethodBodies= skipMethodBodies; - } - - private static boolean processJavadocComments(CompilationUnit astRoot) { - // don't visit Javadoc for 'package-info' (bug 216432) - if (astRoot != null && astRoot.getTypeRoot() != null) { - return !JavaModelUtil.PACKAGE_INFO_JAVA.equals(astRoot.getTypeRoot().getElementName()); - } - return true; - } - - private boolean isAffected(ASTNode node) { - if (fSubRange == null) { - return true; - } - int nodeStart= node.getStartPosition(); - int offset= fSubRange.getOffset(); - return nodeStart + node.getLength() > offset && offset + fSubRange.getLength() > nodeStart; - } - - - private void addReference(SimpleName name) { - if (isAffected(name)) { - fTypeImports.add(name); - } - } - - private void typeRefFound(Name node) { - if (node != null) { - while (node.isQualifiedName()) { - node= ((QualifiedName) node).getQualifier(); - } - addReference((SimpleName) node); - } - } - - private void possibleTypeRefFound(Name node) { - while (node.isQualifiedName()) { - node= ((QualifiedName) node).getQualifier(); - } - IBinding binding= node.resolveBinding(); - if (binding == null || binding.getKind() == IBinding.TYPE) { - // if the binding is null, we cannot determine if - // we have a type binding or not, so we will assume - // we do. - addReference((SimpleName) node); - } - } - - private void possibleStaticImportFound(Name name) { - if (fStaticImports == null || fASTRoot == null) { - return; - } - - while (name.isQualifiedName()) { - name= ((QualifiedName) name).getQualifier(); - } - if (!isAffected(name)) { - return; - } - - IBinding binding= name.resolveBinding(); - SimpleName simpleName= (SimpleName)name; - if (binding == null) { - // This may be a currently unresolvable reference to a static member. - fStaticImports.add(simpleName); - } else if (binding instanceof ITypeBinding || !Modifier.isStatic(binding.getModifiers()) || simpleName.isDeclaration()) { - return; - } else if (binding instanceof IVariableBinding) { - IVariableBinding varBinding= (IVariableBinding) binding; - if (varBinding.isField()) { - varBinding= varBinding.getVariableDeclaration(); - ITypeBinding declaringClass= varBinding.getDeclaringClass(); - if (declaringClass != null && !declaringClass.isLocal()) { - if (new ScopeAnalyzer(fASTRoot).isDeclaredInScope(varBinding, simpleName, ScopeAnalyzer.VARIABLES | ScopeAnalyzer.CHECK_VISIBILITY)) { - return; - } - fStaticImports.add(simpleName); - } - } - } else if (binding instanceof IMethodBinding) { - IMethodBinding methodBinding= ((IMethodBinding) binding).getMethodDeclaration(); - ITypeBinding declaringClass= methodBinding.getDeclaringClass(); - if (declaringClass != null && !declaringClass.isLocal()) { - if (new ScopeAnalyzer(fASTRoot).isDeclaredInScope(methodBinding, simpleName, ScopeAnalyzer.METHODS | ScopeAnalyzer.CHECK_VISIBILITY)) { - return; - } - fStaticImports.add(simpleName); - } - } - - } - - private void doVisitChildren(List<? extends ASTNode> elements) { - int nElements= elements.size(); - for (int i= 0; i < nElements; i++) { - ((ASTNode) elements.get(i)).accept(this); - } - } - - private void doVisitNode(ASTNode node) { - if (node != null) { - node.accept(this); - } - } - - @Override - protected boolean visitNode(ASTNode node) { - return isAffected(node); - } - - /* - * @see ASTVisitor#visit(SimpleType) - */ - @Override - public boolean visit(SimpleType node) { - typeRefFound(node.getName()); - visitAnnotations(node); - return false; - } - - /* - * @see ASTVisitor#visit(NameQualifiedType) - */ - @Override - public boolean visit(NameQualifiedType node) { - possibleTypeRefFound(node.getQualifier()); - visitAnnotations(node); - return false; - } - - /* - * @see ASTVisitor#visit(QualifiedType) - */ - @Override - public boolean visit(QualifiedType node) { - doVisitNode(node.getQualifier()); - visitAnnotations(node); - return false; - } - - private void visitAnnotations(AnnotatableType node) { - if (node.getAST().apiLevel() >= AST.JLS8) { - doVisitChildren(node.annotations()); - } - } - - /* - * @see ASTVisitor#visit(QualifiedName) - */ - @Override - public boolean visit(QualifiedName node) { - possibleTypeRefFound(node); // possible ref - possibleStaticImportFound(node); - return false; - } - - /* - * @see ASTVisitor#visit(ImportDeclaration) - */ - @Override - public boolean visit(ImportDeclaration node) { - return false; - } - - /* - * @see ASTVisitor#visit(PackageDeclaration) - */ - @Override - public boolean visit(PackageDeclaration node) { - doVisitNode(node.getJavadoc()); - doVisitChildren(node.annotations()); - return false; - } - - @Override - public boolean visit(LabeledStatement node) { - doVisitNode(node.getBody()); - return false; - } - - @Override - public boolean visit(ContinueStatement node) { - return false; - } - - @Override - public boolean visit(BreakStatement node) { - return false; - } - - /* - * @see ASTVisitor#visit(ThisExpression) - */ - @Override - public boolean visit(ThisExpression node) { - typeRefFound(node.getQualifier()); - return false; - } - - @Override - public boolean visit(SuperFieldAccess node) { - typeRefFound(node.getQualifier()); - return false; - } - - private void evalQualifyingExpression(Expression expr, Name selector) { - if (expr != null) { - if (expr instanceof Name) { - Name name= (Name) expr; - possibleTypeRefFound(name); - possibleStaticImportFound(name); - } else { - expr.accept(this); - } - } else if (selector != null) { - possibleStaticImportFound(selector); - } - } - - /* - * @see ASTVisitor#visit(ClassInstanceCreation) - */ - @Override - public boolean visit(ClassInstanceCreation node) { - doVisitChildren(node.typeArguments()); - doVisitNode(node.getType()); - evalQualifyingExpression(node.getExpression(), null); - if (node.getAnonymousClassDeclaration() != null) { - node.getAnonymousClassDeclaration().accept(this); - } - doVisitChildren(node.arguments()); - return false; - } - - /* - * @see ASTVisitor#endVisit(MethodInvocation) - */ - @Override - public boolean visit(MethodInvocation node) { - evalQualifyingExpression(node.getExpression(), node.getName()); - doVisitChildren(node.typeArguments()); - doVisitChildren(node.arguments()); - return false; - } - - @Override - public boolean visit(CreationReference node) { - doVisitNode(node.getType()); - doVisitChildren(node.typeArguments()); - return false; - } - - @Override - public boolean visit(ExpressionMethodReference node) { - evalQualifyingExpression(node.getExpression(), node.getName()); - doVisitChildren(node.typeArguments()); - return false; - } - - @Override - public boolean visit(SuperMethodReference node) { - doVisitNode(node.getQualifier()); - doVisitChildren(node.typeArguments()); - return false; - } - - @Override - public boolean visit(TypeMethodReference node) { - doVisitNode(node.getType()); - doVisitChildren(node.typeArguments()); - return false; - } - - @Override - public boolean visit(UsesDirective node) { - possibleTypeRefFound(node.getName()); - return false; - } - - @Override - public boolean visit(ProvidesDirective node) { - possibleTypeRefFound(node.getName()); - for (Object impl : node.implementations()) { - possibleTypeRefFound((Name) impl); - } - return false; - } - - /* - * @see ASTVisitor#visit(SuperConstructorInvocation) - */ - @Override - public boolean visit(SuperConstructorInvocation node) { - if (!isAffected(node)) { - return false; - } - - evalQualifyingExpression(node.getExpression(), null); - doVisitChildren(node.typeArguments()); - doVisitChildren(node.arguments()); - return false; - } - - /* - * @see ASTVisitor#visit(FieldAccess) - */ - @Override - public boolean visit(FieldAccess node) { - evalQualifyingExpression(node.getExpression(), node.getName()); - return false; - } - - /* - * @see ASTVisitor#visit(SimpleName) - */ - @Override - public boolean visit(SimpleName node) { - // if the call gets here, it can only be a variable reference - possibleStaticImportFound(node); - return false; - } - - @Override - public boolean visit(MarkerAnnotation node) { - typeRefFound(node.getTypeName()); - return false; - } - - @Override - public boolean visit(NormalAnnotation node) { - typeRefFound(node.getTypeName()); - doVisitChildren(node.values()); - return false; - } - - @Override - public boolean visit(SingleMemberAnnotation node) { - typeRefFound(node.getTypeName()); - doVisitNode(node.getValue()); - return false; - } - - /* - * @see ASTVisitor#visit(TypeDeclaration) - */ - @Override - public boolean visit(TypeDeclaration node) { - if (!isAffected(node)) { - return false; - } - return true; - } - - /* - * @see ASTVisitor#visit(MethodDeclaration) - */ - @Override - public boolean visit(MethodDeclaration node) { - if (!isAffected(node)) { - return false; - } - doVisitNode(node.getJavadoc()); - - doVisitChildren(node.modifiers()); - doVisitChildren(node.typeParameters()); - - if (!node.isConstructor()) { - doVisitNode(node.getReturnType2()); - } - // name not visited - - int apiLevel= node.getAST().apiLevel(); - if (apiLevel >= AST.JLS8) { - doVisitNode(node.getReceiverType()); - } - // receiverQualifier not visited: - // Enclosing class names cannot be shadowed by an import (qualification is always redundant). - doVisitChildren(node.parameters()); - if (apiLevel >= AST.JLS8) { - doVisitChildren(node.extraDimensions()); - doVisitChildren(node.thrownExceptionTypes()); - } else { - Iterator<Name> iter= getThrownExceptions(node).iterator(); - while (iter.hasNext()) { - typeRefFound(iter.next()); - } - } - if (!fSkipMethodBodies) { - doVisitNode(node.getBody()); - } - return false; - } - - /** - * @param decl method declaration - * @return thrown exception names - * @deprecated to avoid deprecation warnings - */ - @Deprecated - private static List<Name> getThrownExceptions(MethodDeclaration decl) { - return decl.thrownExceptions(); - } - - @Override - public boolean visit(TagElement node) { - String tagName= node.getTagName(); - List<? extends ASTNode> list= node.fragments(); - int idx= 0; - if (tagName != null && !list.isEmpty()) { - Object first= list.get(0); - if (first instanceof Name) { - if ("@throws".equals(tagName) || "@exception".equals(tagName)) { //$NON-NLS-1$//$NON-NLS-2$ - typeRefFound((Name) first); - } else if ("@see".equals(tagName) || "@link".equals(tagName) || "@linkplain".equals(tagName)) { //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$ - Name name= (Name) first; - possibleTypeRefFound(name); - } - idx++; - } - } - for (int i= idx; i < list.size(); i++) { - doVisitNode(list.get(i)); - } - return false; - } - - @Override - public boolean visit(MemberRef node) { - Name qualifier= node.getQualifier(); - if (qualifier != null) { - typeRefFound(qualifier); - } - return false; - } - - @Override - public boolean visit(MethodRef node) { - Name qualifier= node.getQualifier(); - if (qualifier != null) { - typeRefFound(qualifier); - } - List<MethodRefParameter> list= node.parameters(); - if (list != null) { - doVisitChildren(list); // visit MethodRefParameter with Type - } - return false; - } - - @Override - public boolean visit(MethodRefParameter node) { - doVisitNode(node.getType()); - return false; - } -} diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/OrganizeImportsOperation.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/OrganizeImportsOperation.java deleted file mode 100644 index dd7589f7ef..0000000000 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/OrganizeImportsOperation.java +++ /dev/null @@ -1,716 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2018 IBM Corporation and others. - * 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Copied from /org.eclipse.jdt.ui/src/org/eclipse/jdt/internal/corext/codemanipulation/OrganizeImportsOperation.java - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jdt.ls.core.internal.corext.codemanipulation; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Set; - -import org.eclipse.core.runtime.CoreException; -import org.eclipse.core.runtime.IProgressMonitor; -import org.eclipse.core.runtime.NullProgressMonitor; -import org.eclipse.core.runtime.OperationCanceledException; -import org.eclipse.core.runtime.SubProgressMonitor; -import org.eclipse.core.runtime.jobs.ISchedulingRule; -import org.eclipse.jdt.core.Flags; -import org.eclipse.jdt.core.ICompilationUnit; -import org.eclipse.jdt.core.IJavaElement; -import org.eclipse.jdt.core.IJavaProject; -import org.eclipse.jdt.core.IPackageFragment; -import org.eclipse.jdt.core.ISourceRange; -import org.eclipse.jdt.core.JavaCore; -import org.eclipse.jdt.core.JavaModelException; -import org.eclipse.jdt.core.SourceRange; -import org.eclipse.jdt.core.compiler.IProblem; -import org.eclipse.jdt.core.dom.ASTNode; -import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; -import org.eclipse.jdt.core.dom.CompilationUnit; -import org.eclipse.jdt.core.dom.IBinding; -import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.ImportDeclaration; -import org.eclipse.jdt.core.dom.Modifier; -import org.eclipse.jdt.core.dom.NodeFinder; -import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.core.dom.Type; -import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; -import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; -import org.eclipse.jdt.core.search.IJavaSearchConstants; -import org.eclipse.jdt.core.search.IJavaSearchScope; -import org.eclipse.jdt.core.search.SearchEngine; -import org.eclipse.jdt.core.search.TypeNameMatch; -import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; -import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; -import org.eclipse.jdt.internal.core.manipulation.util.Strings; -import org.eclipse.jdt.internal.corext.dom.ASTNodes; -import org.eclipse.jdt.internal.corext.dom.Bindings; -import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer; -import org.eclipse.jdt.internal.corext.util.JavaModelUtil; -import org.eclipse.jdt.internal.corext.util.JdtFlags; -import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.Messages; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; -import org.eclipse.jdt.ls.core.internal.corext.utils.TypeNameMatchCollector; -import org.eclipse.jdt.ls.core.internal.corrections.SimilarElementsRequestor; -import org.eclipse.text.edits.TextEdit; - -public class OrganizeImportsOperation { - public static interface IChooseImportQuery { - /** - * Selects imports from a list of choices. - * @param openChoices From each array, a type reference has to be selected - * @param ranges For each choice the range of the corresponding type reference. - * @return Returns <code>null</code> to cancel the operation, or the - * selected imports. - */ - TypeNameMatch[] chooseImports(TypeNameMatch[][] openChoices, ISourceRange[] ranges); - } - - /** - * Matches unresolvable import declarations (those having associated - * {@link IProblem#ImportNotFound} problems) to unresolved simple names. - * <p> - * For a given simple name, looks first for single imports of that simple name and then, - * in the absence of such, for any on-demand imports. Considers type imports for simple names - * of unresolved types and static imports for simple names of unresolved static members. - * <p> - * @see <a href="https://bugs.eclipse.org/357795">Bug 357795</a> - */ - private static class UnresolvableImportMatcher { - static UnresolvableImportMatcher forCompilationUnit(CompilationUnit cu) { - Collection<ImportDeclaration> unresolvableImports= determineUnresolvableImports(cu); - - Map<String, Set<String>> typeImportsBySimpleName= new HashMap<>(); - Map<String, Set<String>> staticImportsBySimpleName= new HashMap<>(); - for (ImportDeclaration importDeclaration : unresolvableImports) { - String qualifiedName= importDeclaration.isOnDemand() - ? importDeclaration.getName().getFullyQualifiedName() + ".*" //$NON-NLS-1$ - : importDeclaration.getName().getFullyQualifiedName(); - - String simpleName= qualifiedName.substring(qualifiedName.lastIndexOf('.') + 1); - - Map<String, Set<String>> importsBySimpleName= importDeclaration.isStatic() - ? staticImportsBySimpleName : typeImportsBySimpleName; - Set<String> importsWithSimpleName= importsBySimpleName.get(simpleName); - if (importsWithSimpleName == null) { - importsWithSimpleName= new HashSet<>(); - importsBySimpleName.put(simpleName, importsWithSimpleName); - } - - importsWithSimpleName.add(qualifiedName); - } - - return new UnresolvableImportMatcher(typeImportsBySimpleName, staticImportsBySimpleName); - } - - private static Collection<ImportDeclaration> determineUnresolvableImports(CompilationUnit cu) { - Collection<ImportDeclaration> unresolvableImports= new ArrayList<>(cu.imports().size()); - for (IProblem problem : cu.getProblems()) { - if (problem.getID() == IProblem.ImportNotFound) { - ImportDeclaration problematicImport= getProblematicImport(problem, cu); - if (problematicImport != null) { - unresolvableImports.add(problematicImport); - } - } - } - - return unresolvableImports; - } - - private static ImportDeclaration getProblematicImport(IProblem problem, CompilationUnit astRoot) { - ASTNode coveringNode = new NodeFinder(astRoot, problem.getSourceStart(), - problem.getSourceEnd() - problem.getSourceStart()).getCoveringNode(); - if (coveringNode != null) { - ASTNode importNode= ASTNodes.getParent(coveringNode, ASTNode.IMPORT_DECLARATION); - if (importNode instanceof ImportDeclaration) { - return (ImportDeclaration) importNode; - } - } - return null; - } - - private final Map<String, Set<String>> fTypeImportsBySimpleName; - private final Map<String, Set<String>> fStaticImportsBySimpleName; - - private UnresolvableImportMatcher( - Map<String, Set<String>> typeImportsBySimpleName, Map<String, Set<String>> staticImportsBySimpleName) { - fTypeImportsBySimpleName= typeImportsBySimpleName; - fStaticImportsBySimpleName= staticImportsBySimpleName; - } - - private Set<String> matchImports(boolean isStatic, String simpleName) { - Map<String, Set<String>> importsBySimpleName= isStatic - ? fStaticImportsBySimpleName : fTypeImportsBySimpleName; - - Set<String> matchingSingleImports= importsBySimpleName.get(simpleName); - if (matchingSingleImports != null) { - return Collections.unmodifiableSet(matchingSingleImports); - } - - Set<String> matchingOnDemandImports= importsBySimpleName.get("*"); //$NON-NLS-1$ - if (matchingOnDemandImports != null) { - return Collections.unmodifiableSet(matchingOnDemandImports); - } - - return Collections.emptySet(); - } - - Set<String> matchTypeImports(String simpleName) { - return matchImports(false, simpleName); - } - - Set<String> matchStaticImports(String simpleName) { - return matchImports(true, simpleName); - } - } - - private static class TypeReferenceProcessor { - - private static class UnresolvedTypeData { - final SimpleName ref; - final int typeKinds; - final List<TypeNameMatch> foundInfos; - - public UnresolvedTypeData(SimpleName ref) { - this.ref= ref; - this.typeKinds = org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getPossibleTypeKinds(ref, - true); - this.foundInfos= new ArrayList<>(3); - } - - public void addInfo(TypeNameMatch info) { - for (int i= this.foundInfos.size() - 1; i >= 0; i--) { - TypeNameMatch curr= this.foundInfos.get(i); - if (curr.getTypeContainerName().equals(info.getTypeContainerName())) { - return; // not added. already contains type with same name - } - } - foundInfos.add(info); - } - } - - private Set<String> fOldSingleImports; - private Set<String> fOldDemandImports; - - private Set<String> fImplicitImports; - - private ImportRewrite fImpStructure; - - private boolean fDoIgnoreLowerCaseNames; - - private final UnresolvableImportMatcher fUnresolvableImportMatcher; - - private IPackageFragment fCurrPackage; - - private ScopeAnalyzer fAnalyzer; - private boolean fAllowDefaultPackageImports; - - private Map<String, UnresolvedTypeData> fUnresolvedTypes; - private Set<String> fImportsAdded; - private TypeNameMatch[][] fOpenChoices; - private SourceRange[] fSourceRanges; - - - public TypeReferenceProcessor(Set<String> oldSingleImports, Set<String> oldDemandImports, CompilationUnit root, ImportRewrite impStructure, boolean ignoreLowerCaseNames, UnresolvableImportMatcher unresolvableImportMatcher) { - fOldSingleImports= oldSingleImports; - fOldDemandImports= oldDemandImports; - fImpStructure= impStructure; - fDoIgnoreLowerCaseNames= ignoreLowerCaseNames; - fUnresolvableImportMatcher= unresolvableImportMatcher; - - ICompilationUnit cu= impStructure.getCompilationUnit(); - - fImplicitImports= new HashSet<>(3); - fImplicitImports.add(""); //$NON-NLS-1$ - fImplicitImports.add("java.lang"); //$NON-NLS-1$ - fImplicitImports.add(cu.getParent().getElementName()); - - fAnalyzer= new ScopeAnalyzer(root); - - fCurrPackage= (IPackageFragment) cu.getParent(); - - fAllowDefaultPackageImports= cu.getJavaProject().getOption(JavaCore.COMPILER_SOURCE, true).equals(JavaCore.VERSION_1_3); - - fImportsAdded= new HashSet<>(); - fUnresolvedTypes= new HashMap<>(); - } - - private boolean needsImport(ITypeBinding typeBinding, SimpleName ref) { - if (!typeBinding.isTopLevel() && !typeBinding.isMember() || typeBinding.isRecovered()) { - return false; // no imports for anonymous, local, primitive types or parameters types - } - int modifiers= typeBinding.getModifiers(); - if (Modifier.isPrivate(modifiers)) { - return false; // imports for privates are not required - } - ITypeBinding currTypeBinding= Bindings.getBindingOfParentType(ref); - if (currTypeBinding == null) { - if (ASTNodes.getParent(ref, ASTNode.PACKAGE_DECLARATION) != null) { - return true; // reference in package-info.java - } - if (ASTNodes.getParent(ref, ASTNode.MODULE_DECLARATION) != null) { - return true; // reference in module-info.java - } - return false; // not in a type - } - if (!Modifier.isPublic(modifiers)) { - if (!currTypeBinding.getPackage().getName().equals(typeBinding.getPackage().getName())) { - return false; // not visible - } - } - - ASTNode parent= ref.getParent(); - while (parent instanceof Type) { - parent= parent.getParent(); - } - if (parent instanceof AbstractTypeDeclaration && parent.getParent() instanceof CompilationUnit) { - return true; - } - - if (typeBinding.isMember()) { - if (fAnalyzer.isDeclaredInScope(typeBinding, ref, ScopeAnalyzer.TYPES | ScopeAnalyzer.CHECK_VISIBILITY)) { - return false; - } - } - return true; - } - - - /** - * Tries to find the given type name and add it to the import structure. - * @param ref the name node - */ - public void add(SimpleName ref) { - String typeName= ref.getIdentifier(); - - if (fImportsAdded.contains(typeName)) { - return; - } - - IBinding binding= ref.resolveBinding(); - if (binding != null) { - if (binding.getKind() != IBinding.TYPE) { - return; - } - ITypeBinding typeBinding= (ITypeBinding) binding; - if (typeBinding.isArray()) { - typeBinding= typeBinding.getElementType(); - } - typeBinding= typeBinding.getTypeDeclaration(); - if (!typeBinding.isRecovered()) { - if (needsImport(typeBinding, ref)) { - fImpStructure.addImport(typeBinding); - fImportsAdded.add(typeName); - } - return; - } - } else { - if (fDoIgnoreLowerCaseNames && typeName.length() > 0) { - char ch= typeName.charAt(0); - if (Strings.isLowerCase(ch) && Character.isLetter(ch)) { - return; - } - } - } - - fImportsAdded.add(typeName); - fUnresolvedTypes.put(typeName, new UnresolvedTypeData(ref)); - } - - public boolean process(IProgressMonitor monitor) throws JavaModelException { - try { - int nUnresolved= fUnresolvedTypes.size(); - if (nUnresolved == 0) { - return false; - } - char[][] allTypes= new char[nUnresolved][]; - int i= 0; - for (Iterator<String> iter= fUnresolvedTypes.keySet().iterator(); iter.hasNext();) { - allTypes[i++]= iter.next().toCharArray(); - } - final ArrayList<TypeNameMatch> typesFound= new ArrayList<>(); - final IJavaProject project= fCurrPackage.getJavaProject(); - IJavaSearchScope scope= SearchEngine.createJavaSearchScope(new IJavaElement[] { project }); - TypeNameMatchCollector collector= new TypeNameMatchCollector(typesFound); - new SearchEngine().searchAllTypeNames(null, allTypes, scope, collector, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, monitor); - - boolean is50OrHigher= JavaModelUtil.is50OrHigher(project); - - for (i= 0; i < typesFound.size(); i++) { - TypeNameMatch curr= typesFound.get(i); - UnresolvedTypeData data= fUnresolvedTypes.get(curr.getSimpleTypeName()); - if (data != null && isVisible(curr) && isOfKind(curr, data.typeKinds, is50OrHigher)) { - if (fAllowDefaultPackageImports || curr.getPackageName().length() > 0) { - data.addInfo(curr); - } - } - } - - for (Entry<String, UnresolvedTypeData> entry : fUnresolvedTypes.entrySet()) { - if (entry.getValue().foundInfos.size() == 0) { // No result found in search - Set<String> matchingUnresolvableImports= fUnresolvableImportMatcher.matchTypeImports(entry.getKey()); - if (!matchingUnresolvableImports.isEmpty()) { - // If there are matching unresolvable import(s), rely on them to provide the type. - for (String string : matchingUnresolvableImports) { - fImpStructure.addImport(string, UNRESOLVABLE_IMPORT_CONTEXT); - } - } - } - } - - ArrayList<TypeNameMatch[]> openChoices= new ArrayList<>(nUnresolved); - ArrayList<SourceRange> sourceRanges= new ArrayList<>(nUnresolved); - for (Iterator<UnresolvedTypeData> iter= fUnresolvedTypes.values().iterator(); iter.hasNext();) { - UnresolvedTypeData data= iter.next(); - TypeNameMatch[] openChoice= processTypeInfo(data.foundInfos); - if (openChoice != null) { - openChoices.add(openChoice); - sourceRanges.add(new SourceRange(data.ref.getStartPosition(), data.ref.getLength())); - } - } - if (openChoices.isEmpty()) { - return false; - } - fOpenChoices= openChoices.toArray(new TypeNameMatch[openChoices.size()][]); - fSourceRanges= sourceRanges.toArray(new SourceRange[sourceRanges.size()]); - return true; - } finally { - monitor.done(); - } - } - - private TypeNameMatch[] processTypeInfo(List<TypeNameMatch> typeRefsFound) { - int nFound= typeRefsFound.size(); - if (nFound == 0) { - // nothing found - return null; - } else if (nFound == 1) { - TypeNameMatch typeRef= typeRefsFound.get(0); - fImpStructure.addImport(typeRef.getFullyQualifiedName()); - return null; - } else { - String typeToImport= null; - boolean ambiguousImports= false; - - // multiple found, use old imports to find an entry - for (int i= 0; i < nFound; i++) { - TypeNameMatch typeRef= typeRefsFound.get(i); - String fullName= typeRef.getFullyQualifiedName(); - String containerName= typeRef.getTypeContainerName(); - if (fOldSingleImports.contains(fullName)) { - // was single-imported - fImpStructure.addImport(fullName); - return null; - } else if (fOldDemandImports.contains(containerName) || fImplicitImports.contains(containerName)) { - if (typeToImport == null) { - typeToImport= fullName; - } else { // more than one import-on-demand - ambiguousImports= true; - } - } - } - - if (typeToImport != null && !ambiguousImports) { - fImpStructure.addImport(typeToImport); - return null; - } - // return the open choices - return typeRefsFound.toArray(new TypeNameMatch[nFound]); - } - } - - private boolean isOfKind(TypeNameMatch curr, int typeKinds, boolean is50OrHigher) { - int flags= curr.getModifiers(); - if (Flags.isAnnotation(flags)) { - return is50OrHigher && (typeKinds & SimilarElementsRequestor.ANNOTATIONS) != 0; - } - if (Flags.isEnum(flags)) { - return is50OrHigher && (typeKinds & SimilarElementsRequestor.ENUMS) != 0; - } - if (Flags.isInterface(flags)) { - return (typeKinds & SimilarElementsRequestor.INTERFACES) != 0; - } - return (typeKinds & SimilarElementsRequestor.CLASSES) != 0; - } - - private boolean isVisible(TypeNameMatch curr) { - int flags= curr.getModifiers(); - if (Flags.isPrivate(flags)) { - return false; - } - boolean isPublic; - try { - isPublic= JdtFlags.isPublic(curr.getType()); - } catch (JavaModelException e) { - isPublic= Flags.isPublic(flags); - } - if (isPublic || Flags.isProtected(flags)) { - return true; - } - return curr.getPackageName().equals(fCurrPackage.getElementName()); - } - - public TypeNameMatch[][] getChoices() { - return fOpenChoices; - } - - public ISourceRange[] getChoicesSourceRanges() { - return fSourceRanges; - } - } - - /** - * Used to ensure that unresolvable imports don't get reduced into on-demand imports. - */ - private static ImportRewriteContext UNRESOLVABLE_IMPORT_CONTEXT= new ImportRewriteContext() { - @Override - public int findInContext(String qualifier, String name, int kind) { - return RES_NAME_UNKNOWN_NEEDS_EXPLICIT_IMPORT; - } - }; - - private boolean fDoSave; - - private boolean fIgnoreLowerCaseNames; - - private IChooseImportQuery fChooseImportQuery; - - private int fNumberOfImportsAdded; - private int fNumberOfImportsRemoved; - - private IProblem fParsingError; - private ICompilationUnit fCompilationUnit; - - private CompilationUnit fASTRoot; - - private final boolean fAllowSyntaxErrors; - - public OrganizeImportsOperation(ICompilationUnit cu, CompilationUnit astRoot, boolean ignoreLowerCaseNames, boolean save, boolean allowSyntaxErrors, IChooseImportQuery chooseImportQuery) { - fCompilationUnit= cu; - fASTRoot= astRoot; - - fDoSave= save; - fIgnoreLowerCaseNames= ignoreLowerCaseNames; - fAllowSyntaxErrors= allowSyntaxErrors; - fChooseImportQuery= chooseImportQuery; - - fNumberOfImportsAdded= 0; - fNumberOfImportsRemoved= 0; - - fParsingError= null; - } - - public TextEdit createTextEdit(IProgressMonitor monitor) throws CoreException, OperationCanceledException { - if (monitor == null) { - monitor= new NullProgressMonitor(); - } - try { - fNumberOfImportsAdded= 0; - fNumberOfImportsRemoved= 0; - - monitor.beginTask( - Messages.format("Organizing imports of {0}...", BasicElementLabels.getFileName(fCompilationUnit)), - 9); - - CompilationUnit astRoot= fASTRoot; - if (astRoot == null) { - astRoot = SharedASTProvider.getInstance().getAST(fCompilationUnit, new SubProgressMonitor(monitor, 2)); - if (monitor.isCanceled()) { - throw new OperationCanceledException(); - } - } else { - monitor.worked(2); - } - - ImportRewrite importsRewrite= StubUtility.createImportRewrite(astRoot, false); - String[] importOrder = JavaLanguageServerPlugin.getPreferencesManager() == null ? new String[0] : JavaLanguageServerPlugin.getPreferencesManager().getPreferences().getImportOrder(); - importsRewrite.setImportOrder(importOrder); - Set<String> oldSingleImports= new HashSet<>(); - Set<String> oldDemandImports= new HashSet<>(); - List<SimpleName> typeReferences= new ArrayList<>(); - List<SimpleName> staticReferences= new ArrayList<>(); - - if (!collectReferences(astRoot, typeReferences, staticReferences, oldSingleImports, oldDemandImports)) { - return null; - } - - monitor.worked(1); - - UnresolvableImportMatcher unresolvableImportMatcher = - UnresolvableImportMatcher.forCompilationUnit(astRoot); - - TypeReferenceProcessor processor= new TypeReferenceProcessor( - oldSingleImports, - oldDemandImports, - astRoot, - importsRewrite, - fIgnoreLowerCaseNames, - unresolvableImportMatcher); - - Iterator<SimpleName> refIterator= typeReferences.iterator(); - while (refIterator.hasNext()) { - SimpleName typeRef= refIterator.next(); - processor.add(typeRef); - } - - boolean hasOpenChoices= processor.process(new SubProgressMonitor(monitor, 3)); - addStaticImports(staticReferences, importsRewrite, unresolvableImportMatcher); - - if (hasOpenChoices && fChooseImportQuery != null) { - TypeNameMatch[][] choices= processor.getChoices(); - ISourceRange[] ranges= processor.getChoicesSourceRanges(); - TypeNameMatch[] chosen= fChooseImportQuery.chooseImports(choices, ranges); - if (chosen == null) { - // cancel pressed by the user - throw new OperationCanceledException(); - } - for (int i= 0; i < chosen.length; i++) { - TypeNameMatch typeInfo= chosen[i]; - if (typeInfo != null) { - importsRewrite.addImport(typeInfo.getFullyQualifiedName()); - } else { // Skipped by user - String typeName= choices[i][0].getSimpleTypeName(); - Set<String> matchingUnresolvableImports= unresolvableImportMatcher.matchTypeImports(typeName); - if (!matchingUnresolvableImports.isEmpty()) { - // If there are matching unresolvable import(s), rely on them to provide the type. - for (String string : matchingUnresolvableImports) { - importsRewrite.addImport(string, UNRESOLVABLE_IMPORT_CONTEXT); - } - } - } - } - } - - TextEdit result= importsRewrite.rewriteImports(new SubProgressMonitor(monitor, 3)); - - determineImportDifferences(importsRewrite, oldSingleImports, oldDemandImports); - - return result; - } finally { - monitor.done(); - } - } - - private void determineImportDifferences(ImportRewrite importsStructure, Set<String> oldSingleImports, Set<String> oldDemandImports) { - ArrayList<String> importsAdded= new ArrayList<>(); - importsAdded.addAll(Arrays.asList(importsStructure.getCreatedImports())); - importsAdded.addAll(Arrays.asList(importsStructure.getCreatedStaticImports())); - - Object[] content= oldSingleImports.toArray(); - for (int i= 0; i < content.length; i++) { - String importName= (String) content[i]; - if (importsAdded.remove(importName)) { - oldSingleImports.remove(importName); - } - } - content= oldDemandImports.toArray(); - for (int i= 0; i < content.length; i++) { - String importName= (String) content[i]; - if (importsAdded.remove(importName + ".*")) { - oldDemandImports.remove(importName); - } - } - fNumberOfImportsAdded= importsAdded.size(); - fNumberOfImportsRemoved= oldSingleImports.size() + oldDemandImports.size(); - } - - - private void addStaticImports( - Collection<SimpleName> staticReferences, - ImportRewrite importRewrite, - UnresolvableImportMatcher unresolvableImportMatcher) { - for (SimpleName name : staticReferences) { - IBinding binding= name.resolveBinding(); - if (binding != null) { - importRewrite.addStaticImport(binding); - } else { - // This could be an unresolvable reference to a static member. - String identifier= name.getIdentifier(); - Set<String> unresolvableImports= unresolvableImportMatcher.matchStaticImports(identifier); - for (String unresolvableImport : unresolvableImports) { - int lastDotIndex= unresolvableImport.lastIndexOf('.'); - // It's OK to skip invalid imports. - if (lastDotIndex != -1) { - String declaringTypeName= unresolvableImport.substring(0, lastDotIndex); - String simpleName= unresolvableImport.substring(lastDotIndex + 1); - // Whether name refers to a field or to a method is unknown. - boolean isField= false; - importRewrite.addStaticImport(declaringTypeName, simpleName, isField, UNRESOLVABLE_IMPORT_CONTEXT); - } - } - } - } - } - - - // find type references in a compilation unit - private boolean collectReferences(CompilationUnit astRoot, List<SimpleName> typeReferences, List<SimpleName> staticReferences, Set<String> oldSingleImports, Set<String> oldDemandImports) { - if (!fAllowSyntaxErrors) { - IProblem[] problems= astRoot.getProblems(); - for (int i= 0; i < problems.length; i++) { - IProblem curr= problems[i]; - if (curr.isError() && (curr.getID() & IProblem.Syntax) != 0) { - fParsingError= problems[i]; - return false; - } - } - } - List<ImportDeclaration> imports= astRoot.imports(); - for (int i= 0; i < imports.size(); i++) { - ImportDeclaration curr= imports.get(i); - String id= ASTResolving.getFullName(curr.getName()); - if (curr.isOnDemand()) { - oldDemandImports.add(id); - } else { - oldSingleImports.add(id); - } - } - - IJavaProject project= fCompilationUnit.getJavaProject(); - ImportReferencesCollector.collect(astRoot, project, null, typeReferences, staticReferences); - - return true; - } - - /** - * After executing the operation, returns <code>null</code> if the operation has been executed successfully or - * the range where parsing failed. - * @return returns the parse error - */ - public IProblem getParseError() { - return fParsingError; - } - - public int getNumberOfImportsAdded() { - return fNumberOfImportsAdded; - } - - public int getNumberOfImportsRemoved() { - return fNumberOfImportsRemoved; - } - - /** - * @return Returns the scheduling rule for this operation - */ - public ISchedulingRule getScheduleRule() { - return fCompilationUnit.getResource(); - } - -} diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/StubUtility.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/StubUtility.java index f9588e2a37..10fcbd43b4 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/StubUtility.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/StubUtility.java @@ -43,7 +43,6 @@ import org.eclipse.jdt.core.dom.ArrayType; import org.eclipse.jdt.core.dom.CastExpression; import org.eclipse.jdt.core.dom.ClassInstanceCreation; -import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.ConstructorInvocation; import org.eclipse.jdt.core.dom.Expression; import org.eclipse.jdt.core.dom.FieldAccess; @@ -64,7 +63,7 @@ import org.eclipse.jdt.core.dom.SuperMethodInvocation; import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.TypeParameter; -import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.core.manipulation.util.Strings; import org.eclipse.jdt.internal.corext.dom.ASTNodes; import org.eclipse.jdt.internal.corext.dom.Bindings; @@ -72,7 +71,6 @@ import org.eclipse.jdt.ls.core.internal.StatusFactory; import org.eclipse.jdt.ls.core.internal.corext.template.java.CodeTemplateContext; import org.eclipse.jdt.ls.core.internal.corext.template.java.CodeTemplateContextType; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; import org.eclipse.jdt.ls.core.internal.preferences.CodeGenerationTemplate; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; @@ -1496,31 +1494,4 @@ public static String getExceptionVariableName(IJavaProject project) { // } // - public static ImportRewrite createImportRewrite(ICompilationUnit cu, boolean restoreExistingImports) throws JavaModelException { - return ImportRewrite.create(cu, restoreExistingImports); - } - - /** - * Returns a {@link ImportRewrite} using {@link ImportRewrite#create(CompilationUnit, boolean)} and - * configures the rewriter with the settings as specified in the JDT UI preferences. - * <p> - * This method sets {@link ImportRewrite#setUseContextToFilterImplicitImports(boolean)} to <code>true</code> - * iff the given AST has been resolved with bindings. Clients should always supply a context - * when they call one of the <code>addImport(...)</code> methods. - * </p> - * - * @param astRoot the AST root to create the rewriter on - * @param restoreExistingImports specifies if the existing imports should be kept or removed. - * @return the new rewriter configured with the settings as specified in the JDT UI preferences. - * - * @see ImportRewrite#create(CompilationUnit, boolean) - */ - public static ImportRewrite createImportRewrite(CompilationUnit astRoot, boolean restoreExistingImports) { - ImportRewrite rewrite = ImportRewrite.create(astRoot, restoreExistingImports); - if (astRoot.getAST().hasResolvedBindings()) { - rewrite.setUseContextToFilterImplicitImports(true); - } - return rewrite; - } - } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/StubUtility2.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/StubUtility2.java index 77078c2f86..60d0281677 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/StubUtility2.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/codemanipulation/StubUtility2.java @@ -48,6 +48,7 @@ import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.IPackageBinding; import org.eclipse.jdt.core.dom.ITypeBinding; +import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.MethodDeclaration; import org.eclipse.jdt.core.dom.Modifier; import org.eclipse.jdt.core.dom.Name; @@ -368,7 +369,7 @@ public static MethodDeclaration createImplementationStub(ICompilationUnit unit, IJavaProject javaProject= unit.getJavaProject(); IAnnotationBinding nullnessDefault= null; if (contextBinding != null && JavaCore.ENABLED.equals(javaProject.getOption(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, true))) { - nullnessDefault= Bindings.findNullnessDefault(contextBinding, javaProject); + nullnessDefault = findNullnessDefault(contextBinding, javaProject); } MethodDeclaration decl= ast.newMethodDeclaration(); @@ -482,6 +483,55 @@ public static MethodDeclaration createImplementationStub(ICompilationUnit unit, return decl; } + // TODO Remove this by addressing https://bugs.eclipse.org/bugs/show_bug.cgi?id=531511 + private static IAnnotationBinding findNullnessDefault(IBinding contextBinding, IJavaProject javaProject) { + if (JavaCore.ENABLED.equals(javaProject.getOption(JavaCore.COMPILER_ANNOTATION_NULL_ANALYSIS, true))) { + String annotationName = javaProject.getOption(JavaCore.COMPILER_NONNULL_BY_DEFAULT_ANNOTATION_NAME, true); + while (contextBinding != null) { + for (IAnnotationBinding annotation : contextBinding.getAnnotations()) { + ITypeBinding annotationType = annotation.getAnnotationType(); + if (annotationType != null && annotationType.getQualifiedName().equals(annotationName)) { + return annotation; + } + } + // travel out: + switch (contextBinding.getKind()) { + case IBinding.METHOD: + IMethodBinding methodBinding = (IMethodBinding) contextBinding; + contextBinding = methodBinding.getDeclaringMember(); + if (contextBinding == null) { + contextBinding = methodBinding.getDeclaringClass(); + } + break; + case IBinding.VARIABLE: + IVariableBinding variableBinding = (IVariableBinding) contextBinding; + contextBinding = variableBinding.getDeclaringMethod(); + if (contextBinding == null) { + contextBinding = variableBinding.getDeclaringClass(); + } + break; + case IBinding.TYPE: + ITypeBinding currentClass = (ITypeBinding) contextBinding; + contextBinding = currentClass.getDeclaringMember(); + if (contextBinding == null) { + contextBinding = currentClass.getDeclaringMethod(); + if (contextBinding == null) { + contextBinding = currentClass.getDeclaringClass(); + if (contextBinding == null) { + contextBinding = currentClass.getPackage(); + } + } + } + break; + default: + contextBinding = null; + break; + } + } + } + return null; + } + private static void createTypeParameters(ImportRewrite imports, ImportRewriteContext context, AST ast, IMethodBinding binding, MethodDeclaration decl) { ITypeBinding[] typeParams= binding.getTypeParameters(); List<TypeParameter> typeParameters= decl.typeParameters(); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/fix/LinkedProposalPositionGroup.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/fix/LinkedProposalPositionGroup.java index dd411746ef..4ce6789222 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/fix/LinkedProposalPositionGroup.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/fix/LinkedProposalPositionGroup.java @@ -21,8 +21,8 @@ import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.rewrite.ITrackedNodePosition; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; +import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration; import org.eclipse.jdt.ls.core.internal.BindingLabelProvider; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; import org.eclipse.jdt.ls.core.internal.hover.JavaElementLabels; import org.eclipse.jface.text.link.LinkedModeModel; import org.eclipse.jface.text.link.LinkedPosition; @@ -194,7 +194,7 @@ public JavaLinkedModeProposal(ICompilationUnit unit, ITypeBinding typeProposal, @Override public TextEdit computeEdits(int offset, LinkedPosition position, char trigger, int stateMask, LinkedModeModel model) throws CoreException { - ImportRewrite impRewrite= StubUtility.createImportRewrite(fCompilationUnit, true); + ImportRewrite impRewrite = CodeStyleConfiguration.createImportRewrite(fCompilationUnit, true); String replaceString= impRewrite.addImport(fTypeProposal); MultiTextEdit composedEdit= new MultiTextEdit(); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/Checks.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/Checks.java index 5929f0b6a7..1337badecd 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/Checks.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/Checks.java @@ -23,7 +23,7 @@ import org.eclipse.jdt.ls.core.internal.corext.refactoring.base.JavaStatusContext; import org.eclipse.jdt.ls.core.internal.corext.util.JavaConventionsUtil; import org.eclipse.ltk.core.refactoring.RefactoringStatus; -import org.eclipse.ltk.internal.core.refactoring.Resources; +import org.eclipse.ltk.core.refactoring.resource.Resources; /** * This class defines a set of reusable static checks methods. diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractMethodAnalyzer.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractMethodAnalyzer.java index 1c22a9ab6f..4db6e2dff3 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractMethodAnalyzer.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractMethodAnalyzer.java @@ -73,6 +73,7 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.ls.core.internal.BindingLabelProvider; @@ -92,7 +93,6 @@ import org.eclipse.jdt.ls.core.internal.corext.refactoring.code.flow.InOutFlowAnalyzer; import org.eclipse.jdt.ls.core.internal.corext.refactoring.code.flow.InputFlowAnalyzer; import org.eclipse.jdt.ls.core.internal.corext.refactoring.util.CodeAnalyzer; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; import org.eclipse.jdt.ls.core.internal.hover.JavaElementLabels; import org.eclipse.ltk.core.refactoring.RefactoringStatus; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractMethodRefactoring.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractMethodRefactoring.java index 6e8254a2d0..2cfb5deb79 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractMethodRefactoring.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/code/ExtractMethodRefactoring.java @@ -85,10 +85,12 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration; import org.eclipse.jdt.core.refactoring.CompilationUnitChange; import org.eclipse.jdt.core.refactoring.IJavaRefactorings; import org.eclipse.jdt.core.refactoring.descriptors.ExtractMethodDescriptor; import org.eclipse.jdt.core.refactoring.descriptors.JavaRefactoringDescriptor; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; import org.eclipse.jdt.internal.core.refactoring.descriptors.RefactoringSignatureDescriptorFactory; import org.eclipse.jdt.internal.corext.util.JdtFlags; @@ -96,7 +98,6 @@ import org.eclipse.jdt.ls.core.internal.Messages; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.CodeGeneration; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodeFactory; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodes; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; @@ -116,7 +117,6 @@ import org.eclipse.jdt.ls.core.internal.corext.refactoring.util.RefactoringASTParser; import org.eclipse.jdt.ls.core.internal.corext.refactoring.util.ResourceUtil; import org.eclipse.jdt.ls.core.internal.corext.refactoring.util.SelectionAwareSourceRangeComputer; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; import org.eclipse.jdt.ls.core.internal.hover.JavaElementLabels; import org.eclipse.jdt.ls.core.internal.text.correction.ModifierCorrectionSubProcessor; import org.eclipse.ltk.core.refactoring.Change; @@ -332,7 +332,7 @@ public RefactoringStatus checkInitialConditions(IProgressMonitor pm) throws Core if (fRoot == null) { fRoot = RefactoringASTParser.parseWithASTProvider(fCUnit, true, new SubProgressMonitor(pm, 99)); } - fImportRewriter = StubUtility.createImportRewrite(fRoot, true); + fImportRewriter = CodeStyleConfiguration.createImportRewrite(fRoot, true); fAST = fRoot.getAST(); fRoot.accept(createVisitor()); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/structure/CompilationUnitRewrite.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/structure/CompilationUnitRewrite.java index 47b711bdb3..ffbc6875a3 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/structure/CompilationUnitRewrite.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/structure/CompilationUnitRewrite.java @@ -25,10 +25,10 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; +import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.core.refactoring.CompilationUnitChange; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.ltk.core.refactoring.CategorizedTextEditGroup; @@ -295,7 +295,7 @@ public ICompilationUnit getCu() { public CompilationUnit getRoot() { if (fRoot == null) { - fRoot = SharedASTProvider.getInstance().getAST(fCu, null); + fRoot = CoreASTProvider.getInstance().getAST(fCu, CoreASTProvider.WAIT_YES, null); } return fRoot; } @@ -326,9 +326,9 @@ public ImportRewrite getImportRewrite() { * ImportRewrite#setUseContextToFilterImplicitImports(boolean) will be set to true * and ContextSensitiveImportRewriteContext etc. can be used. */ if (fRoot == null && ! fResolveBindings) { - fImportRewrite= StubUtility.createImportRewrite(fCu, true); + fImportRewrite = CodeStyleConfiguration.createImportRewrite(fCu, true); } else { - fImportRewrite= StubUtility.createImportRewrite(getRoot(), true); + fImportRewrite = CodeStyleConfiguration.createImportRewrite(getRoot(), true); } } catch (CoreException e) { JavaLanguageServerPlugin.log(e); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/structure/ImportRemover.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/structure/ImportRemover.java index 80a28ec542..da94aa0612 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/structure/ImportRemover.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/structure/ImportRemover.java @@ -36,7 +36,7 @@ import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.Type; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ImportReferencesCollector; +import org.eclipse.jdt.core.manipulation.ImportReferencesCollector; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/surround/SurroundWithTryCatchRefactoring.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/surround/SurroundWithTryCatchRefactoring.java index c667784e43..c0a2ee7894 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/surround/SurroundWithTryCatchRefactoring.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/surround/SurroundWithTryCatchRefactoring.java @@ -50,6 +50,7 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration; import org.eclipse.jdt.core.refactoring.CompilationUnitChange; import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.core.manipulation.util.Strings; @@ -204,7 +205,7 @@ public Change createChange(IProgressMonitor pm) throws CoreException { result.setEdit(root); fRewriter = ASTRewrite.create(fAnalyzer.getEnclosingBodyDeclaration().getAST()); fRewriter.setTargetSourceRangeComputer(new SelectionAwareSourceRangeComputer(fAnalyzer.getSelectedNodes(), fCUnit.getBuffer(), fSelection.getOffset(), fSelection.getLength())); - fImportRewrite = StubUtility.createImportRewrite(fRootNode, true); + fImportRewrite = CodeStyleConfiguration.createImportRewrite(fRootNode, true); fLinkedProposalModel = new LinkedProposalModel(); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/util/RefactoringASTParser.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/util/RefactoringASTParser.java index ac505de18f..2ea875663d 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/util/RefactoringASTParser.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/refactoring/util/RefactoringASTParser.java @@ -26,9 +26,9 @@ import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ASTParser; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.internal.corext.dom.IASTSharedValues; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; public class RefactoringASTParser { @@ -129,7 +129,7 @@ public CompilationUnit parse(String newCfSource, IClassFile originalCf, boolean * @return the parsed CompilationUnit */ public static CompilationUnit parseWithASTProvider(ITypeRoot typeRoot, boolean resolveBindings, IProgressMonitor pm) { - CompilationUnit cuNode = SharedASTProvider.getInstance().getAST(typeRoot, pm); + CompilationUnit cuNode = CoreASTProvider.getInstance().getAST(typeRoot, CoreASTProvider.WAIT_YES, pm); if (cuNode != null) { return cuNode; } else { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/utils/TypeNameMatchCollector.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/utils/TypeNameMatchCollector.java deleted file mode 100644 index 7ceb43c395..0000000000 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corext/utils/TypeNameMatchCollector.java +++ /dev/null @@ -1,42 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2000, 2012 IBM Corporation and others. - * 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 - * http://www.eclipse.org/legal/epl-v10.html - * - * Copied from /org.eclipse.jdt.ui/src/org/eclipse/jdt/internal/corext/util/TypeNameMatchCollector.java - * - * Contributors: - * IBM Corporation - initial API and implementation - *******************************************************************************/ -package org.eclipse.jdt.ls.core.internal.corext.utils; - -import java.util.Collection; - -import org.eclipse.core.runtime.Assert; -import org.eclipse.jdt.core.search.TypeNameMatch; -import org.eclipse.jdt.core.search.TypeNameMatchRequestor; - -public class TypeNameMatchCollector extends TypeNameMatchRequestor { - - private final Collection<TypeNameMatch> fCollection; - - public TypeNameMatchCollector(Collection<TypeNameMatch> collection) { - Assert.isNotNull(collection); - fCollection= collection; - } - - private boolean inScope(TypeNameMatch match) { - return true; - // return ! TypeFilter.isFiltered(match); - } - - @Override - public void acceptTypeNameMatch(TypeNameMatch match) { - if (inScope(match)) { - fCollection.add(match); - } - } - -} diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/ASTResolving.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/ASTResolving.java index dd3740f844..d23e24a22d 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/ASTResolving.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/ASTResolving.java @@ -1,12 +1,10 @@ /******************************************************************************* - * Copyright (c) 2000, 2016 IBM Corporation and others. + * Copyright (c) 2000, 2018 IBM Corporation and others. * 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 * http://www.eclipse.org/legal/epl-v10.html * - * Copied from /org.eclipse.jdt.ui/src/org/eclipse/jdt/internal/ui/text/correction/ASTResolving.java - * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ @@ -16,28 +14,18 @@ import org.eclipse.jdt.core.dom.AST; import org.eclipse.jdt.core.dom.ASTNode; import org.eclipse.jdt.core.dom.ArrayAccess; -import org.eclipse.jdt.core.dom.ClassInstanceCreation; import org.eclipse.jdt.core.dom.FieldAccess; import org.eclipse.jdt.core.dom.IMethodBinding; import org.eclipse.jdt.core.dom.ITypeBinding; -import org.eclipse.jdt.core.dom.MethodDeclaration; -import org.eclipse.jdt.core.dom.NameQualifiedType; -import org.eclipse.jdt.core.dom.ParameterizedType; import org.eclipse.jdt.core.dom.QualifiedName; -import org.eclipse.jdt.core.dom.QualifiedType; import org.eclipse.jdt.core.dom.Type; -import org.eclipse.jdt.core.dom.TypeDeclaration; -import org.eclipse.jdt.core.dom.TypeParameter; import org.eclipse.jdt.core.dom.VariableDeclaration; import org.eclipse.jdt.core.dom.VariableDeclarationFragment; -import org.eclipse.jdt.core.dom.WildcardType; import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; import org.eclipse.jdt.ls.core.internal.BindingLabelProvider; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodeFactory; import org.eclipse.jdt.ls.core.internal.hover.JavaElementLabels; - - /** * JDT-UI-internal helper methods to find AST nodes or bindings. * @@ -66,14 +54,6 @@ public static String getMethodSignature(String name, ITypeBinding[] params, bool return BasicElementLabels.getJavaElementName(buf.toString()); } - public static int getPossibleTypeKinds(ASTNode node, boolean is50OrHigher) { - int kinds= internalGetPossibleTypeKinds(node); - if (!is50OrHigher) { - kinds &= (SimilarElementsRequestor.INTERFACES | SimilarElementsRequestor.CLASSES); - } - return kinds; - } - public static String getTypeSignature(ITypeBinding type) { return BindingLabelProvider.getBindingLabel(type, BindingLabelProvider.DEFAULT_TEXTFLAGS); } @@ -82,155 +62,49 @@ public static Type guessTypeForReference(AST ast, ASTNode node) { ASTNode parent= node.getParent(); while (parent != null) { switch (parent.getNodeType()) { - case ASTNode.VARIABLE_DECLARATION_FRAGMENT: - if (((VariableDeclarationFragment) parent).getInitializer() == node) { - return ASTNodeFactory.newType(ast, (VariableDeclaration) parent); - } - return null; - case ASTNode.SINGLE_VARIABLE_DECLARATION: - if (((VariableDeclarationFragment) parent).getInitializer() == node) { - return ASTNodeFactory.newType(ast, (VariableDeclaration) parent); - } - return null; - case ASTNode.ARRAY_ACCESS: - if (!((ArrayAccess) parent).getIndex().equals(node)) { - Type type= guessTypeForReference(ast, parent); - if (type != null) { - return ASTNodeFactory.newArrayType(type); + case ASTNode.VARIABLE_DECLARATION_FRAGMENT: + if (((VariableDeclarationFragment) parent).getInitializer() == node) { + return ASTNodeFactory.newType(ast, (VariableDeclaration) parent); + } + return null; + case ASTNode.SINGLE_VARIABLE_DECLARATION: + if (((VariableDeclarationFragment) parent).getInitializer() == node) { + return ASTNodeFactory.newType(ast, (VariableDeclaration) parent); } - } - return null; - case ASTNode.FIELD_ACCESS: - if (node.equals(((FieldAccess) parent).getName())) { - node= parent; - parent= parent.getParent(); - } else { return null; - } - break; - case ASTNode.SUPER_FIELD_ACCESS: - case ASTNode.PARENTHESIZED_EXPRESSION: - node= parent; - parent= parent.getParent(); - break; - case ASTNode.QUALIFIED_NAME: - if (node.equals(((QualifiedName) parent).getName())) { + case ASTNode.ARRAY_ACCESS: + if (!((ArrayAccess) parent).getIndex().equals(node)) { + Type type = guessTypeForReference(ast, parent); + if (type != null) { + return ASTNodeFactory.newArrayType(type); + } + } + return null; + case ASTNode.FIELD_ACCESS: + if (node.equals(((FieldAccess) parent).getName())) { + node = parent; + parent = parent.getParent(); + } else { + return null; + } + break; + case ASTNode.SUPER_FIELD_ACCESS: + case ASTNode.PARENTHESIZED_EXPRESSION: node= parent; parent= parent.getParent(); - } else { + break; + case ASTNode.QUALIFIED_NAME: + if (node.equals(((QualifiedName) parent).getName())) { + node = parent; + parent = parent.getParent(); + } else { + return null; + } + break; + default: return null; - } - break; - default: - return null; } } return null; } - - private static int internalGetPossibleTypeKinds(ASTNode node) { - int kind= SimilarElementsRequestor.ALL_TYPES; - - int mask= SimilarElementsRequestor.ALL_TYPES | SimilarElementsRequestor.VOIDTYPE; - - ASTNode parent= node.getParent(); - while (parent instanceof QualifiedName) { - if (node.getLocationInParent() == QualifiedName.QUALIFIER_PROPERTY) { - return SimilarElementsRequestor.REF_TYPES; - } - node= parent; - parent= parent.getParent(); - mask= SimilarElementsRequestor.REF_TYPES; - } - while (parent instanceof Type) { - if (parent instanceof QualifiedType) { - if (node.getLocationInParent() == QualifiedType.QUALIFIER_PROPERTY) { - return mask & (SimilarElementsRequestor.REF_TYPES); - } - mask&= SimilarElementsRequestor.REF_TYPES; - } else if (parent instanceof NameQualifiedType) { - if (node.getLocationInParent() == NameQualifiedType.QUALIFIER_PROPERTY) { - return mask & (SimilarElementsRequestor.REF_TYPES); - } - mask&= SimilarElementsRequestor.REF_TYPES; - } else if (parent instanceof ParameterizedType) { - if (node.getLocationInParent() == ParameterizedType.TYPE_ARGUMENTS_PROPERTY) { - return mask & SimilarElementsRequestor.REF_TYPES_AND_VAR; - } - mask&= SimilarElementsRequestor.CLASSES | SimilarElementsRequestor.INTERFACES; - } else if (parent instanceof WildcardType) { - if (node.getLocationInParent() == WildcardType.BOUND_PROPERTY) { - return mask & SimilarElementsRequestor.REF_TYPES_AND_VAR; - } - } - node= parent; - parent= parent.getParent(); - } - - if (parent != null) { - switch (parent.getNodeType()) { - case ASTNode.TYPE_DECLARATION: - if (node.getLocationInParent() == TypeDeclaration.SUPER_INTERFACE_TYPES_PROPERTY) { - kind= SimilarElementsRequestor.INTERFACES; - } else if (node.getLocationInParent() == TypeDeclaration.SUPERCLASS_TYPE_PROPERTY) { - kind= SimilarElementsRequestor.CLASSES; - } - break; - case ASTNode.ENUM_DECLARATION: - kind= SimilarElementsRequestor.INTERFACES; - break; - case ASTNode.METHOD_DECLARATION: - if (node.getLocationInParent() == MethodDeclaration.THROWN_EXCEPTION_TYPES_PROPERTY) { - kind= SimilarElementsRequestor.CLASSES; - } else if (node.getLocationInParent() == MethodDeclaration.RETURN_TYPE2_PROPERTY) { - kind= SimilarElementsRequestor.ALL_TYPES | SimilarElementsRequestor.VOIDTYPE; - } - break; - case ASTNode.ANNOTATION_TYPE_MEMBER_DECLARATION: - kind= SimilarElementsRequestor.PRIMITIVETYPES | SimilarElementsRequestor.ANNOTATIONS | SimilarElementsRequestor.ENUMS; - break; - case ASTNode.INSTANCEOF_EXPRESSION: - kind= SimilarElementsRequestor.REF_TYPES; - break; - case ASTNode.THROW_STATEMENT: - kind= SimilarElementsRequestor.CLASSES; - break; - case ASTNode.CLASS_INSTANCE_CREATION: - if (((ClassInstanceCreation) parent).getAnonymousClassDeclaration() == null) { - kind= SimilarElementsRequestor.CLASSES; - } else { - kind= SimilarElementsRequestor.CLASSES | SimilarElementsRequestor.INTERFACES; - } - break; - case ASTNode.SINGLE_VARIABLE_DECLARATION: - int superParent= parent.getParent().getNodeType(); - if (superParent == ASTNode.CATCH_CLAUSE) { - kind= SimilarElementsRequestor.CLASSES; - } else if (superParent == ASTNode.ENHANCED_FOR_STATEMENT) { - kind= SimilarElementsRequestor.REF_TYPES; - } - break; - case ASTNode.TAG_ELEMENT: - kind= SimilarElementsRequestor.REF_TYPES; - break; - case ASTNode.MARKER_ANNOTATION: - case ASTNode.SINGLE_MEMBER_ANNOTATION: - case ASTNode.NORMAL_ANNOTATION: - kind= SimilarElementsRequestor.ANNOTATIONS; - break; - case ASTNode.TYPE_PARAMETER: - if (((TypeParameter) parent).typeBounds().indexOf(node) > 0) { - kind= SimilarElementsRequestor.INTERFACES; - } else { - kind= SimilarElementsRequestor.REF_TYPES_AND_VAR; - } - break; - case ASTNode.TYPE_LITERAL: - kind= SimilarElementsRequestor.REF_TYPES; - break; - default: - } - } - return kind & mask; - } } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ASTRewriteCorrectionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ASTRewriteCorrectionProposal.java index a6bf266286..26f42a2889 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ASTRewriteCorrectionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ASTRewriteCorrectionProposal.java @@ -19,8 +19,8 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; +import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration; import org.eclipse.jdt.ls.core.internal.StatusFactory; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; import org.eclipse.jface.text.IDocument; import org.eclipse.text.edits.TextEdit; @@ -76,7 +76,7 @@ public void setImportRewrite(ImportRewrite rewrite) { * @nooverride This method is not intended to be re-implemented or extended by clients. */ public ImportRewrite createImportRewrite(CompilationUnit astRoot) { - fImportRewrite = StubUtility.createImportRewrite(astRoot, true); + fImportRewrite = CodeStyleConfiguration.createImportRewrite(astRoot, true); return fImportRewrite; } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AbstractMethodCorrectionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AbstractMethodCorrectionProposal.java index c5444c8f18..b281382287 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AbstractMethodCorrectionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AbstractMethodCorrectionProposal.java @@ -43,13 +43,13 @@ import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.CodeGeneration; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.CodeGenerationSettings; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodeFactory; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodes; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AddArgumentCorrectionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AddArgumentCorrectionProposal.java index 7e30b128dc..9a82f175fb 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AddArgumentCorrectionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AddArgumentCorrectionProposal.java @@ -27,9 +27,9 @@ import org.eclipse.jdt.core.dom.StructuralPropertyDescriptor; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodeFactory; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; public class AddArgumentCorrectionProposal extends ASTRewriteCorrectionProposal { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AddTypeParameterProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AddTypeParameterProposal.java index 5b355299af..be9598d7de 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AddTypeParameterProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/AddTypeParameterProposal.java @@ -33,11 +33,11 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; import org.eclipse.jdt.ls.core.internal.Messages; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; import org.eclipse.jdt.ls.core.internal.corrections.CorrectionMessages; @@ -62,10 +62,10 @@ public AddTypeParameterProposal(ICompilationUnit targetCU, IBinding binding, Com fBounds= bounds; if (binding instanceof IMethodBinding) { - String[] args= { BasicElementLabels.getJavaElementName(fTypeParamName), ASTResolving.getMethodSignature((IMethodBinding) binding) }; + String[] args = { BasicElementLabels.getJavaElementName(fTypeParamName), org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature((IMethodBinding) binding) }; setDisplayName(Messages.format(CorrectionMessages.AddTypeParameterProposal_method_label, args)); } else { - String[] args= { BasicElementLabels.getJavaElementName(fTypeParamName), ASTResolving.getTypeSignature((ITypeBinding) binding) }; + String[] args = { BasicElementLabels.getJavaElementName(fTypeParamName), org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getTypeSignature((ITypeBinding) binding) }; setDisplayName(Messages.format(CorrectionMessages.AddTypeParameterProposal_type_label, args)); } } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/CastCorrectionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/CastCorrectionProposal.java index df104a9ad7..4b9ac6c752 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/CastCorrectionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/CastCorrectionProposal.java @@ -32,8 +32,8 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; public class CastCorrectionProposal extends ASTRewriteCorrectionProposal { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ChangeMethodSignatureProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ChangeMethodSignatureProposal.java index 48f8ad2a8b..8ea47d244f 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ChangeMethodSignatureProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ChangeMethodSignatureProposal.java @@ -38,6 +38,7 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; @@ -47,7 +48,6 @@ import org.eclipse.jdt.ls.core.internal.corext.dom.DimensionRewrite; import org.eclipse.jdt.ls.core.internal.corext.dom.LinkedNodeFinder; import org.eclipse.jdt.ls.core.internal.corext.dom.TypeAnnotationRewrite; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; public class ChangeMethodSignatureProposal extends LinkedCorrectionProposal { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/GetterSetterCorrectionSubProcessor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/GetterSetterCorrectionSubProcessor.java index 7a65915b82..b45904cb69 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/GetterSetterCorrectionSubProcessor.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/GetterSetterCorrectionSubProcessor.java @@ -30,11 +30,11 @@ import org.eclipse.jdt.core.dom.SimpleName; import org.eclipse.jdt.core.dom.SuperFieldAccess; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; import org.eclipse.jdt.internal.corext.util.JdtFlags; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.Messages; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.corrections.CorrectionMessages; import org.eclipse.jdt.ls.core.internal.corrections.IInvocationContext; import org.eclipse.jdt.ls.core.internal.corrections.IProblemLocation; @@ -115,7 +115,7 @@ private static CUCorrectionProposal getProposal(ProposalParameter context) { IJavaElement element = context.variableBinding.getJavaElement(); if (element instanceof IField) { IField field = (IField) element; - CompilationUnit cu = SharedASTProvider.getInstance().getAST(field.getTypeRoot(), null); + CompilationUnit cu = CoreASTProvider.getInstance().getAST(field.getTypeRoot(), CoreASTProvider.WAIT_YES, null); try { if (isSelfEncapsulateAvailable(field)) { return new SelfEncapsulateFieldProposal(getDescription(field), field.getCompilationUnit(), cu.getRoot(), context.variableBinding, field, IProposalRelevance.GETTER_SETTER_UNUSED_PRIVATE_FIELD); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/JavadocTagsSubProcessor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/JavadocTagsSubProcessor.java index f4dc2530c1..e1cf7f50e9 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/JavadocTagsSubProcessor.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/JavadocTagsSubProcessor.java @@ -52,13 +52,13 @@ import org.eclipse.jdt.core.dom.VariableDeclarationFragment; import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.core.manipulation.util.Strings; import org.eclipse.jdt.ls.core.internal.StatusFactory; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.CodeGeneration; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodes; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; import org.eclipse.jdt.ls.core.internal.corrections.CorrectionMessages; import org.eclipse.jdt.ls.core.internal.corrections.IInvocationContext; import org.eclipse.jdt.ls.core.internal.corrections.IProblemLocation; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewAnnotationMemberProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewAnnotationMemberProposal.java index dcaa8f0c68..c0585536c9 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewAnnotationMemberProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewAnnotationMemberProposal.java @@ -30,9 +30,9 @@ import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodeFactory; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; public class NewAnnotationMemberProposal extends ASTRewriteCorrectionProposal { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewMethodCorrectionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewMethodCorrectionProposal.java index 549c50a69a..327fc4877d 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewMethodCorrectionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewMethodCorrectionProposal.java @@ -43,12 +43,12 @@ import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.internal.corext.util.JdtFlags; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodes; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; public class NewMethodCorrectionProposal extends AbstractMethodCorrectionProposal { @@ -194,7 +194,7 @@ protected Type getNewMethodType(ASTRewrite rewrite, ImportRewriteContext importR if (parent instanceof ExpressionStatement) { newTypeNode= ast.newPrimitiveType(PrimitiveType.VOID); } else { - newTypeNode = ASTResolving.guessTypeForReference(ast, node); + newTypeNode = org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.guessTypeForReference(ast, node); if (newTypeNode == null) { newTypeNode= ast.newSimpleType(ast.newSimpleName("Object")); //$NON-NLS-1$ } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewVariableCorrectionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewVariableCorrectionProposal.java index 1a4d726a05..440d42be8b 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewVariableCorrectionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/NewVariableCorrectionProposal.java @@ -61,13 +61,13 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodeFactory; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodes; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; import org.eclipse.jdt.ls.core.internal.corext.dom.BodyDeclarationRewrite; import org.eclipse.jdt.ls.core.internal.corext.dom.LinkedNodeFinder; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; public class NewVariableCorrectionProposal extends ASTRewriteCorrectionProposal { @@ -453,7 +453,7 @@ private Type evaluateVariableType(AST ast, ImportRewrite imports, ImportRewriteC return imports.addImport(binding, ast, importRewriteContext, location); } // no binding, find type AST node instead -> ABC a= x-> use 'ABC' as is - Type type = ASTResolving.guessTypeForReference(ast, fOriginalNode); + Type type = org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.guessTypeForReference(ast, fOriginalNode); if (type != null) { return type; } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/RenameNodeCorrectionProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/RenameNodeCorrectionProposal.java index 1c05d20ae3..08568d2cc9 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/RenameNodeCorrectionProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/RenameNodeCorrectionProposal.java @@ -18,7 +18,7 @@ import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.NodeFinder; import org.eclipse.jdt.core.dom.SimpleName; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.ls.core.internal.corext.dom.LinkedNodeFinder; import org.eclipse.jface.text.IDocument; import org.eclipse.text.edits.ReplaceEdit; @@ -42,7 +42,7 @@ protected void addEdits(IDocument doc, TextEdit root) throws CoreException { super.addEdits(doc, root); // build a full AST - CompilationUnit unit = SharedASTProvider.getInstance().getAST(getCompilationUnit(), null); + CompilationUnit unit = CoreASTProvider.getInstance().getAST(getCompilationUnit(), CoreASTProvider.WAIT_YES, null); ASTNode name= NodeFinder.perform(unit, fOffset, fLength); if (name instanceof SimpleName) { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ReorgCorrectionsSubProcessor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ReorgCorrectionsSubProcessor.java index 7d74c8bf6c..d609f756ef 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ReorgCorrectionsSubProcessor.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/ReorgCorrectionsSubProcessor.java @@ -26,9 +26,9 @@ import org.eclipse.jdt.core.dom.AbstractTypeDeclaration; import org.eclipse.jdt.core.dom.CompilationUnit; import org.eclipse.jdt.core.dom.SimpleName; +import org.eclipse.jdt.core.manipulation.OrganizeImportsOperation; import org.eclipse.jdt.core.refactoring.CompilationUnitChange; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.OrganizeImportsOperation; import org.eclipse.jdt.ls.core.internal.corext.fix.IProposableFix; import org.eclipse.jdt.ls.core.internal.corext.fix.UnusedCodeFix; import org.eclipse.jdt.ls.core.internal.corrections.CorrectionMessages; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/SelfEncapsulateFieldProposal.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/SelfEncapsulateFieldProposal.java index 86b09344cb..45d9c12938 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/SelfEncapsulateFieldProposal.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/SelfEncapsulateFieldProposal.java @@ -39,13 +39,13 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.CodeGeneration; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.GetterSetterUtil; import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodes; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; public class SelfEncapsulateFieldProposal extends ASTRewriteCorrectionProposal { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/TypeMismatchSubProcessor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/TypeMismatchSubProcessor.java index b759c91cea..94cf2f57d9 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/TypeMismatchSubProcessor.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/TypeMismatchSubProcessor.java @@ -50,6 +50,7 @@ import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.TypeLocation; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; import org.eclipse.jdt.ls.core.internal.BindingLabelProvider; @@ -58,7 +59,6 @@ import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodes; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; import org.eclipse.jdt.ls.core.internal.corrections.CorrectionMessages; import org.eclipse.jdt.ls.core.internal.corrections.IInvocationContext; import org.eclipse.jdt.ls.core.internal.corrections.IProblemLocation; diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/UnresolvedElementsSubProcessor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/UnresolvedElementsSubProcessor.java index 9c3faf043b..83a38bbb4c 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/UnresolvedElementsSubProcessor.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/corrections/proposals/UnresolvedElementsSubProcessor.java @@ -73,7 +73,10 @@ import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext; +import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration; +import org.eclipse.jdt.core.manipulation.TypeKinds; import org.eclipse.jdt.core.refactoring.CompilationUnitChange; +import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.core.manipulation.util.BasicElementLabels; import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer; import org.eclipse.jdt.internal.corext.util.JavaModelUtil; @@ -84,7 +87,6 @@ import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodeFactory; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodes; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; -import org.eclipse.jdt.ls.core.internal.corrections.ASTResolving; import org.eclipse.jdt.ls.core.internal.corrections.CorrectionMessages; import org.eclipse.jdt.ls.core.internal.corrections.IInvocationContext; import org.eclipse.jdt.ls.core.internal.corrections.IProblemLocation; @@ -137,12 +139,12 @@ public static void getVariableProposals(IInvocationContext context, IProblemLoca ASTNode parent= node.getParent(); StructuralPropertyDescriptor locationInParent= node.getLocationInParent(); if (locationInParent == ExpressionMethodReference.EXPRESSION_PROPERTY) { - typeKind= SimilarElementsRequestor.REF_TYPES; + typeKind= TypeKinds.REF_TYPES; } else if (locationInParent == MethodInvocation.EXPRESSION_PROPERTY) { if (JavaModelUtil.is18OrHigher(cu.getJavaProject())) { - typeKind= SimilarElementsRequestor.CLASSES | SimilarElementsRequestor.INTERFACES | SimilarElementsRequestor.ENUMS; + typeKind= TypeKinds.CLASSES | TypeKinds.INTERFACES | TypeKinds.ENUMS; } else { - typeKind= SimilarElementsRequestor.CLASSES; + typeKind= TypeKinds.CLASSES; } } else if (locationInParent == FieldAccess.NAME_PROPERTY) { Expression expression= ((FieldAccess) parent).getExpression(); @@ -154,20 +156,20 @@ public static void getVariableProposals(IInvocationContext context, IProblemLoca } } else if (parent instanceof SimpleType || parent instanceof NameQualifiedType) { suggestVariableProposals= false; - typeKind= SimilarElementsRequestor.REF_TYPES_AND_VAR; + typeKind= TypeKinds.REF_TYPES_AND_VAR; } else if (parent instanceof QualifiedName) { Name qualifier= ((QualifiedName) parent).getQualifier(); if (qualifier != node) { binding= qualifier.resolveTypeBinding(); } else { - typeKind= SimilarElementsRequestor.REF_TYPES; + typeKind= TypeKinds.REF_TYPES; } ASTNode outerParent= parent.getParent(); while (outerParent instanceof QualifiedName) { outerParent= outerParent.getParent(); } if (outerParent instanceof SimpleType || outerParent instanceof NameQualifiedType) { - typeKind= SimilarElementsRequestor.REF_TYPES; + typeKind= TypeKinds.REF_TYPES; suggestVariableProposals= false; } } else if (locationInParent == SwitchCase.EXPRESSION_PROPERTY) { @@ -187,11 +189,11 @@ public static void getVariableProposals(IInvocationContext context, IProblemLoca binding= qualifierBinding; } else { node= qualifierName.getQualifier(); - typeKind= SimilarElementsRequestor.REF_TYPES; + typeKind= TypeKinds.REF_TYPES; suggestVariableProposals= node.isSimpleName(); } if (selectedNode.getParent() instanceof SimpleType || selectedNode.getParent() instanceof NameQualifiedType) { - typeKind= SimilarElementsRequestor.REF_TYPES; + typeKind= TypeKinds.REF_TYPES; suggestVariableProposals= false; } break; @@ -219,13 +221,13 @@ public static void getVariableProposals(IInvocationContext context, IProblemLoca // add type proposals if (typeKind != 0) { if (!JavaModelUtil.is50OrHigher(cu.getJavaProject())) { - typeKind &= ~(SimilarElementsRequestor.ANNOTATIONS | SimilarElementsRequestor.ENUMS | SimilarElementsRequestor.VARIABLES); + typeKind &= ~(TypeKinds.ANNOTATIONS | TypeKinds.ENUMS | TypeKinds.VARIABLES); } int relevance= Character.isUpperCase(ASTNodes.getSimpleNameIdentifier(node).charAt(0)) ? IProposalRelevance.VARIABLE_TYPE_PROPOSAL_1 : IProposalRelevance.VARIABLE_TYPE_PROPOSAL_2; addSimilarTypeProposals(typeKind, cu, node, relevance + 1, proposals); - typeKind &= ~SimilarElementsRequestor.ANNOTATIONS; + typeKind &= ~TypeKinds.ANNOTATIONS; addNewTypeProposals(cu, node, typeKind, relevance, proposals); } @@ -332,7 +334,7 @@ private static void addNewFieldForType(ICompilationUnit targetCU, ITypeBinding b String label; if (senderDeclBinding.isEnum() && !isWriteAccess) { label = Messages.format(CorrectionMessages.UnresolvedElementsSubProcessor_createenum_description, - new Object[] { nameLabel, ASTResolving.getTypeSignature(senderDeclBinding) }); + new Object[] { nameLabel, org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getTypeSignature(senderDeclBinding) }); proposals.add(new NewVariableCorrectionProposal(label, targetCU, NewVariableCorrectionProposal.ENUM_CONST, simpleName, senderDeclBinding, 10)); } else { @@ -342,7 +344,7 @@ private static void addNewFieldForType(ICompilationUnit targetCU, ITypeBinding b } else { label = Messages.format( CorrectionMessages.UnresolvedElementsSubProcessor_createfield_other_description, - new Object[] { nameLabel, ASTResolving.getTypeSignature(senderDeclBinding) }); + new Object[] { nameLabel, org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getTypeSignature(senderDeclBinding) }); } int fieldRelevance= StubUtility.hasFieldName(targetCU.getJavaProject(), name) ? IProposalRelevance.CREATE_FIELD_PREFIX_OR_SUFFIX_MATCH : IProposalRelevance.CREATE_FIELD; proposals.add(new NewVariableCorrectionProposal(label, targetCU, NewVariableCorrectionProposal.FIELD, @@ -355,7 +357,7 @@ private static void addNewFieldForType(ICompilationUnit targetCU, ITypeBinding b } else { label = Messages.format( CorrectionMessages.UnresolvedElementsSubProcessor_createconst_other_description, - new Object[] { nameLabel, ASTResolving.getTypeSignature(senderDeclBinding) }); + new Object[] { nameLabel, org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getTypeSignature(senderDeclBinding) }); } int constRelevance= StubUtility.hasConstantName(targetCU.getJavaProject(), name) ? IProposalRelevance.CREATE_CONSTANT_PREFIX_OR_SUFFIX_MATCH : IProposalRelevance.CREATE_CONSTANT; proposals.add(new NewVariableCorrectionProposal(label, targetCU, @@ -472,7 +474,7 @@ private static void addSimilarVariableProposals(ICompilationUnit cu, Compilation ASTRewrite rewrite= ASTRewrite.create(ast); String label = Messages.format( CorrectionMessages.UnresolvedElementsSubProcessor_changetomethod_description, - ASTResolving.getMethodSignature(curr)); + org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(curr)); ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, cu, rewrite, IProposalRelevance.CHANGE_TO_METHOD); newProposals.add(proposal); @@ -549,7 +551,7 @@ public static void getTypeProposals(IInvocationContext context, IProblemLocation int kind= evauateTypeKind(selectedNode, cu.getJavaProject()); - if (kind == SimilarElementsRequestor.REF_TYPES) { + if (kind == TypeKinds.REF_TYPES) { addEnhancedForWithoutTypeProposals(cu, selectedNode, proposals); } @@ -587,8 +589,8 @@ public static void getTypeProposals(IInvocationContext context, IProblemLocation if (selectedNode != node) { kind= evauateTypeKind(node, cu.getJavaProject()); } - if ((kind & (SimilarElementsRequestor.CLASSES | SimilarElementsRequestor.INTERFACES)) != 0) { - kind &= ~SimilarElementsRequestor.ANNOTATIONS; // only propose annotations when there are no other suggestions + if ((kind & (TypeKinds.CLASSES | TypeKinds.INTERFACES)) != 0) { + kind &= ~TypeKinds.ANNOTATIONS; // only propose annotations when there are no other suggestions } addNewTypeProposals(cu, node, kind, IProposalRelevance.NEW_TYPE, proposals); } @@ -620,7 +622,7 @@ static CompilationUnitChange createAddImportChange(ICompilationUnit cu, Name nam String label= Messages.format(CorrectionMessages.UnresolvedElementsSubProcessor_importtype_description, args); CompilationUnitChange cuChange= new CompilationUnitChange(label, cu); - ImportRewrite importRewrite= StubUtility.createImportRewrite((CompilationUnit) name.getRoot(), true); + ImportRewrite importRewrite = CodeStyleConfiguration.createImportRewrite((CompilationUnit) name.getRoot(), true); importRewrite.addImport(fullyQualifiedName); cuChange.setEdit(importRewrite.rewriteImports(null)); return cuChange; @@ -628,7 +630,7 @@ static CompilationUnitChange createAddImportChange(ICompilationUnit cu, Name nam private static void addSimilarTypeProposals(int kind, ICompilationUnit cu, Name node, int relevance, Collection<CUCorrectionProposal> proposals) throws CoreException { - SimilarElement[] elements= SimilarElementsRequestor.findSimilarElement(cu, node, kind); + SimilarElement[] elements = SimilarElementsRequestor.findSimilarElement(cu, node, kind); // try to resolve type in context -> highest severity String resolvedTypeName= null; @@ -667,7 +669,7 @@ private static void addSimilarTypeProposals(int kind, ICompilationUnit cu, Name // add all similar elements for (int i= 0; i < elements.length; i++) { SimilarElement elem= elements[i]; - if ((elem.getKind() & SimilarElementsRequestor.ALL_TYPES) != 0) { + if ((elem.getKind() & TypeKinds.ALL_TYPES) != 0) { String fullName= elem.getName(); if (!fullName.equals(resolvedTypeName)) { proposals.add(createTypeRefChangeProposal(cu, fullName, node, relevance, elements.length)); @@ -681,7 +683,7 @@ private static CUCorrectionProposal createTypeRefChangeProposal(ICompilationUnit String simpleName= fullName; String packName= Signature.getQualifier(fullName); if (packName.length() > 0) { // no imports for primitive types, type variables - importRewrite= StubUtility.createImportRewrite((CompilationUnit) node.getRoot(), true); + importRewrite = CodeStyleConfiguration.createImportRewrite((CompilationUnit) node.getRoot(), true); BodyDeclaration scope= ASTResolving.findParentBodyDeclaration(node); // can be null in package-info.java ImportRewriteContext context= new ContextSensitiveImportRewriteContext(scope != null ? scope : node, importRewrite); simpleName= importRewrite.addImport(fullName, context); @@ -806,16 +808,16 @@ public static void addNewTypeProposals(ICompilationUnit cu, Name refNode, int ki // || enclosingType != null && !enclosingType.isReadOnly() && !enclosingType.getType(typeName).exists()) { // new member type // IJavaElement enclosing= enclosingPackage != null ? (IJavaElement) enclosingPackage : enclosingType; // - // if ((kind & SimilarElementsRequestor.CLASSES) != 0) { + // if ((kind & TypeKinds.CLASSES) != 0) { // proposals.add(new NewCUUsingWizardProposal(cu, node, NewCUUsingWizardProposal.K_CLASS, enclosing, rel+3)); // } - // if ((kind & SimilarElementsRequestor.INTERFACES) != 0) { + // if ((kind & TypeKinds.INTERFACES) != 0) { // proposals.add(new NewCUUsingWizardProposal(cu, node, NewCUUsingWizardProposal.K_INTERFACE, enclosing, rel+2)); // } - // if ((kind & SimilarElementsRequestor.ENUMS) != 0) { + // if ((kind & TypeKinds.ENUMS) != 0) { // proposals.add(new NewCUUsingWizardProposal(cu, node, NewCUUsingWizardProposal.K_ENUM, enclosing, rel)); // } - // if ((kind & SimilarElementsRequestor.ANNOTATIONS) != 0) { + // if ((kind & TypeKinds.ANNOTATIONS) != 0) { // proposals.add(new NewCUUsingWizardProposal(cu, node, NewCUUsingWizardProposal.K_ANNOTATION, enclosing, rel + 1)); // addNullityAnnotationTypesProposals(cu, node, proposals); // } @@ -825,7 +827,7 @@ public static void addNewTypeProposals(ICompilationUnit cu, Name refNode, int ki // } while (node != null); // type parameter proposals - if (refNode.isSimpleName() && (kind & SimilarElementsRequestor.VARIABLES) != 0) { + if (refNode.isSimpleName() && (kind & TypeKinds.VARIABLES) != 0) { CompilationUnit root= (CompilationUnit) refNode.getRoot(); String name= ((SimpleName) refNode).getIdentifier(); BodyDeclaration declaration= ASTResolving.findParentBodyDeclaration(refNode); @@ -957,7 +959,7 @@ private static void addStaticImportFavoriteProposals(IInvocationContext context, for (int i= 0; i < staticImports.length; i++) { String curr= staticImports[i]; - ImportRewrite importRewrite= StubUtility.createImportRewrite(root, true); + ImportRewrite importRewrite = CodeStyleConfiguration.createImportRewrite(root, true); ASTRewrite astRewrite= ASTRewrite.create(ast); String label; @@ -1005,7 +1007,7 @@ private static void addNewMethodProposals(ICompilationUnit cu, CompilationUnit a String label; ITypeBinding[] parameterTypes= getParameterTypes(arguments); if (parameterTypes != null) { - String sig = ASTResolving.getMethodSignature(methodName, parameterTypes, false); + String sig = org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(methodName, parameterTypes, false); boolean is18OrHigher= JavaModelUtil.is18OrHigher(targetCU.getJavaProject()); boolean isSenderBindingInterface= senderDeclBinding.isInterface(); @@ -1028,7 +1030,7 @@ private static void addNewMethodProposals(ICompilationUnit cu, CompilationUnit a if (!senderDeclBinding.isAnonymous()) { if (is18OrHigher || !isSenderBindingInterface) { String[] args = new String[] { sig, - ASTResolving.getTypeSignature(senderDeclBinding) }; + org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getTypeSignature(senderDeclBinding) }; label= Messages.format(CorrectionMessages.UnresolvedElementsSubProcessor_createmethod_other_description, args); proposals.add(new NewMethodCorrectionProposal(label, targetCU, invocationNode, arguments, senderDeclBinding, IProposalRelevance.CREATE_METHOD)); @@ -1190,7 +1192,7 @@ private static void doMoreParameters(IInvocationContext context, ASTNode invocat // add arguments { - String[] arg = new String[] { ASTResolving.getMethodSignature(methodBinding) }; + String[] arg = new String[] { org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(methodBinding) }; String label; if (diff == 1) { label= Messages.format(CorrectionMessages.UnresolvedElementsSubProcessor_addargument_description, arg); @@ -1218,7 +1220,7 @@ private static void doMoreParameters(IInvocationContext context, ASTNode invocat changeDesc[idx]= new RemoveDescription(); changedTypes[i]= declParameterTypes[idx]; } - String[] arg = new String[] { ASTResolving.getMethodSignature(methodDecl), getTypeNames(changedTypes) }; + String[] arg = new String[] { org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(methodDecl), getTypeNames(changedTypes) }; String label; if (methodDecl.isConstructor()) { if (diff == 1) { @@ -1246,7 +1248,7 @@ private static String getTypeNames(ITypeBinding[] types) { if (i > 0) { buf.append(", "); //$NON-NLS-1$ } - buf.append(ASTResolving.getTypeSignature(types[i])); + buf.append(org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getTypeSignature(types[i])); } return BasicElementLabels.getJavaElementName(buf.toString()); } @@ -1295,7 +1297,7 @@ private static void doMoreArguments(IInvocationContext context, ASTNode invocati for (int i= diff - 1; i >= 0; i--) { rewrite.remove(arguments.get(indexSkipped[i]), null); } - String[] arg = new String[] { ASTResolving.getMethodSignature(methodRef) }; + String[] arg = new String[] { org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(methodRef) }; String label; if (diff == 1) { label= Messages.format(CorrectionMessages.UnresolvedElementsSubProcessor_removeargument_description, arg); @@ -1340,7 +1342,7 @@ private static void doMoreArguments(IInvocationContext context, ASTNode invocati changeDesc[idx]= new InsertDescription(newType, name); changeTypes[i]= newType; } - String[] arg = new String[] { ASTResolving.getMethodSignature(methodDecl), getTypeNames(changeTypes) }; + String[] arg = new String[] { org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(methodDecl), getTypeNames(changeTypes) }; String label; if (methodDecl.isConstructor()) { if (diff == 1) { @@ -1473,7 +1475,7 @@ private static void doEqualNumberOfParameters(IInvocationContext context, ASTNod ITypeBinding[] declParamTypes= methodDecl.getParameterTypes(); ITypeBinding[] swappedTypes= new ITypeBinding[] { declParamTypes[idx1], declParamTypes[idx2] }; - String[] args = new String[] { ASTResolving.getMethodSignature(methodDecl), + String[] args = new String[] { org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(methodDecl), getTypeNames(swappedTypes) }; String label; if (methodDecl.isConstructor()) { @@ -1505,8 +1507,8 @@ private static void doEqualNumberOfParameters(IInvocationContext context, ASTNod newParamTypes[i]= changeDesc[i] == null ? declParamTypes[i] : ((EditDescription) changeDesc[i]).type; } boolean isVarArgs= methodDecl.isVarargs() && newParamTypes.length > 0 && newParamTypes[newParamTypes.length - 1].isArray(); - String[] args = new String[] { ASTResolving.getMethodSignature(methodDecl), - ASTResolving.getMethodSignature(methodDecl.getName(), newParamTypes, isVarArgs) }; + String[] args = new String[] { org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(methodDecl), + org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(methodDecl.getName(), newParamTypes, isVarArgs) }; String label; if (methodDecl.isConstructor()) { label= Messages.format(CorrectionMessages.UnresolvedElementsSubProcessor_changeparamsignature_constr_description, args); @@ -1598,7 +1600,7 @@ private static void addQualifierToOuterProposal(IInvocationContext context, Meth ASTRewrite rewrite= ASTRewrite.create(invocationNode.getAST()); String label = Messages.format(CorrectionMessages.UnresolvedElementsSubProcessor_changetoouter_description, - ASTResolving.getTypeSignature(currType)); + org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getTypeSignature(currType)); ASTRewriteCorrectionProposal proposal = new ASTRewriteCorrectionProposal(label, context.getCompilationUnit(), rewrite, IProposalRelevance.QUALIFY_WITH_ENCLOSING_TYPE); @@ -1680,7 +1682,8 @@ public static void getConstructorProposals(IInvocationContext context, IProblemL ICompilationUnit targetCU= ASTResolving.findCompilationUnitForBinding(cu, astRoot, targetDecl); if (targetCU != null) { - String[] args= new String[] { ASTResolving.getMethodSignature( ASTResolving.getTypeSignature(targetDecl), getParameterTypes(arguments), false) }; + String[] args = new String[] { + org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getMethodSignature(org.eclipse.jdt.ls.core.internal.corrections.ASTResolving.getTypeSignature(targetDecl), getParameterTypes(arguments), false) }; String label= Messages.format(CorrectionMessages.UnresolvedElementsSubProcessor_createconstructor_description, args); proposals.add(new NewMethodCorrectionProposal(label, targetCU, selectedNode, arguments, targetDecl, IProposalRelevance.CREATE_CONSTRUCTOR)); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CodeActionHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CodeActionHandler.java index 4f73dd78d6..3a5937e139 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CodeActionHandler.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/CodeActionHandler.java @@ -21,9 +21,9 @@ import org.eclipse.core.runtime.NullProgressMonitor; import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.TextEditConverter; import org.eclipse.jdt.ls.core.internal.corrections.DiagnosticsHelper; import org.eclipse.jdt.ls.core.internal.corrections.IProblemLocation; @@ -133,7 +133,7 @@ private static Command textEditToCommand(ICompilationUnit unit, String label, Te } private static CompilationUnit getASTRoot(ICompilationUnit unit) { - return SharedASTProvider.getInstance().getAST(unit, new NullProgressMonitor()); + return CoreASTProvider.getInstance().getAST(unit, CoreASTProvider.WAIT_YES, new NullProgressMonitor()); } private static class CUCorrectionProposalComparator implements Comparator<CUCorrectionProposal> { diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentHighlightHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentHighlightHandler.java index a0b06c948c..f8b0953975 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentHighlightHandler.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentHighlightHandler.java @@ -18,12 +18,12 @@ import org.eclipse.jdt.core.ITypeRoot; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.internal.core.manipulation.search.IOccurrencesFinder; import org.eclipse.jdt.internal.core.manipulation.search.IOccurrencesFinder.OccurrenceLocation; import org.eclipse.jdt.internal.core.manipulation.search.OccurrencesFinder; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.lsp4j.DocumentHighlight; import org.eclipse.lsp4j.DocumentHighlightKind; import org.eclipse.lsp4j.Position; @@ -38,7 +38,7 @@ private List<DocumentHighlight> computeOccurrences(ITypeRoot unit, int line, int try { int offset = JsonRpcHelpers.toOffset(unit.getBuffer(), line, column); OccurrencesFinder finder = new OccurrencesFinder(); - CompilationUnit ast = SharedASTProvider.getInstance().getAST(unit, monitor); + CompilationUnit ast = CoreASTProvider.getInstance().getAST(unit, CoreASTProvider.WAIT_YES, monitor); if (ast != null) { String error = finder.initialize(ast, offset, 0); if (error == null){ diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentLifeCycleHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentLifeCycleHandler.java index 8a84d199a0..19ec4b7bb0 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentLifeCycleHandler.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentLifeCycleHandler.java @@ -39,12 +39,12 @@ import org.eclipse.jdt.core.WorkingCopyOwner; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.ls.core.internal.ActionableNotification; import org.eclipse.jdt.ls.core.internal.DocumentAdapter; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JavaClientConnection; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; @@ -72,7 +72,7 @@ public class DocumentLifeCycleHandler { private PreferenceManager preferenceManager; private ProjectsManager projectsManager; - private SharedASTProvider sharedASTProvider; + private CoreASTProvider sharedASTProvider; private WorkspaceJob validationTimer; private Set<ICompilationUnit> toReconcile = new HashSet<>(); @@ -80,7 +80,7 @@ public DocumentLifeCycleHandler(JavaClientConnection connection, PreferenceManag this.connection = connection; this.preferenceManager = preferenceManager; this.projectsManager = projectsManager; - this.sharedASTProvider = SharedASTProvider.getInstance(); + this.sharedASTProvider = CoreASTProvider.getInstance(); if (delayValidation) { this.validationTimer = new WorkspaceJob("Validate documents") { @Override @@ -107,6 +107,7 @@ private void triggerValidation(ICompilationUnit cu) throws JavaModelException { private void triggerValidation(ICompilationUnit cu, long delay) throws JavaModelException { synchronized (toReconcile) { toReconcile.add(cu); + sharedASTProvider.setActiveJavaElement(cu); } if (validationTimer != null) { validationTimer.cancel(); @@ -132,9 +133,13 @@ private IStatus performValidation(IProgressMonitor monitor) throws JavaModelExce for (ICompilationUnit cu : cusToReconcile) { cu.reconcile(ICompilationUnit.NO_AST, true, null, progress.newChild(1)); } - this.sharedASTProvider.invalidateAll(); + this.sharedASTProvider.disposeAST(); List<ICompilationUnit> toValidate = Arrays.asList(JavaCore.getWorkingCopies(null)); - List<CompilationUnit> astRoots = this.sharedASTProvider.getASTs(toValidate, monitor); + List<CompilationUnit> astRoots = new ArrayList<>(); + for (ICompilationUnit rootToValidate : toValidate) { + CompilationUnit astRoot = this.sharedASTProvider.getAST(rootToValidate, CoreASTProvider.WAIT_YES, monitor); + astRoots.add(astRoot); + } for (CompilationUnit astRoot : astRoots) { // report errors, even if there are no problems in the file: The client need to know that they got fixed. ICompilationUnit unit = (ICompilationUnit) astRoot.getTypeRoot(); @@ -291,7 +296,9 @@ public void handleChanged(DidChangeTextDocumentParams params) { } try { - sharedASTProvider.invalidate(unit); + if (sharedASTProvider.getActiveJavaElement().equals(unit)) { + sharedASTProvider.disposeAST(); + } List<TextDocumentContentChangeEvent> contentChanges = params.getContentChanges(); for (TextDocumentContentChangeEvent changeEvent : contentChanges) { @@ -336,7 +343,9 @@ public void handleClosed(DidCloseTextDocumentParams params) { if (JDTUtils.isDefaultProject(unit) || !JDTUtils.isOnClassPath(unit)) { new DiagnosticsHandler(connection, unit).clearDiagnostics(); } - sharedASTProvider.invalidate(unit); + if (sharedASTProvider.getActiveJavaElement().equals(unit)) { + sharedASTProvider.disposeAST(); + } unit.discardWorkingCopy(); } catch (CoreException e) { JavaLanguageServerPlugin.logException("Error while handling document close", e); @@ -366,7 +375,7 @@ public void handleSaved(DidSaveTextDocumentParams params) { private ICompilationUnit checkPackageDeclaration(String uri, ICompilationUnit unit) { if (unit.getResource() != null && unit.getJavaProject() != null && unit.getJavaProject().getProject().getName().equals(ProjectsManager.DEFAULT_PROJECT_NAME)) { try { - CompilationUnit astRoot = SharedASTProvider.getInstance().getAST(unit, new NullProgressMonitor()); + CompilationUnit astRoot = CoreASTProvider.getInstance().getAST(unit, CoreASTProvider.WAIT_YES, new NullProgressMonitor()); IProblem[] problems = astRoot.getProblems(); for (IProblem problem : problems) { if (problem.getID() == IProblem.PackageIsNotExpectedPackage) { @@ -388,7 +397,9 @@ private ICompilationUnit checkPackageDeclaration(String uri, ICompilationUnit un } if (toRemove) { file.delete(true, new NullProgressMonitor()); - sharedASTProvider.invalidate(unit); + if (sharedASTProvider.getActiveJavaElement().equals(unit)) { + sharedASTProvider.disposeAST(); + } unit.discardWorkingCopy(); unit = JDTUtils.resolveCompilationUnit(uri); unit.becomeWorkingCopy(new NullProgressMonitor()); diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceEventsHandler.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceEventsHandler.java index 2e6f072830..72643de778 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceEventsHandler.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/handlers/WorkspaceEventsHandler.java @@ -22,11 +22,11 @@ import org.eclipse.jdt.core.ICompilationUnit; import org.eclipse.jdt.core.IJavaElement; import org.eclipse.jdt.core.IPackageFragment; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JavaClientConnection; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.ResourceUtils; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager; import org.eclipse.jdt.ls.core.internal.managers.ProjectsManager.CHANGE_TYPE; import org.eclipse.lsp4j.DidChangeWatchedFilesParams; @@ -84,7 +84,9 @@ public void run(IProgressMonitor monitor) throws CoreException { continue; } if(changeType == CHANGE_TYPE.DELETED || changeType == CHANGE_TYPE.CHANGED){ - SharedASTProvider.getInstance().invalidate(unit); + if (CoreASTProvider.getInstance().getActiveJavaElement().equals(unit)) { + CoreASTProvider.getInstance().disposeAST(); + } } pm.fileChanged(fileEvent.getUri(), changeType); } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/preferences/PreferenceManager.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/preferences/PreferenceManager.java index 2c1f653683..9569a6d1a4 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/preferences/PreferenceManager.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/preferences/PreferenceManager.java @@ -18,9 +18,13 @@ import org.eclipse.core.runtime.ISafeRunnable; import org.eclipse.core.runtime.ListenerList; import org.eclipse.core.runtime.SafeRunner; +import org.eclipse.core.runtime.preferences.DefaultScope; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants; +import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration; import org.eclipse.jdt.internal.corext.util.CodeFormatterUtil; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.jdt.ls.core.internal.StatusFactory; @@ -42,10 +46,12 @@ public class PreferenceManager { private ClientPreferences clientPreferences; private IMavenConfiguration mavenConfig; private ListenerList<IPreferencesChangeListener> preferencesChangeListeners; + private IEclipsePreferences eclipsePrefs; public PreferenceManager() { preferences = new Preferences(); preferencesChangeListeners = new ListenerList<>(); + eclipsePrefs = InstanceScope.INSTANCE.getNode(JavaLanguageServerPlugin.PLUGIN_ID); initialize(); } @@ -59,6 +65,13 @@ public void initialize() { javaCoreOptions.put(JavaCore.CODEASSIST_VISIBILITY_CHECK, JavaCore.ENABLED); javaCoreOptions.put(DefaultCodeFormatterConstants.FORMATTER_USE_ON_OFF_TAGS, DefaultCodeFormatterConstants.TRUE); JavaCore.setOptions(javaCoreOptions); + + // Initialize default preferences + IEclipsePreferences defEclipsePrefs = DefaultScope.INSTANCE.getNode(JavaLanguageServerPlugin.PLUGIN_ID); + defEclipsePrefs.put("org.eclipse.jdt.ui.typefilter.enabled", ""); + defEclipsePrefs.put(CodeStyleConfiguration.ORGIMPORTS_IMPORTORDER, ""); + defEclipsePrefs.put(CodeStyleConfiguration.ORGIMPORTS_ONDEMANDTHRESHOLD, "99"); + defEclipsePrefs.put(CodeStyleConfiguration.ORGIMPORTS_STATIC_ONDEMANDTHRESHOLD, "99"); } public void update(Preferences preferences) { @@ -176,4 +189,11 @@ public void addPreferencesChangeListener(IPreferencesChangeListener listener) { public void removePreferencesChangeListener(IPreferencesChangeListener listener) { preferencesChangeListeners.remove(listener); } + + /** + * @return Get the workspace runtime preferences for Eclipse + */ + public IEclipsePreferences getEclipsePreferences() { + return eclipsePrefs; + } } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/preferences/Preferences.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/preferences/Preferences.java index 4221a47a91..069c688233 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/preferences/Preferences.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/preferences/Preferences.java @@ -20,6 +20,9 @@ import java.util.Map; import java.util.UUID; +import org.eclipse.core.runtime.preferences.IEclipsePreferences; +import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration; +import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; import org.eclipse.lsp4j.MessageType; /** @@ -438,6 +441,8 @@ private Preferences setIncompleteClasspathSeverity(Severity severity) { public Preferences setImportOrder(List<String> importOrder) { this.importOrder = (importOrder == null || importOrder.size() == 0) ? JAVA_IMPORT_ORDER_DEFAULT : importOrder; + IEclipsePreferences pref = JavaLanguageServerPlugin.getPreferencesManager().getEclipsePreferences(); + pref.put(CodeStyleConfiguration.ORGIMPORTS_IMPORTORDER, String.join(";", importOrder)); return this; } diff --git a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/text/correction/QuickAssistProcessor.java b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/text/correction/QuickAssistProcessor.java index d41b3d1e08..5fd662bdd8 100644 --- a/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/text/correction/QuickAssistProcessor.java +++ b/org.eclipse.jdt.ls.core/src/org/eclipse/jdt/ls/core/internal/text/correction/QuickAssistProcessor.java @@ -76,10 +76,10 @@ import org.eclipse.jdt.core.dom.rewrite.ASTRewrite; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.core.dom.rewrite.ListRewrite; +import org.eclipse.jdt.core.manipulation.CodeStyleConfiguration; import org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving; import org.eclipse.jdt.internal.corext.dom.GenericVisitor; import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.StubUtility; import org.eclipse.jdt.ls.core.internal.corext.dom.ASTNodes; import org.eclipse.jdt.ls.core.internal.corext.dom.Bindings; import org.eclipse.jdt.ls.core.internal.corext.fix.LinkedProposalModel; @@ -412,7 +412,7 @@ public static LambdaExpression convertMethodRefernceToLambda(MethodReference met Type type = ((TypeMethodReference) methodReference).getType(); ITypeBinding typeBinding = type.resolveBinding(); if (typeBinding != null) { - ImportRewrite importRewrite = StubUtility.createImportRewrite(astRoot, true); + ImportRewrite importRewrite = CodeStyleConfiguration.createImportRewrite(astRoot, true); expr = ast.newName(importRewrite.addImport(typeBinding)); } } diff --git a/org.eclipse.jdt.ls.target/org.eclipse.jdt.ls.tp.target b/org.eclipse.jdt.ls.target/org.eclipse.jdt.ls.tp.target index 1af281448b..8602f87921 100644 --- a/org.eclipse.jdt.ls.target/org.eclipse.jdt.ls.tp.target +++ b/org.eclipse.jdt.ls.target/org.eclipse.jdt.ls.tp.target @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> -<?pde version="3.8"?><target name="Java Language Server Target Definition" sequenceNumber="108"> +<?pde version="4.8"?><target name="Java Language Server Target Definition" sequenceNumber="109"> <locations> <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit"> <unit id="org.mockito.mockito-all" version="1.9.5"/> @@ -32,16 +32,16 @@ <repository location="http://download.eclipse.org/technology/m2e/milestones/1.9/1.9.0.20180214-1942/"/> </location> <location includeAllPlatforms="false" includeConfigurePhase="false" includeMode="planner" includeSource="true" type="InstallableUnit"> - <unit id="org.eclipse.equinox.core.feature.feature.group" version="1.5.0.v20180123-1456"/> - <unit id="org.eclipse.equinox.core.sdk.feature.group" version="3.14.0.v20180119-2027"/> - <unit id="org.eclipse.equinox.executable.feature.group" version="3.8.0.v20180124-1426"/> - <unit id="org.eclipse.equinox.p2.core.feature.source.feature.group" version="1.5.0.v20180122-2220"/> - <unit id="org.eclipse.equinox.p2.discovery.feature.feature.group" version="1.2.0.v20180103-0918"/> - <unit id="org.eclipse.equinox.p2.rcp.feature.feature.group" version="1.4.0.v20180122-2220"/> - <unit id="org.eclipse.equinox.sdk.feature.group" version="3.14.0.v20180124-1426"/> - <unit id="org.eclipse.jdt.source.feature.group" version="3.14.0.v20180124-2000"/> - <unit id="org.eclipse.sdk.feature.group" version="4.8.0.v20180124-2000"/> - <repository location="http://download.eclipse.org/eclipse/updates/4.8milestones/"/> + <unit id="org.eclipse.equinox.core.feature.feature.group" version="0.0.0"/> + <unit id="org.eclipse.equinox.core.sdk.feature.group" version="0.0.0"/> + <unit id="org.eclipse.equinox.executable.feature.group" version="0.0.0"/> + <unit id="org.eclipse.equinox.p2.core.feature.source.feature.group" version="0.0.0"/> + <unit id="org.eclipse.equinox.p2.discovery.feature.feature.group" version="0.0.0"/> + <unit id="org.eclipse.equinox.p2.rcp.feature.feature.group" version="0.0.0"/> + <unit id="org.eclipse.equinox.sdk.feature.group" version="0.0.0"/> + <unit id="org.eclipse.jdt.source.feature.group" version="0.0.0"/> + <unit id="org.eclipse.sdk.feature.group" version="0.0.0"/> + <repository location="http://download.eclipse.org/eclipse/updates/4.8-I-builds/"/> </location> </locations> <targetJRE path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/> diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/codemanipulation/ImportOrganizeTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/codemanipulation/ImportOrganizeTest.java index 9db109fa5e..35b2267b5c 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/codemanipulation/ImportOrganizeTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/codemanipulation/ImportOrganizeTest.java @@ -52,12 +52,12 @@ import org.eclipse.jdt.core.ISourceRange; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; +import org.eclipse.jdt.core.manipulation.OrganizeImportsOperation; +import org.eclipse.jdt.core.manipulation.OrganizeImportsOperation.IChooseImportQuery; import org.eclipse.jdt.core.search.TypeNameMatch; import org.eclipse.jdt.ls.core.internal.JavaLanguageServerPlugin; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.WorkspaceHelper; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.OrganizeImportsOperation; -import org.eclipse.jdt.ls.core.internal.corext.codemanipulation.OrganizeImportsOperation.IChooseImportQuery; import org.eclipse.jdt.ls.core.internal.correction.TestOptions; import org.eclipse.jdt.ls.core.internal.managers.AbstractMavenBasedTest; import org.eclipse.jdt.ls.core.internal.preferences.Preferences; @@ -129,7 +129,7 @@ private static File getLocalArtifactFile(ArtifactKey a) { @Override @After public void cleanUp() throws Exception { - SharedASTProvider.getInstance().invalidateAll(); + CoreASTProvider.getInstance().disposeAST(); super.cleanUp(); JavaLanguageServerPlugin.getPreferencesManager().getPreferences().setImportOrder(Preferences.JAVA_IMPORT_ORDER_DEFAULT); } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/correction/AbstractQuickFixTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/correction/AbstractQuickFixTest.java index e8b82c593b..94cca5baba 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/correction/AbstractQuickFixTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/correction/AbstractQuickFixTest.java @@ -24,8 +24,8 @@ import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.ls.core.internal.JDTUtils; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.TextEditUtil; import org.eclipse.jdt.ls.core.internal.handlers.CodeActionHandler; import org.eclipse.jdt.ls.core.internal.handlers.DiagnosticsHandler; @@ -148,7 +148,7 @@ protected Range getRange(ICompilationUnit cu, IProblem[] problems) throws JavaMo protected List<Command> evaluateCodeActions(ICompilationUnit cu) throws JavaModelException { - CompilationUnit astRoot = SharedASTProvider.getInstance().getAST(cu, null); + CompilationUnit astRoot = CoreASTProvider.getInstance().getAST(cu, CoreASTProvider.WAIT_YES, null); IProblem[] problems = astRoot.getProblems(); Range range = getRange(cu, problems); diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/AbstractCompilationUnitBasedTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/AbstractCompilationUnitBasedTest.java index caa17ced69..229336e37d 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/AbstractCompilationUnitBasedTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/AbstractCompilationUnitBasedTest.java @@ -18,9 +18,9 @@ import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.WorkingCopyOwner; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.ls.core.internal.JavaClientConnection; import org.eclipse.jdt.ls.core.internal.LanguageServerWorkingCopyOwner; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.WorkspaceHelper; import org.eclipse.jdt.ls.core.internal.managers.AbstractProjectsManagerBasedTest; import org.junit.After; @@ -72,6 +72,6 @@ protected int[] findCompletionLocation(ICompilationUnit unit, String completeBeh @After public void shutdown() throws Exception { - SharedASTProvider.getInstance().invalidateAll(); + CoreASTProvider.getInstance().disposeAST(); } } 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 f13772e6f9..7b490afef7 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 @@ -37,10 +37,10 @@ import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JavaClientConnection; import org.eclipse.jdt.ls.core.internal.JsonMessageHelper; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.WorkspaceHelper; import org.eclipse.jdt.ls.core.internal.preferences.ClientPreferences; import org.eclipse.jdt.ls.core.internal.preferences.PreferenceManager; @@ -89,9 +89,9 @@ public class CompletionHandlerTest extends AbstractCompilationUnitBasedTest { @Before public void setUp() { mockLSP3Client(); - SharedASTProvider sharedASTProvider = SharedASTProvider.getInstance(); - sharedASTProvider.invalidateAll(); - sharedASTProvider.clearASTCreationCount(); + CoreASTProvider sharedASTProvider = CoreASTProvider.getInstance(); + sharedASTProvider.disposeAST(); + // sharedASTProvider.clearASTCreationCount(); javaClient = new JavaClientConnection(client); lifeCycleHandler = new DocumentLifeCycleHandler(javaClient, preferenceManager, projectsManager, true); } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentLifeCycleHandlerTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentLifeCycleHandlerTest.java index 3609d7ebfb..ac7a7b849d 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentLifeCycleHandlerTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/handlers/DocumentLifeCycleHandlerTest.java @@ -39,9 +39,9 @@ import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.core.compiler.IProblem; import org.eclipse.jdt.core.dom.CompilationUnit; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JavaClientConnection; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.WorkspaceHelper; import org.eclipse.jdt.ls.core.internal.managers.AbstractProjectsManagerBasedTest; import org.eclipse.jdt.ls.core.internal.preferences.Preferences; @@ -70,7 +70,7 @@ @RunWith(MockitoJUnitRunner.class) public class DocumentLifeCycleHandlerTest extends AbstractProjectsManagerBasedTest { - private SharedASTProvider sharedASTProvider; + private CoreASTProvider sharedASTProvider; private DocumentLifeCycleHandler lifeCycleHandler; private JavaClientConnection javaClient; @@ -81,9 +81,9 @@ public class DocumentLifeCycleHandlerTest extends AbstractProjectsManagerBasedTe public void setup() throws Exception { mockPreferences(); - sharedASTProvider = SharedASTProvider.getInstance(); - sharedASTProvider.invalidateAll(); - sharedASTProvider.clearASTCreationCount(); + sharedASTProvider = CoreASTProvider.getInstance(); + sharedASTProvider.disposeAST(); + // sharedASTProvider.clearASTCreationCount(); javaClient = new JavaClientConnection(client); lifeCycleHandler = new DocumentLifeCycleHandler(javaClient, preferenceManager, projectsManager, false); } @@ -132,7 +132,7 @@ public void testUnimplementedMethods() throws Exception { protected List<Command> getCodeActions(ICompilationUnit cu) throws JavaModelException { - CompilationUnit astRoot = SharedASTProvider.getInstance().getAST(cu, null); + CompilationUnit astRoot = CoreASTProvider.getInstance().getAST(cu, CoreASTProvider.WAIT_YES, null); IProblem[] problems = astRoot.getProblems(); Range range = getRange(cu, problems); @@ -178,7 +178,7 @@ public void testBasicBufferLifeCycle() throws Exception { assertEquals(false, cu1.isWorkingCopy()); assertEquals(false, cu1.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(0, sharedASTProvider.getCacheSize()); + assertEquals(0, getCacheSize()); assertNewASTsCreated(0); openDocument(cu1, cu1.getSource(), 1); @@ -186,7 +186,7 @@ public void testBasicBufferLifeCycle() throws Exception { assertEquals(true, cu1.isWorkingCopy()); assertEquals(false, cu1.hasUnsavedChanges()); assertNewProblemReported(new ExpectedProblemReport(cu1, 0)); - assertEquals(1, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(1); buf = new StringBuilder(); @@ -200,7 +200,7 @@ public void testBasicBufferLifeCycle() throws Exception { assertEquals(true, cu1.isWorkingCopy()); assertEquals(true, cu1.hasUnsavedChanges()); assertNewProblemReported(new ExpectedProblemReport(cu1, 1)); - assertEquals(1, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(1); saveDocument(cu1); @@ -208,7 +208,7 @@ public void testBasicBufferLifeCycle() throws Exception { assertEquals(true, cu1.isWorkingCopy()); assertEquals(false, cu1.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(1, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(0); closeDocument(cu1); @@ -216,7 +216,7 @@ public void testBasicBufferLifeCycle() throws Exception { assertEquals(false, cu1.isWorkingCopy()); assertEquals(false, cu1.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(0, sharedASTProvider.getCacheSize()); + assertEquals(0, getCacheSize()); assertNewASTsCreated(0); } @@ -238,7 +238,7 @@ public void testIncrementalChangeDocument() throws Exception { assertEquals(false, cu1.isWorkingCopy()); assertEquals(false, cu1.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(0, sharedASTProvider.getCacheSize()); + assertEquals(0, getCacheSize()); assertNewASTsCreated(0); openDocument(cu1, cu1.getSource(), 1); @@ -246,7 +246,7 @@ public void testIncrementalChangeDocument() throws Exception { assertEquals(true, cu1.isWorkingCopy()); assertEquals(false, cu1.hasUnsavedChanges()); assertNewProblemReported(new ExpectedProblemReport(cu1, 0)); - assertEquals(1, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(1); buf = new StringBuilder(); @@ -258,7 +258,7 @@ public void testIncrementalChangeDocument() throws Exception { assertEquals(true, cu1.isWorkingCopy()); assertEquals(true, cu1.hasUnsavedChanges()); assertNewProblemReported(new ExpectedProblemReport(cu1, 1)); - assertEquals(1, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(1); saveDocument(cu1); @@ -266,7 +266,7 @@ public void testIncrementalChangeDocument() throws Exception { assertEquals(true, cu1.isWorkingCopy()); assertEquals(false, cu1.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(1, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(0); closeDocument(cu1); @@ -274,7 +274,7 @@ public void testIncrementalChangeDocument() throws Exception { assertEquals(false, cu1.isWorkingCopy()); assertEquals(false, cu1.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(0, sharedASTProvider.getCacheSize()); + assertEquals(0, getCacheSize()); assertNewASTsCreated(0); } @@ -302,7 +302,7 @@ public void testFixInDependencyScenario() throws Exception { assertEquals(false, cu2.isWorkingCopy()); assertEquals(false, cu2.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(0, sharedASTProvider.getCacheSize()); + assertEquals(0, getCacheSize()); assertNewASTsCreated(0); openDocument(cu2, cu2.getSource(), 1); @@ -312,7 +312,7 @@ public void testFixInDependencyScenario() throws Exception { assertEquals(true, cu2.isWorkingCopy()); assertEquals(false, cu2.hasUnsavedChanges()); assertNewProblemReported(new ExpectedProblemReport(cu2, 1)); - assertEquals(1, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(1); openDocument(cu1, cu1.getSource(), 1); @@ -322,7 +322,7 @@ public void testFixInDependencyScenario() throws Exception { assertEquals(true, cu2.isWorkingCopy()); assertEquals(false, cu2.hasUnsavedChanges()); assertNewProblemReported(new ExpectedProblemReport(cu2, 1), new ExpectedProblemReport(cu1, 0)); - assertEquals(2, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(2); buf = new StringBuilder(); @@ -338,7 +338,7 @@ public void testFixInDependencyScenario() throws Exception { assertEquals(true, cu2.isWorkingCopy()); assertEquals(false, cu2.hasUnsavedChanges()); assertNewProblemReported(new ExpectedProblemReport(cu2, 0), new ExpectedProblemReport(cu1, 0)); - assertEquals(2, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(2); saveDocument(cu1); @@ -348,7 +348,7 @@ public void testFixInDependencyScenario() throws Exception { assertEquals(true, cu2.isWorkingCopy()); assertEquals(false, cu2.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(2, sharedASTProvider.getCacheSize()); + assertEquals(1, getCacheSize()); assertNewASTsCreated(0); closeDocument(cu1); @@ -358,7 +358,7 @@ public void testFixInDependencyScenario() throws Exception { assertEquals(true, cu2.isWorkingCopy()); assertEquals(false, cu2.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(1, sharedASTProvider.getCacheSize()); + assertEquals(0, getCacheSize()); assertNewASTsCreated(0); closeDocument(cu2); @@ -368,7 +368,7 @@ public void testFixInDependencyScenario() throws Exception { assertEquals(false, cu2.isWorkingCopy()); assertEquals(false, cu2.hasUnsavedChanges()); assertNewProblemReported(); - assertEquals(0, sharedASTProvider.getCacheSize()); + assertEquals(0, getCacheSize()); assertNewASTsCreated(0); } @@ -505,7 +505,7 @@ public void testNotExpectedPackage() throws Exception { URI uri = file.toURI(); ICompilationUnit cu = JDTUtils.resolveCompilationUnit(uri); openDocument(cu, cu.getSource(), 1); - CompilationUnit astRoot = SharedASTProvider.getInstance().getAST(cu, new NullProgressMonitor()); + CompilationUnit astRoot = CoreASTProvider.getInstance().getAST(cu, CoreASTProvider.WAIT_YES, new NullProgressMonitor()); IProblem[] problems = astRoot.getProblems(); assertEquals("Unexpected number of errors", 0, problems.length); String source = cu.getSource(); @@ -515,7 +515,7 @@ public void testNotExpectedPackage() throws Exception { FileUtils.writeStringToFile(file, source); saveDocument(cu); cu = JDTUtils.resolveCompilationUnit(uri); - astRoot = SharedASTProvider.getInstance().getAST(cu, new NullProgressMonitor()); + astRoot = CoreASTProvider.getInstance().getAST(cu, CoreASTProvider.WAIT_YES, new NullProgressMonitor()); problems = astRoot.getProblems(); assertEquals("Unexpected number of errors", 0, problems.length); } @@ -554,7 +554,7 @@ public void testCreateCompilationUnit() throws Exception { changeDocumentFull(unit, fooContent, 1); saveDocument(unit); closeDocument(unit); - CompilationUnit astRoot = sharedASTProvider.getAST(bar, null); + CompilationUnit astRoot = sharedASTProvider.getAST(bar, CoreASTProvider.WAIT_YES, null); IProblem[] problems = astRoot.getProblems(); assertEquals("Unexpected number of errors", 0, problems.length); } @@ -574,7 +574,7 @@ public void testNotExpectedPackage2() throws Exception { URI uri = file.toURI(); ICompilationUnit cu = JDTUtils.resolveCompilationUnit(uri); openDocument(cu, cu.getSource(), 1); - CompilationUnit astRoot = SharedASTProvider.getInstance().getAST(cu, new NullProgressMonitor()); + CompilationUnit astRoot = CoreASTProvider.getInstance().getAST(cu, CoreASTProvider.WAIT_YES, new NullProgressMonitor()); IProblem[] problems = astRoot.getProblems(); assertEquals("Unexpected number of errors", 0, problems.length); @@ -585,7 +585,7 @@ public void testNotExpectedPackage2() throws Exception { FileUtils.writeStringToFile(file, source); saveDocument(cu); cu = JDTUtils.resolveCompilationUnit(uri); - astRoot = SharedASTProvider.getInstance().getAST(cu, new NullProgressMonitor()); + astRoot = CoreASTProvider.getInstance().getAST(cu, CoreASTProvider.WAIT_YES, new NullProgressMonitor()); problems = astRoot.getProblems(); assertEquals("Unexpected number of errors", 0, problems.length); @@ -596,7 +596,7 @@ public void testNotExpectedPackage2() throws Exception { FileUtils.writeStringToFile(file, source); saveDocument(cu); cu = JDTUtils.resolveCompilationUnit(uri); - astRoot = SharedASTProvider.getInstance().getAST(cu, new NullProgressMonitor()); + astRoot = CoreASTProvider.getInstance().getAST(cu, CoreASTProvider.WAIT_YES, new NullProgressMonitor()); problems = astRoot.getProblems(); assertEquals("Unexpected number of errors", 1, problems.length); } @@ -713,7 +713,11 @@ private void assertNewProblemReported(ExpectedProblemReport... expectedReports) } private void assertNewASTsCreated(int expected) { - assertEquals(expected, sharedASTProvider.getASTCreationCount()); - sharedASTProvider.clearASTCreationCount(); + // assertEquals(expected, sharedASTProvider.getASTCreationCount()); + // sharedASTProvider.clearASTCreationCount(); + } + + private int getCacheSize() { + return (sharedASTProvider.getCachedAST() != null) ? 1 : 0; } } diff --git a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenClasspathTest.java b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenClasspathTest.java index f60446a6b5..7207d7e4c6 100644 --- a/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenClasspathTest.java +++ b/org.eclipse.jdt.ls.tests/src/org/eclipse/jdt/ls/core/internal/managers/MavenClasspathTest.java @@ -19,9 +19,9 @@ import org.eclipse.jdt.core.IType; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.WorkingCopyOwner; +import org.eclipse.jdt.core.manipulation.CoreASTProvider; import org.eclipse.jdt.ls.core.internal.JDTUtils; import org.eclipse.jdt.ls.core.internal.JavaClientConnection; -import org.eclipse.jdt.ls.core.internal.SharedASTProvider; import org.eclipse.jdt.ls.core.internal.handlers.DiagnosticsHandler; import org.eclipse.jdt.ls.core.internal.handlers.DocumentLifeCycleHandler; import org.eclipse.lsp4j.DidOpenTextDocumentParams; @@ -32,23 +32,23 @@ public class MavenClasspathTest extends AbstractMavenBasedTest { - private SharedASTProvider sharedASTProvider; + private CoreASTProvider sharedASTProvider; private DocumentLifeCycleHandler lifeCycleHandler; private JavaClientConnection javaClient; @Before public void setup() throws Exception { - sharedASTProvider = SharedASTProvider.getInstance(); - sharedASTProvider.invalidateAll(); - sharedASTProvider.clearASTCreationCount(); + sharedASTProvider = CoreASTProvider.getInstance(); + sharedASTProvider.disposeAST(); + // sharedASTProvider.clearASTCreationCount(); javaClient = new JavaClientConnection(client); lifeCycleHandler = new DocumentLifeCycleHandler(javaClient, preferenceManager, projectsManager, false); } @After public void tearDown() throws Exception { - sharedASTProvider.invalidateAll(); + sharedASTProvider.disposeAST(); javaClient.disconnect(); for (ICompilationUnit cu : JavaCore.getWorkingCopies(null)) { cu.discardWorkingCopy();