/******************************************************************************* * Copyright (c) 2006-2012 * Software Technology Group, Dresden University of Technology * DevBoost GmbH, Berlin, Amtsgericht Charlottenburg, HRB 140026 * * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Software Technology Group - TU Dresden, Germany; * DevBoost GmbH - Berlin, Germany * - initial API and implementation ******************************************************************************/ package org.emftext.language.java.resource.java.analysis.decider; import org.eclipse.emf.common.util.BasicEList; import org.eclipse.emf.common.util.EList; import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EReference; import org.emftext.language.java.classifiers.ClassifiersPackage; import org.emftext.language.java.classifiers.Enumeration; import org.emftext.language.java.commons.NamedElement; import org.emftext.language.java.expressions.AssignmentExpression; import org.emftext.language.java.imports.ClassifierImport; import org.emftext.language.java.imports.Import; import org.emftext.language.java.imports.ImportingElement; import org.emftext.language.java.imports.StaticClassifierImport; import org.emftext.language.java.imports.StaticMemberImport; import org.emftext.language.java.members.EnumConstant; import org.emftext.language.java.modifiers.AnnotableAndModifiable; import org.emftext.language.java.references.MethodCall; import org.emftext.language.java.references.Reference; import org.emftext.language.java.statements.StatementsPackage; import org.emftext.language.java.statements.Switch; import org.emftext.language.java.statements.SwitchCase; import org.emftext.language.java.types.Type; import org.emftext.language.java.util.TemporalCompositeClassifier; import org.emftext.language.java.variables.LocalVariable; /** * A decider that looks for enumeration constants. */ public class EnumConstantDecider extends AbstractDecider { private EObject reference = null; public boolean isPossibleTarget(String id, EObject element) { if (element instanceof EnumConstant) { NamedElement ne = (NamedElement) element; return id.equals(ne.getName()); } return false; } public EList<? extends EObject> getAdditionalCandidates(String identifier, EObject container) { if (container instanceof Switch && reference.eContainmentFeature().equals(StatementsPackage.Literals.CONDITIONAL__CONDITION) && reference.eContainer() instanceof SwitchCase) { Switch aSwitch = (Switch) container; Type variableType = aSwitch.getVariable().getType(); if (variableType instanceof Enumeration) { return ((Enumeration)variableType).getConstants(); } if (variableType instanceof TemporalCompositeClassifier) { for(EObject superType : ((TemporalCompositeClassifier)variableType).getSuperTypes()) { if (superType instanceof Enumeration) { return ((Enumeration)superType).getConstants(); } } } } if (container instanceof AssignmentExpression) { AssignmentExpression assignmentExpression = (AssignmentExpression) container; Type assignmentExpressionType = assignmentExpression.getType(); if (assignmentExpressionType instanceof Enumeration) { return ((Enumeration)assignmentExpressionType).getConstants(); } } if (container instanceof LocalVariable) { LocalVariable localVariable = (LocalVariable) container; Type assignmentExpressionType = localVariable.getTypeReference().getTarget(); if (assignmentExpressionType instanceof Enumeration) { return ((Enumeration)assignmentExpressionType).getConstants(); } } EList<EObject> resultList = addImports(container); return resultList; } private EList<EObject> addImports(EObject container) { if(container instanceof ImportingElement) { EList<EObject> resultList = new BasicEList<EObject>(); for(Import aImport : ((ImportingElement)container).getImports()) { if (aImport instanceof StaticMemberImport) { resultList.addAll(((StaticMemberImport)aImport).getStaticMembers()); } else if (aImport instanceof StaticClassifierImport) { resultList.addAll(aImport.getImportedMembers()); } else if (aImport instanceof ClassifierImport) { for (EObject member : ((ClassifierImport)aImport).getClassifier().getMembers()) { if (member instanceof AnnotableAndModifiable) { if(((AnnotableAndModifiable)member).isStatic()) { resultList.add(member); } } } } } return resultList; } return null; } public boolean containsCandidates(EObject container, EReference containingReference) { if (ClassifiersPackage.Literals.ENUMERATION__CONSTANTS.equals(containingReference)) { return true; } return false; } public boolean canFindTargetsFor(EObject referenceContainer, EReference containingReference) { reference = referenceContainer; return referenceContainer instanceof Reference && !(referenceContainer instanceof MethodCall); } }