/* * Copyright (c) 2013, the Dart project authors. * * Licensed under the Eclipse Public License v1.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.eclipse.org/legal/epl-v10.html * * 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.google.dart.engine.services.util; import com.google.dart.engine.ast.AstNode; import com.google.dart.engine.ast.SimpleIdentifier; import com.google.dart.engine.ast.visitor.RecursiveAstVisitor; import com.google.dart.engine.element.Element; import com.google.dart.engine.element.FieldFormalParameterElement; import com.google.dart.engine.element.ParameterElement; import com.google.dart.engine.element.PropertyAccessorElement; import com.google.dart.engine.element.PropertyInducingElement; import com.google.dart.engine.internal.element.member.Member; import java.util.Collection; import java.util.HashSet; import java.util.Set; public class NameOccurrencesFinder extends RecursiveAstVisitor<Void> { public static Collection<AstNode> findIn(SimpleIdentifier ident, AstNode root) { if (ident == null || ident.getBestElement() == null) { return new HashSet<AstNode>(0); } NameOccurrencesFinder finder = new NameOccurrencesFinder(ident.getBestElement()); root.accept(finder); return finder.getMatches(); } private Element target; private Element target2; private Element target3; private Element target4; private Set<AstNode> matches; private NameOccurrencesFinder(Element source) { this.target = source; switch (source.getKind()) { case GETTER: case SETTER: PropertyAccessorElement accessorElem = (PropertyAccessorElement) source; this.target2 = accessorElem.getVariable(); if (source instanceof Member) { Member member = (Member) source; this.target4 = member.getBaseElement(); } if (this.target2 instanceof Member) { Member member = (Member) source; this.target3 = member.getBaseElement(); } break; case FIELD: case TOP_LEVEL_VARIABLE: PropertyInducingElement propertyElem = (PropertyInducingElement) source; this.target2 = propertyElem.getGetter(); this.target3 = propertyElem.getSetter(); break; case METHOD: if (source instanceof Member) { Member member = (Member) source; this.target4 = member.getBaseElement(); } break; case PARAMETER: ParameterElement param = (ParameterElement) source; if (param.isInitializingFormal()) { FieldFormalParameterElement fieldInit = (FieldFormalParameterElement) param; this.target2 = fieldInit.getField(); } default: break; } if (target2 == null) { target2 = target; } if (target3 == null) { target3 = target; } if (target4 == null) { target4 = target; } this.matches = new HashSet<AstNode>(); } public Collection<AstNode> getMatches() { return matches; } @Override public Void visitSimpleIdentifier(SimpleIdentifier node) { Element element = node.getBestElement(); if (element == null) { return null; } match(element, node); if (element instanceof Member) { Member member = (Member) element; match(member.getBaseElement(), node); } switch (element.getKind()) { case GETTER: case SETTER: PropertyAccessorElement accessorElem = (PropertyAccessorElement) element; match(accessorElem.getVariable(), node); break; case FIELD: case TOP_LEVEL_VARIABLE: PropertyInducingElement propertyElem = (PropertyInducingElement) element; match(propertyElem.getGetter(), node); match(propertyElem.getSetter(), node); break; case PARAMETER: ParameterElement param = (ParameterElement) element; if (param.isInitializingFormal()) { FieldFormalParameterElement fieldInit = (FieldFormalParameterElement) param; match(fieldInit.getField(), node); } break; default: break; } return null; } private void match(Element element, AstNode node) { if (target == element || target2 == element || target3 == element || target4 == element) { matches.add(node); } } }