All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.objectweb.fractal.mind.adl.parameter.ParametricGenericDefinitionReferenceResolver Maven / Gradle / Ivy

The newest version!
/**
 * Copyright (C) 2009 STMicroelectronics
 *
 * This file is part of "Mind Compiler" is free software: you can redistribute 
 * it and/or modify it under the terms of the GNU Lesser General Public License 
 * as published by the Free Software Foundation, either version 3 of the 
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT 
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
 * details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see .
 *
 * Contact: [email protected]
 *
 * Authors: Matthieu Leclercq
 * Contributors: 
 */

package org.objectweb.fractal.mind.adl.parameter;

import static org.objectweb.fractal.adl.NodeUtil.castNodeError;

import java.util.Map;

import org.objectweb.fractal.adl.ADLException;
import org.objectweb.fractal.adl.Definition;
import org.objectweb.fractal.mind.adl.AbstractDefinitionReferenceResolver;
import org.objectweb.fractal.mind.adl.DefinitionReferenceResolver;
import org.objectweb.fractal.mind.adl.ast.DefinitionReference;
import org.objectweb.fractal.mind.adl.generic.ast.TypeArgument;
import org.objectweb.fractal.mind.adl.generic.ast.TypeArgumentContainer;
import org.objectweb.fractal.mind.adl.parameter.ast.Argument;
import org.objectweb.fractal.mind.adl.parameter.ast.ArgumentContainer;

/**
 * This delegating {@link DefinitionReferenceResolver} extracts {@link Argument}
 * nodes of the {@link TypeArgument type arguments} contains by the definition
 * reference to resolve, and adds them to the definition reference to resolve. 
* i.e. transforms * *
 * D1<P1(10, 11), P2("foo")>
 * 
* * to * *
 * D1<P1, P2>(10, 11, "foo")
 * 
* * @see ParametricTemplateInstantiator */ public class ParametricGenericDefinitionReferenceResolver extends AbstractDefinitionReferenceResolver { // --------------------------------------------------------------------------- // Implementation of the DefinitionReferenceResolver interface // --------------------------------------------------------------------------- public Definition resolve(final DefinitionReference reference, final Definition encapsulatingDefinition, final Map context) throws ADLException { final TypeArgument[] typeArguments = (reference instanceof TypeArgumentContainer) ? ((TypeArgumentContainer) reference).getTypeArguments() : null; final Definition d = clientResolverItf.resolve(reference, encapsulatingDefinition, context); if (typeArguments != null && typeArguments.length > 0) { ArgumentContainer topArgumentContainer = null; for (final TypeArgument typeArgument : typeArguments) { if (typeArgument.getDefinitionReference() instanceof ArgumentContainer) { final String typeParameterName = typeArgument.getTypeParameterName(); assert typeParameterName != null; final ArgumentContainer argumentContainer = (ArgumentContainer) typeArgument .getDefinitionReference(); for (final Argument argument : argumentContainer.getArguments()) { assert argument.getName() != null; argumentContainer.removeArgument(argument); argument.setName(typeParameterName + "$" + argument.getName()); if (topArgumentContainer == null) { // cast reference node to ArgumentContainer. If the reference node // is not an ArgumentContainer, this is an error since it is // impossible to replace it by a node that actually implements // ArgumentContainer. topArgumentContainer = castNodeError(reference, ArgumentContainer.class); } topArgumentContainer.addArgument(argument); } } } } return d; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy