/*******************************************************************************
* Copyright (c) 2006-2014
* 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.extensions.classifiers;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.util.EcoreUtil;
import org.emftext.language.java.classifiers.AnonymousClass;
import org.emftext.language.java.classifiers.ConcreteClassifier;
import org.emftext.language.java.classifiers.Enumeration;
import org.emftext.language.java.commons.Commentable;
import org.emftext.language.java.instantiations.NewConstructorCall;
import org.emftext.language.java.members.EnumConstant;
import org.emftext.language.java.members.Member;
import org.emftext.language.java.modifiers.AnnotableAndModifiable;
import org.emftext.language.java.types.Type;
import org.emftext.language.java.types.TypeReference;
import org.emftext.language.java.util.UniqueEList;
public class AnonymousClassExtension {
/**
* @param context to check protected visibility
* @return a view on all members including super classifiers' members
*/
public static EList<Member> getAllMembers(AnonymousClass me, Commentable context) {
EList<Member> memberList = new UniqueEList<Member>();
memberList.addAll(me.getMembers());
memberList.addAll(me.getDefaultMembers());
NewConstructorCall ncCall = null;
EObject eContainer = me.eContainer();
if (eContainer instanceof NewConstructorCall) {
ncCall = (NewConstructorCall) eContainer;
}
if (ncCall == null) {
return memberList;
} else {
TypeReference typeReference = ncCall.getTypeReference();
Type target = typeReference.getTarget();
ConcreteClassifier classifier = (ConcreteClassifier) target;
if (classifier != null) {
EList<Member> superMemberList = classifier.getAllMembers(context);
for (Member superMember : superMemberList) {
// Exclude private members
if (superMember instanceof AnnotableAndModifiable) {
if (superMember.eIsProxy()) {
superMember = (Member) EcoreUtil.resolve(superMember, me);
}
AnnotableAndModifiable modifiable = (AnnotableAndModifiable) superMember;
if (!modifiable.isHidden(context)) {
memberList.add(superMember);
}
} else {
memberList.add(superMember);
}
}
}
return memberList;
}
}
/**
* @return a view on all super classifiers
*/
public static EList<ConcreteClassifier> getAllSuperClassifiers(AnonymousClass me) {
EList<ConcreteClassifier> superClassifierList = new UniqueEList<ConcreteClassifier>();
ConcreteClassifier superClassifier = me.getSuperClassifier();
if (superClassifier != null) {
superClassifierList.add(superClassifier);
superClassifierList.addAll(superClassifier.getAllSuperClassifiers());
} else {
superClassifierList.add(me.getObjectClass());
}
return superClassifierList;
}
/**
* @return the direct super classifier
*/
public static ConcreteClassifier getSuperClassifier(AnonymousClass me) {
NewConstructorCall ncCall = null;
EObject eContainer = me.eContainer();
if (eContainer instanceof NewConstructorCall) {
ncCall = (NewConstructorCall) eContainer;
TypeReference typeReference = ncCall.getTypeReference();
Type target = typeReference.getTarget();
ConcreteClassifier superClassifier = (ConcreteClassifier) target;
return superClassifier;
} else if (eContainer instanceof EnumConstant) {
if (eContainer.eContainer() instanceof Enumeration) {
return (Enumeration) eContainer.eContainer();
}
}
return null;
}
}