104b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller/* 204b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * Copyright (C) 2015 The Android Open Source Project 304b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * 404b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * Licensed under the Apache License, Version 2.0 (the "License"); 504b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * you may not use this file except in compliance with the License. 604b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * You may obtain a copy of the License at 704b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * 804b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * http://www.apache.org/licenses/LICENSE-2.0 904b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * 1004b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * Unless required by applicable law or agreed to in writing, software 1104b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * distributed under the License is distributed on an "AS IS" BASIS, 1204b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1304b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * See the License for the specific language governing permissions and 1404b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * limitations under the License. 1504b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller */ 16ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fullerpackage com.google.currysrc.api.process.ast; 1704b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 1804b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fullerimport org.eclipse.jdt.core.dom.AbstractTypeDeclaration; 1904b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fullerimport org.eclipse.jdt.core.dom.BodyDeclaration; 2004b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fullerimport org.eclipse.jdt.core.dom.CompilationUnit; 2104b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fullerimport org.eclipse.jdt.core.dom.EnumConstantDeclaration; 2204b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fullerimport org.eclipse.jdt.core.dom.EnumDeclaration; 2304b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 2404b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fullerimport java.util.List; 2504b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 2604b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller/** 2704b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * Locates the {@link org.eclipse.jdt.core.dom.BodyDeclaration} associated with an enum 2804b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller * declaration. 2904b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller */ 30ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fullerpublic final class EnumConstantLocator implements BodyDeclarationLocator { 3104b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 32ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller static final String LOCATOR_TYPE_NAME = "enumConstant"; 3393cf604e9dd0525f15bc0a7450b2a35f3884c298Neil Fuller 34ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller private final TypeLocator typeLocator; 3504b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 3604b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller private final String constantName; 3704b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 38ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller public EnumConstantLocator(String packageName, String typeName, String constantName) { 39ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller this(new TypeLocator(packageName, typeName), constantName); 4004b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 4104b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 42ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller public EnumConstantLocator(TypeLocator typeLocator, String constantName) { 43ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller this.typeLocator = typeLocator; 4404b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller this.constantName = constantName; 4504b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 4604b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 47ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller @Override public TypeLocator getTypeLocator() { 48ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller return typeLocator; 4993cf604e9dd0525f15bc0a7450b2a35f3884c298Neil Fuller } 5093cf604e9dd0525f15bc0a7450b2a35f3884c298Neil Fuller 5104b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller @Override 5204b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller public boolean matches(BodyDeclaration node) { 5304b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller if (!(node instanceof EnumConstantDeclaration)) { 5404b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller return false; 5504b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 5604b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 57ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller if (typeLocator.matches((BodyDeclaration) node.getParent())) { 5804b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller EnumConstantDeclaration enumConstantDeclaration = (EnumConstantDeclaration) node; 5904b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller if (enumConstantDeclaration.getName().getFullyQualifiedName().equals(constantName)) { 6004b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller return true; 6104b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 6204b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 6304b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller return false; 6404b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 6504b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 6604b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller @Override 6704b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller public BodyDeclaration find(CompilationUnit cu) { 68ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller AbstractTypeDeclaration typeDeclaration = typeLocator.find(cu); 6904b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller if (typeDeclaration == null || !(typeDeclaration instanceof EnumDeclaration)) { 7004b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller return null; 7104b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 7204b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller for (EnumConstantDeclaration enumConstantDeclaration 7304b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller : (List<EnumConstantDeclaration>) ((EnumDeclaration) typeDeclaration).enumConstants()) { 7404b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller if (enumConstantDeclaration.getName().getFullyQualifiedName().equals(constantName)) { 7504b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller return enumConstantDeclaration; 7604b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 7704b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 7804b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller return null; 7904b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 8004b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller 8193cf604e9dd0525f15bc0a7450b2a35f3884c298Neil Fuller @Override public String getStringFormType() { 82ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller return LOCATOR_TYPE_NAME; 8393cf604e9dd0525f15bc0a7450b2a35f3884c298Neil Fuller } 8493cf604e9dd0525f15bc0a7450b2a35f3884c298Neil Fuller 8593cf604e9dd0525f15bc0a7450b2a35f3884c298Neil Fuller @Override public String getStringFormTarget() { 86ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller return typeLocator.getStringFormTarget() + "#" + constantName; 8793cf604e9dd0525f15bc0a7450b2a35f3884c298Neil Fuller } 8893cf604e9dd0525f15bc0a7450b2a35f3884c298Neil Fuller 8904b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller @Override 9004b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller public String toString() { 91ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller return "EnumConstantLocator{" + 92ac1c676b1256aaa85c5cc22494ea56bd2d276b9fNeil Fuller "typeLocator=" + typeLocator + 9304b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller ", constantName='" + constantName + '\'' + 9404b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller '}'; 9504b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller } 9604b228542fa91e91551c6ea4e6a2bac1d55ca1afNeil Fuller} 97