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