clean up & remove dead code around MetaDataRegistrar

This commit is contained in:
peter
2019-02-07 15:39:03 +01:00
parent d1eeeb8389
commit 788c16015f
5 changed files with 17 additions and 205 deletions
@@ -23,11 +23,9 @@ import com.intellij.psi.impl.PsiSuperMethodImplUtil;
import com.intellij.psi.impl.java.stubs.JavaStubElementTypes;
import com.intellij.psi.impl.java.stubs.PsiTypeParameterStub;
import com.intellij.psi.impl.light.LightEmptyImplementsList;
import com.intellij.psi.impl.meta.MetaRegistry;
import com.intellij.psi.impl.source.SourceTreeToPsiMap;
import com.intellij.psi.impl.source.tree.TreeElement;
import com.intellij.psi.javadoc.PsiDocComment;
import com.intellij.psi.meta.PsiMetaData;
import com.intellij.psi.scope.PsiScopeProcessor;
import com.intellij.psi.search.SearchScope;
import com.intellij.psi.util.PsiUtil;
@@ -349,10 +347,6 @@ public class ClsTypeParameterImpl extends ClsRepositoryPsiElement<PsiTypeParamet
return stub.getParentStub().getChildrenStubs().indexOf(stub);
}
public PsiMetaData getMetaData() {
return MetaRegistry.getMeta(this);
}
@Override
public Icon getElementIcon(final int flags) {
return PsiClassImplUtil.getClassIcon(flags, this);
@@ -17,11 +17,8 @@
package com.intellij.psi.meta;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.patterns.ElementPattern;
import com.intellij.psi.filters.ElementFilter;
import java.util.function.Supplier;
/**
* Provides association for elements matching given filter with metadata class.
* @see MetaDataContributor
@@ -31,19 +28,10 @@ public abstract class MetaDataRegistrar {
* Associates elements matching given filter with metadata class.
* @param filter on element for finding metadata matches
* @param metadataDescriptorClass class of metadata, should be instantiable without parameters
* @deprecated use {@link #registerMetaData(ElementPattern, Supplier)}
*/
@Deprecated
public abstract <T extends PsiMetaData> void registerMetaData(
ElementFilter filter, Class<T> metadataDescriptorClass);
/**
* Associates elements matching given filter with metadata class.
* @param pattern on element for finding metadata matches
* @param metadataDescriptorClass class of metadata, should be instantiable without parameters
*/
public abstract <T extends PsiMetaData> void registerMetaData(
ElementPattern<?> pattern, Supplier<? extends T> metadataDescriptorClass);
public static MetaDataRegistrar getInstance() {
return ServiceManager.getService(MetaDataRegistrar.class);
@@ -2,20 +2,13 @@
package com.intellij.psi.impl.meta;
import com.intellij.openapi.Disposable;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.progress.ProgressIndicatorProvider;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.util.Key;
import com.intellij.openapi.util.UserDataCache;
import com.intellij.patterns.ElementPattern;
import com.intellij.psi.PsiElement;
import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.filters.position.PatternFilter;
import com.intellij.psi.meta.MetaDataContributor;
import com.intellij.psi.meta.MetaDataRegistrar;
import com.intellij.psi.meta.PsiMetaData;
import com.intellij.psi.util.CachedValue;
import com.intellij.psi.util.CachedValueProvider;
import com.intellij.psi.util.CachedValuesManager;
import com.intellij.util.ArrayUtil;
@@ -32,45 +25,10 @@ public class MetaRegistry extends MetaDataRegistrar {
private static final List<MyBinding> ourBindings = ContainerUtil.createLockFreeCopyOnWriteList();
private static volatile boolean ourContributorsLoaded;
private static final Key<CachedValue<PsiMetaData>> META_DATA_KEY = Key.create("META DATA KEY");
public static void bindDataToElement(final PsiElement element, final PsiMetaData data) {
CachedValue<PsiMetaData> value =
CachedValuesManager.getManager(element.getProject()).createCachedValue(() -> {
data.init(element);
return new CachedValueProvider.Result<>(data, data.getDependencies());
});
element.putUserData(META_DATA_KEY, value);
}
public static PsiMetaData getMeta(final PsiElement element) {
return getMetaBase(element);
}
private static final UserDataCache<CachedValue<PsiMetaData>, PsiElement, Object> ourCachedMetaCache =
new UserDataCache<CachedValue<PsiMetaData>, PsiElement, Object>() {
@Override
protected CachedValue<PsiMetaData> compute(final PsiElement element, Object p) {
return CachedValuesManager.getManager(element.getProject()).createCachedValue(() -> {
ensureContributorsLoaded();
for (final MyBinding binding : ourBindings) {
if (binding.myFilter.isClassAcceptable(element.getClass()) && binding.myFilter.isAcceptable(element, element.getParent())) {
final PsiMetaData data = binding.myDataClass.get();
data.init(element);
Object[] dependences = data.getDependencies();
for (Object dependence : dependences) {
if (dependence == null) {
LOG.error(data + "(" + binding.myDataClass + ") provided null dependency");
}
}
return new CachedValueProvider.Result<>(data, ArrayUtil.append(dependences, element));
}
}
return new CachedValueProvider.Result<>(null, element);
}, false);
}
};
private static void ensureContributorsLoaded() {
if (!ourContributorsLoaded) {
synchronized (ourBindings) {
@@ -85,42 +43,27 @@ public class MetaRegistry extends MetaDataRegistrar {
}
@Nullable
public static PsiMetaData getMetaBase(final PsiElement element) {
public static PsiMetaData getMetaBase(PsiElement element) {
ProgressIndicatorProvider.checkCanceled();
return ourCachedMetaCache.get(META_DATA_KEY, element, null).getValue();
}
/**
* @see com.intellij.psi.meta.MetaDataContributor
* @deprecated
*/
@Deprecated
static <T extends PsiMetaData> void addMetadataBinding(ElementFilter filter,
Supplier<? extends T> aMetadataClass,
Disposable parentDisposable) {
final MyBinding binding = new MyBinding(filter, aMetadataClass);
addBinding(binding);
Disposer.register(parentDisposable, new Disposable() {
@Override
public void dispose() {
ourBindings.remove(binding);
return CachedValuesManager.getCachedValue(element, () -> {
ensureContributorsLoaded();
for (final MyBinding binding : ourBindings) {
if (binding.myFilter.isClassAcceptable(element.getClass()) && binding.myFilter.isAcceptable(element, element.getParent())) {
PsiMetaData data = binding.myDataClass.get();
data.init(element);
Object[] dependencies = data.getDependencies();
for (Object dependence : dependencies) {
if (dependence == null) {
LOG.error(data + "(" + binding.myDataClass + ") provided null dependency");
}
}
return new CachedValueProvider.Result<>(data, ArrayUtil.append(dependencies, element));
}
}
return new CachedValueProvider.Result<>(null, element);
});
}
/**
* @see com.intellij.psi.meta.MetaDataContributor
* @deprecated
*/
@Deprecated
public static <T extends PsiMetaData> void addMetadataBinding(ElementFilter filter, Supplier<? extends T> aMetadataClass) {
addBinding(new MyBinding(filter, aMetadataClass));
}
private static void addBinding(final MyBinding binding) {
ourBindings.add(0, binding);
}
@Override
public <T extends PsiMetaData> void registerMetaData(ElementFilter filter, Class<T> metadataDescriptorClass) {
Supplier<? extends T> supplier = ()-> {
@@ -132,12 +75,7 @@ public class MetaRegistry extends MetaDataRegistrar {
}
return null;
};
addMetadataBinding(filter, supplier);
}
@Override
public <T extends PsiMetaData> void registerMetaData(ElementPattern<?> pattern, Supplier<? extends T> metadataDescriptorClass) {
addMetadataBinding(new PatternFilter(pattern), metadataDescriptorClass);
ourBindings.add(0, new MyBinding(filter, supplier));
}
private static class MyBinding {
@@ -1,104 +0,0 @@
/*
* Copyright 2000-2016 JetBrains s.r.o.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.intellij.psi.impl.meta;
import com.intellij.openapi.command.WriteCommandAction;
import com.intellij.psi.PsiElement;
import com.intellij.psi.filters.ElementFilter;
import com.intellij.psi.meta.PsiMetaData;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.testFramework.LightPlatformTestCase;
import com.intellij.testFramework.UsefulTestCase;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
/**
* @author peter
*/
public class MetaRegistryTest extends LightPlatformTestCase {
public void testChangingMetaData() {
final boolean[] flag = {false};
MetaRegistry.addMetadataBinding(new ElementFilter() {
@Override
public boolean isAcceptable(Object element, PsiElement context) {
return flag[0];
}
@Override
public boolean isClassAcceptable(Class hintClass) {
return true;
}
}, MyTrueMetaData::new, getTestRootDisposable());
MetaRegistry.addMetadataBinding(new ElementFilter() {
@Override
public boolean isAcceptable(Object element, PsiElement context) {
return !flag[0];
}
@Override
public boolean isClassAcceptable(Class hintClass) {
return true;
}
}, MyFalseMetaData::new, getTestRootDisposable());
final XmlTag tag = ((XmlFile)LightPlatformTestCase.createFile("a.xml", "<a/>")).getDocument().getRootTag();
UsefulTestCase.assertInstanceOf(tag.getMetaData(), MyFalseMetaData.class);
flag[0] = true;
WriteCommandAction.runWriteCommandAction(LightPlatformTestCase.getProject(), () -> {
tag.setName("b");
});
UsefulTestCase.assertInstanceOf(tag.getMetaData(), MyTrueMetaData.class);
}
public static class MyAbstractMetaData implements PsiMetaData {
private PsiElement myDeclaration;
@Override
public PsiElement getDeclaration() {
return myDeclaration;
}
@NotNull
@Override
public Object[] getDependencies() {
return new Object[]{myDeclaration};
}
@Override
@NonNls
public String getName() {
return null;
}
@Override
@NonNls
public String getName(PsiElement context) {
return null;
}
@Override
public void init(PsiElement element) {
myDeclaration = element;
}
}
public static class MyTrueMetaData extends MyAbstractMetaData {}
public static class MyFalseMetaData extends MyAbstractMetaData {}
}
@@ -24,11 +24,9 @@ import com.intellij.openapi.util.text.StringUtil;
import com.intellij.openapi.vfs.VfsUtil;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.impl.PsiManagerImpl;
import com.intellij.psi.impl.meta.MetaRegistry;
import com.intellij.psi.xml.XmlFile;
import com.intellij.testFramework.PlatformTestUtil;
import com.intellij.util.ThrowableRunnable;
import com.intellij.xml.impl.dtd.XmlNSDescriptorImpl;
import org.jetbrains.annotations.NotNull;
import java.io.IOException;
@@ -42,8 +40,6 @@ public class DomPerformanceTest extends DomHardCoreTestCase {
public void testVisitorPerformance() {
final MyElement element = createElement("<root xmlns=\"adsf\" targetNamespace=\"adsf\"/>", MyElement.class);
MetaRegistry.bindDataToElement(DomUtil.getFile(element).getDocument(), new XmlNSDescriptorImpl());
final MyElement child = element.addChildElement();
child.getAttr().setValue("239");
child.getChild239().getAttr().setValue("42");