Browse Source

moved ExpressionParser from AbstractTestClass to its own class to remove
dependencies to test packages.

bohl 10 years ago
parent
commit
d70aec4aca

+ 1 - 0
plugins/org.yakindu.sct.model.stext/META-INF/MANIFEST.MF

@@ -43,6 +43,7 @@ Export-Package: org.yakindu.sct.model.stext,
  org.yakindu.sct.model.stext.stext,
  org.yakindu.sct.model.stext.stext.impl,
  org.yakindu.sct.model.stext.stext.util,
+ org.yakindu.sct.model.stext.expressions,
  org.yakindu.sct.model.stext.util,
  org.yakindu.sct.model.stext.validation
 Bundle-ClassPath: .

+ 15 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/expressions/IExpressionParser.java

@@ -0,0 +1,15 @@
+package org.yakindu.sct.model.stext.expressions;
+
+import org.eclipse.emf.ecore.EObject;
+import org.yakindu.sct.model.sgraph.Scope;
+
+import com.google.inject.ImplementedBy;
+
+@ImplementedBy(STextExpressionParser.class)
+public interface IExpressionParser {
+
+	public EObject parseExpression(String expression, String ruleName);
+
+	public EObject parseExpression(String expression, String ruleName, Scope... context);
+
+}

+ 118 - 0
plugins/org.yakindu.sct.model.stext/src/org/yakindu/sct/model/stext/expressions/STextExpressionParser.java

@@ -0,0 +1,118 @@
+package org.yakindu.sct.model.stext.expressions;
+
+import java.io.StringReader;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.xtext.ParserRule;
+import org.eclipse.xtext.XtextFactory;
+import org.eclipse.xtext.diagnostics.Severity;
+import org.eclipse.xtext.linking.ILinker;
+import org.eclipse.xtext.nodemodel.INode;
+import org.eclipse.xtext.parser.IParseResult;
+import org.eclipse.xtext.parser.IParser;
+import org.eclipse.xtext.resource.impl.ListBasedDiagnosticConsumer;
+import org.eclipse.xtext.util.CancelIndicator;
+import org.yakindu.base.xtext.utils.jface.viewers.ContextElementAdapter;
+import org.yakindu.sct.model.sgraph.SGraphFactory;
+import org.yakindu.sct.model.sgraph.SGraphPackage;
+import org.yakindu.sct.model.sgraph.Scope;
+import org.yakindu.sct.model.sgraph.SpecificationElement;
+import org.yakindu.sct.model.sgraph.Statechart;
+import org.yakindu.sct.model.stext.resource.StextResource;
+import org.yakindu.sct.model.stext.stext.InterfaceScope;
+import org.yakindu.sct.model.stext.stext.InternalScope;
+
+import com.google.common.collect.Multimap;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
+public class STextExpressionParser implements IExpressionParser {
+
+	@Inject
+	private IParser parser;
+	@Inject
+	private ILinker linker;
+
+	@Inject
+	private Injector injector;
+
+	public StextResource getResource() {
+		final StextResource resource = new StextResource();
+		injector.injectMembers(resource);
+		resource.eAdapters().add(new ContextElementAdapter(new ContextElementAdapter.IContextElementProvider() {
+			public EObject getContextObject() {
+				return (EObject) EcoreUtil.getObjectByType(resource.getContents(), SGraphPackage.Literals.STATECHART);
+			}
+		}));
+		ResourceSet set = new ResourceSetImpl();
+		set.getResources().add(resource);
+		return resource;
+	}
+
+	public EObject parseExpression(String expression, String ruleName) {
+		return parseExpression(expression, ruleName, (Scope) null);
+	}
+
+	public EObject parseExpression(String expression, String ruleName, Scope... context) {
+		StextResource resource = getResource();
+		resource.setURI(URI.createURI("path", true));
+		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
+		parserRule.setName(ruleName);
+		IParseResult result = parser.parse(parserRule, new StringReader(expression));
+		EObject rootASTElement = result.getRootASTElement();
+		resource.getContents().add(rootASTElement);
+		ListBasedDiagnosticConsumer diagnosticsConsumer = new ListBasedDiagnosticConsumer();
+		if (context != null) {
+			Statechart sc = SGraphFactory.eINSTANCE.createStatechart();
+			sc.setName("sc");
+			resource.getContents().add(sc);
+			for (Scope scope : context) {
+				if (scope != null) {
+					sc.getScopes().add(scope);
+					linker.linkModel(scope, diagnosticsConsumer);
+				}
+
+			}
+		}
+		linker.linkModel(result.getRootASTElement(), diagnosticsConsumer);
+		resource.resolveLazyCrossReferences(CancelIndicator.NullImpl);
+		resource.resolveLazyCrossReferences(CancelIndicator.NullImpl);
+		Multimap<SpecificationElement, Diagnostic> diagnostics = resource.getLinkingDiagnostics();
+		if (diagnostics.size() > 0) {
+			throw new RuntimeException(diagnostics.toString());
+		}
+		if (result.hasSyntaxErrors()) {
+			StringBuilder errorMessages = new StringBuilder();
+			Iterable<INode> syntaxErrors = result.getSyntaxErrors();
+			for (INode iNode : syntaxErrors) {
+				errorMessages.append(iNode.getSyntaxErrorMessage());
+				errorMessages.append("\n");
+			}
+			throw new RuntimeException("Could not parse expression, syntax errors: " + errorMessages);
+		}
+		if (diagnosticsConsumer.hasConsumedDiagnostics(Severity.ERROR)) {
+			throw new RuntimeException("Error during linking: " + diagnosticsConsumer.getResult(Severity.ERROR));
+		}
+		return rootASTElement;
+	}
+
+	public Scope createInternalScope(String contextScope) {
+		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
+		parserRule.setName(InternalScope.class.getSimpleName());
+		IParseResult result = parser.parse(parserRule, new StringReader(contextScope));
+		return (Scope) result.getRootASTElement();
+	}
+
+	public Scope createInterfaceScope(String contextScope) {
+		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
+		parserRule.setName(InterfaceScope.class.getSimpleName());
+		IParseResult result = parser.parse(parserRule, new StringReader(contextScope));
+		return (Scope) result.getRootASTElement();
+	}
+
+}

+ 1 - 1
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/STextJavaValidatorTest.java

@@ -225,7 +225,7 @@ public class STextJavaValidatorTest extends AbstractSTextTest implements STextVa
 		AssertableDiagnostics validationResult = tester.validate(expression);
 		validationResult.assertErrorContains(STextJavaValidator.GUARD_EXPRESSION);
 
-		Scope context = createInternalScope("internal: var myInt : integer var myBool : boolean = true)");
+		Scope context = createInternalScope("internal: var myInt : integer var myBool : boolean = true");
 		expression = super.parseExpression("[myInt = 5]", context, ReactionTrigger.class.getSimpleName());
 		validationResult = tester.validate(expression);
 		validationResult.assertErrorContains(STextJavaValidator.GUARD_EXPRESSION);

+ 9 - 94
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/util/AbstractSTextTest.java

@@ -10,37 +10,13 @@
  */
 package org.yakindu.sct.model.stext.test.util;
 
-import static org.yakindu.sct.model.sgraph.test.util.SGraphTestFactory._createStatechart;
-
-import java.io.StringReader;
-
-import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource.Diagnostic;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.xtext.ParserRule;
-import org.eclipse.xtext.XtextFactory;
-import org.eclipse.xtext.diagnostics.Severity;
-import org.eclipse.xtext.linking.ILinker;
-import org.eclipse.xtext.nodemodel.INode;
-import org.eclipse.xtext.parser.IParseResult;
-import org.eclipse.xtext.parser.IParser;
-import org.eclipse.xtext.resource.impl.ListBasedDiagnosticConsumer;
-import org.eclipse.xtext.util.CancelIndicator;
-import org.yakindu.base.xtext.utils.jface.viewers.ContextElementAdapter;
-import org.yakindu.sct.model.sgraph.SGraphPackage;
 import org.yakindu.sct.model.sgraph.Scope;
-import org.yakindu.sct.model.sgraph.SpecificationElement;
-import org.yakindu.sct.model.sgraph.Statechart;
-import org.yakindu.sct.model.stext.resource.StextResource;
+import org.yakindu.sct.model.stext.expressions.IExpressionParser;
 import org.yakindu.sct.model.stext.stext.InterfaceScope;
 import org.yakindu.sct.model.stext.stext.InternalScope;
 
-import com.google.common.collect.Multimap;
 import com.google.inject.Inject;
-import com.google.inject.Injector;
 
 /**
  * 
@@ -50,88 +26,26 @@ import com.google.inject.Injector;
 public abstract class AbstractSTextTest {
 
 	@Inject
-	private IParser parser;
-	@Inject
-	private ILinker linker;
-	@Inject
-	private Injector injector;
-	
-	protected StextResource getResource() {
-		final StextResource resource = new StextResource(); 
-		injector.injectMembers(resource);
-		resource.eAdapters().add(new ContextElementAdapter(new ContextElementAdapter.IContextElementProvider() {
-			public EObject getContextObject() {
-				return (EObject) EcoreUtil.getObjectByType(resource.getContents(), SGraphPackage.Literals.STATECHART);
-			}
-		}));
-		ResourceSet set = new ResourceSetImpl();
-		set.getResources().add(resource);
-		return resource;
-	}
+	private IExpressionParser expressionParser;
 
 	protected EObject parseExpression(String expression, String ruleName) {
-		return parseExpression(expression, null, ruleName);
+		return expressionParser.parseExpression(expression, ruleName);
 	}
 
-	// TODO: REMOVE
 	protected EObject parseExpression(String expression, Scope scope, String ruleName) {
 		return parseExpression(expression, ruleName, scope);
 	}
 
 	protected EObject parseExpression(String expression, String ruleName, Scope... context) {
-		StextResource resource = getResource();
-		resource.setURI(URI.createURI("path", true));
-		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
-		parserRule.setName(ruleName);
-		IParseResult result = parser.parse(parserRule, new StringReader(expression));
-		EObject rootASTElement = result.getRootASTElement();
-		resource.getContents().add(rootASTElement);
-		ListBasedDiagnosticConsumer diagnosticsConsumer = new ListBasedDiagnosticConsumer();
-		if (context != null) {
-			Statechart sc = _createStatechart("sc");
-			resource.getContents().add(sc);
-			for (Scope scope : context) {
-				if (scope != null) {
-					sc.getScopes().add(scope);
-					linker.linkModel(scope, diagnosticsConsumer);
-				}
-
-			}
-		}
-		linker.linkModel(result.getRootASTElement(), diagnosticsConsumer);
-		resource.resolveLazyCrossReferences(CancelIndicator.NullImpl);
-		resource.resolveLazyCrossReferences(CancelIndicator.NullImpl);
-		Multimap<SpecificationElement, Diagnostic> diagnostics = resource.getLinkingDiagnostics();
-		if (diagnostics.size() > 0) {
-			throw new RuntimeException(diagnostics.toString());
-		}
-		if (result.hasSyntaxErrors()) {
-			StringBuilder errorMessages = new StringBuilder();
-			Iterable<INode> syntaxErrors = result.getSyntaxErrors();
-			for (INode iNode : syntaxErrors) {
-				errorMessages.append(iNode.getSyntaxErrorMessage());
-				errorMessages.append("\n");
-			}
-			throw new RuntimeException("Could not parse expression, syntax errors: " + errorMessages);
-		}
-		if (diagnosticsConsumer.hasConsumedDiagnostics(Severity.ERROR)) {
-			throw new RuntimeException("Error during linking: " + diagnosticsConsumer.getResult(Severity.ERROR));
-		}
-		return rootASTElement;
+		return expressionParser.parseExpression(expression, ruleName, context);
 	}
 
 	protected Scope createInternalScope(String contextScope) {
-		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
-		parserRule.setName(InternalScope.class.getSimpleName());
-		IParseResult result = parser.parse(parserRule, new StringReader(contextScope));
-		return (Scope) result.getRootASTElement();
+		return (Scope) expressionParser.parseExpression(contextScope, InternalScope.class.getSimpleName());
 	}
 
 	protected Scope createInterfaceScope(String contextScope) {
-		ParserRule parserRule = XtextFactory.eINSTANCE.createParserRule();
-		parserRule.setName(InterfaceScope.class.getSimpleName());
-		IParseResult result = parser.parse(parserRule, new StringReader(contextScope));
-		return (Scope) result.getRootASTElement();
+		return (Scope) expressionParser.parseExpression(contextScope, InterfaceScope.class.getSimpleName());
 	}
 
 	/**
@@ -150,7 +64,7 @@ public abstract class AbstractSTextTest {
 	 *  event voidEvent : void"
 	 * </pre>
 	 */
-	protected Scope internalScope() {
+	public Scope internalScope() {
 		return createInternalScope("internal: operation voidOp() operation intOp():integer var intVar : integer var boolVar : boolean var realVar : real var stringVar : string event intEvent : integer  event boolEvent : boolean event realEvent : real event stringEvent : string event voidEvent : void");
 	}
 
@@ -165,7 +79,8 @@ public abstract class AbstractSTextTest {
 	 *  var boolVar : boolean
 	 * </pre>
 	 */
-	protected Scope interfaceScope() {
+	public Scope interfaceScope() {
 		return createInterfaceScope("interface ABC : operation paramOp(param1 : integer, param2 : boolean ) : string operation stringOp() in event voidEvent  in event intEvent : integer var intVar : integer var boolVar : boolean");
 	}
+
 }

+ 34 - 28
test-plugins/org.yakindu.sct.model.stext.test/src/org/yakindu/sct/model/stext/test/util/STextRuntimeTestModule.java

@@ -1,28 +1,34 @@
-/**
- * Copyright (c) 2012 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.test.util;
-
-import org.eclipse.xtext.scoping.IScopeProvider;
-import org.yakindu.sct.model.stext.STextRuntimeModule;
-
-/**
- * 
- * @author andreas muelder - Initial contribution and API
- * 
- */
-public class STextRuntimeTestModule extends STextRuntimeModule {
-
-	@Override
-	public Class<? extends IScopeProvider> bindIScopeProvider() {
-		return STextTestScopeProvider.class;
-	}
-
-}
+/**
+ * Copyright (c) 2012 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.test.util;
+
+import org.eclipse.xtext.scoping.IScopeProvider;
+import org.yakindu.sct.model.stext.STextRuntimeModule;
+import org.yakindu.sct.model.stext.expressions.IExpressionParser;
+import org.yakindu.sct.model.stext.expressions.STextExpressionParser;
+
+/**
+ * 
+ * @author andreas muelder - Initial contribution and API
+ * 
+ */
+public class STextRuntimeTestModule extends STextRuntimeModule {
+
+	@Override
+	public Class<? extends IScopeProvider> bindIScopeProvider() {
+		return STextTestScopeProvider.class;
+	}
+
+	public Class<? extends IExpressionParser> bindISTextUtilityProvider() {
+		return STextExpressionParser.class;
+	}
+
+}