Browse Source

Added feature to set internal function visibility

markus.muehlbrandt@gmail.com 11 years ago
parent
commit
765aea400c

+ 6 - 0
plugins/org.yakindu.sct.generator.cpp/library/FeatureTypeLibrary.xmi

@@ -22,4 +22,10 @@
         name="separator"
         optional="true"/>
   </types>
+  <types name="GeneratorOptions"
+      optional="true">
+    <parameters
+        name="innerFunctionVisibility"
+        optional="true"/>
+  </types>
 </sgen:FeatureTypeLibrary>

+ 11 - 11
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineHeader.xtend

@@ -14,9 +14,9 @@ import com.google.inject.Inject
 import java.util.List
 import org.eclipse.xtend2.lib.StringConcatenation
 import org.eclipse.xtext.generator.IFileSystemAccess
-import org.yakindu.sct.generator.c.GenmodelEntries
 import org.yakindu.sct.generator.c.Statemachine
 import org.yakindu.sct.generator.core.types.ICodegenTypeSystemAccess
+import org.yakindu.sct.generator.cpp.features.GenmodelEntriesExtension
 import org.yakindu.sct.model.sexec.Check
 import org.yakindu.sct.model.sexec.ExecutionFlow
 import org.yakindu.sct.model.sexec.Step
@@ -36,7 +36,7 @@ class StatemachineHeader extends Statemachine {
 	@Inject extension Naming cNaming
 	@Inject extension Navigation
 	@Inject extension ICodegenTypeSystemAccess
-	@Inject extension GenmodelEntries
+	@Inject extension GenmodelEntriesExtension
 	@Inject extension INamingService
 	
 	def generateStatemachineHeader(ExecutionFlow flow, Statechart sc, IFileSystemAccess fsa, GeneratorEntry entry) {
@@ -68,16 +68,16 @@ class StatemachineHeader extends Statemachine {
 				
 				«statesEnumDecl»
 				
-				«FOR s : it.scopes»«s.createPublicScope()»«ENDFOR»
+				«FOR s : it.scopes»«s.createPublicScope(entry)»«ENDFOR»
 				
 				«publicFunctionPrototypes»
 				
 				/*! Checks if the specified state is active. */
 				sc_boolean «activeFctID»(«statesEnumType» state);
 			
-			private:
+			«entry.innerClassVisibility»:
 			
-				«FOR s : scopes.filter(typeof(InternalScope))»«s.createInterface»«ENDFOR»
+				«FOR s : scopes.filter(typeof(InternalScope))»«s.createInterface(entry)»«ENDFOR»
 			
 				«statemachineTypeDecl»
 				
@@ -110,16 +110,16 @@ class StatemachineHeader extends Statemachine {
 		return ''''''
 	}
 	
-	def protected createPublicScope(Scope scope) {
+	def protected createPublicScope(Scope scope, GeneratorEntry entry) {
 		switch scope {
-			InterfaceScope: scope.createPublicScope()
+			InterfaceScope: scope.createPublicScope(entry)
 			InternalScope: scope.createPublicScope
 		}
 	}
 	
-	def protected createPublicScope(InterfaceScope scope)
+	def protected createPublicScope(InterfaceScope scope, GeneratorEntry entry)
 	'''
-		«scope.createInterface()»
+		«scope.createInterface(entry
 «««		«scope.createListenerInterface(entry)»
 		«scope.createOCBInterface»
 		
@@ -139,7 +139,7 @@ class StatemachineHeader extends Statemachine {
 		'''
 	}
 	
-	def protected createInterface(StatechartScope scope)
+	def protected createInterface(StatechartScope scope, GeneratorEntry entry)
 	'''
 		//! Inner class for «scope.simpleName» interface scope.
 		class «scope.interfaceName» {
@@ -149,7 +149,7 @@ class StatemachineHeader extends Statemachine {
 					«d.functionPrototypes»
 				«ENDFOR»
 				
-			private:
+			«entry.innerClassVisibility»:
 				friend class «scope.execution_flow.module()»;
 				«FOR d : scope.declarations»
 				 «d.structDeclaration»

+ 23 - 3
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/features/CPPDefaultFeatureValueProvider.java

@@ -10,12 +10,15 @@
  */
 package org.yakindu.sct.generator.cpp.features;
 
+import java.util.Arrays;
+
 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.c.features.CFeatureConstants;
 import org.yakindu.sct.generator.core.features.AbstractDefaultFeatureValueProvider;
+import org.yakindu.sct.generator.cpp.features.CPPFeatureConstants.Visibility;
 import org.yakindu.sct.model.sgen.FeatureParameterValue;
 import org.yakindu.sct.model.sgen.FeatureTypeLibrary;
 import org.yakindu.sct.model.sgen.GeneratorEntry;
@@ -28,7 +31,7 @@ import org.yakindu.sct.model.sgraph.Statechart;
  */
 public class CPPDefaultFeatureValueProvider 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]*";
 
@@ -55,6 +58,11 @@ public class CPPDefaultFeatureValueProvider extends
 		} else if (parameterValue.getParameter().getName()
 				.equals(CFeatureConstants.PARAMETER_SEPARATOR)) {
 			parameterValue.setValue("_");
+		} else if (parameterValue
+				.getParameter()
+				.getName()
+				.equals(CPPFeatureConstants.PARAMETER_INNER_FUNCTION_VISIBILITY)) {
+			parameterValue.setValue(Visibility.PRIVATE.toString().toLowerCase());
 		}
 	}
 
@@ -64,7 +72,8 @@ public class CPPDefaultFeatureValueProvider extends
 			if (!parameter.getStringValue().matches(VALID_IDENTIFIER_REGEX)) {
 				return error("Invalid module name");
 			}
-		} else if (CFeatureConstants.PARAMETER_STATEMACHINE_PREFIX.equals(parameterName)) {
+		} else if (CFeatureConstants.PARAMETER_STATEMACHINE_PREFIX
+				.equals(parameterName)) {
 			if (!parameter.getStringValue().matches(VALID_IDENTIFIER_REGEX)) {
 				return error("Invalid function prefix name");
 			}
@@ -72,10 +81,21 @@ public class CPPDefaultFeatureValueProvider extends
 			if (!parameter.getStringValue().matches(VALID_IDENTIFIER_REGEX)) {
 				return error("Invalid separator");
 			}
+		} else if (CPPFeatureConstants.PARAMETER_INNER_FUNCTION_VISIBILITY.equals(parameterName)) {
+			boolean found = false;
+			for (Visibility visibility : Arrays.asList(Visibility.values())) {
+				if (visibility.toString().toLowerCase().equals(parameter.getStringValue())) {
+					found = true;
+					break;
+				}
+			}
+			if (!found) {
+				return error("Visibility could only be private or protected");
+			}
 		}
 		return Status.OK_STATUS;
 	}
-	
+
 	private String asIdentifier(String it, String separator) {
 		return it.replaceAll(INVALID_IDENTIFIER_REGEX, separator);
 	}

+ 11 - 2
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/features/CPPFeatureConstants.java

@@ -1,5 +1,5 @@
 /**
- * Copyright (c) 2011 committers of YAKINDU and others.
+ * Copyright (c) 2014 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
@@ -12,10 +12,19 @@ package org.yakindu.sct.generator.cpp.features;
 
 /**
  * 
- * @author holger willebrandt - Initial contribution and API
+ * @author Markus Muehlbrandt - Initial contribution and API
  * 
  */
 public interface CPPFeatureConstants {
+	
+	public static enum Visibility {
+		PRIVATE,
+		PROTECTED
+	}
+	
 	public static final String LIBRARY_NAME = "CPP Generator";
 	
+	public static final String FEATURE_GENERATOR_OPTIONS = "GeneratorOptions";
+	
+	public static final String PARAMETER_INNER_FUNCTION_VISIBILITY = "innerFunctionVisibility";
 }

+ 23 - 0
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/features/GenmodelEntriesExtension.xtend

@@ -0,0 +1,23 @@
+package org.yakindu.sct.generator.cpp.features
+
+import org.yakindu.sct.generator.c.GenmodelEntries
+import org.yakindu.sct.model.sgen.GeneratorEntry
+import org.yakindu.sct.generator.cpp.features.CPPFeatureConstants.Visibility
+
+class GenmodelEntriesExtension extends GenmodelEntries {
+	
+	def private getGeneratorOptionsFeature(GeneratorEntry it) {
+		getFeatureConfiguration(CPPFeatureConstants::FEATURE_GENERATOR_OPTIONS)
+	}
+	
+	def private getVisibilityParameter(GeneratorEntry it) {
+		generatorOptionsFeature?.getParameterValue(CPPFeatureConstants.PARAMETER_INNER_FUNCTION_VISIBILITY)
+	}
+	
+	def getInnerClassVisibility(GeneratorEntry it) {
+		if (visibilityParameter != null) {
+			return visibilityParameter.stringValue
+		}
+		return Visibility.PRIVATE.toString.toLowerCase
+	}
+}