/******************************************************************************* * Copyright (c) 2008,2010 itemis AG (http://www.itemis.eu) and others. * 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 * *******************************************************************************/ package org.eclipse.emf.mwe2.language.scoping; import java.util.List; import java.util.Map; import org.eclipse.xtext.common.types.JvmDeclaredType; import org.eclipse.xtext.common.types.JvmFeature; import org.eclipse.xtext.common.types.JvmMember; import org.eclipse.xtext.common.types.JvmOperation; import org.eclipse.xtext.common.types.JvmType; import org.eclipse.xtext.common.types.JvmTypeReference; import org.eclipse.xtext.naming.QualifiedName; import org.eclipse.xtext.util.Strings; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; public class InjectableFeatureLookup implements IInjectableFeatureLookup { public Map<QualifiedName, JvmFeature> getInjectableFeatures(JvmType type) { Map<QualifiedName, JvmFeature> result = Maps.newHashMap(); collectFeatures(type, result); return ImmutableMap.copyOf(result); } public void collectFeatures(JvmType containerType, Map<QualifiedName, JvmFeature> result) { if (containerType == null || containerType.eIsProxy()) return; if (containerType instanceof JvmDeclaredType) { List<JvmTypeReference> superTypes = ((JvmDeclaredType) containerType).getSuperTypes(); for(JvmTypeReference superType: superTypes) { if (superType.getType() != null) collectFeatures(superType.getType(), result); } List<JvmMember> members = ((JvmDeclaredType) containerType).getMembers(); for(JvmMember member: members) { if (member instanceof JvmOperation) { JvmOperation op = (JvmOperation) member; String simpleName = op.getSimpleName(); if (simpleName != null && simpleName.length() > 3 && (simpleName.startsWith("add") || simpleName.startsWith("set"))) { if (op.getParameters().size() == 1) { String name = Strings.toFirstLower(op.getSimpleName().substring(3)); result.put(QualifiedName.create(name), op); } } } } } } }