blob: de068212ede17f33d3fd003b4400ab8c5235c294 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2018 Willink Transformations and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* E.D.Willink - initial API and implementation
*******************************************************************************/
package org.eclipse.ocl.xtext.completeocl.attributes;
import java.util.List;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.ocl.pivot.Element;
import org.eclipse.ocl.pivot.internal.scoping.AbstractAttribution;
import org.eclipse.ocl.pivot.internal.scoping.EnvironmentView;
import org.eclipse.ocl.pivot.internal.scoping.ScopeView;
import org.eclipse.ocl.pivot.utilities.FeatureFilter;
import org.eclipse.ocl.xtext.basecs.PathElementCS;
import org.eclipse.ocl.xtext.basecs.PathNameCS;
import org.eclipse.ocl.xtext.completeoclcs.CompleteOCLCSPackage;
import org.eclipse.ocl.xtext.completeoclcs.OperationContextDeclCS;
public class OperationContextCSAttribution extends AbstractAttribution
{
public static final @NonNull OperationContextCSAttribution INSTANCE = new OperationContextCSAttribution();
@Override
public ScopeView computeLookup(@NonNull EObject target, @NonNull EnvironmentView environmentView, @NonNull ScopeView scopeView) {
OperationContextDeclCS targetElement = (OperationContextDeclCS)target;
EStructuralFeature containmentFeature = scopeView.getContainmentFeature();
/* if (containmentFeature == CompleteOCLCSPackage.Literals.OPERATION_CONTEXT_DECL_CS__OPERATION) {
Filter filter = new OperationContextFilter(targetElement);
try {
environmentView.addFilter(filter);
ScopeView namespaceScope = getNamespaceScope(environmentView, scopeView, targetElement.getNamespace());
if ("conformsTo".equals(environmentView.getName())) { // FIXME debugging
environmentView.computeLookups(namespaceScope);
}
else {
environmentView.computeLookups(namespaceScope);
}
return null;
}
finally {
environmentView.removeFilter(filter);
}
}
else if (containmentFeature == CompleteOCLCSPackage.Literals.CONTEXT_DECL_CS__NAMESPACE) {
return getNextNamespaceScope(environmentView, scopeView, targetElement.getNamespace());
}
else*/ if ((containmentFeature == CompleteOCLCSPackage.Literals.OPERATION_CONTEXT_DECL_CS__OWNED_POSTCONDITIONS)
|| (containmentFeature == CompleteOCLCSPackage.Literals.OPERATION_CONTEXT_DECL_CS__OWNED_PRECONDITIONS)
|| (containmentFeature == CompleteOCLCSPackage.Literals.OPERATION_CONTEXT_DECL_CS__OWNED_BODIES)) {
// return getNextNamespaceScope(environmentView, scopeView, target.getNamespace());
// Operation operation = targetElement.getOperation();
PathNameCS pathName = targetElement.getOwnedPathName();
if (pathName != null) {
List<PathElementCS> path = pathName.getOwnedPathElements();
if (path.size() > 1) {
Element element = path.get(path.size()-2).getReferredElement();
if ((element instanceof org.eclipse.ocl.pivot.Class) && !element.eIsProxy()) {
org.eclipse.ocl.pivot.Class type = (org.eclipse.ocl.pivot.Class) element;
// MetamodelManager metamodelManager = environmentView.getMetamodelManager();
environmentView.addAllOperations(type, FeatureFilter.SELECT_NON_STATIC);
environmentView.addAllProperties(type, FeatureFilter.SELECT_NON_STATIC);
// if (!environmentView.hasFinalResult()) {
// Set<Type> alreadyVisitedTypes = new HashSet<Type>();
// org.eclipse.ocl.pivot.Class unspecializedTarget = PivotUtil.getUnspecializedTemplateableElement(target); // FIXME
// for (Type superClass : metamodelManager.getSuperClasses(type)) {
// environmentView.addAllContents(type, scopeView, superClass, Boolean.FALSE, alreadyVisitedTypes);
// }
// }
}
}
}
}
return scopeView.getParent();
}
}