package com.redhat.ceylon.eclipse.util;
import com.redhat.ceylon.model.typechecker.model.Declaration;
import com.redhat.ceylon.model.typechecker.model.Function;
import com.redhat.ceylon.model.typechecker.model.Referenceable;
import com.redhat.ceylon.model.typechecker.model.Setter;
import com.redhat.ceylon.common.Backends;
import com.redhat.ceylon.compiler.typechecker.tree.Node;
import com.redhat.ceylon.compiler.typechecker.tree.Tree;
import com.redhat.ceylon.compiler.typechecker.tree.Visitor;
import com.redhat.ceylon.compiler.typechecker.tree.Tree.FunctionArgument;
@Deprecated
class FindReferencedNodeVisitor extends Visitor {
private final Referenceable declaration;
private Node declarationNode;
FindReferencedNodeVisitor(Referenceable declaration) {
this.declaration = declaration;
}
Node getDeclarationNode() {
return declarationNode;
}
private boolean isDeclaration(Declaration dec) {
if (dec!=null && dec.equals(declaration)) {
if (dec.isNative()) {
Declaration d = (Declaration) declaration;
Backends backends = d.getNativeBackends();
if (!dec.getNativeBackends().equals(backends)) {
return false;
}
}
if (declaration instanceof Function) {
Function method = (Function) declaration;
if (method.isOverloaded()) {
return method==dec;
}
}
return true;
}
else {
return false;
}
}
@Override
public void visit(Tree.ModuleDescriptor that) {
super.visit(that);
Referenceable m = that.getImportPath().getModel();
if (m!=null && m.equals(declaration)) {
declarationNode = that;
}
}
@Override
public void visit(Tree.PackageDescriptor that) {
super.visit(that);
Referenceable p = that.getImportPath().getModel();
if (p!=null && p.equals(declaration)) {
declarationNode = that;
}
}
@Override
public void visit(Tree.Declaration that) {
if (isDeclaration(that.getDeclarationModel())) {
declarationNode = that;
}
super.visit(that);
}
@Override
public void visit(Tree.Constructor that) {
if (isDeclaration(that.getConstructor())) {
declarationNode = that;
}
super.visit(that);
}
@Override
public void visit(Tree.Enumerated that) {
if (isDeclaration(that.getEnumerated())) {
declarationNode = that;
}
super.visit(that);
}
@Override
public void visit(Tree.AttributeSetterDefinition that) {
Setter setter = that.getDeclarationModel();
Declaration param =
setter.getDirectMember(setter.getName(),
null, false);
if (isDeclaration(param)) {
declarationNode = that;
}
super.visit(that);
}
@Override
public void visit(Tree.ObjectDefinition that) {
if (isDeclaration(that.getAnonymousClass())) {
declarationNode = that;
}
super.visit(that);
}
@Override
public void visit(Tree.ObjectExpression that) {
if (isDeclaration(that.getAnonymousClass())) {
declarationNode = that;
}
super.visit(that);
}
@Override
public void visit(Tree.SpecifierStatement that) {
if (that.getRefinement()) {
if (isDeclaration(that.getDeclaration())) {
declarationNode = that;
}
}
super.visit(that);
}
@Override
public void visit(FunctionArgument that) {
if (isDeclaration(that.getDeclarationModel())) {
declarationNode = that;
}
super.visit(that);
}
@Override
public void visit(Tree.InitializerParameter that) {
if (isDeclaration(that.getParameterModel().getModel())) {
declarationNode = that;
}
super.visit(that);
}
public void visitAny(Node node) {
if (declarationNode==null ||
declarationNode
instanceof Tree.InitializerParameter) {
super.visitAny(node);
}
}
}