better DeclarationDescriptorVisitor

* it is interface
* no methods for abstract classes
* DescriptorRenderer now uses it do not forget about anything
This commit is contained in:
Stepan Koltsov
2012-06-13 21:11:08 +04:00
parent a9d82880e0
commit 1ca80f74fd
5 changed files with 137 additions and 61 deletions
@@ -17,66 +17,32 @@
package org.jetbrains.jet.lang.descriptors;
/**
* @author abreslav
* @author Stepan Koltsov
*/
public class DeclarationDescriptorVisitor<R, D> {
public R visitDeclarationDescriptor(DeclarationDescriptor descriptor, D data) {
return null;
}
public interface DeclarationDescriptorVisitor<R, D> {
R visitNamespaceDescriptor(NamespaceDescriptor descriptor, D data);
public R visitVariableDescriptor(VariableDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
R visitVariableDescriptor(VariableDescriptor descriptor, D data);
public R visitFunctionDescriptor(FunctionDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
R visitFunctionDescriptor(FunctionDescriptor descriptor, D data);
public R visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
R visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, D data);
public R visitNamespaceDescriptor(NamespaceDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
R visitClassDescriptor(ClassDescriptor descriptor, D data);
public R visitClassDescriptor(ClassDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
R visitModuleDeclaration(ModuleDescriptor descriptor, D data);
public R visitModuleDeclaration(ModuleDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
R visitConstructorDescriptor(ConstructorDescriptor constructorDescriptor, D data);
public R visitConstructorDescriptor(ConstructorDescriptor constructorDescriptor, D data) {
return visitFunctionDescriptor(constructorDescriptor, data);
}
R visitScriptDescriptor(ScriptDescriptor scriptDescriptor, D data);
public R visitScriptDescriptor(ScriptDescriptor scriptDescriptor, D data) {
return visitDeclarationDescriptor(scriptDescriptor, data);
}
R visitLocalVariableDescriptor(LocalVariableDescriptor descriptor, D data);
public R visitLocalVariableDescriptor(LocalVariableDescriptor descriptor, D data) {
return visitVariableDescriptor(descriptor, data);
}
R visitPropertyDescriptor(PropertyDescriptor descriptor, D data);
public R visitPropertyDescriptor(PropertyDescriptor descriptor, D data) {
return visitVariableDescriptor(descriptor, data);
}
R visitValueParameterDescriptor(ValueParameterDescriptor descriptor, D data);
public R visitValueParameterDescriptor(ValueParameterDescriptor descriptor, D data) {
return visitVariableDescriptor(descriptor, data);
}
R visitPropertyGetterDescriptor(PropertyGetterDescriptor descriptor, D data);
public R visitPropertyGetterDescriptor(PropertyGetterDescriptor descriptor, D data) {
return visitPropertyAccessorDescriptor(descriptor, data);
}
private R visitPropertyAccessorDescriptor(PropertyAccessorDescriptor descriptor, D data) {
return visitFunctionDescriptor(descriptor, data);
}
public R visitPropertySetterDescriptor(PropertySetterDescriptor descriptor, D data) {
return visitPropertyAccessorDescriptor(descriptor, data);
}
R visitPropertySetterDescriptor(PropertySetterDescriptor descriptor, D data);
}
@@ -0,0 +1,95 @@
/*
* Copyright 2010-2012 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 org.jetbrains.jet.lang.descriptors;
/**
* @author abreslav
*/
public class DeclarationDescriptorVisitorEmptyBodies<R, D> implements DeclarationDescriptorVisitor<R, D> {
public R visitDeclarationDescriptor(DeclarationDescriptor descriptor, D data) {
return null;
}
@Override
public R visitVariableDescriptor(VariableDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
@Override
public R visitFunctionDescriptor(FunctionDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
@Override
public R visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
@Override
public R visitNamespaceDescriptor(NamespaceDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
@Override
public R visitClassDescriptor(ClassDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
@Override
public R visitModuleDeclaration(ModuleDescriptor descriptor, D data) {
return visitDeclarationDescriptor(descriptor, data);
}
@Override
public R visitConstructorDescriptor(ConstructorDescriptor constructorDescriptor, D data) {
return visitFunctionDescriptor(constructorDescriptor, data);
}
@Override
public R visitScriptDescriptor(ScriptDescriptor scriptDescriptor, D data) {
return visitDeclarationDescriptor(scriptDescriptor, data);
}
@Override
public R visitLocalVariableDescriptor(LocalVariableDescriptor descriptor, D data) {
return visitVariableDescriptor(descriptor, data);
}
@Override
public R visitPropertyDescriptor(PropertyDescriptor descriptor, D data) {
return visitVariableDescriptor(descriptor, data);
}
@Override
public R visitValueParameterDescriptor(ValueParameterDescriptor descriptor, D data) {
return visitVariableDescriptor(descriptor, data);
}
@Override
public R visitPropertyGetterDescriptor(PropertyGetterDescriptor descriptor, D data) {
return visitPropertyAccessorDescriptor(descriptor, data);
}
private R visitPropertyAccessorDescriptor(PropertyAccessorDescriptor descriptor, D data) {
return visitFunctionDescriptor(descriptor, data);
}
@Override
public R visitPropertySetterDescriptor(PropertySetterDescriptor descriptor, D data) {
return visitPropertyAccessorDescriptor(descriptor, data);
}
}
@@ -78,7 +78,7 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
private final RenderDeclarationDescriptorVisitor rootVisitor = new RenderDeclarationDescriptorVisitor();
private final DeclarationDescriptorVisitor<Void, StringBuilder> subVisitor = new RenderDeclarationDescriptorVisitor() {
private final DeclarationDescriptorVisitorEmptyBodies<Void, StringBuilder> subVisitor = new RenderDeclarationDescriptorVisitor() {
@Override
public Void visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, StringBuilder builder) {
renderTypeParameter(descriptor, builder, false);
@@ -248,11 +248,6 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
StringBuilder stringBuilder = new StringBuilder();
declarationDescriptor.accept(rootVisitor, stringBuilder);
if (stringBuilder.length() == 0) {
// don't use toString here because render may be called from toString
stringBuilder.append(declarationDescriptor.getClass().getName() + "@" + System.identityHashCode(declarationDescriptor));
}
if (shouldRenderDefinedIn()) {
appendDefinedIn(declarationDescriptor, stringBuilder);
}
@@ -296,12 +291,12 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
return s;
}
private class RenderDeclarationDescriptorVisitor extends DeclarationDescriptorVisitor<Void, StringBuilder> {
private class RenderDeclarationDescriptorVisitor implements DeclarationDescriptorVisitor<Void, StringBuilder> {
@Override
public Void visitValueParameterDescriptor(ValueParameterDescriptor descriptor, StringBuilder builder) {
builder.append(renderKeyword("value-parameter")).append(" ");
return super.visitValueParameterDescriptor(descriptor, builder);
return visitVariableDescriptor(descriptor, builder);
}
@Override
@@ -309,6 +304,11 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
return visitVariableDescriptor(descriptor, builder, false);
}
@Override
public Void visitLocalVariableDescriptor(LocalVariableDescriptor descriptor, StringBuilder builder) {
return visitVariableDescriptor(descriptor, builder);
}
protected Void visitVariableDescriptor(VariableDescriptor descriptor, StringBuilder builder, boolean skipValVar) {
JetType type = descriptor.getType();
if (descriptor instanceof ValueParameterDescriptor) {
@@ -412,6 +412,16 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
return null;
}
@Override
public Void visitPropertyGetterDescriptor(PropertyGetterDescriptor descriptor, StringBuilder data) {
return visitFunctionDescriptor(descriptor, data);
}
@Override
public Void visitPropertySetterDescriptor(PropertySetterDescriptor descriptor, StringBuilder data) {
return visitFunctionDescriptor(descriptor, data);
}
private void renderValueParameters(FunctionDescriptor descriptor, StringBuilder builder) {
builder.append("(");
for (Iterator<ValueParameterDescriptor> iterator = descriptor.getValueParameters().iterator(); iterator.hasNext(); ) {
@@ -495,6 +505,12 @@ public class DescriptorRenderer implements Renderer<DeclarationDescriptor> {
return null;
}
@Override
public Void visitScriptDescriptor(ScriptDescriptor scriptDescriptor, StringBuilder data) {
renderName(scriptDescriptor, data);
return null;
}
@Override
public Void visitClassDescriptor(ClassDescriptor descriptor, StringBuilder builder) {
String keyword;
@@ -17,12 +17,11 @@
package org.jetbrains.jet.plugin.references;
import com.intellij.psi.*;
import com.intellij.psi.impl.source.tree.PsiCommentImpl;
import com.intellij.psi.util.PsiTreeUtil;
import com.intellij.testFramework.ResolveTestCase;
import org.jetbrains.jet.lang.descriptors.ClassDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitor;
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptorVisitorEmptyBodies;
import org.jetbrains.jet.lang.descriptors.NamespaceDescriptor;
import org.jetbrains.jet.lang.types.lang.JetStandardClasses;
import org.jetbrains.jet.plugin.PluginTestCaseBase;
@@ -78,7 +77,7 @@ public class StandardLibraryReferenceResolverTest extends ResolveTestCase {
private static Collection<DeclarationDescriptor> getAllStandardDescriptors(DeclarationDescriptor baseDescriptor) {
final ArrayList<DeclarationDescriptor> descriptors = new ArrayList<DeclarationDescriptor>();
baseDescriptor.acceptVoid(new DeclarationDescriptorVisitor<Void, Void>() {
baseDescriptor.acceptVoid(new DeclarationDescriptorVisitorEmptyBodies<Void, Void>() {
private Void visitDescriptors(Collection<? extends DeclarationDescriptor> descriptors) {
for (DeclarationDescriptor descriptor : descriptors) {
descriptor.acceptVoid(this);
@@ -226,7 +226,7 @@ public final class Intrinsics {
}
@SuppressWarnings("ConstantConditions")
private final class IntrinsicDeclarationVisitor extends DeclarationDescriptorVisitor<Void, Void> {
private final class IntrinsicDeclarationVisitor extends DeclarationDescriptorVisitorEmptyBodies<Void, Void> {
@Override
public Void visitClassDescriptor(@NotNull ClassDescriptor descriptor, @Nullable Void nothing) {