mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
clean up & remove dead code around MetaDataRegistrar
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user