Explorar el Código

Custom NamesAreUniqueValidator to check internal uniqueness (#1759)

Andreas Mülder hace 7 años
padre
commit
a92ae09cbf

+ 97 - 122
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/GenerateSText.mwe2

@@ -1,122 +1,97 @@
-module org.yakindu.sct.model.stext.Stext
-
-import org.eclipse.emf.mwe.utils.*
-import org.eclipse.xtext.generator.*
-import org.eclipse.xtext.ui.generator.*
-
-var grammarURI = "classpath:/org/yakindu/sct/model/stext/SText.xtext"
-var file.extensions = "stext"
-var projectName = "org.yakindu.sct.model.stext"
-var runtimeProject = "../${projectName}"
-
-Workflow {
-    bean = StandaloneSetup {
-	    scanClassPath = true
-		platformUri = "${runtimeProject}/.."
-		registerGenModelFile = "platform:/resource/org.yakindu.sct.model.sgraph/model/emf/sgraph.genmodel"
-		registerGenModelFile = "platform:/resource/org.yakindu.sct.model.stext/model/SText.genmodel"
-		registerGenModelFile = "platform:/resource/org.yakindu.base.types/model/base.genmodel"
-		registerGenModelFile = "platform:/resource/org.yakindu.base.types/model/types.genmodel"
-		registerGenModelFile = "platform:/resource/org.yakindu.base.expressions/model/Expressions.genmodel"
-		registerEcoreFile ="platform:/resource/org.yakindu.base.types/model/base.ecore"
-		registerEcoreFile ="platform:/resource/org.yakindu.base.types/model/types.ecore"
-		registerEcoreFile ="platform:/resource/org.yakindu.base.expressions/model/Expressions.ecore"
-		registerEcoreFile ="platform:/resource/org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore"
-		registerEcoreFile ="platform:/resource/org.yakindu.sct.model.stext/model/SText.ecore"
-	}
-
-	component = DirectoryCleaner {
-		directory = "${runtimeProject}/src-gen"
-	}
-
-	component = DirectoryCleaner {
-		directory = "${runtimeProject}.ui/src-gen"
-	}
-
-	component = Generator {
-		pathRtProject = runtimeProject
-		pathUiProject = "${runtimeProject}.ui"
-//		pathTestProject = "../../test-plugins/${projectName}.test"
-		projectNameRt = projectName
-		projectNameUi = "${projectName}.ui"
-		language = {
-			uri = grammarURI
-			fileExtensions = file.extensions
-
-			// Java API to access grammar elements (required by several other fragments)
-			fragment = grammarAccess.GrammarAccessFragment {
-				xmlVersion = "1.0"
-			}
-
-//			// generates Java API for the generated EPackages 
-//			fragment = ecore.EcoreGeneratorFragment {
-//				generateEdit = true
-//				genModel = "model/SText.genmodel"
-//				emfRuntimeVersion = "2.8"
-//				xmiModelDirectory = "${runtimeProject}/model"
-//			}
-
-			// the serialization component
-			fragment = parseTreeConstructor.ParseTreeConstructorFragment {}
-
-			// a custom ResourceFactory for use with EMF 
-			fragment = resourceFactory.ResourceFactoryFragment {
-				fileExtensions = file.extensions
-			}
-
-			// The antlr parser generator fragment.
-			fragment = parser.antlr.XtextAntlrGeneratorFragment {
-			//  options = {
-			//		backtrack = true
-			//	}
-			}
-			
-			// java-based API for validation 
-			fragment = validation.JavaValidatorFragment {
-				composedCheck = "org.eclipse.xtext.validation.ImportUriValidator"
-				composedCheck = "org.eclipse.xtext.validation.NamesAreUniqueValidator"
-				// registerForImportedPackages = true
-			}
-
-			// scoping and exporting API
-			// fragment = scoping.ImportURIScopingFragment {}
-			// fragment = exporting.SimpleNamesFragment {}
-
-			// scoping and exporting API 
-			fragment = scoping.ImportNamespacesScopingFragment {}
-			fragment = exporting.QualifiedNamesFragment {}
-			fragment = builder.BuilderIntegrationFragment {}
-
-			// generator API
-			//fragment = generator.GeneratorFragment {
-			//	generateMwe = true
-			//	generateJavaMain = true
-			//}
-			
-			// formatter API 
-			fragment = formatting.FormatterFragment {}
-
-			// labeling API 
-			fragment = labeling.LabelProviderFragment {}
-
-			// outline API 
-			fragment = outline.OutlineTreeProviderFragment {}
-			fragment = outline.QuickOutlineFragment {}
-
-			// quickfix API 
-			fragment = quickfix.QuickfixProviderFragment {}
-
-			// content assist API  
-			fragment = contentAssist.JavaBasedContentAssistFragment {}
-			
-			// rename refactoring  
-			fragment = refactoring.RefactorElementNameFragment {}
-
-			// generates a more lightweight Antlr parser and lexer tailored for content assist  
-			fragment = parser.antlr.XtextAntlrUiGeneratorFragment {}
-
-			// generates junit test support classes into Generator#pathTestProject
-			fragment = junit.Junit4Fragment {}
-		}
-	}
-}
+module org.yakindu.sct.model.stext.Stext
+
+import org.eclipse.emf.mwe.utils.*
+import org.eclipse.xtext.generator.*
+import org.eclipse.xtext.ui.generator.*
+
+var grammarURI = "classpath:/org/yakindu/sct/model/stext/SText.xtext"
+var file.extensions = "stext"
+var projectName = "org.yakindu.sct.model.stext"
+var runtimeProject = "../${projectName}"
+
+Workflow {
+    bean = StandaloneSetup {
+	    scanClassPath = true
+		platformUri = "${runtimeProject}/.."
+		registerGenModelFile = "platform:/resource/org.yakindu.sct.model.sgraph/model/emf/sgraph.genmodel"
+		registerGenModelFile = "platform:/resource/org.yakindu.sct.model.stext/model/SText.genmodel"
+		registerGenModelFile = "platform:/resource/org.yakindu.base.types/model/base.genmodel"
+		registerGenModelFile = "platform:/resource/org.yakindu.base.types/model/types.genmodel"
+		registerGenModelFile = "platform:/resource/org.yakindu.base.expressions/model/Expressions.genmodel"
+		registerEcoreFile ="platform:/resource/org.yakindu.base.types/model/base.ecore"
+		registerEcoreFile ="platform:/resource/org.yakindu.base.types/model/types.ecore"
+		registerEcoreFile ="platform:/resource/org.yakindu.base.expressions/model/Expressions.ecore"
+		registerEcoreFile ="platform:/resource/org.yakindu.sct.model.sgraph/model/emf/sgraph.ecore"
+		registerEcoreFile ="platform:/resource/org.yakindu.sct.model.stext/model/SText.ecore"
+	}
+
+	component = DirectoryCleaner {
+		directory = "${runtimeProject}/src-gen"
+	}
+
+	component = DirectoryCleaner {
+		directory = "${runtimeProject}.ui/src-gen"
+	}
+
+	component = Generator {
+		pathRtProject = runtimeProject
+		pathUiProject = "${runtimeProject}.ui"
+		projectNameRt = projectName
+		projectNameUi = "${projectName}.ui"
+		language = {
+			uri = grammarURI
+			fileExtensions = file.extensions
+
+			// Java API to access grammar elements (required by several other fragments)
+			fragment = grammarAccess.GrammarAccessFragment {
+				xmlVersion = "1.0"
+			}
+
+			// the serialization component
+			fragment = parseTreeConstructor.ParseTreeConstructorFragment {}
+
+			// a custom ResourceFactory for use with EMF 
+			fragment = resourceFactory.ResourceFactoryFragment {
+				fileExtensions = file.extensions
+			}
+
+			// The antlr parser generator fragment.
+			fragment = parser.antlr.XtextAntlrGeneratorFragment {
+			}
+			
+			// java-based API for validation 
+			fragment = validation.JavaValidatorFragment {
+			}
+
+			// scoping and exporting API 
+			fragment = scoping.ImportNamespacesScopingFragment {}
+			fragment = exporting.QualifiedNamesFragment {}
+			fragment = builder.BuilderIntegrationFragment {}
+
+			// formatter API 
+			fragment = formatting.FormatterFragment {}
+
+			// labeling API 
+			fragment = labeling.LabelProviderFragment {}
+
+			// outline API 
+			fragment = outline.OutlineTreeProviderFragment {}
+			fragment = outline.QuickOutlineFragment {}
+
+			// quickfix API 
+			fragment = quickfix.QuickfixProviderFragment {}
+
+			// content assist API  
+			fragment = contentAssist.JavaBasedContentAssistFragment {}
+			
+			// rename refactoring  
+			fragment = refactoring.RefactorElementNameFragment {}
+
+			// generates a more lightweight Antlr parser and lexer tailored for content assist  
+			fragment = parser.antlr.XtextAntlrUiGeneratorFragment {}
+
+			// generates junit test support classes into Generator#pathTestProject
+			fragment = junit.Junit4Fragment {}
+		}
+	}
+}

+ 1 - 1
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextJavaValidator.java

@@ -115,7 +115,7 @@ import com.google.inject.name.Named;
  * @author muelder
  * 
  */
-@ComposedChecks(validators = { SGraphJavaValidator.class, SCTResourceValidator.class, ExpressionsJavaValidator.class })
+@ComposedChecks(validators = { SGraphJavaValidator.class, SCTResourceValidator.class, ExpressionsJavaValidator.class, STextNamesAreUniqueValidator.class })
 public class STextJavaValidator extends AbstractSTextJavaValidator implements STextValidationMessages {
 
 	@Inject

+ 52 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/validation/STextNamesAreUniqueValidator.java

@@ -0,0 +1,52 @@
+/**
+ * Copyright (c) 2018 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:
+ * 	committers of YAKINDU - initial API and implementation
+ * 
+ */
+package org.yakindu.sct.model.stext.validation;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.xtext.scoping.Scopes;
+import org.eclipse.xtext.util.CancelIndicator;
+import org.eclipse.xtext.validation.INamesAreUniqueValidationHelper;
+import org.eclipse.xtext.validation.NamesAreUniqueValidator;
+import org.yakindu.base.base.NamedElement;
+import org.yakindu.sct.model.stext.naming.StextNameProvider;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class STextNamesAreUniqueValidator extends NamesAreUniqueValidator {
+
+	@Inject
+	private INamesAreUniqueValidationHelper helper;
+	@Inject
+	private StextNameProvider fqnProvider;
+
+	/**
+	 * The default implementation checks only for objects that are exported via description strategy.
+	 * It should also check for uniqueness of internal elements. 
+	 */
+	@Override
+	public void doCheckUniqueNames(Resource resource, CancelIndicator cancelIndicator) {
+		Iterable<EObject> iterable = () -> EcoreUtil.getAllContents(resource, true);
+		List<EObject> candiatates = StreamSupport.stream(iterable.spliterator(), false)
+				.filter((it) -> it instanceof NamedElement).collect(Collectors.toList());
+		helper.checkUniqueNames(Scopes.scopedElementsFor(candiatates, fqnProvider), cancelIndicator, this);
+	}
+}