cache package's classes in package itself. remove similar cache from groovy

This commit is contained in:
peter
2010-05-31 21:44:01 +01:00
parent d2650031a8
commit fa06ce1faa
2 changed files with 7 additions and 50 deletions
@@ -496,7 +496,8 @@ public class PsiPackageImpl extends PsiElementBase implements PsiPackage, Querya
if (classHint == null || classHint.shouldProcess(ElementClassHint.DeclaractionKind.CLASS)) {
NameHint nameHint = processor.getHint(NameHint.KEY);
if (nameHint != null) {
if (processClassesByName(processor, state, place, scope, nameHint.getName(state))) return false;
final String shortName = nameHint.getName(state);
if (containsClassNamed(shortName) && processClassesByName(processor, state, place, scope, shortName)) return false;
}
else if (prefixMatcher != null && migration == null) {
for (String className : getClassNamesCache()) {
@@ -18,14 +18,11 @@ package org.jetbrains.plugins.groovy.lang.psi.impl;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleUtil;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.ProjectRootManager;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.TextRange;
import com.intellij.openapi.util.UserDataCache;
import com.intellij.openapi.util.UserDataHolder;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.*;
@@ -40,11 +37,7 @@ import com.intellij.psi.stubs.StubElement;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.psi.util.PsiModificationTracker;
import com.intellij.util.IncorrectOperationException;
import com.intellij.util.containers.ConcurrentFactoryMap;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.FactoryMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.groovy.GroovyFileType;
@@ -66,7 +59,9 @@ import org.jetbrains.plugins.groovy.lang.resolve.ResolveUtil;
import org.jetbrains.plugins.groovy.lang.resolve.processors.ClassHint;
import javax.swing.*;
import java.util.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Implements all abstractions related to Groovy file
@@ -74,7 +69,6 @@ import java.util.*;
* @author ilyas
*/
public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile {
private static final Key<CachedValue<FactoryMap<String, Set<String>>>> IMPLICITLY_IMPORTABLE_CLASSES = Key.create("IMplicitlyImportable");
private static final Logger LOG = Logger.getInstance("org.jetbrains.plugins.groovy.lang.psi.impl.GroovyFileImpl");
private static final Object lock = new Object();
@@ -82,8 +76,6 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile {
private GroovyScriptClass myScriptClass;
private static final String SYNTHETIC_PARAMETER_NAME = "args";
private GrParameter mySyntheticArgsParameter = null;
private PsiElement myContext;
public GroovyFileImpl(FileViewProvider viewProvider) {
@@ -162,7 +154,7 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile {
}
}
if (processClasses && !processImplicitImports(processor, state, lastParent, place, expectedName)) {
if (processClasses && !processImplicitImports(processor, state, lastParent, place)) {
return false;
}
@@ -212,16 +204,10 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile {
}
private boolean processImplicitImports(PsiScopeProcessor processor, ResolveState state, PsiElement lastParent,
PsiElement place, @Nullable String className) {
PsiElement place) {
JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject());
final FactoryMap<String, Set<String>> cache = getImplicitlyImportableClassNames();
for (final String implicitlyImported : getImplicitlyImportedPackages()) {
if (className != null && !cache.get(implicitlyImported).contains(className)) {
continue;
}
PsiPackage aPackage = facade.findPackage(implicitlyImported);
if (aPackage != null && !aPackage.processDeclarations(processor, state, lastParent, place)) return false;
}
@@ -233,36 +219,6 @@ public class GroovyFileImpl extends GroovyFileBaseImpl implements GroovyFile {
return true;
}
@NotNull
private FactoryMap<String, Set<String>> getImplicitlyImportableClassNames() {
final Module module = ModuleUtil.findModuleForPsiElement(this);
UserDataHolder holder = module != null ? module : this;
return CachedValuesManager.getManager(getProject()).getCachedValue(holder, IMPLICITLY_IMPORTABLE_CLASSES, new CachedValueProvider<FactoryMap<String, Set<String>>>() {
public Result<FactoryMap<String, Set<String>>> compute() {
final JavaPsiFacade facade = JavaPsiFacade.getInstance(getProject());
final FactoryMap<String, Set<String>> result = new ConcurrentFactoryMap<String, Set<String>>() {
@Override
protected Set<String> create(String pkgName) {
final HashSet<String> shortNames = new HashSet<String>();
PsiPackage aPackage = facade.findPackage(pkgName);
if (aPackage != null) {
for (PsiClass aClass : aPackage.getClasses()) {
ContainerUtil.addIfNotNull(aClass.getName(), shortNames);
}
}
return shortNames;
}
};
return Result.create(result, ProjectRootManager.getInstance(getProject()), PsiModificationTracker.JAVA_STRUCTURE_MODIFICATION_COUNT);
}
}, false);
}
private static boolean processChildrenScopes(PsiElement element,
PsiScopeProcessor processor,
ResolveState state,