/** * Copyright (c) 2011, 2015 Committers of YAKINDU 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 * * Contributors: * Andreas Mülder - Initial contribution and API * Markus Mühlbrandt - Added support for 'IdentifierSettings' feature * Alexander Nyßen - Added support for 'Tracing' feature; general refactorings */ package org.yakindu.sct.generator.c.features; import org.eclipse.core.runtime.IStatus; import org.eclipse.core.runtime.Status; import org.eclipse.emf.ecore.EObject; import org.eclipse.xtext.xbase.lib.StringExtensions; import org.yakindu.sct.generator.core.library.AbstractDefaultFeatureValueProvider; import org.yakindu.sct.model.sgen.FeatureParameterValue; import org.yakindu.sct.model.sgen.FeatureType; import org.yakindu.sct.model.sgen.FeatureTypeLibrary; import org.yakindu.sct.model.sgen.GeneratorEntry; import org.yakindu.sct.model.sgraph.Statechart; /** * Provides default values and support for validating parameter values of C code * generator generator model. * * @author Andreas Mülder * @author Markus Mühlbrandt * @author Alexander Nyßen */ public class CDefaultFeatureValueProvider extends AbstractDefaultFeatureValueProvider { private static final String INVALID_IDENTIFIER_REGEX = "[^a-z&&[^A-Z&&[^0-9]]]"; private static final String VALID_IDENTIFIER_REGEX = "[_a-zA-Z][_a-zA-Z0-9]*"; @Override public boolean isProviderFor(FeatureTypeLibrary library) { return ICFeatureConstants.LIBRARY_NAME.equals(library.getName()); } @Override protected void setDefaultValue(FeatureType featureType, FeatureParameterValue parameterValue, EObject contextElement) { GeneratorEntry entry = (GeneratorEntry) contextElement; Statechart statechart = (Statechart) entry.getElementRef(); String parameterName = parameterValue.getParameter().getName(); if (ICFeatureConstants.PARAMETER_NAMING_MODULE_NAME.equals(parameterName)) { parameterValue.setValue(asIdentifier(statechart.getName(), "_")); } else if (ICFeatureConstants.PARAMETER_NAMING_STATEMACHINE_PREFIX.equals(parameterName)) { parameterValue.setValue(StringExtensions.toFirstLower(asIdentifier(statechart.getName(), "_"))); } else if (ICFeatureConstants.PARAMETER_NAMING_MAX_IDENTIFIER_LENGTH.equals(parameterName)) { parameterValue.setValue("31"); } else if (ICFeatureConstants.PARAMETER_NAMING_SEPARATOR.equals(parameterName)) { parameterValue.setValue("_"); } else if (ICFeatureConstants.PARAMETER_TRACING_ENTER_STATE.equals(parameterName)) { parameterValue.setValue(true); } else if (ICFeatureConstants.PARAMETER_TRACING_EXIT_STATE.equals(parameterName)) { parameterValue.setValue(true); } else if (ICFeatureConstants.PARAMETER_INCLUDES_USE_RELATIVE_PATHS.equals(parameterName)) { parameterValue.setValue(true); } else { throw new IllegalArgumentException("Unsupported parameter '" + parameterName + "'."); } } @Override public IStatus validateParameterValue(FeatureParameterValue parameter) { String parameterName = parameter.getParameter().getName(); if (ICFeatureConstants.PARAMETER_NAMING_MODULE_NAME.equals(parameterName)) { if (!parameter.getStringValue().matches(VALID_IDENTIFIER_REGEX)) { return error("Invalid module name"); } } else if (ICFeatureConstants.PARAMETER_NAMING_STATEMACHINE_PREFIX.equals(parameterName)) { if (!parameter.getStringValue().matches(VALID_IDENTIFIER_REGEX)) { return error("Invalid function prefix name"); } } else if (ICFeatureConstants.PARAMETER_NAMING_SEPARATOR.equals(parameterName)) { if (!parameter.getStringValue().matches(VALID_IDENTIFIER_REGEX)) { return error("Invalid separator"); } } // No specific validation is required for 'enterState' and 'exitState' // parameters of 'Tracing' feature, as they are boolean. return Status.OK_STATUS; } private String asIdentifier(String it, String separator) { return it.replaceAll(INVALID_IDENTIFIER_REGEX, separator); } }